@databricks/appkit-ui 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +121 -1228
- package/NOTICE.md +1 -1
- package/bin/appkit.js +3 -0
- package/dist/cli/commands/docs.js +47 -0
- package/dist/cli/commands/docs.js.map +1 -0
- package/dist/cli/commands/generate-types.js +38 -0
- package/dist/cli/commands/generate-types.js.map +1 -0
- package/dist/cli/commands/lint.js +104 -0
- package/dist/cli/commands/lint.js.map +1 -0
- package/dist/cli/commands/setup.js +121 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +24 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/js/arrow/arrow-client.d.ts +48 -0
- package/dist/js/arrow/arrow-client.d.ts.map +1 -1
- package/dist/js/arrow/arrow-client.js +51 -3
- package/dist/js/arrow/arrow-client.js.map +1 -1
- package/dist/react/charts/area/index.d.ts +6 -17
- package/dist/react/charts/area/index.d.ts.map +1 -1
- package/dist/react/charts/area/index.js +5 -17
- package/dist/react/charts/area/index.js.map +1 -1
- package/dist/react/charts/bar/index.d.ts +5 -26
- package/dist/react/charts/bar/index.d.ts.map +1 -1
- package/dist/react/charts/bar/index.js +4 -26
- package/dist/react/charts/bar/index.js.map +1 -1
- package/dist/react/charts/create-chart.js +1 -2
- package/dist/react/charts/create-chart.js.map +1 -1
- package/dist/react/charts/heatmap/index.d.ts +7 -22
- package/dist/react/charts/heatmap/index.d.ts.map +1 -1
- package/dist/react/charts/heatmap/index.js +6 -22
- package/dist/react/charts/heatmap/index.js.map +1 -1
- package/dist/react/charts/line/index.d.ts +6 -18
- package/dist/react/charts/line/index.d.ts.map +1 -1
- package/dist/react/charts/line/index.js +5 -18
- package/dist/react/charts/line/index.js.map +1 -1
- package/dist/react/charts/normalize.js +16 -16
- package/dist/react/charts/normalize.js.map +1 -1
- package/dist/react/charts/pie/index.d.ts +10 -32
- package/dist/react/charts/pie/index.d.ts.map +1 -1
- package/dist/react/charts/pie/index.js +9 -32
- package/dist/react/charts/pie/index.js.map +1 -1
- package/dist/react/charts/radar/index.d.ts +6 -16
- package/dist/react/charts/radar/index.d.ts.map +1 -1
- package/dist/react/charts/radar/index.js +5 -16
- package/dist/react/charts/radar/index.js.map +1 -1
- package/dist/react/charts/scatter/index.d.ts +6 -16
- package/dist/react/charts/scatter/index.d.ts.map +1 -1
- package/dist/react/charts/scatter/index.js +5 -16
- package/dist/react/charts/scatter/index.js.map +1 -1
- package/dist/react/charts/types.d.ts +0 -5
- package/dist/react/charts/types.d.ts.map +1 -1
- package/dist/react/charts/types.js.map +1 -1
- package/dist/react/charts/wrapper.d.ts +0 -2
- package/dist/react/charts/wrapper.d.ts.map +1 -1
- package/dist/react/charts/wrapper.js +2 -4
- package/dist/react/charts/wrapper.js.map +1 -1
- package/dist/react/hooks/types.d.ts +0 -2
- package/dist/react/hooks/types.d.ts.map +1 -1
- package/dist/react/hooks/use-analytics-query.d.ts +4 -0
- package/dist/react/hooks/use-analytics-query.d.ts.map +1 -1
- package/dist/react/hooks/use-analytics-query.js +17 -14
- package/dist/react/hooks/use-analytics-query.js.map +1 -1
- package/dist/react/hooks/use-chart-data.d.ts +0 -2
- package/dist/react/hooks/use-chart-data.d.ts.map +1 -1
- package/dist/react/hooks/use-chart-data.js +2 -3
- package/dist/react/hooks/use-chart-data.js.map +1 -1
- package/dist/react/table/data-table.d.ts +4 -1
- package/dist/react/table/data-table.d.ts.map +1 -1
- package/dist/react/table/data-table.js +4 -1
- package/dist/react/table/data-table.js.map +1 -1
- package/dist/react/table/table-wrapper.js +5 -6
- package/dist/react/table/table-wrapper.js.map +1 -1
- package/dist/react/table/types.d.ts.map +1 -1
- package/dist/react/ui/accordion.d.ts +9 -5
- package/dist/react/ui/accordion.d.ts.map +1 -1
- package/dist/react/ui/accordion.js +4 -0
- package/dist/react/ui/accordion.js.map +1 -1
- package/dist/react/ui/alert-dialog.d.ts +23 -12
- package/dist/react/ui/alert-dialog.d.ts.map +1 -1
- package/dist/react/ui/alert-dialog.js +11 -0
- package/dist/react/ui/alert-dialog.js.map +1 -1
- package/dist/react/ui/alert.d.ts +7 -4
- package/dist/react/ui/alert.d.ts.map +1 -1
- package/dist/react/ui/alert.js +3 -0
- package/dist/react/ui/alert.js.map +1 -1
- package/dist/react/ui/aspect-ratio.d.ts +3 -2
- package/dist/react/ui/aspect-ratio.d.ts.map +1 -1
- package/dist/react/ui/aspect-ratio.js +1 -0
- package/dist/react/ui/aspect-ratio.js.map +1 -1
- package/dist/react/ui/avatar.d.ts +7 -4
- package/dist/react/ui/avatar.d.ts.map +1 -1
- package/dist/react/ui/avatar.js +3 -0
- package/dist/react/ui/avatar.js.map +1 -1
- package/dist/react/ui/badge.d.ts +5 -4
- package/dist/react/ui/badge.d.ts.map +1 -1
- package/dist/react/ui/badge.js +1 -0
- package/dist/react/ui/badge.js.map +1 -1
- package/dist/react/ui/breadcrumb.d.ts +15 -8
- package/dist/react/ui/breadcrumb.d.ts.map +1 -1
- package/dist/react/ui/breadcrumb.js +7 -0
- package/dist/react/ui/breadcrumb.js.map +1 -1
- package/dist/react/ui/button-group.d.ts +9 -6
- package/dist/react/ui/button-group.d.ts.map +1 -1
- package/dist/react/ui/button-group.js +3 -0
- package/dist/react/ui/button-group.js.map +1 -1
- package/dist/react/ui/button.d.ts +5 -4
- package/dist/react/ui/button.d.ts.map +1 -1
- package/dist/react/ui/button.js +1 -0
- package/dist/react/ui/button.js.map +1 -1
- package/dist/react/ui/calendar.d.ts +5 -3
- package/dist/react/ui/calendar.d.ts.map +1 -1
- package/dist/react/ui/calendar.js +14 -12
- package/dist/react/ui/calendar.js.map +1 -1
- package/dist/react/ui/card.d.ts +15 -8
- package/dist/react/ui/card.d.ts.map +1 -1
- package/dist/react/ui/card.js +7 -0
- package/dist/react/ui/card.js.map +1 -1
- package/dist/react/ui/carousel.d.ts +11 -6
- package/dist/react/ui/carousel.d.ts.map +1 -1
- package/dist/react/ui/carousel.js +9 -4
- package/dist/react/ui/carousel.js.map +1 -1
- package/dist/react/ui/chart.d.ts +6 -5
- package/dist/react/ui/chart.d.ts.map +1 -1
- package/dist/react/ui/chart.js +2 -1
- package/dist/react/ui/chart.js.map +1 -1
- package/dist/react/ui/checkbox.d.ts +3 -2
- package/dist/react/ui/checkbox.d.ts.map +1 -1
- package/dist/react/ui/checkbox.js +1 -0
- package/dist/react/ui/checkbox.js.map +1 -1
- package/dist/react/ui/collapsible.d.ts +7 -4
- package/dist/react/ui/collapsible.d.ts.map +1 -1
- package/dist/react/ui/collapsible.js +3 -0
- package/dist/react/ui/collapsible.js.map +1 -1
- package/dist/react/ui/command.d.ts +19 -10
- package/dist/react/ui/command.d.ts.map +1 -1
- package/dist/react/ui/command.js +9 -0
- package/dist/react/ui/command.js.map +1 -1
- package/dist/react/ui/context-menu.d.ts +17 -16
- package/dist/react/ui/context-menu.d.ts.map +1 -1
- package/dist/react/ui/context-menu.js +1 -0
- package/dist/react/ui/context-menu.js.map +1 -1
- package/dist/react/ui/dialog.d.ts +21 -11
- package/dist/react/ui/dialog.d.ts.map +1 -1
- package/dist/react/ui/dialog.js +10 -0
- package/dist/react/ui/dialog.js.map +1 -1
- package/dist/react/ui/drawer.d.ts +21 -11
- package/dist/react/ui/drawer.d.ts.map +1 -1
- package/dist/react/ui/drawer.js +10 -0
- package/dist/react/ui/drawer.js.map +1 -1
- package/dist/react/ui/dropdown-menu.d.ts +17 -16
- package/dist/react/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/react/ui/dropdown-menu.js +1 -0
- package/dist/react/ui/dropdown-menu.js.map +1 -1
- package/dist/react/ui/empty.d.ts +8 -7
- package/dist/react/ui/empty.d.ts.map +1 -1
- package/dist/react/ui/empty.js +1 -0
- package/dist/react/ui/empty.js.map +1 -1
- package/dist/react/ui/field.d.ts +21 -11
- package/dist/react/ui/field.d.ts.map +1 -1
- package/dist/react/ui/field.js +10 -0
- package/dist/react/ui/field.js.map +1 -1
- package/dist/react/ui/form.d.ts +14 -7
- package/dist/react/ui/form.d.ts.map +1 -1
- package/dist/react/ui/form.js +7 -0
- package/dist/react/ui/form.js.map +1 -1
- package/dist/react/ui/hover-card.d.ts +5 -4
- package/dist/react/ui/hover-card.d.ts.map +1 -1
- package/dist/react/ui/hover-card.js +1 -0
- package/dist/react/ui/hover-card.js.map +1 -1
- package/dist/react/ui/input-group.d.ts +16 -10
- package/dist/react/ui/input-group.d.ts.map +1 -1
- package/dist/react/ui/input-group.js +6 -0
- package/dist/react/ui/input-group.js.map +1 -1
- package/dist/react/ui/input-otp.d.ts +9 -5
- package/dist/react/ui/input-otp.d.ts.map +1 -1
- package/dist/react/ui/input-otp.js +4 -0
- package/dist/react/ui/input-otp.js.map +1 -1
- package/dist/react/ui/input.d.ts +3 -2
- package/dist/react/ui/input.d.ts.map +1 -1
- package/dist/react/ui/input.js +1 -0
- package/dist/react/ui/input.js.map +1 -1
- package/dist/react/ui/item.d.ts +15 -14
- package/dist/react/ui/item.d.ts.map +1 -1
- package/dist/react/ui/item.js +1 -0
- package/dist/react/ui/item.js.map +1 -1
- package/dist/react/ui/kbd.d.ts +1 -0
- package/dist/react/ui/kbd.d.ts.map +1 -1
- package/dist/react/ui/kbd.js +1 -0
- package/dist/react/ui/kbd.js.map +1 -1
- package/dist/react/ui/label.d.ts +1 -0
- package/dist/react/ui/label.d.ts.map +1 -1
- package/dist/react/ui/label.js +1 -0
- package/dist/react/ui/label.js.map +1 -1
- package/dist/react/ui/menubar.d.ts +1 -0
- package/dist/react/ui/menubar.d.ts.map +1 -1
- package/dist/react/ui/menubar.js +1 -0
- package/dist/react/ui/menubar.js.map +1 -1
- package/dist/react/ui/navigation-menu.d.ts +8 -0
- package/dist/react/ui/navigation-menu.d.ts.map +1 -1
- package/dist/react/ui/navigation-menu.js +8 -0
- package/dist/react/ui/navigation-menu.js.map +1 -1
- package/dist/react/ui/pagination.d.ts +7 -0
- package/dist/react/ui/pagination.d.ts.map +1 -1
- package/dist/react/ui/pagination.js +7 -0
- package/dist/react/ui/pagination.js.map +1 -1
- package/dist/react/ui/popover.d.ts +6 -5
- package/dist/react/ui/popover.d.ts.map +1 -1
- package/dist/react/ui/popover.js +1 -0
- package/dist/react/ui/popover.js.map +1 -1
- package/dist/react/ui/progress.d.ts +3 -2
- package/dist/react/ui/progress.d.ts.map +1 -1
- package/dist/react/ui/progress.js +1 -0
- package/dist/react/ui/progress.js.map +1 -1
- package/dist/react/ui/radio-group.d.ts +4 -3
- package/dist/react/ui/radio-group.d.ts.map +1 -1
- package/dist/react/ui/radio-group.js +1 -0
- package/dist/react/ui/radio-group.js.map +1 -1
- package/dist/react/ui/resizable.d.ts +7 -4
- package/dist/react/ui/resizable.d.ts.map +1 -1
- package/dist/react/ui/resizable.js +3 -0
- package/dist/react/ui/resizable.js.map +1 -1
- package/dist/react/ui/scroll-area.d.ts +5 -3
- package/dist/react/ui/scroll-area.d.ts.map +1 -1
- package/dist/react/ui/scroll-area.js +2 -0
- package/dist/react/ui/scroll-area.js.map +1 -1
- package/dist/react/ui/select.d.ts +23 -11
- package/dist/react/ui/select.d.ts.map +1 -1
- package/dist/react/ui/select.js +12 -0
- package/dist/react/ui/select.js.map +1 -1
- package/dist/react/ui/separator.d.ts +3 -2
- package/dist/react/ui/separator.d.ts.map +1 -1
- package/dist/react/ui/separator.js +1 -0
- package/dist/react/ui/separator.js.map +1 -1
- package/dist/react/ui/sheet.d.ts +17 -9
- package/dist/react/ui/sheet.d.ts.map +1 -1
- package/dist/react/ui/sheet.js +10 -0
- package/dist/react/ui/sheet.js.map +1 -1
- package/dist/react/ui/sidebar.d.ts +46 -24
- package/dist/react/ui/sidebar.d.ts.map +1 -1
- package/dist/react/ui/sidebar.js +23 -1
- package/dist/react/ui/sidebar.js.map +1 -1
- package/dist/react/ui/skeleton.d.ts +3 -2
- package/dist/react/ui/skeleton.d.ts.map +1 -1
- package/dist/react/ui/skeleton.js +1 -0
- package/dist/react/ui/skeleton.js.map +1 -1
- package/dist/react/ui/slider.d.ts +3 -2
- package/dist/react/ui/slider.d.ts.map +1 -1
- package/dist/react/ui/slider.js +1 -0
- package/dist/react/ui/slider.js.map +1 -1
- package/dist/react/ui/sonner.d.ts +3 -2
- package/dist/react/ui/sonner.d.ts.map +1 -1
- package/dist/react/ui/sonner.js +1 -0
- package/dist/react/ui/sonner.js.map +1 -1
- package/dist/react/ui/spinner.d.ts +3 -2
- package/dist/react/ui/spinner.d.ts.map +1 -1
- package/dist/react/ui/spinner.js +1 -0
- package/dist/react/ui/spinner.js.map +1 -1
- package/dist/react/ui/switch.d.ts +3 -2
- package/dist/react/ui/switch.d.ts.map +1 -1
- package/dist/react/ui/switch.js +1 -0
- package/dist/react/ui/switch.js.map +1 -1
- package/dist/react/ui/table.d.ts +1 -0
- package/dist/react/ui/table.d.ts.map +1 -1
- package/dist/react/ui/table.js +1 -0
- package/dist/react/ui/table.js.map +1 -1
- package/dist/react/ui/tabs.d.ts +9 -5
- package/dist/react/ui/tabs.d.ts.map +1 -1
- package/dist/react/ui/tabs.js +4 -0
- package/dist/react/ui/tabs.js.map +1 -1
- package/dist/react/ui/textarea.d.ts +3 -2
- package/dist/react/ui/textarea.d.ts.map +1 -1
- package/dist/react/ui/textarea.js +1 -0
- package/dist/react/ui/textarea.js.map +1 -1
- package/dist/react/ui/toggle-group.d.ts +4 -3
- package/dist/react/ui/toggle-group.d.ts.map +1 -1
- package/dist/react/ui/toggle-group.js +1 -0
- package/dist/react/ui/toggle-group.js.map +1 -1
- package/dist/react/ui/toggle.d.ts +3 -2
- package/dist/react/ui/toggle.d.ts.map +1 -1
- package/dist/react/ui/toggle.js +1 -0
- package/dist/react/ui/toggle.js.map +1 -1
- package/dist/react/ui/tooltip.d.ts +7 -5
- package/dist/react/ui/tooltip.d.ts.map +1 -1
- package/dist/react/ui/tooltip.js +2 -0
- package/dist/react/ui/tooltip.js.map +1 -1
- package/docs/docs/api/appkit/Class.AppKitError/index.html +77 -0
- package/docs/docs/api/appkit/Class.AppKitError.md +154 -0
- package/docs/docs/api/appkit/Class.AuthenticationError/index.html +110 -0
- package/docs/docs/api/appkit/Class.AuthenticationError.md +236 -0
- package/docs/docs/api/appkit/Class.ConfigurationError/index.html +112 -0
- package/docs/docs/api/appkit/Class.ConfigurationError.md +243 -0
- package/docs/docs/api/appkit/Class.ConnectionError/index.html +120 -0
- package/docs/docs/api/appkit/Class.ConnectionError.md +265 -0
- package/docs/docs/api/appkit/Class.ExecutionError/index.html +116 -0
- package/docs/docs/api/appkit/Class.ExecutionError.md +250 -0
- package/docs/docs/api/appkit/Class.InitializationError/index.html +104 -0
- package/docs/docs/api/appkit/Class.InitializationError.md +222 -0
- package/docs/docs/api/appkit/Class.Plugin/index.html +149 -0
- package/docs/docs/api/appkit/Class.Plugin.md +392 -0
- package/docs/docs/api/appkit/Class.ServerError/index.html +108 -0
- package/docs/docs/api/appkit/Class.ServerError.md +229 -0
- package/docs/docs/api/appkit/Class.TunnelError/index.html +108 -0
- package/docs/docs/api/appkit/Class.TunnelError.md +231 -0
- package/docs/docs/api/appkit/Class.ValidationError/index.html +106 -0
- package/docs/docs/api/appkit/Class.ValidationError.md +225 -0
- package/docs/docs/api/appkit/Function.appKitTypesPlugin/index.html +24 -0
- package/docs/docs/api/appkit/Function.appKitTypesPlugin.md +20 -0
- package/docs/docs/api/appkit/Function.createApp/index.html +24 -0
- package/docs/docs/api/appkit/Function.createApp.md +31 -0
- package/docs/docs/api/appkit/Function.isSQLTypeMarker/index.html +25 -0
- package/docs/docs/api/appkit/Function.isSQLTypeMarker.md +32 -0
- package/docs/docs/api/appkit/Interface.BasePluginConfig/index.html +28 -0
- package/docs/docs/api/appkit/Interface.BasePluginConfig.md +37 -0
- package/docs/docs/api/appkit/Interface.CacheConfig/index.html +63 -0
- package/docs/docs/api/appkit/Interface.CacheConfig.md +131 -0
- package/docs/docs/api/appkit/Interface.ITelemetry/index.html +73 -0
- package/docs/docs/api/appkit/Interface.ITelemetry.md +144 -0
- package/docs/docs/api/appkit/Interface.StreamExecutionSettings/index.html +26 -0
- package/docs/docs/api/appkit/Interface.StreamExecutionSettings.md +30 -0
- package/docs/docs/api/appkit/Interface.TelemetryConfig/index.html +32 -0
- package/docs/docs/api/appkit/Interface.TelemetryConfig.md +48 -0
- package/docs/docs/api/appkit/TypeAlias.IAppRouter/index.html +18 -0
- package/docs/docs/api/appkit/TypeAlias.IAppRouter.md +8 -0
- package/docs/docs/api/appkit/Variable.sql/index.html +98 -0
- package/docs/docs/api/appkit/Variable.sql.md +260 -0
- package/docs/docs/api/appkit/index.html +28 -0
- package/docs/docs/api/appkit-ui/data/AreaChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/AreaChart.md +79 -0
- package/docs/docs/api/appkit-ui/data/BarChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/BarChart.md +74 -0
- package/docs/docs/api/appkit-ui/data/DataTable/index.html +36 -0
- package/docs/docs/api/appkit-ui/data/DataTable.md +69 -0
- package/docs/docs/api/appkit-ui/data/DonutChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/DonutChart.md +72 -0
- package/docs/docs/api/appkit-ui/data/HeatmapChart/index.html +35 -0
- package/docs/docs/api/appkit-ui/data/HeatmapChart.md +91 -0
- package/docs/docs/api/appkit-ui/data/LineChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/LineChart.md +77 -0
- package/docs/docs/api/appkit-ui/data/PieChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/PieChart.md +72 -0
- package/docs/docs/api/appkit-ui/data/RadarChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/RadarChart.md +74 -0
- package/docs/docs/api/appkit-ui/data/ScatterChart/index.html +29 -0
- package/docs/docs/api/appkit-ui/data/ScatterChart.md +76 -0
- package/docs/docs/api/appkit-ui/index.html +23 -0
- package/docs/docs/api/appkit-ui/styling/index.html +74 -0
- package/docs/docs/api/appkit-ui/styling.md +81 -0
- package/docs/docs/api/appkit-ui/ui/Accordion/index.html +48 -0
- package/docs/docs/api/appkit-ui/ui/Accordion.md +139 -0
- package/docs/docs/api/appkit-ui/ui/Alert/index.html +41 -0
- package/docs/docs/api/appkit-ui/ui/Alert.md +89 -0
- package/docs/docs/api/appkit-ui/ui/AlertDialog/index.html +97 -0
- package/docs/docs/api/appkit-ui/ui/AlertDialog.md +282 -0
- package/docs/docs/api/appkit-ui/ui/AspectRatio/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/AspectRatio.md +46 -0
- package/docs/docs/api/appkit-ui/ui/Avatar/index.html +41 -0
- package/docs/docs/api/appkit-ui/ui/Avatar.md +90 -0
- package/docs/docs/api/appkit-ui/ui/Badge/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Badge.md +38 -0
- package/docs/docs/api/appkit-ui/ui/Breadcrumb/index.html +69 -0
- package/docs/docs/api/appkit-ui/ui/Breadcrumb.md +193 -0
- package/docs/docs/api/appkit-ui/ui/Button/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Button.md +39 -0
- package/docs/docs/api/appkit-ui/ui/ButtonGroup/index.html +38 -0
- package/docs/docs/api/appkit-ui/ui/ButtonGroup.md +68 -0
- package/docs/docs/api/appkit-ui/ui/Calendar/index.html +34 -0
- package/docs/docs/api/appkit-ui/ui/Calendar.md +154 -0
- package/docs/docs/api/appkit-ui/ui/Card/index.html +69 -0
- package/docs/docs/api/appkit-ui/ui/Card.md +222 -0
- package/docs/docs/api/appkit-ui/ui/Carousel/index.html +55 -0
- package/docs/docs/api/appkit-ui/ui/Carousel.md +152 -0
- package/docs/docs/api/appkit-ui/ui/ChartContainer/index.html +58 -0
- package/docs/docs/api/appkit-ui/ui/ChartContainer.md +343 -0
- package/docs/docs/api/appkit-ui/ui/Checkbox/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Checkbox.md +53 -0
- package/docs/docs/api/appkit-ui/ui/Collapsible/index.html +41 -0
- package/docs/docs/api/appkit-ui/ui/Collapsible.md +125 -0
- package/docs/docs/api/appkit-ui/ui/Command/index.html +83 -0
- package/docs/docs/api/appkit-ui/ui/Command.md +287 -0
- package/docs/docs/api/appkit-ui/ui/ContextMenu/index.html +111 -0
- package/docs/docs/api/appkit-ui/ui/ContextMenu.md +419 -0
- package/docs/docs/api/appkit-ui/ui/Dialog/index.html +90 -0
- package/docs/docs/api/appkit-ui/ui/Dialog.md +285 -0
- package/docs/docs/api/appkit-ui/ui/Drawer/index.html +90 -0
- package/docs/docs/api/appkit-ui/ui/Drawer.md +387 -0
- package/docs/docs/api/appkit-ui/ui/DropdownMenu/index.html +111 -0
- package/docs/docs/api/appkit-ui/ui/DropdownMenu.md +478 -0
- package/docs/docs/api/appkit-ui/ui/Empty/index.html +54 -0
- package/docs/docs/api/appkit-ui/ui/Empty.md +109 -0
- package/docs/docs/api/appkit-ui/ui/Field/index.html +87 -0
- package/docs/docs/api/appkit-ui/ui/Field.md +201 -0
- package/docs/docs/api/appkit-ui/ui/FormControl/index.html +59 -0
- package/docs/docs/api/appkit-ui/ui/FormControl.md +128 -0
- package/docs/docs/api/appkit-ui/ui/HoverCard/index.html +39 -0
- package/docs/docs/api/appkit-ui/ui/HoverCard.md +131 -0
- package/docs/docs/api/appkit-ui/ui/Input/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Input.md +35 -0
- package/docs/docs/api/appkit-ui/ui/InputGroup/index.html +59 -0
- package/docs/docs/api/appkit-ui/ui/InputGroup.md +123 -0
- package/docs/docs/api/appkit-ui/ui/InputOTP/index.html +48 -0
- package/docs/docs/api/appkit-ui/ui/InputOTP.md +124 -0
- package/docs/docs/api/appkit-ui/ui/Item/index.html +78 -0
- package/docs/docs/api/appkit-ui/ui/Item.md +185 -0
- package/docs/docs/api/appkit-ui/ui/Kbd/index.html +30 -0
- package/docs/docs/api/appkit-ui/ui/Kbd.md +39 -0
- package/docs/docs/api/appkit-ui/ui/Label/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Label.md +44 -0
- package/docs/docs/api/appkit-ui/ui/Menubar/index.html +117 -0
- package/docs/docs/api/appkit-ui/ui/Menubar.md +484 -0
- package/docs/docs/api/appkit-ui/ui/NavigationMenu/index.html +76 -0
- package/docs/docs/api/appkit-ui/ui/NavigationMenu.md +338 -0
- package/docs/docs/api/appkit-ui/ui/Pagination/index.html +69 -0
- package/docs/docs/api/appkit-ui/ui/Pagination.md +191 -0
- package/docs/docs/api/appkit-ui/ui/Popover/index.html +45 -0
- package/docs/docs/api/appkit-ui/ui/Popover.md +173 -0
- package/docs/docs/api/appkit-ui/ui/Progress/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Progress.md +51 -0
- package/docs/docs/api/appkit-ui/ui/RadioGroup/index.html +33 -0
- package/docs/docs/api/appkit-ui/ui/RadioGroup.md +83 -0
- package/docs/docs/api/appkit-ui/ui/ResizableHandle/index.html +41 -0
- package/docs/docs/api/appkit-ui/ui/ResizableHandle.md +136 -0
- package/docs/docs/api/appkit-ui/ui/ScrollArea/index.html +34 -0
- package/docs/docs/api/appkit-ui/ui/ScrollArea.md +83 -0
- package/docs/docs/api/appkit-ui/ui/Select/index.html +82 -0
- package/docs/docs/api/appkit-ui/ui/Select.md +267 -0
- package/docs/docs/api/appkit-ui/ui/Separator/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Separator.md +56 -0
- package/docs/docs/api/appkit-ui/ui/Sheet/index.html +76 -0
- package/docs/docs/api/appkit-ui/ui/Sheet.md +236 -0
- package/docs/docs/api/appkit-ui/ui/Sidebar/index.html +183 -0
- package/docs/docs/api/appkit-ui/ui/Sidebar.md +490 -0
- package/docs/docs/api/appkit-ui/ui/Skeleton/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Skeleton.md +43 -0
- package/docs/docs/api/appkit-ui/ui/Slider/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Slider.md +61 -0
- package/docs/docs/api/appkit-ui/ui/Spinner/index.html +24 -0
- package/docs/docs/api/appkit-ui/ui/Spinner.md +22 -0
- package/docs/docs/api/appkit-ui/ui/Switch/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Switch.md +46 -0
- package/docs/docs/api/appkit-ui/ui/Table/index.html +69 -0
- package/docs/docs/api/appkit-ui/ui/Table.md +236 -0
- package/docs/docs/api/appkit-ui/ui/Tabs/index.html +48 -0
- package/docs/docs/api/appkit-ui/ui/Tabs.md +177 -0
- package/docs/docs/api/appkit-ui/ui/Textarea/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Textarea.md +35 -0
- package/docs/docs/api/appkit-ui/ui/Toaster/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Toaster.md +75 -0
- package/docs/docs/api/appkit-ui/ui/Toggle/index.html +27 -0
- package/docs/docs/api/appkit-ui/ui/Toggle.md +48 -0
- package/docs/docs/api/appkit-ui/ui/ToggleGroup/index.html +33 -0
- package/docs/docs/api/appkit-ui/ui/ToggleGroup.md +88 -0
- package/docs/docs/api/appkit-ui/ui/Tooltip/index.html +46 -0
- package/docs/docs/api/appkit-ui/ui/Tooltip.md +134 -0
- package/docs/docs/api/appkit-ui.md +15 -0
- package/docs/docs/api/appkit.md +48 -0
- package/docs/docs/api/index.html +28 -0
- package/docs/docs/api.md +24 -0
- package/docs/docs/app-management/index.html +106 -0
- package/docs/docs/app-management.md +171 -0
- package/docs/docs/architecture/index.html +71 -0
- package/docs/docs/architecture.md +69 -0
- package/docs/docs/category/development/index.html +16 -0
- package/docs/docs/category/development.md +3 -0
- package/docs/docs/configuration/index.html +66 -0
- package/docs/docs/configuration.md +150 -0
- package/docs/docs/core-principles/index.html +38 -0
- package/docs/docs/core-principles.md +31 -0
- package/docs/docs/development/index.html +34 -0
- package/docs/docs/development/llm-guide/index.html +74 -0
- package/docs/docs/development/llm-guide.md +74 -0
- package/docs/docs/development/local-development/index.html +27 -0
- package/docs/docs/development/local-development.md +20 -0
- package/docs/docs/development/project-setup/index.html +69 -0
- package/docs/docs/development/project-setup.md +246 -0
- package/docs/docs/development/remote-bridge/index.html +76 -0
- package/docs/docs/development/remote-bridge.md +80 -0
- package/docs/docs/development/type-generation/index.html +65 -0
- package/docs/docs/development/type-generation.md +110 -0
- package/docs/docs/development.md +21 -0
- package/docs/docs/index.html +58 -0
- package/docs/docs/plugins/index.html +151 -0
- package/docs/docs/plugins.md +313 -0
- package/docs/docs.md +64 -0
- package/llms.txt +121 -1228
- package/package.json +7 -5
- package/scripts/postinstall.js +1 -1
- package/AGENTS.md +0 -1231
- package/bin/setup-claude.js +0 -190
package/NOTICE.md
CHANGED
|
@@ -55,12 +55,12 @@ This Software contains code from the following open source projects:
|
|
|
55
55
|
| [class-variance-authority](https://www.npmjs.com/package/class-variance-authority) | 0.7.1 | Apache-2.0 | https://github.com/joe-bell/cva#readme |
|
|
56
56
|
| [clsx](https://www.npmjs.com/package/clsx) | 2.1.1 | MIT | https://github.com/lukeed/clsx#readme |
|
|
57
57
|
| [cmdk](https://www.npmjs.com/package/cmdk) | 1.1.1 | MIT | https://github.com/pacocoursey/cmdk#readme |
|
|
58
|
+
| [commander](https://www.npmjs.com/package/commander) | 2.20.3, 5.1.0, 7.2.0, 8.3.0, 10.0.1, 12.1.0 | MIT | https://github.com/tj/commander.js#readme |
|
|
58
59
|
| [date-fns](https://www.npmjs.com/package/date-fns) | 4.1.0 | MIT | https://github.com/date-fns/date-fns#readme |
|
|
59
60
|
| [dotenv](https://www.npmjs.com/package/dotenv) | 16.6.1 | BSD-2-Clause | https://github.com/motdotla/dotenv#readme |
|
|
60
61
|
| [echarts-for-react](https://www.npmjs.com/package/echarts-for-react) | 3.0.5 | MIT | https://github.com/hustcc/echarts-for-react |
|
|
61
62
|
| [embla-carousel-react](https://www.npmjs.com/package/embla-carousel-react) | 8.6.0 | MIT | https://www.embla-carousel.com |
|
|
62
63
|
| [express](https://www.npmjs.com/package/express) | 4.22.0 | MIT | http://expressjs.com/ |
|
|
63
|
-
| [fast-glob](https://www.npmjs.com/package/fast-glob) | 3.3.3 | MIT | https://github.com/mrmlnc/fast-glob#readme |
|
|
64
64
|
| [input-otp](https://www.npmjs.com/package/input-otp) | 1.4.2 | MIT | https://input-otp.rodz.dev/ |
|
|
65
65
|
| [lucide-react](https://www.npmjs.com/package/lucide-react) | 0.554.0 | ISC | https://lucide.dev |
|
|
66
66
|
| [next-themes](https://www.npmjs.com/package/next-themes) | 0.4.6 | MIT | https://github.com/pacocoursey/next-themes#readme |
|
package/bin/appkit.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
|
|
6
|
+
//#region src/cli/commands/docs.ts
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = path.dirname(__filename);
|
|
9
|
+
function findPackageRoot() {
|
|
10
|
+
let dir = __dirname;
|
|
11
|
+
while (dir !== path.parse(dir).root) {
|
|
12
|
+
if (fs.existsSync(path.join(dir, "package.json"))) return dir;
|
|
13
|
+
dir = path.dirname(dir);
|
|
14
|
+
}
|
|
15
|
+
throw new Error("Could not find package root");
|
|
16
|
+
}
|
|
17
|
+
function runDocs(docPath) {
|
|
18
|
+
const packageRoot = findPackageRoot();
|
|
19
|
+
if (!docPath) {
|
|
20
|
+
const llmsPath = path.join(packageRoot, "llms.txt");
|
|
21
|
+
if (!fs.existsSync(llmsPath)) {
|
|
22
|
+
console.error("Error: llms.txt not found in package");
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const content = fs.readFileSync(llmsPath, "utf-8");
|
|
26
|
+
console.log(content);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
let normalizedPath = docPath;
|
|
30
|
+
normalizedPath = normalizedPath.replace(/^\.\//, "");
|
|
31
|
+
normalizedPath = normalizedPath.replace(/^\//, "");
|
|
32
|
+
normalizedPath = normalizedPath.replace(/^appkit\/docs\//, "");
|
|
33
|
+
normalizedPath = normalizedPath.replace(/^docs\//, "");
|
|
34
|
+
const fullPath = path.join(packageRoot, "docs", normalizedPath);
|
|
35
|
+
if (!fs.existsSync(fullPath)) {
|
|
36
|
+
console.error(`Error: Documentation file not found: ${docPath}`);
|
|
37
|
+
console.error(`Tried: ${fullPath}`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
41
|
+
console.log(content);
|
|
42
|
+
}
|
|
43
|
+
const docsCommand = new Command("docs").description("Display embedded documentation").argument("[path]", "Path to specific documentation file (e.g., /appkit/docs/api/appkit-ui/components/Sidebar.md)").action(runDocs);
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
export { docsCommand };
|
|
47
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","names":[],"sources":["../../../src/cli/commands/docs.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction findPackageRoot(): string {\n let dir = __dirname;\n while (dir !== path.parse(dir).root) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n throw new Error(\"Could not find package root\");\n}\n\nfunction runDocs(docPath?: string) {\n const packageRoot = findPackageRoot();\n\n if (!docPath) {\n // Display llms.txt by default\n const llmsPath = path.join(packageRoot, \"llms.txt\");\n\n if (!fs.existsSync(llmsPath)) {\n console.error(\"Error: llms.txt not found in package\");\n process.exit(1);\n }\n\n const content = fs.readFileSync(llmsPath, \"utf-8\");\n console.log(content);\n return;\n }\n\n // Handle path - remove leading ./ and / first, then strip prefixes\n let normalizedPath = docPath;\n\n // Strip leading ./ or /\n normalizedPath = normalizedPath.replace(/^\\.\\//, \"\");\n normalizedPath = normalizedPath.replace(/^\\//, \"\");\n\n // Remove /appkit/docs/ or docs/ prefix since files are in packageRoot/docs/\n normalizedPath = normalizedPath.replace(/^appkit\\/docs\\//, \"\");\n normalizedPath = normalizedPath.replace(/^docs\\//, \"\");\n\n const fullPath = path.join(packageRoot, \"docs\", normalizedPath);\n\n if (!fs.existsSync(fullPath)) {\n console.error(`Error: Documentation file not found: ${docPath}`);\n console.error(`Tried: ${fullPath}`);\n process.exit(1);\n }\n\n const content = fs.readFileSync(fullPath, \"utf-8\");\n console.log(content);\n}\n\nexport const docsCommand = new Command(\"docs\")\n .description(\"Display embedded documentation\")\n .argument(\n \"[path]\",\n \"Path to specific documentation file (e.g., /appkit/docs/api/appkit-ui/components/Sidebar.md)\",\n )\n .action(runDocs);\n"],"mappings":";;;;;;AAKA,MAAM,aAAa,cAAc,OAAO,KAAK,IAAI;AACjD,MAAM,YAAY,KAAK,QAAQ,WAAW;AAE1C,SAAS,kBAA0B;CACjC,IAAI,MAAM;AACV,QAAO,QAAQ,KAAK,MAAM,IAAI,CAAC,MAAM;AACnC,MAAI,GAAG,WAAW,KAAK,KAAK,KAAK,eAAe,CAAC,CAC/C,QAAO;AAET,QAAM,KAAK,QAAQ,IAAI;;AAEzB,OAAM,IAAI,MAAM,8BAA8B;;AAGhD,SAAS,QAAQ,SAAkB;CACjC,MAAM,cAAc,iBAAiB;AAErC,KAAI,CAAC,SAAS;EAEZ,MAAM,WAAW,KAAK,KAAK,aAAa,WAAW;AAEnD,MAAI,CAAC,GAAG,WAAW,SAAS,EAAE;AAC5B,WAAQ,MAAM,uCAAuC;AACrD,WAAQ,KAAK,EAAE;;EAGjB,MAAM,UAAU,GAAG,aAAa,UAAU,QAAQ;AAClD,UAAQ,IAAI,QAAQ;AACpB;;CAIF,IAAI,iBAAiB;AAGrB,kBAAiB,eAAe,QAAQ,SAAS,GAAG;AACpD,kBAAiB,eAAe,QAAQ,OAAO,GAAG;AAGlD,kBAAiB,eAAe,QAAQ,mBAAmB,GAAG;AAC9D,kBAAiB,eAAe,QAAQ,WAAW,GAAG;CAEtD,MAAM,WAAW,KAAK,KAAK,aAAa,QAAQ,eAAe;AAE/D,KAAI,CAAC,GAAG,WAAW,SAAS,EAAE;AAC5B,UAAQ,MAAM,wCAAwC,UAAU;AAChE,UAAQ,MAAM,UAAU,WAAW;AACnC,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,GAAG,aAAa,UAAU,QAAQ;AAClD,SAAQ,IAAI,QAAQ;;AAGtB,MAAa,cAAc,IAAI,QAAQ,OAAO,CAC3C,YAAY,iCAAiC,CAC7C,SACC,UACA,+FACD,CACA,OAAO,QAAQ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/generate-types.ts
|
|
5
|
+
/**
|
|
6
|
+
* Generate types command implementation
|
|
7
|
+
*/
|
|
8
|
+
async function runGenerateTypes(rootDir, outFile, warehouseId, options) {
|
|
9
|
+
try {
|
|
10
|
+
const { generateFromEntryPoint } = await import("@databricks/appkit/type-generator");
|
|
11
|
+
const resolvedRootDir = rootDir || process.cwd();
|
|
12
|
+
const resolvedOutFile = outFile || path.join(process.cwd(), "client/src/appKitTypes.d.ts");
|
|
13
|
+
const queryFolder = path.join(resolvedRootDir, "config/queries");
|
|
14
|
+
const resolvedWarehouseId = warehouseId || process.env.DATABRICKS_WAREHOUSE_ID;
|
|
15
|
+
if (!resolvedWarehouseId) {
|
|
16
|
+
console.error("Error: DATABRICKS_WAREHOUSE_ID is not set. Please provide it as an argument or environment variable.");
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
await generateFromEntryPoint({
|
|
20
|
+
queryFolder,
|
|
21
|
+
outFile: resolvedOutFile,
|
|
22
|
+
warehouseId: resolvedWarehouseId,
|
|
23
|
+
noCache: options?.noCache || false
|
|
24
|
+
});
|
|
25
|
+
} catch (error) {
|
|
26
|
+
if (error instanceof Error && error.message.includes("Cannot find module")) {
|
|
27
|
+
console.error("Error: The 'generate-types' command is only available in @databricks/appkit.");
|
|
28
|
+
console.error("Please install @databricks/appkit to use this command.");
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const generateTypesCommand = new Command("generate-types").description("Generate TypeScript types from SQL queries").argument("[rootDir]", "Root directory of the project", process.cwd()).argument("[outFile]", "Output file path", path.join(process.cwd(), "client/src/appKitTypes.d.ts")).argument("[warehouseId]", "Databricks warehouse ID").option("--no-cache", "Disable caching for type generation").action(runGenerateTypes);
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { generateTypesCommand };
|
|
38
|
+
//# sourceMappingURL=generate-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-types.js","names":[],"sources":["../../../src/cli/commands/generate-types.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport path from \"node:path\";\n\n/**\n * Generate types command implementation\n */\nasync function runGenerateTypes(\n rootDir?: string,\n outFile?: string,\n warehouseId?: string,\n options?: { noCache?: boolean },\n) {\n try {\n // Try to import the type generator from @databricks/appkit\n const { generateFromEntryPoint } = await import(\n \"@databricks/appkit/type-generator\"\n );\n\n const resolvedRootDir = rootDir || process.cwd();\n const resolvedOutFile =\n outFile || path.join(process.cwd(), \"client/src/appKitTypes.d.ts\");\n\n const queryFolder = path.join(resolvedRootDir, \"config/queries\");\n\n const resolvedWarehouseId =\n warehouseId || process.env.DATABRICKS_WAREHOUSE_ID;\n if (!resolvedWarehouseId) {\n console.error(\n \"Error: DATABRICKS_WAREHOUSE_ID is not set. Please provide it as an argument or environment variable.\",\n );\n process.exit(1);\n }\n\n await generateFromEntryPoint({\n queryFolder,\n outFile: resolvedOutFile,\n warehouseId: resolvedWarehouseId,\n noCache: options?.noCache || false,\n });\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\"Cannot find module\")\n ) {\n console.error(\n \"Error: The 'generate-types' command is only available in @databricks/appkit.\",\n );\n console.error(\"Please install @databricks/appkit to use this command.\");\n process.exit(1);\n }\n throw error;\n }\n}\n\nexport const generateTypesCommand = new Command(\"generate-types\")\n .description(\"Generate TypeScript types from SQL queries\")\n .argument(\"[rootDir]\", \"Root directory of the project\", process.cwd())\n .argument(\n \"[outFile]\",\n \"Output file path\",\n path.join(process.cwd(), \"client/src/appKitTypes.d.ts\"),\n )\n .argument(\"[warehouseId]\", \"Databricks warehouse ID\")\n .option(\"--no-cache\", \"Disable caching for type generation\")\n .action(runGenerateTypes);\n"],"mappings":";;;;;;;AAMA,eAAe,iBACb,SACA,SACA,aACA,SACA;AACA,KAAI;EAEF,MAAM,EAAE,2BAA2B,MAAM,OACvC;EAGF,MAAM,kBAAkB,WAAW,QAAQ,KAAK;EAChD,MAAM,kBACJ,WAAW,KAAK,KAAK,QAAQ,KAAK,EAAE,8BAA8B;EAEpE,MAAM,cAAc,KAAK,KAAK,iBAAiB,iBAAiB;EAEhE,MAAM,sBACJ,eAAe,QAAQ,IAAI;AAC7B,MAAI,CAAC,qBAAqB;AACxB,WAAQ,MACN,uGACD;AACD,WAAQ,KAAK,EAAE;;AAGjB,QAAM,uBAAuB;GAC3B;GACA,SAAS;GACT,aAAa;GACb,SAAS,SAAS,WAAW;GAC9B,CAAC;UACK,OAAO;AACd,MACE,iBAAiB,SACjB,MAAM,QAAQ,SAAS,qBAAqB,EAC5C;AACA,WAAQ,MACN,+EACD;AACD,WAAQ,MAAM,yDAAyD;AACvE,WAAQ,KAAK,EAAE;;AAEjB,QAAM;;;AAIV,MAAa,uBAAuB,IAAI,QAAQ,iBAAiB,CAC9D,YAAY,6CAA6C,CACzD,SAAS,aAAa,iCAAiC,QAAQ,KAAK,CAAC,CACrE,SACC,aACA,oBACA,KAAK,KAAK,QAAQ,KAAK,EAAE,8BAA8B,CACxD,CACA,SAAS,iBAAiB,0BAA0B,CACpD,OAAO,cAAc,sCAAsC,CAC3D,OAAO,iBAAiB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { Lang, parse } from "@ast-grep/napi";
|
|
5
|
+
|
|
6
|
+
//#region src/cli/commands/lint.ts
|
|
7
|
+
const rules = [
|
|
8
|
+
{
|
|
9
|
+
id: "no-double-type-assertion",
|
|
10
|
+
pattern: "$X as unknown as $Y",
|
|
11
|
+
message: "Avoid double type assertion (as unknown as). Use proper type guards or fix the source type."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: "no-as-any",
|
|
15
|
+
pattern: "$X as any",
|
|
16
|
+
message: "Avoid \"as any\" type assertion. Use proper typing or unknown with type guards.",
|
|
17
|
+
includeTests: false
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "no-array-index-key",
|
|
21
|
+
pattern: "key={$IDX}",
|
|
22
|
+
message: "Avoid using array index as React key. Use a stable unique identifier.",
|
|
23
|
+
filter: (code) => /key=\{(idx|index|i)\}/.test(code)
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "no-parse-float-without-validation",
|
|
27
|
+
pattern: "parseFloat($X).toFixed($Y)",
|
|
28
|
+
message: "parseFloat can return NaN. Validate input or use toNumber() helper from shared/types.ts."
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
function isTestFile(filePath) {
|
|
32
|
+
return /\.(test|spec)\.(ts|tsx)$/.test(filePath) || filePath.includes("/tests/");
|
|
33
|
+
}
|
|
34
|
+
function findTsFiles(dir, files = []) {
|
|
35
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const fullPath = path.join(dir, entry.name);
|
|
38
|
+
if (entry.isDirectory()) {
|
|
39
|
+
if ([
|
|
40
|
+
"node_modules",
|
|
41
|
+
"dist",
|
|
42
|
+
"build",
|
|
43
|
+
".git"
|
|
44
|
+
].includes(entry.name)) continue;
|
|
45
|
+
findTsFiles(fullPath, files);
|
|
46
|
+
} else if (entry.isFile() && /\.(ts|tsx)$/.test(entry.name)) files.push(fullPath);
|
|
47
|
+
}
|
|
48
|
+
return files;
|
|
49
|
+
}
|
|
50
|
+
function lintFile(filePath, rules) {
|
|
51
|
+
const violations = [];
|
|
52
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
53
|
+
const lang = filePath.endsWith(".tsx") ? Lang.Tsx : Lang.TypeScript;
|
|
54
|
+
const testFile = isTestFile(filePath);
|
|
55
|
+
const root = parse(lang, content).root();
|
|
56
|
+
for (const rule of rules) {
|
|
57
|
+
if (testFile && rule.includeTests === false) continue;
|
|
58
|
+
const matches = root.findAll(rule.pattern);
|
|
59
|
+
for (const match of matches) {
|
|
60
|
+
const code = match.text();
|
|
61
|
+
if (rule.filter && !rule.filter(code)) continue;
|
|
62
|
+
const range = match.range();
|
|
63
|
+
violations.push({
|
|
64
|
+
file: filePath,
|
|
65
|
+
line: range.start.line + 1,
|
|
66
|
+
column: range.start.column + 1,
|
|
67
|
+
rule: rule.id,
|
|
68
|
+
message: rule.message,
|
|
69
|
+
code: code.length > 80 ? `${code.slice(0, 77)}...` : code
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return violations;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Lint command implementation
|
|
77
|
+
*/
|
|
78
|
+
function runLint() {
|
|
79
|
+
const rootDir = process.cwd();
|
|
80
|
+
const files = findTsFiles(rootDir);
|
|
81
|
+
console.log(`Scanning ${files.length} TypeScript files...\n`);
|
|
82
|
+
const allViolations = [];
|
|
83
|
+
for (const file of files) {
|
|
84
|
+
const violations = lintFile(file, rules);
|
|
85
|
+
allViolations.push(...violations);
|
|
86
|
+
}
|
|
87
|
+
if (allViolations.length === 0) {
|
|
88
|
+
console.log("No ast-grep lint violations found.");
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
console.log(`Found ${allViolations.length} violation(s):\n`);
|
|
92
|
+
for (const v of allViolations) {
|
|
93
|
+
const relPath = path.relative(rootDir, v.file);
|
|
94
|
+
console.log(`${relPath}:${v.line}:${v.column}`);
|
|
95
|
+
console.log(` ${v.rule}: ${v.message}`);
|
|
96
|
+
console.log(` > ${v.code}\n`);
|
|
97
|
+
}
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
const lintCommand = new Command("lint").description("Run AST-based linting on TypeScript files").action(runLint);
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
export { lintCommand };
|
|
104
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","names":[],"sources":["../../../src/cli/commands/lint.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { parse, Lang } from \"@ast-grep/napi\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\ninterface Rule {\n id: string;\n pattern: string;\n message: string;\n includeTests?: boolean;\n filter?: (code: string) => boolean;\n}\n\nconst rules: Rule[] = [\n {\n id: \"no-double-type-assertion\",\n pattern: \"$X as unknown as $Y\",\n message:\n \"Avoid double type assertion (as unknown as). Use proper type guards or fix the source type.\",\n },\n {\n id: \"no-as-any\",\n pattern: \"$X as any\",\n message:\n 'Avoid \"as any\" type assertion. Use proper typing or unknown with type guards.',\n includeTests: false, // acceptable in test mocks\n },\n {\n id: \"no-array-index-key\",\n pattern: \"key={$IDX}\",\n message:\n \"Avoid using array index as React key. Use a stable unique identifier.\",\n filter: (code) => /key=\\{(idx|index|i)\\}/.test(code),\n },\n {\n id: \"no-parse-float-without-validation\",\n pattern: \"parseFloat($X).toFixed($Y)\",\n message:\n \"parseFloat can return NaN. Validate input or use toNumber() helper from shared/types.ts.\",\n },\n];\n\nfunction isTestFile(filePath: string): boolean {\n return (\n /\\.(test|spec)\\.(ts|tsx)$/.test(filePath) || filePath.includes(\"/tests/\")\n );\n}\n\nfunction findTsFiles(dir: string, files: string[] = []): string[] {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if ([\"node_modules\", \"dist\", \"build\", \".git\"].includes(entry.name))\n continue;\n findTsFiles(fullPath, files);\n } else if (entry.isFile() && /\\.(ts|tsx)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\ninterface Violation {\n file: string;\n line: number;\n column: number;\n rule: string;\n message: string;\n code: string;\n}\n\nfunction lintFile(filePath: string, rules: Rule[]): Violation[] {\n const violations: Violation[] = [];\n const content = fs.readFileSync(filePath, \"utf-8\");\n const lang = filePath.endsWith(\".tsx\") ? Lang.Tsx : Lang.TypeScript;\n const testFile = isTestFile(filePath);\n\n const ast = parse(lang, content);\n const root = ast.root();\n\n for (const rule of rules) {\n // skip rules that don't apply to test files\n if (testFile && rule.includeTests === false) continue;\n\n const matches = root.findAll(rule.pattern);\n\n for (const match of matches) {\n const code = match.text();\n\n if (rule.filter && !rule.filter(code)) continue;\n\n const range = match.range();\n violations.push({\n file: filePath,\n line: range.start.line + 1,\n column: range.start.column + 1,\n rule: rule.id,\n message: rule.message,\n code: code.length > 80 ? `${code.slice(0, 77)}...` : code,\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Lint command implementation\n */\nfunction runLint() {\n const rootDir = process.cwd();\n const files = findTsFiles(rootDir);\n\n console.log(`Scanning ${files.length} TypeScript files...\\n`);\n\n const allViolations: Violation[] = [];\n\n for (const file of files) {\n const violations = lintFile(file, rules);\n allViolations.push(...violations);\n }\n\n if (allViolations.length === 0) {\n console.log(\"No ast-grep lint violations found.\");\n process.exit(0);\n }\n\n console.log(`Found ${allViolations.length} violation(s):\\n`);\n\n for (const v of allViolations) {\n const relPath = path.relative(rootDir, v.file);\n console.log(`${relPath}:${v.line}:${v.column}`);\n console.log(` ${v.rule}: ${v.message}`);\n console.log(` > ${v.code}\\n`);\n }\n\n process.exit(1);\n}\n\nexport const lintCommand = new Command(\"lint\")\n .description(\"Run AST-based linting on TypeScript files\")\n .action(runLint);\n"],"mappings":";;;;;;AAaA,MAAM,QAAgB;CACpB;EACE,IAAI;EACJ,SAAS;EACT,SACE;EACH;CACD;EACE,IAAI;EACJ,SAAS;EACT,SACE;EACF,cAAc;EACf;CACD;EACE,IAAI;EACJ,SAAS;EACT,SACE;EACF,SAAS,SAAS,wBAAwB,KAAK,KAAK;EACrD;CACD;EACE,IAAI;EACJ,SAAS;EACT,SACE;EACH;CACF;AAED,SAAS,WAAW,UAA2B;AAC7C,QACE,2BAA2B,KAAK,SAAS,IAAI,SAAS,SAAS,UAAU;;AAI7E,SAAS,YAAY,KAAa,QAAkB,EAAE,EAAY;CAChE,MAAM,UAAU,GAAG,YAAY,KAAK,EAAE,eAAe,MAAM,CAAC;AAE5D,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK;AAE3C,MAAI,MAAM,aAAa,EAAE;AACvB,OAAI;IAAC;IAAgB;IAAQ;IAAS;IAAO,CAAC,SAAS,MAAM,KAAK,CAChE;AACF,eAAY,UAAU,MAAM;aACnB,MAAM,QAAQ,IAAI,cAAc,KAAK,MAAM,KAAK,CACzD,OAAM,KAAK,SAAS;;AAIxB,QAAO;;AAYT,SAAS,SAAS,UAAkB,OAA4B;CAC9D,MAAM,aAA0B,EAAE;CAClC,MAAM,UAAU,GAAG,aAAa,UAAU,QAAQ;CAClD,MAAM,OAAO,SAAS,SAAS,OAAO,GAAG,KAAK,MAAM,KAAK;CACzD,MAAM,WAAW,WAAW,SAAS;CAGrC,MAAM,OADM,MAAM,MAAM,QAAQ,CACf,MAAM;AAEvB,MAAK,MAAM,QAAQ,OAAO;AAExB,MAAI,YAAY,KAAK,iBAAiB,MAAO;EAE7C,MAAM,UAAU,KAAK,QAAQ,KAAK,QAAQ;AAE1C,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,OAAO,MAAM,MAAM;AAEzB,OAAI,KAAK,UAAU,CAAC,KAAK,OAAO,KAAK,CAAE;GAEvC,MAAM,QAAQ,MAAM,OAAO;AAC3B,cAAW,KAAK;IACd,MAAM;IACN,MAAM,MAAM,MAAM,OAAO;IACzB,QAAQ,MAAM,MAAM,SAAS;IAC7B,MAAM,KAAK;IACX,SAAS,KAAK;IACd,MAAM,KAAK,SAAS,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,OAAO;IACtD,CAAC;;;AAIN,QAAO;;;;;AAMT,SAAS,UAAU;CACjB,MAAM,UAAU,QAAQ,KAAK;CAC7B,MAAM,QAAQ,YAAY,QAAQ;AAElC,SAAQ,IAAI,YAAY,MAAM,OAAO,wBAAwB;CAE7D,MAAM,gBAA6B,EAAE;AAErC,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,aAAa,SAAS,MAAM,MAAM;AACxC,gBAAc,KAAK,GAAG,WAAW;;AAGnC,KAAI,cAAc,WAAW,GAAG;AAC9B,UAAQ,IAAI,qCAAqC;AACjD,UAAQ,KAAK,EAAE;;AAGjB,SAAQ,IAAI,SAAS,cAAc,OAAO,kBAAkB;AAE5D,MAAK,MAAM,KAAK,eAAe;EAC7B,MAAM,UAAU,KAAK,SAAS,SAAS,EAAE,KAAK;AAC9C,UAAQ,IAAI,GAAG,QAAQ,GAAG,EAAE,KAAK,GAAG,EAAE,SAAS;AAC/C,UAAQ,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,UAAU;AACxC,UAAQ,IAAI,OAAO,EAAE,KAAK,IAAI;;AAGhC,SAAQ,KAAK,EAAE;;AAGjB,MAAa,cAAc,IAAI,QAAQ,OAAO,CAC3C,YAAY,4CAA4C,CACxD,OAAO,QAAQ"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
|
|
5
|
+
//#region src/cli/commands/setup.ts
|
|
6
|
+
const PACKAGES = [{
|
|
7
|
+
name: "@databricks/appkit",
|
|
8
|
+
description: "Backend SDK"
|
|
9
|
+
}, {
|
|
10
|
+
name: "@databricks/appkit-ui",
|
|
11
|
+
description: "UI Integration, Charts, Tables, SSE, and more."
|
|
12
|
+
}];
|
|
13
|
+
const SECTION_START = "<!-- appkit-instructions-start -->";
|
|
14
|
+
const SECTION_END = "<!-- appkit-instructions-end -->";
|
|
15
|
+
/**
|
|
16
|
+
* Find which AppKit packages are installed by checking for package.json
|
|
17
|
+
*/
|
|
18
|
+
function findInstalledPackages() {
|
|
19
|
+
const cwd = process.cwd();
|
|
20
|
+
const installed = [];
|
|
21
|
+
for (const pkg of PACKAGES) {
|
|
22
|
+
const packagePath = path.join(cwd, "node_modules", pkg.name, "package.json");
|
|
23
|
+
if (fs.existsSync(packagePath)) installed.push(pkg);
|
|
24
|
+
}
|
|
25
|
+
return installed;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Generate the AppKit section content
|
|
29
|
+
*/
|
|
30
|
+
function generateSection(packages) {
|
|
31
|
+
return `${SECTION_START}
|
|
32
|
+
## Databricks AppKit
|
|
33
|
+
|
|
34
|
+
This project uses Databricks AppKit packages. For AI assistant guidance on using these packages, refer to:
|
|
35
|
+
|
|
36
|
+
${packages.map((pkg) => {
|
|
37
|
+
const docPath = `./node_modules/${pkg.name}/CLAUDE.md`;
|
|
38
|
+
return `- **${pkg.name}** (${pkg.description}): [${docPath}](${docPath})`;
|
|
39
|
+
}).join("\n")}
|
|
40
|
+
${SECTION_END}`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate standalone CLAUDE.md content (when no existing file)
|
|
44
|
+
*/
|
|
45
|
+
function generateStandalone(packages) {
|
|
46
|
+
return `# AI Assistant Instructions
|
|
47
|
+
|
|
48
|
+
${SECTION_START}
|
|
49
|
+
## Databricks AppKit
|
|
50
|
+
|
|
51
|
+
This project uses Databricks AppKit packages. For AI assistant guidance on using these packages, refer to:
|
|
52
|
+
|
|
53
|
+
${packages.map((pkg) => {
|
|
54
|
+
const docPath = `./node_modules/${pkg.name}/CLAUDE.md`;
|
|
55
|
+
return `- **${pkg.name}** (${pkg.description}): [${docPath}](${docPath})`;
|
|
56
|
+
}).join("\n")}
|
|
57
|
+
${SECTION_END}
|
|
58
|
+
`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Update existing content with AppKit section
|
|
62
|
+
*/
|
|
63
|
+
function updateContent(existingContent, packages) {
|
|
64
|
+
const newSection = generateSection(packages);
|
|
65
|
+
const startIndex = existingContent.indexOf(SECTION_START);
|
|
66
|
+
const endIndex = existingContent.indexOf(SECTION_END);
|
|
67
|
+
if (startIndex !== -1 && endIndex !== -1) {
|
|
68
|
+
const before = existingContent.substring(0, startIndex);
|
|
69
|
+
const after = existingContent.substring(endIndex + 32);
|
|
70
|
+
return before + newSection + after;
|
|
71
|
+
}
|
|
72
|
+
return `${existingContent.trimEnd()}\n\n${newSection}\n`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Setup command implementation
|
|
76
|
+
*/
|
|
77
|
+
function runSetup(options) {
|
|
78
|
+
const shouldWrite = options.write;
|
|
79
|
+
const installed = findInstalledPackages();
|
|
80
|
+
if (installed.length === 0) {
|
|
81
|
+
console.log("No @databricks/appkit packages found in node_modules.");
|
|
82
|
+
console.log("\nMake sure you've installed at least one of:");
|
|
83
|
+
PACKAGES.forEach((pkg) => {
|
|
84
|
+
console.log(` - ${pkg.name}`);
|
|
85
|
+
});
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
console.log("Detected packages:");
|
|
89
|
+
installed.forEach((pkg) => {
|
|
90
|
+
console.log(` ✓ ${pkg.name}`);
|
|
91
|
+
});
|
|
92
|
+
const claudePath = path.join(process.cwd(), "CLAUDE.md");
|
|
93
|
+
const existingContent = fs.existsSync(claudePath) ? fs.readFileSync(claudePath, "utf-8") : null;
|
|
94
|
+
let finalContent;
|
|
95
|
+
let action;
|
|
96
|
+
if (existingContent) {
|
|
97
|
+
finalContent = updateContent(existingContent, installed);
|
|
98
|
+
action = existingContent.includes(SECTION_START) ? "Updated" : "Added to";
|
|
99
|
+
} else {
|
|
100
|
+
finalContent = generateStandalone(installed);
|
|
101
|
+
action = "Created";
|
|
102
|
+
}
|
|
103
|
+
if (shouldWrite) {
|
|
104
|
+
fs.writeFileSync(claudePath, finalContent);
|
|
105
|
+
console.log(`\n✓ ${action} CLAUDE.md`);
|
|
106
|
+
console.log(` Path: ${claudePath}`);
|
|
107
|
+
} else {
|
|
108
|
+
console.log("\nTo create/update CLAUDE.md, run:");
|
|
109
|
+
console.log(" npx appkit setup --write\n");
|
|
110
|
+
if (existingContent) console.log(`This will ${existingContent.includes(SECTION_START) ? "update the existing" : "add a new"} AppKit section.\n`);
|
|
111
|
+
console.log("Preview of AppKit section:\n");
|
|
112
|
+
console.log("─".repeat(50));
|
|
113
|
+
console.log(generateSection(installed));
|
|
114
|
+
console.log("─".repeat(50));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const setupCommand = new Command("setup").description("Setup CLAUDE.md with AppKit package references").option("-w, --write", "Create or update CLAUDE.md file in current directory").action(runSetup);
|
|
118
|
+
|
|
119
|
+
//#endregion
|
|
120
|
+
export { setupCommand };
|
|
121
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","names":[],"sources":["../../../src/cli/commands/setup.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst PACKAGES = [\n { name: \"@databricks/appkit\", description: \"Backend SDK\" },\n {\n name: \"@databricks/appkit-ui\",\n description: \"UI Integration, Charts, Tables, SSE, and more.\",\n },\n];\n\nconst SECTION_START = \"<!-- appkit-instructions-start -->\";\nconst SECTION_END = \"<!-- appkit-instructions-end -->\";\n\n/**\n * Find which AppKit packages are installed by checking for package.json\n */\nfunction findInstalledPackages() {\n const cwd = process.cwd();\n const installed = [];\n\n for (const pkg of PACKAGES) {\n const packagePath = path.join(\n cwd,\n \"node_modules\",\n pkg.name,\n \"package.json\",\n );\n if (fs.existsSync(packagePath)) {\n installed.push(pkg);\n }\n }\n\n return installed;\n}\n\n/**\n * Generate the AppKit section content\n */\nfunction generateSection(packages: typeof PACKAGES) {\n const links = packages\n .map((pkg) => {\n const docPath = `./node_modules/${pkg.name}/CLAUDE.md`;\n return `- **${pkg.name}** (${pkg.description}): [${docPath}](${docPath})`;\n })\n .join(\"\\n\");\n\n return `${SECTION_START}\n## Databricks AppKit\n\nThis project uses Databricks AppKit packages. For AI assistant guidance on using these packages, refer to:\n\n${links}\n${SECTION_END}`;\n}\n\n/**\n * Generate standalone CLAUDE.md content (when no existing file)\n */\nfunction generateStandalone(packages: typeof PACKAGES) {\n const links = packages\n .map((pkg) => {\n const docPath = `./node_modules/${pkg.name}/CLAUDE.md`;\n return `- **${pkg.name}** (${pkg.description}): [${docPath}](${docPath})`;\n })\n .join(\"\\n\");\n\n return `# AI Assistant Instructions\n\n${SECTION_START}\n## Databricks AppKit\n\nThis project uses Databricks AppKit packages. For AI assistant guidance on using these packages, refer to:\n\n${links}\n${SECTION_END}\n`;\n}\n\n/**\n * Update existing content with AppKit section\n */\nfunction updateContent(existingContent: string, packages: typeof PACKAGES) {\n const newSection = generateSection(packages);\n\n // Check if AppKit section already exists\n const startIndex = existingContent.indexOf(SECTION_START);\n const endIndex = existingContent.indexOf(SECTION_END);\n\n if (startIndex !== -1 && endIndex !== -1) {\n // Replace existing section\n const before = existingContent.substring(0, startIndex);\n const after = existingContent.substring(endIndex + SECTION_END.length);\n return before + newSection + after;\n }\n\n // Append section to end\n return `${existingContent.trimEnd()}\\n\\n${newSection}\\n`;\n}\n\n/**\n * Setup command implementation\n */\nfunction runSetup(options: { write?: boolean }) {\n const shouldWrite = options.write;\n\n // Find installed packages\n const installed = findInstalledPackages();\n\n if (installed.length === 0) {\n console.log(\"No @databricks/appkit packages found in node_modules.\");\n console.log(\"\\nMake sure you've installed at least one of:\");\n PACKAGES.forEach((pkg) => {\n console.log(` - ${pkg.name}`);\n });\n process.exit(1);\n }\n\n console.log(\"Detected packages:\");\n installed.forEach((pkg) => {\n console.log(` ✓ ${pkg.name}`);\n });\n\n const claudePath = path.join(process.cwd(), \"CLAUDE.md\");\n const existingContent = fs.existsSync(claudePath)\n ? fs.readFileSync(claudePath, \"utf-8\")\n : null;\n\n let finalContent: string;\n let action: string;\n\n if (existingContent) {\n finalContent = updateContent(existingContent, installed);\n action = existingContent.includes(SECTION_START) ? \"Updated\" : \"Added to\";\n } else {\n finalContent = generateStandalone(installed);\n action = \"Created\";\n }\n\n if (shouldWrite) {\n fs.writeFileSync(claudePath, finalContent);\n console.log(`\\n✓ ${action} CLAUDE.md`);\n console.log(` Path: ${claudePath}`);\n } else {\n console.log(\"\\nTo create/update CLAUDE.md, run:\");\n console.log(\" npx appkit setup --write\\n\");\n\n if (existingContent) {\n console.log(\n `This will ${\n existingContent.includes(SECTION_START)\n ? \"update the existing\"\n : \"add a new\"\n } AppKit section.\\n`,\n );\n }\n\n console.log(\"Preview of AppKit section:\\n\");\n console.log(\"─\".repeat(50));\n console.log(generateSection(installed));\n console.log(\"─\".repeat(50));\n }\n}\n\nexport const setupCommand = new Command(\"setup\")\n .description(\"Setup CLAUDE.md with AppKit package references\")\n .option(\"-w, --write\", \"Create or update CLAUDE.md file in current directory\")\n .action(runSetup);\n"],"mappings":";;;;;AAIA,MAAM,WAAW,CACf;CAAE,MAAM;CAAsB,aAAa;CAAe,EAC1D;CACE,MAAM;CACN,aAAa;CACd,CACF;AAED,MAAM,gBAAgB;AACtB,MAAM,cAAc;;;;AAKpB,SAAS,wBAAwB;CAC/B,MAAM,MAAM,QAAQ,KAAK;CACzB,MAAM,YAAY,EAAE;AAEpB,MAAK,MAAM,OAAO,UAAU;EAC1B,MAAM,cAAc,KAAK,KACvB,KACA,gBACA,IAAI,MACJ,eACD;AACD,MAAI,GAAG,WAAW,YAAY,CAC5B,WAAU,KAAK,IAAI;;AAIvB,QAAO;;;;;AAMT,SAAS,gBAAgB,UAA2B;AAQlD,QAAO,GAAG,cAAc;;;;;EAPV,SACX,KAAK,QAAQ;EACZ,MAAM,UAAU,kBAAkB,IAAI,KAAK;AAC3C,SAAO,OAAO,IAAI,KAAK,MAAM,IAAI,YAAY,MAAM,QAAQ,IAAI,QAAQ;GACvE,CACD,KAAK,KAAK,CAOP;EACN;;;;;AAMF,SAAS,mBAAmB,UAA2B;AAQrD,QAAO;;EAEP,cAAc;;;;;EATA,SACX,KAAK,QAAQ;EACZ,MAAM,UAAU,kBAAkB,IAAI,KAAK;AAC3C,SAAO,OAAO,IAAI,KAAK,MAAM,IAAI,YAAY,MAAM,QAAQ,IAAI,QAAQ;GACvE,CACD,KAAK,KAAK,CASP;EACN,YAAY;;;;;;AAOd,SAAS,cAAc,iBAAyB,UAA2B;CACzE,MAAM,aAAa,gBAAgB,SAAS;CAG5C,MAAM,aAAa,gBAAgB,QAAQ,cAAc;CACzD,MAAM,WAAW,gBAAgB,QAAQ,YAAY;AAErD,KAAI,eAAe,MAAM,aAAa,IAAI;EAExC,MAAM,SAAS,gBAAgB,UAAU,GAAG,WAAW;EACvD,MAAM,QAAQ,gBAAgB,UAAU,WAAW,GAAmB;AACtE,SAAO,SAAS,aAAa;;AAI/B,QAAO,GAAG,gBAAgB,SAAS,CAAC,MAAM,WAAW;;;;;AAMvD,SAAS,SAAS,SAA8B;CAC9C,MAAM,cAAc,QAAQ;CAG5B,MAAM,YAAY,uBAAuB;AAEzC,KAAI,UAAU,WAAW,GAAG;AAC1B,UAAQ,IAAI,wDAAwD;AACpE,UAAQ,IAAI,gDAAgD;AAC5D,WAAS,SAAS,QAAQ;AACxB,WAAQ,IAAI,OAAO,IAAI,OAAO;IAC9B;AACF,UAAQ,KAAK,EAAE;;AAGjB,SAAQ,IAAI,qBAAqB;AACjC,WAAU,SAAS,QAAQ;AACzB,UAAQ,IAAI,OAAO,IAAI,OAAO;GAC9B;CAEF,MAAM,aAAa,KAAK,KAAK,QAAQ,KAAK,EAAE,YAAY;CACxD,MAAM,kBAAkB,GAAG,WAAW,WAAW,GAC7C,GAAG,aAAa,YAAY,QAAQ,GACpC;CAEJ,IAAI;CACJ,IAAI;AAEJ,KAAI,iBAAiB;AACnB,iBAAe,cAAc,iBAAiB,UAAU;AACxD,WAAS,gBAAgB,SAAS,cAAc,GAAG,YAAY;QAC1D;AACL,iBAAe,mBAAmB,UAAU;AAC5C,WAAS;;AAGX,KAAI,aAAa;AACf,KAAG,cAAc,YAAY,aAAa;AAC1C,UAAQ,IAAI,OAAO,OAAO,YAAY;AACtC,UAAQ,IAAI,WAAW,aAAa;QAC/B;AACL,UAAQ,IAAI,qCAAqC;AACjD,UAAQ,IAAI,+BAA+B;AAE3C,MAAI,gBACF,SAAQ,IACN,aACE,gBAAgB,SAAS,cAAc,GACnC,wBACA,YACL,oBACF;AAGH,UAAQ,IAAI,+BAA+B;AAC3C,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;AAC3B,UAAQ,IAAI,gBAAgB,UAAU,CAAC;AACvC,UAAQ,IAAI,IAAI,OAAO,GAAG,CAAC;;;AAI/B,MAAa,eAAe,IAAI,QAAQ,QAAQ,CAC7C,YAAY,iDAAiD,CAC7D,OAAO,eAAe,uDAAuD,CAC7E,OAAO,SAAS"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { setupCommand } from "./commands/setup.js";
|
|
3
|
+
import { generateTypesCommand } from "./commands/generate-types.js";
|
|
4
|
+
import { lintCommand } from "./commands/lint.js";
|
|
5
|
+
import { docsCommand } from "./commands/docs.js";
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { dirname, join } from "node:path";
|
|
9
|
+
import { Command } from "commander";
|
|
10
|
+
|
|
11
|
+
//#region src/cli/index.ts
|
|
12
|
+
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "../../package.json");
|
|
13
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
14
|
+
const cmd = new Command();
|
|
15
|
+
cmd.name("appkit").description("CLI tools for Databricks AppKit").version(pkg.version);
|
|
16
|
+
cmd.addCommand(setupCommand);
|
|
17
|
+
cmd.addCommand(generateTypesCommand);
|
|
18
|
+
cmd.addCommand(lintCommand);
|
|
19
|
+
cmd.addCommand(docsCommand);
|
|
20
|
+
cmd.parse();
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { };
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/cli/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport { Command } from \"commander\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { generateTypesCommand } from \"./commands/generate-types.js\";\nimport { lintCommand } from \"./commands/lint.js\";\nimport { docsCommand } from \"./commands/docs.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkgPath = join(__dirname, \"../../package.json\");\nconst pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n\nconst cmd = new Command();\n\ncmd\n .name(\"appkit\")\n .description(\"CLI tools for Databricks AppKit\")\n .version(pkg.version);\n\ncmd.addCommand(setupCommand);\ncmd.addCommand(generateTypesCommand);\ncmd.addCommand(lintCommand);\ncmd.addCommand(docsCommand);\n\ncmd.parse();\n"],"mappings":";;;;;;;;;;;AAYA,MAAM,UAAU,KADE,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC,EACzB,qBAAqB;AACrD,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC;AAEtD,MAAM,MAAM,IAAI,SAAS;AAEzB,IACG,KAAK,SAAS,CACd,YAAY,kCAAkC,CAC9C,QAAQ,IAAI,QAAQ;AAEvB,IAAI,WAAW,aAAa;AAC5B,IAAI,WAAW,qBAAqB;AACpC,IAAI,WAAW,YAAY;AAC3B,IAAI,WAAW,YAAY;AAE3B,IAAI,OAAO"}
|
|
@@ -11,11 +11,47 @@ declare class ArrowClient {
|
|
|
11
11
|
* @returns Promise resolving to an Arrow Table
|
|
12
12
|
*/
|
|
13
13
|
static processArrowBuffer(buffer: Uint8Array): Promise<Table$1>;
|
|
14
|
+
/**
|
|
15
|
+
* Fetches Arrow data from a URL and processes it into a Table.
|
|
16
|
+
* Convenience method that combines fetchArrow and processArrowBuffer.
|
|
17
|
+
*
|
|
18
|
+
* @param url - URL to fetch Arrow data from
|
|
19
|
+
* @param headers - Optional HTTP headers to include in the request
|
|
20
|
+
* @returns Promise resolving to an Arrow Table
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const table = await ArrowClient.fetchAndProcessArrow('/api/data/arrow');
|
|
24
|
+
* console.log(`Loaded ${table.numRows} rows`);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
14
27
|
static fetchAndProcessArrow(url: string, headers?: Record<string, string>): Promise<Table$1>;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts field metadata (name and type) from an Arrow Table.
|
|
30
|
+
*
|
|
31
|
+
* @param table - Arrow Table to extract fields from
|
|
32
|
+
* @returns Array of field metadata objects
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const fields = ArrowClient.extractArrowFields(table);
|
|
36
|
+
* // [{ name: "date", type: Date32 }, { name: "value", type: Float64 }]
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
15
39
|
static extractArrowFields(table: Table$1): {
|
|
16
40
|
name: string;
|
|
17
41
|
type: any;
|
|
18
42
|
}[];
|
|
43
|
+
/**
|
|
44
|
+
* Extracts all columns from an Arrow Table as JavaScript arrays.
|
|
45
|
+
* Each column is converted to a native JavaScript array.
|
|
46
|
+
*
|
|
47
|
+
* @param table - Arrow Table to extract columns from
|
|
48
|
+
* @returns Object mapping column names to arrays
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const columns = ArrowClient.extractArrowColumns(table);
|
|
52
|
+
* // { date: ["2024-01-01", "2024-01-02"], value: [100, 200] }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
19
55
|
static extractArrowColumns(table: Table$1): Record<string, any>;
|
|
20
56
|
/**
|
|
21
57
|
* Extracts chart data from Arrow table.
|
|
@@ -51,6 +87,18 @@ declare class ArrowClient {
|
|
|
51
87
|
static detectFieldsFromArrow(table: Table$1, orientation?: "vertical" | "horizontal"): DetectedFields & {
|
|
52
88
|
chartType: "timeseries" | "categorical";
|
|
53
89
|
};
|
|
90
|
+
/**
|
|
91
|
+
* Fetches raw Arrow IPC data from a URL.
|
|
92
|
+
*
|
|
93
|
+
* @param url - URL to fetch Arrow data from
|
|
94
|
+
* @param headers - Optional HTTP headers to include in the request
|
|
95
|
+
* @returns Promise resolving to the raw Arrow buffer as Uint8Array
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const buffer = await ArrowClient.fetchArrow('/api/data/arrow');
|
|
99
|
+
* const table = await ArrowClient.processArrowBuffer(buffer);
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
54
102
|
static fetchArrow(url: string, headers?: Record<string, string>): Promise<Uint8Array>;
|
|
55
103
|
}
|
|
56
104
|
interface DetectedFields {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrow-client.d.ts","names":[],"sources":["../../../src/js/arrow/arrow-client.ts"],"sourcesContent":[],"mappings":";;;;AAmBa,cAAA,WAAA,CAAW;EAAA;;;;;;;
|
|
1
|
+
{"version":3,"file":"arrow-client.d.ts","names":[],"sources":["../../../src/js/arrow/arrow-client.ts"],"sourcesContent":[],"mappings":";;;;AAmBa,cAAA,WAAA,CAAW;EAAA;;;;;;;SAgEW,kBAAA,CAAA,MAAA,EAxDO,UAwDP,CAAA,EAxDoB,OAwDpB,CAxD4B,OAwD5B,CAAA;;;;;;;;;;;AAuPnC;;;qDAjRc,yBACT,QAAQ;;;;;;;;;;;;mCAyBsB;;;;;;;;;;;;;;;;oCAqBC,UAAQ;;;;;;;;;;iCAuBX;;cAyNrB;;;;;;;;;;;;;;;;;;;;sCAlKD,mDAEN;;;;;;;;;;;;;;;2CA0HS,yBACT,QAAQ;;UAuBI,cAAA"}
|
|
@@ -19,6 +19,19 @@ var ArrowClient = class ArrowClient {
|
|
|
19
19
|
throw new Error(`Failed to process Arrow buffer: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Fetches Arrow data from a URL and processes it into a Table.
|
|
24
|
+
* Convenience method that combines fetchArrow and processArrowBuffer.
|
|
25
|
+
*
|
|
26
|
+
* @param url - URL to fetch Arrow data from
|
|
27
|
+
* @param headers - Optional HTTP headers to include in the request
|
|
28
|
+
* @returns Promise resolving to an Arrow Table
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const table = await ArrowClient.fetchAndProcessArrow('/api/data/arrow');
|
|
32
|
+
* console.log(`Loaded ${table.numRows} rows`);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
22
35
|
static async fetchAndProcessArrow(url, headers) {
|
|
23
36
|
try {
|
|
24
37
|
const buffer = await ArrowClient.fetchArrow(url, headers);
|
|
@@ -27,6 +40,17 @@ var ArrowClient = class ArrowClient {
|
|
|
27
40
|
throw new Error(`Failed to fetch Arrow data: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
28
41
|
}
|
|
29
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Extracts field metadata (name and type) from an Arrow Table.
|
|
45
|
+
*
|
|
46
|
+
* @param table - Arrow Table to extract fields from
|
|
47
|
+
* @returns Array of field metadata objects
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const fields = ArrowClient.extractArrowFields(table);
|
|
51
|
+
* // [{ name: "date", type: Date32 }, { name: "value", type: Float64 }]
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
30
54
|
static extractArrowFields(table) {
|
|
31
55
|
return table.schema.fields.map((field) => {
|
|
32
56
|
return {
|
|
@@ -35,6 +59,18 @@ var ArrowClient = class ArrowClient {
|
|
|
35
59
|
};
|
|
36
60
|
});
|
|
37
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Extracts all columns from an Arrow Table as JavaScript arrays.
|
|
64
|
+
* Each column is converted to a native JavaScript array.
|
|
65
|
+
*
|
|
66
|
+
* @param table - Arrow Table to extract columns from
|
|
67
|
+
* @returns Object mapping column names to arrays
|
|
68
|
+
* @example
|
|
69
|
+
* ```typescript
|
|
70
|
+
* const columns = ArrowClient.extractArrowColumns(table);
|
|
71
|
+
* // { date: ["2024-01-01", "2024-01-02"], value: [100, 200] }
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
38
74
|
static extractArrowColumns(table) {
|
|
39
75
|
const cols = {};
|
|
40
76
|
for (const field of table.schema.fields) {
|
|
@@ -116,10 +152,10 @@ var ArrowClient = class ArrowClient {
|
|
|
116
152
|
const isTimeSeries = primaryDateFields.length > 0 && orientation !== "horizontal";
|
|
117
153
|
const isCategorical = nameFields.length > 0 && (primaryDateFields.length === 0 || orientation === "horizontal");
|
|
118
154
|
if (orientation === "horizontal" || isCategorical) {
|
|
119
|
-
const xField
|
|
155
|
+
const xField = nameFields[0] || primaryDateFields[0] || metadataDateFields[0] || fieldNames[0];
|
|
120
156
|
return {
|
|
121
|
-
xField
|
|
122
|
-
yFields: numericFields.length > 0 ? numericFields : fieldNames.filter((k) => k !== xField
|
|
157
|
+
xField,
|
|
158
|
+
yFields: numericFields.length > 0 ? numericFields : fieldNames.filter((k) => k !== xField),
|
|
123
159
|
chartType: "categorical"
|
|
124
160
|
};
|
|
125
161
|
}
|
|
@@ -130,6 +166,18 @@ var ArrowClient = class ArrowClient {
|
|
|
130
166
|
chartType: isTimeSeries ? "timeseries" : "categorical"
|
|
131
167
|
};
|
|
132
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Fetches raw Arrow IPC data from a URL.
|
|
171
|
+
*
|
|
172
|
+
* @param url - URL to fetch Arrow data from
|
|
173
|
+
* @param headers - Optional HTTP headers to include in the request
|
|
174
|
+
* @returns Promise resolving to the raw Arrow buffer as Uint8Array
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* const buffer = await ArrowClient.fetchArrow('/api/data/arrow');
|
|
178
|
+
* const table = await ArrowClient.processArrowBuffer(buffer);
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
133
181
|
static async fetchArrow(url, headers) {
|
|
134
182
|
try {
|
|
135
183
|
const response = await fetch(url, { headers: {
|