@open-dy/vibecoding-sdk-taro 0.0.1 → 0.1.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/dist/adapters/interest-card/eslint/eslint-plugin-custom-navigation.mjs +2 -290
- package/dist/adapters/interest-card/eslint/taro.mjs +8 -42
- package/dist/build/plugins/inject-feed-card-meta.cjs +148 -0
- package/dist/build/taro.js +1 -0
- package/dist/build/taro.js.map +1 -1
- package/dist/components/miniapp-open-card.d.ts +46 -1
- package/dist/components/miniapp-open-card.js +14 -1
- package/dist/components/miniapp-open-card.js.map +1 -1
- package/dist/eslint/eslint-plugin-custom-navigation.mjs +290 -0
- package/dist/eslint/taro.mjs +35 -1
- package/dist/reference/llms.txt +72 -80
- package/dist/reference/sdk-api/build/taro/BuildContext.md +1 -1
- package/dist/reference/sdk-api/build/taro/CreateMicroappTaroConfigOptions.md +1 -1
- package/dist/reference/sdk-api/build/taro/createMicroappTaroConfig.md +1 -1
- package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCard.md +109 -0
- package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCardEnvVersion.md +38 -0
- package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCardErrorDetail.md +52 -0
- package/dist/reference/sdk-api/components/miniapp-open-card/MiniappOpenCardProps.md +76 -0
- package/dist/reference/sdk-api/components/miniapp-open-card/index.md +12 -0
- package/dist/reference/sdk-api/libraries/lucide-taro.md +151 -0
- package/dist/reference/sdk-api/runtime/CreateMicroappClientOptions.md +1 -1
- package/dist/reference/sdk-api/runtime/createMicroappClient.md +2 -2
- package/dist/reference/sdk-api/ui/accordion/Accordion.md +1 -1
- package/dist/reference/sdk-api/ui/accordion/AccordionContent.md +1 -1
- package/dist/reference/sdk-api/ui/accordion/AccordionItem.md +1 -1
- package/dist/reference/sdk-api/ui/accordion/AccordionTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/alert/Alert.md +1 -1
- package/dist/reference/sdk-api/ui/alert/AlertAction.md +1 -1
- package/dist/reference/sdk-api/ui/alert/AlertDescription.md +1 -1
- package/dist/reference/sdk-api/ui/alert/AlertTitle.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialog.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogAction.md +2 -2
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogCancel.md +2 -2
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogContent.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogDescription.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogFooter.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogHeader.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogOverlay.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogPortal.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogTitle.md +1 -1
- package/dist/reference/sdk-api/ui/alert-dialog/AlertDialogTrigger.md +22 -22
- package/dist/reference/sdk-api/ui/aspect-ratio/AspectRatio.md +1 -1
- package/dist/reference/sdk-api/ui/avatar/Avatar.md +1 -1
- package/dist/reference/sdk-api/ui/avatar/AvatarBadge.md +1 -1
- package/dist/reference/sdk-api/ui/avatar/AvatarFallback.md +1 -1
- package/dist/reference/sdk-api/ui/avatar/AvatarGroup.md +1 -1
- package/dist/reference/sdk-api/ui/avatar/AvatarGroupCount.md +1 -1
- package/dist/reference/sdk-api/ui/avatar/AvatarImage.md +19 -19
- package/dist/reference/sdk-api/ui/badge/Badge.md +2 -2
- package/dist/reference/sdk-api/ui/badge/badgeVariants.md +2 -2
- package/dist/reference/sdk-api/ui/button/Button.md +2 -2
- package/dist/reference/sdk-api/ui/button/ButtonProps.md +2 -2
- package/dist/reference/sdk-api/ui/button/buttonVariants.md +2 -2
- package/dist/reference/sdk-api/ui/button-group/ButtonGroup.md +1 -1
- package/dist/reference/sdk-api/ui/button-group/ButtonGroupSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/button-group/ButtonGroupText.md +22 -22
- package/dist/reference/sdk-api/ui/button-group/buttonGroupVariants.md +1 -1
- package/dist/reference/sdk-api/ui/calendar/Calendar.md +1 -1
- package/dist/reference/sdk-api/ui/calendar/CalendarProps.md +1 -1
- package/dist/reference/sdk-api/ui/card/Card.md +1 -1
- package/dist/reference/sdk-api/ui/card/CardAction.md +1 -1
- package/dist/reference/sdk-api/ui/card/CardContent.md +1 -1
- package/dist/reference/sdk-api/ui/card/CardDescription.md +1 -1
- package/dist/reference/sdk-api/ui/card/CardFooter.md +1 -1
- package/dist/reference/sdk-api/ui/card/CardHeader.md +1 -1
- package/dist/reference/sdk-api/ui/card/CardTitle.md +1 -1
- package/dist/reference/sdk-api/ui/carousel/Carousel.md +1 -1
- package/dist/reference/sdk-api/ui/carousel/CarouselContent.md +1 -1
- package/dist/reference/sdk-api/ui/carousel/CarouselItem.md +1 -1
- package/dist/reference/sdk-api/ui/carousel/CarouselNext.md +2 -2
- package/dist/reference/sdk-api/ui/carousel/CarouselPrevious.md +2 -2
- package/dist/reference/sdk-api/ui/carousel/useCarousel.md +1 -1
- package/dist/reference/sdk-api/ui/checkbox/Checkbox.md +1 -1
- package/dist/reference/sdk-api/ui/collapsible/Collapsible.md +1 -1
- package/dist/reference/sdk-api/ui/collapsible/CollapsibleContent.md +1 -1
- package/dist/reference/sdk-api/ui/collapsible/CollapsibleTrigger.md +22 -22
- package/dist/reference/sdk-api/ui/combobox/Combobox.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxChip.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxChips.md +22 -22
- package/dist/reference/sdk-api/ui/combobox/ComboboxChipsInput.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxCollection.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxContent.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxEmpty.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxGroup.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxInput.md +22 -22
- package/dist/reference/sdk-api/ui/combobox/ComboboxItem.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxLabel.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxList.md +22 -22
- package/dist/reference/sdk-api/ui/combobox/ComboboxSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/combobox/ComboboxValue.md +22 -22
- package/dist/reference/sdk-api/ui/combobox/useComboboxAnchor.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/Dialog.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogClose.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogContent.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogDescription.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogFooter.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogHeader.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogOverlay.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogPortal.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogTitle.md +1 -1
- package/dist/reference/sdk-api/ui/dialog/DialogTrigger.md +22 -22
- package/dist/reference/sdk-api/ui/drawer/Drawer.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerClose.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerContent.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerDescription.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerFooter.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerHeader.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerOverlay.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerPortal.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerTitle.md +1 -1
- package/dist/reference/sdk-api/ui/drawer/DrawerTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenu.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuCheckboxItem.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuContent.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuGroup.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuItem.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuLabel.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuPortal.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuRadioGroup.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuRadioItem.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuShortcut.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSub.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSubContent.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuSubTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/dropdown-menu/DropdownMenuTrigger.md +22 -22
- package/dist/reference/sdk-api/ui/empty/Empty.md +1 -1
- package/dist/reference/sdk-api/ui/empty/EmptyContent.md +1 -1
- package/dist/reference/sdk-api/ui/empty/EmptyDescription.md +1 -1
- package/dist/reference/sdk-api/ui/empty/EmptyHeader.md +1 -1
- package/dist/reference/sdk-api/ui/empty/EmptyMedia.md +1 -1
- package/dist/reference/sdk-api/ui/empty/EmptyTitle.md +1 -1
- package/dist/reference/sdk-api/ui/field/Field.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldContent.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldDescription.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldError.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldGroup.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldLabel.md +13 -13
- package/dist/reference/sdk-api/ui/field/FieldLegend.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldSet.md +1 -1
- package/dist/reference/sdk-api/ui/field/FieldTitle.md +1 -1
- package/dist/reference/sdk-api/ui/helpers/collectDataIconState.md +1 -1
- package/dist/reference/sdk-api/ui/input/Input.md +13 -13
- package/dist/reference/sdk-api/ui/input-group/InputGroup.md +1 -1
- package/dist/reference/sdk-api/ui/input-group/InputGroupAddon.md +1 -1
- package/dist/reference/sdk-api/ui/input-group/InputGroupButton.md +25 -25
- package/dist/reference/sdk-api/ui/input-group/InputGroupInput.md +13 -13
- package/dist/reference/sdk-api/ui/input-group/InputGroupText.md +1 -1
- package/dist/reference/sdk-api/ui/input-group/InputGroupTextarea.md +13 -13
- package/dist/reference/sdk-api/ui/input-otp/InputOTP.md +1 -1
- package/dist/reference/sdk-api/ui/input-otp/InputOTPGroup.md +1 -1
- package/dist/reference/sdk-api/ui/input-otp/InputOTPSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/input-otp/InputOTPSlot.md +1 -1
- package/dist/reference/sdk-api/ui/item/Item.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemActions.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemContent.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemDescription.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemFooter.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemGroup.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemHeader.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemMedia.md +2 -2
- package/dist/reference/sdk-api/ui/item/ItemSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/item/ItemTitle.md +1 -1
- package/dist/reference/sdk-api/ui/label/Label.md +13 -13
- package/dist/reference/sdk-api/ui/menubar/Menubar.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarCheckboxItem.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarContent.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarGroup.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarItem.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarLabel.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarMenu.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarPortal.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarRadioGroup.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarRadioItem.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarShortcut.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarSub.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarSubContent.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarSubTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/menubar/MenubarTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenu.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuContent.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuIndicator.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuItem.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuLink.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuList.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuPositioner.md +1 -1
- package/dist/reference/sdk-api/ui/navigation-menu/NavigationMenuTrigger.md +22 -22
- package/dist/reference/sdk-api/ui/navigation-menu/navigationMenuTriggerStyle.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/Pagination.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/PaginationContent.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/PaginationEllipsis.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/PaginationItem.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/PaginationLink.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/PaginationNext.md +1 -1
- package/dist/reference/sdk-api/ui/pagination/PaginationPrevious.md +1 -1
- package/dist/reference/sdk-api/ui/popover/Popover.md +1 -1
- package/dist/reference/sdk-api/ui/popover/PopoverAnchor.md +1 -1
- package/dist/reference/sdk-api/ui/popover/PopoverContent.md +1 -1
- package/dist/reference/sdk-api/ui/popover/PopoverDescription.md +1 -1
- package/dist/reference/sdk-api/ui/popover/PopoverHeader.md +1 -1
- package/dist/reference/sdk-api/ui/popover/PopoverTitle.md +1 -1
- package/dist/reference/sdk-api/ui/popover/PopoverTrigger.md +22 -22
- package/dist/reference/sdk-api/ui/portal/Portal.md +1 -1
- package/dist/reference/sdk-api/ui/progress/Progress.md +1 -1
- package/dist/reference/sdk-api/ui/progress/ProgressIndicator.md +1 -1
- package/dist/reference/sdk-api/ui/progress/ProgressLabel.md +1 -1
- package/dist/reference/sdk-api/ui/progress/ProgressTrack.md +1 -1
- package/dist/reference/sdk-api/ui/progress/ProgressValue.md +22 -22
- package/dist/reference/sdk-api/ui/radio-group/RadioGroup.md +1 -1
- package/dist/reference/sdk-api/ui/radio-group/RadioGroupItem.md +1 -1
- package/dist/reference/sdk-api/ui/resizable/ResizableHandle.md +1 -1
- package/dist/reference/sdk-api/ui/resizable/ResizablePanel.md +1 -1
- package/dist/reference/sdk-api/ui/resizable/ResizablePanelGroup.md +1 -1
- package/dist/reference/sdk-api/ui/scroll-area/ScrollArea.md +13 -13
- package/dist/reference/sdk-api/ui/scroll-area/ScrollBar.md +1 -1
- package/dist/reference/sdk-api/ui/select/Select.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectContent.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectGroup.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectItem.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectLabel.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectScrollDownButton.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectScrollUpButton.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectSeparator.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/select/SelectValue.md +1 -1
- package/dist/reference/sdk-api/ui/separator/Separator.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/Sheet.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetClose.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetContent.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetDescription.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetFooter.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetHeader.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetOverlay.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetPortal.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetTitle.md +1 -1
- package/dist/reference/sdk-api/ui/sheet/SheetTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/skeleton/Skeleton.md +1 -1
- package/dist/reference/sdk-api/ui/slider/Slider.md +1 -1
- package/dist/reference/sdk-api/ui/sonner/Toaster.md +1 -1
- package/dist/reference/sdk-api/ui/sonner/toast.md +1 -1
- package/dist/reference/sdk-api/ui/spinner/Spinner.md +1 -1
- package/dist/reference/sdk-api/ui/switch/Switch.md +1 -1
- package/dist/reference/sdk-api/ui/table/Table.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableBody.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableCaption.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableCell.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableFooter.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableHead.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableHeader.md +1 -1
- package/dist/reference/sdk-api/ui/table/TableRow.md +1 -1
- package/dist/reference/sdk-api/ui/tabs/Tabs.md +1 -1
- package/dist/reference/sdk-api/ui/tabs/TabsContent.md +1 -1
- package/dist/reference/sdk-api/ui/tabs/TabsList.md +1 -1
- package/dist/reference/sdk-api/ui/tabs/TabsTrigger.md +1 -1
- package/dist/reference/sdk-api/ui/tabs/tabsListVariants.md +1 -1
- package/dist/reference/sdk-api/ui/textarea/Textarea.md +13 -13
- package/dist/reference/sdk-api/ui/toggle/Toggle.md +1 -1
- package/dist/reference/sdk-api/ui/toggle/toggleVariants.md +1 -1
- package/dist/reference/sdk-api/ui/toggle-group/ToggleGroup.md +1 -1
- package/dist/reference/sdk-api/ui/toggle-group/ToggleGroupItem.md +1 -1
- package/dist/reference/sdk-api.json +2811 -2295
- package/dist/reference/sdk-api.md +12 -1
- package/dist/runtime/client.js +0 -5
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/douyin-container-request.js +0 -7
- package/dist/runtime/douyin-container-request.js.map +1 -1
- package/dist/runtime/network-url.js +0 -3
- package/dist/runtime/network-url.js.map +1 -1
- package/dist/ui/menubar.js +0 -1
- package/dist/ui/menubar.js.map +1 -1
- package/package.json +1 -1
- package/release-provenance.json +4 -4
- package/src/adapters/interest-card/eslint/eslint-plugin-custom-navigation.mjs +2 -290
- package/src/adapters/interest-card/eslint/taro.mjs +8 -42
- package/src/build/plugins/inject-feed-card-meta.ts +172 -0
- package/src/build/taro.ts +1 -0
- package/src/components/miniapp-open-card.ts +46 -1
- package/src/eslint/eslint-plugin-custom-navigation.mjs +290 -0
- package/src/eslint/taro.mjs +35 -1
- package/src/runtime/client.ts +0 -6
- package/src/runtime/douyin-container-request.ts +0 -7
- package/src/runtime/network-url.ts +0 -3
- package/src/ui/menubar.tsx +0 -1
|
@@ -1,54 +1,20 @@
|
|
|
1
1
|
import { createMicroappTaroEslintConfig } from '../../../eslint/taro.mjs'
|
|
2
|
-
import customNavigation from './eslint-plugin-custom-navigation.mjs'
|
|
3
|
-
|
|
4
|
-
const interestCardRules = [
|
|
5
|
-
{
|
|
6
|
-
files: ['src/**/*.{js,jsx,ts,tsx}'],
|
|
7
|
-
plugins: { customNavigation },
|
|
8
|
-
rules: {
|
|
9
|
-
'customNavigation/no-navigation-control-apis': 'error',
|
|
10
|
-
},
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
files: ['src/**/*.{js,jsx,ts,tsx}'],
|
|
14
|
-
ignores: ['src/network.ts'],
|
|
15
|
-
plugins: { customNavigation },
|
|
16
|
-
rules: {
|
|
17
|
-
'customNavigation/require-custom-navigation-style': 'error',
|
|
18
|
-
'customNavigation/pages-must-use-custom-nav-space': 'error',
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
]
|
|
22
2
|
|
|
23
3
|
/**
|
|
24
|
-
* 兴趣卡 Taro
|
|
25
|
-
*
|
|
26
|
-
* 公共规则仍由 `createMicroappTaroEslintConfig` 维护;这里只声明兴趣卡
|
|
27
|
-
* 独有的导航能力及其旧图标包来源,避免模板复制整份 ESLint 配置。
|
|
4
|
+
* 兴趣卡 Taro 复用公共导航与页面校验,保留本地 UI 和历史图标导入兼容。
|
|
5
|
+
* 规则实现统一由公共配置维护,模板只保留 SDK 调用入口。
|
|
28
6
|
*/
|
|
29
7
|
export function createInterestCardTaroEslintConfig(options = {}) {
|
|
30
|
-
const
|
|
31
|
-
const additionalLucideSources = baseOptions.lucideImportSources === undefined
|
|
8
|
+
const additionalLucideSources = options.lucideImportSources === undefined
|
|
32
9
|
? []
|
|
33
|
-
: Array.isArray(
|
|
34
|
-
?
|
|
35
|
-
: [
|
|
10
|
+
: Array.isArray(options.lucideImportSources)
|
|
11
|
+
? options.lucideImportSources
|
|
12
|
+
: [options.lucideImportSources]
|
|
36
13
|
|
|
37
14
|
return createMicroappTaroEslintConfig({
|
|
38
|
-
...
|
|
39
|
-
lucideImportSources: ['lucide-taro', ...additionalLucideSources],
|
|
15
|
+
...options,
|
|
16
|
+
lucideImportSources: ['@open-dy/lucide-taro', 'lucide-taro', ...additionalLucideSources],
|
|
40
17
|
preferredUiImportBase: '@/components/ui',
|
|
41
|
-
overrides(config) {
|
|
42
|
-
const withInterestCardRules = [...config, ...interestCardRules]
|
|
43
|
-
if (!overrides) return withInterestCardRules
|
|
44
|
-
if (typeof overrides === 'function') {
|
|
45
|
-
return overrides(withInterestCardRules) ?? withInterestCardRules
|
|
46
|
-
}
|
|
47
|
-
return [
|
|
48
|
-
...withInterestCardRules,
|
|
49
|
-
...(Array.isArray(overrides) ? overrides : [overrides]),
|
|
50
|
-
]
|
|
51
|
-
},
|
|
52
18
|
})
|
|
53
19
|
}
|
|
54
20
|
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
type AppConfig = Record<string, any>;
|
|
5
|
+
|
|
6
|
+
type InjectFeedCardMetaContext = {
|
|
7
|
+
appPath?: string;
|
|
8
|
+
paths?: {
|
|
9
|
+
appPath?: string;
|
|
10
|
+
};
|
|
11
|
+
modifyAppConfig: (
|
|
12
|
+
modifier: (payload: { appConfig: AppConfig }) => AppConfig,
|
|
13
|
+
) => void;
|
|
14
|
+
modifyViteConfig?: (
|
|
15
|
+
modifier: (payload: { viteConfig: Record<string, any> }) => Record<string, any> | void,
|
|
16
|
+
) => void;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const BG_MUSIC_URL_KEYS = [
|
|
20
|
+
'BgMusicUrl',
|
|
21
|
+
'BgmMusicUrl',
|
|
22
|
+
'bgMusicUrl',
|
|
23
|
+
'bg_music_url',
|
|
24
|
+
'BgMusicURL',
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
function resolveBgMusicUrl(card: unknown): string {
|
|
28
|
+
if (!card || typeof card !== 'object') {
|
|
29
|
+
return '';
|
|
30
|
+
}
|
|
31
|
+
for (const key of BG_MUSIC_URL_KEYS) {
|
|
32
|
+
const value = (card as Record<string, unknown>)[key];
|
|
33
|
+
if (typeof value === 'string' && value.startsWith('https://')) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return '';
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function pickBgmConfig(card: Record<string, any>): Record<string, unknown> {
|
|
41
|
+
const raw = card?.BgmConfig ?? card?.bgmConfig;
|
|
42
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const autoPlay = raw.auto_play ?? raw.AutoPlay;
|
|
47
|
+
const landingBehavior = raw.landing_behavior ?? raw.LandingBehavior;
|
|
48
|
+
const duckingVolume = raw.bgm_ducking_volume ?? raw.BgmDuckingVolume;
|
|
49
|
+
const config: Record<string, unknown> = {};
|
|
50
|
+
|
|
51
|
+
if (typeof autoPlay === 'boolean') {
|
|
52
|
+
config.auto_play = autoPlay;
|
|
53
|
+
}
|
|
54
|
+
if (typeof landingBehavior === 'string' && landingBehavior) {
|
|
55
|
+
config.landing_behavior = landingBehavior;
|
|
56
|
+
}
|
|
57
|
+
if (typeof duckingVolume === 'number' && Number.isFinite(duckingVolume)) {
|
|
58
|
+
config.bgm_ducking_volume = duckingVolume;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return config;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function buildBgmMeta(card: Record<string, any>) {
|
|
65
|
+
const bgm_url = resolveBgMusicUrl(card);
|
|
66
|
+
if (!bgm_url) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
bgm_url,
|
|
71
|
+
...pickBgmConfig(card),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function feedCardWatchCandidates(appPath: string): string[] {
|
|
76
|
+
return [
|
|
77
|
+
path.resolve(appPath, '..', 'feed', 'feed-card.json'),
|
|
78
|
+
path.resolve(appPath, 'feed', 'feed-card.json'),
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function findFeedCardJson(appPath: string): string | null {
|
|
83
|
+
return feedCardWatchCandidates(appPath).find((candidate) => fs.existsSync(candidate)) ?? null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function stripInjectedBgm(appConfig: AppConfig): AppConfig {
|
|
87
|
+
if (!appConfig.meta || typeof appConfig.meta !== 'object' || Array.isArray(appConfig.meta)) {
|
|
88
|
+
return appConfig;
|
|
89
|
+
}
|
|
90
|
+
if (!('bgm' in appConfig.meta)) {
|
|
91
|
+
return appConfig;
|
|
92
|
+
}
|
|
93
|
+
const nextMeta = { ...appConfig.meta };
|
|
94
|
+
delete nextMeta.bgm;
|
|
95
|
+
if (Object.keys(nextMeta).length) {
|
|
96
|
+
appConfig.meta = nextMeta;
|
|
97
|
+
} else {
|
|
98
|
+
delete appConfig.meta;
|
|
99
|
+
}
|
|
100
|
+
return appConfig;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function applyFeedCardMeta(appConfig: AppConfig, appPath: string): AppConfig {
|
|
104
|
+
const feedCardPath = findFeedCardJson(appPath);
|
|
105
|
+
if (!feedCardPath) {
|
|
106
|
+
return stripInjectedBgm(appConfig);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let card: Record<string, any>;
|
|
110
|
+
try {
|
|
111
|
+
card = JSON.parse(fs.readFileSync(feedCardPath, 'utf8'));
|
|
112
|
+
} catch {
|
|
113
|
+
return stripInjectedBgm(appConfig);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const bgm = buildBgmMeta(card);
|
|
117
|
+
if (!bgm) {
|
|
118
|
+
return stripInjectedBgm(appConfig);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const prevMeta =
|
|
122
|
+
appConfig.meta && typeof appConfig.meta === 'object' && !Array.isArray(appConfig.meta)
|
|
123
|
+
? appConfig.meta
|
|
124
|
+
: {};
|
|
125
|
+
appConfig.meta = {
|
|
126
|
+
...prevMeta,
|
|
127
|
+
bgm,
|
|
128
|
+
};
|
|
129
|
+
return appConfig;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function applyMetaToCompilerContext(compilerCtx: Record<string, any> | undefined, appPath: string) {
|
|
133
|
+
if (!compilerCtx?.app?.config) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
applyFeedCardMeta(compilerCtx.app.config, appPath);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export default function injectFeedCardMetaPlugin(ctx: InjectFeedCardMetaContext) {
|
|
140
|
+
const resolveAppPath = () => ctx.paths?.appPath || ctx.appPath || process.cwd();
|
|
141
|
+
|
|
142
|
+
ctx.modifyAppConfig(({ appConfig }) => {
|
|
143
|
+
if (process.env.TARO_ENV === 'h5') {
|
|
144
|
+
return appConfig;
|
|
145
|
+
}
|
|
146
|
+
return applyFeedCardMeta(appConfig, resolveAppPath());
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
ctx.modifyViteConfig?.(({ viteConfig }) => {
|
|
150
|
+
if (process.env.TARO_ENV === 'h5') {
|
|
151
|
+
return viteConfig;
|
|
152
|
+
}
|
|
153
|
+
const appPath = resolveAppPath();
|
|
154
|
+
const watchFiles = feedCardWatchCandidates(appPath);
|
|
155
|
+
viteConfig.plugins = Array.isArray(viteConfig.plugins) ? viteConfig.plugins : [];
|
|
156
|
+
viteConfig.plugins.push({
|
|
157
|
+
name: 'watch-feed-card-meta',
|
|
158
|
+
async buildStart() {
|
|
159
|
+
if (this.meta.watchMode) {
|
|
160
|
+
watchFiles.forEach((file) => this.addWatchFile(file));
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const info = await (this as any).load({ id: 'taro:compiler' });
|
|
164
|
+
applyMetaToCompilerContext(info?.meta?.viteCompilerContext, appPath);
|
|
165
|
+
} catch {
|
|
166
|
+
// 拿不到 compiler context 时仍保留 modifyAppConfig 首轮注入。
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
return viteConfig;
|
|
171
|
+
});
|
|
172
|
+
}
|
package/src/build/taro.ts
CHANGED
|
@@ -484,6 +484,7 @@ export function createMicroappTaroConfig(
|
|
|
484
484
|
path.resolve(SDK_DIR, "plugins/app-config.cjs"),
|
|
485
485
|
{ previewBasePath }
|
|
486
486
|
],
|
|
487
|
+
[path.resolve(SDK_DIR, "plugins/inject-feed-card-meta.cjs"), {}],
|
|
487
488
|
[
|
|
488
489
|
"@tarojs/plugin-inject", // 注入抖音小程序的一些原生事件
|
|
489
490
|
{
|
|
@@ -6,21 +6,53 @@ declare const tt: {
|
|
|
6
6
|
getEnvInfoSync?: () => { microapp?: { envType?: string } }
|
|
7
7
|
} | undefined
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* @desc SDK 根据宿主环境选择的卡片版本;不是业务组件的可配置属性。
|
|
11
|
+
* @example const version: MiniappOpenCardEnvVersion = 'current'
|
|
12
|
+
* @ai-intent 描述 SDK 自动选择的内嵌卡环境版本。
|
|
13
|
+
* @ai-when 需要理解宿主环境与卡片版本的对应关系时。
|
|
14
|
+
* @ai-avoid 不要向 MiniappOpenCard 传入 envVersion 覆盖环境选择。
|
|
15
|
+
* @ai-example const version: MiniappOpenCardEnvVersion = 'current'
|
|
16
|
+
*/
|
|
9
17
|
export type MiniappOpenCardEnvVersion = 'current' | 'latest' | 'preview'
|
|
10
18
|
|
|
19
|
+
/**
|
|
20
|
+
* @desc 内嵌卡加载错误的事件 detail;可选错误字段由平台提供。
|
|
21
|
+
* @example const detail: MiniappOpenCardErrorDetail = { errMsg: '卡片加载失败' }
|
|
22
|
+
* @ai-intent 识别内嵌卡加载失败的事件字段。
|
|
23
|
+
* @ai-when 宿主需要通过 onError 展示错误或记录诊断信息时。
|
|
24
|
+
* @ai-avoid 不要假设可选错误编号或类型一定存在。
|
|
25
|
+
* @ai-example const detail: MiniappOpenCardErrorDetail = { errMsg: '卡片加载失败' }
|
|
26
|
+
*/
|
|
11
27
|
export interface MiniappOpenCardErrorDetail {
|
|
28
|
+
/** @desc 平台返回的错误消息。 */
|
|
12
29
|
errMsg: string
|
|
30
|
+
/** @desc 平台错误编号;平台未提供时省略。 */
|
|
13
31
|
errNo?: number
|
|
32
|
+
/** @desc 平台错误码;平台未提供时省略。 */
|
|
14
33
|
errorCode?: number
|
|
34
|
+
/** @desc 平台错误类型;平台未提供时省略。 */
|
|
15
35
|
errorType?: string
|
|
16
36
|
}
|
|
17
37
|
|
|
38
|
+
/**
|
|
39
|
+
* @desc 普通 Taro 宿主的内嵌卡属性;沿用 StandardProps,但不接受 children 或 envVersion。
|
|
40
|
+
* @example const props: MiniappOpenCardProps = { appId: OPEN_CARD_ID, path: 'pages/index/index', initData: {} }
|
|
41
|
+
* @ai-intent 配置宿主实际承载的 OpenCard 页面。
|
|
42
|
+
* @ai-when 普通小程序或兴趣卡落地页需要渲染内嵌卡时。
|
|
43
|
+
* @ai-avoid 不要传小程序 APP_ID、未确认的页面路径或私域结果作为 initData。
|
|
44
|
+
* @ai-example const props: MiniappOpenCardProps = { appId: OPEN_CARD_ID, path: 'pages/index/index', initData: {} }
|
|
45
|
+
*/
|
|
18
46
|
export interface MiniappOpenCardProps extends Omit<StandardProps, 'children'> {
|
|
47
|
+
/** @desc 已确认的目标 OpenCard 标识;承载当前工程时使用非空 OPEN_CARD_ID,不使用小程序 APP_ID。 */
|
|
19
48
|
appId: string
|
|
49
|
+
/** @desc 目标卡片的真实页面路径,例如 pages/index/index。 */
|
|
20
50
|
path: string
|
|
21
51
|
/** @desc 卡片初始化对象;省略时传空对象。禁止传 null、数组或 JSON 字符串。 */
|
|
22
52
|
initData?: Record<string, unknown>
|
|
53
|
+
/** @desc 卡片加载成功时调用;event.detail 为空对象。 */
|
|
23
54
|
onLoad?: BaseEventOrigFunction<Record<string, never>>
|
|
55
|
+
/** @desc 卡片加载失败时调用;读取 event.detail 中的错误消息与平台可选错误字段。 */
|
|
24
56
|
onError?: BaseEventOrigFunction<MiniappOpenCardErrorDetail>
|
|
25
57
|
}
|
|
26
58
|
|
|
@@ -28,7 +60,20 @@ export interface MiniappOpenCardProps extends Omit<StandardProps, 'children'> {
|
|
|
28
60
|
* @desc 承载同一 OpenCard;SDK 选择环境版本并为空初始化参数提供对象,错误类型直接报错。
|
|
29
61
|
* @params {MiniappOpenCardProps} props 卡片标识、页面路径和生命周期回调。
|
|
30
62
|
* @return {React.ReactElement} 注入环境版本与初始化对象的原生卡片组件。
|
|
31
|
-
* @
|
|
63
|
+
* @remarks development 使用 latest,preview 使用 preview,production、未知或无法读取的环境使用 current;业务不传 envVersion。
|
|
64
|
+
* initData 省略时 SDK 传入空对象,传 null、数组、字符串或其他非普通对象会抛出 TypeError;业务示例显式传 {}。
|
|
65
|
+
* 宿主只承载卡片。封闭域请求、数据处理与结果 UI 留在卡内,不通过 initData 或事件把私域结果交给宿主。
|
|
66
|
+
* @example
|
|
67
|
+
* ```tsx
|
|
68
|
+
* import { MiniappOpenCard } from '@open-dy/vibecoding-sdk-taro/components/miniapp-open-card'
|
|
69
|
+
* export function EmbeddedCard({ openCardId }: { openCardId: string }) {
|
|
70
|
+
* return <MiniappOpenCard appId={openCardId} path="pages/index/index" initData={{}} onError={(event) => console.error(event.detail.errMsg)} />
|
|
71
|
+
* }
|
|
72
|
+
* ```
|
|
73
|
+
* @ai-intent 在普通 Taro 宿主中渲染已确认的 OpenCard 页面。
|
|
74
|
+
* @ai-when 用户要求内嵌卡,或宿主需要通过同一封闭域卡片呈现其结果时。
|
|
75
|
+
* @ai-avoid 不要手写原生标签、传 envVersion 或把卡内私域结果转移到宿主。
|
|
76
|
+
* @ai-example createElement(MiniappOpenCard, { appId: OPEN_CARD_ID, path: 'pages/index/index', initData: {} })
|
|
32
77
|
*/
|
|
33
78
|
export function MiniappOpenCard(props: MiniappOpenCardProps) {
|
|
34
79
|
const initData = props.initData === undefined ? {} : props.initData
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 强制小程序页面使用自定义导航栏:app config 必须声明 navigationStyle: 'custom',
|
|
3
|
+
* page config 若声明 navigationStyle 也只能是 custom,每个页面必须显式声明导航前景色,
|
|
4
|
+
* 且每个页面入口必须接入顶部避让。
|
|
5
|
+
*/
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
|
|
8
|
+
const ts = createRequire(import.meta.url)('typescript');
|
|
9
|
+
|
|
10
|
+
const CUSTOM = 'custom';
|
|
11
|
+
const NAVIGATION_TEXT_STYLES = new Set(['black', 'white']);
|
|
12
|
+
|
|
13
|
+
const CUSTOM_NAV_IMPORTS = new Set([
|
|
14
|
+
'@/components/custom-nav-space',
|
|
15
|
+
'@/hooks/use-custom-nav-layout',
|
|
16
|
+
'@/lib/custom-nav-layout',
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
const FORBIDDEN_NAVIGATION_APIS = new Map([
|
|
20
|
+
['setNavigationBarTitle', '禁止修改导航栏标题'],
|
|
21
|
+
['setNavigationBarColor', '禁止修改导航栏颜色、前景色或状态栏样式'],
|
|
22
|
+
['showNavigationBarLoading', '禁止显示导航栏 loading'],
|
|
23
|
+
['hideNavigationBarLoading', '禁止隐藏导航栏 loading'],
|
|
24
|
+
['hideHomeButton', '禁止隐藏左上角首页或 logo 按钮'],
|
|
25
|
+
]);
|
|
26
|
+
|
|
27
|
+
function getPropertyName(prop) {
|
|
28
|
+
if (!ts.isPropertyAssignment(prop)) return null;
|
|
29
|
+
if (ts.isIdentifier(prop.name)) return prop.name.text;
|
|
30
|
+
if (ts.isStringLiteral(prop.name)) return prop.name.text;
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function getStringLiteral(node) {
|
|
35
|
+
if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
|
|
36
|
+
return node.text;
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getStaticPropertyName(node) {
|
|
42
|
+
if (!node.computed && node.property.type === 'Identifier') {
|
|
43
|
+
return node.property.name;
|
|
44
|
+
}
|
|
45
|
+
if (
|
|
46
|
+
node.computed &&
|
|
47
|
+
node.property.type === 'Literal' &&
|
|
48
|
+
typeof node.property.value === 'string'
|
|
49
|
+
) {
|
|
50
|
+
return node.property.value;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getPropertyKeyName(node) {
|
|
56
|
+
if (!node.computed && node.key.type === 'Identifier') {
|
|
57
|
+
return node.key.name;
|
|
58
|
+
}
|
|
59
|
+
if (node.key.type === 'Literal' && typeof node.key.value === 'string') {
|
|
60
|
+
return node.key.value;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @returns {{ windowStyle: string | null, pageStyle: string | null, windowTextStyle: string | null, pageTextStyle: string | null, invalid: Array<{ kind: string, value: string | null }> } | null}
|
|
67
|
+
*/
|
|
68
|
+
function extractNavigationStyles(filePath, text) {
|
|
69
|
+
const sf = ts.createSourceFile(filePath, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
70
|
+
let result = null;
|
|
71
|
+
|
|
72
|
+
function fromObjectLiteral(obj) {
|
|
73
|
+
const out = {
|
|
74
|
+
windowStyle: null,
|
|
75
|
+
pageStyle: null,
|
|
76
|
+
windowTextStyle: null,
|
|
77
|
+
pageTextStyle: null,
|
|
78
|
+
invalid: [],
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
for (const prop of obj.properties) {
|
|
82
|
+
if (!ts.isPropertyAssignment(prop)) continue;
|
|
83
|
+
const key = getPropertyName(prop);
|
|
84
|
+
|
|
85
|
+
if (key === 'navigationStyle') {
|
|
86
|
+
const value = getStringLiteral(prop.initializer);
|
|
87
|
+
out.pageStyle = value;
|
|
88
|
+
if (value !== CUSTOM) {
|
|
89
|
+
out.invalid.push({ kind: 'page', value });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (key === 'navigationBarTextStyle') {
|
|
94
|
+
out.pageTextStyle = getStringLiteral(prop.initializer);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (key === 'window' && ts.isObjectLiteralExpression(prop.initializer)) {
|
|
98
|
+
for (const windowProp of prop.initializer.properties) {
|
|
99
|
+
if (!ts.isPropertyAssignment(windowProp)) continue;
|
|
100
|
+
const windowKey = getPropertyName(windowProp);
|
|
101
|
+
if (windowKey === 'navigationStyle') {
|
|
102
|
+
const value = getStringLiteral(windowProp.initializer);
|
|
103
|
+
out.windowStyle = value;
|
|
104
|
+
if (value !== CUSTOM) {
|
|
105
|
+
out.invalid.push({ kind: 'window', value });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (windowKey === 'navigationBarTextStyle') {
|
|
109
|
+
out.windowTextStyle = getStringLiteral(windowProp.initializer);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function visit(node) {
|
|
119
|
+
if (result) return;
|
|
120
|
+
if (ts.isExportAssignment(node) && !node.isExportEquals && node.expression) {
|
|
121
|
+
const expr = node.expression;
|
|
122
|
+
if (
|
|
123
|
+
ts.isCallExpression(expr) &&
|
|
124
|
+
expr.arguments[0] &&
|
|
125
|
+
ts.isObjectLiteralExpression(expr.arguments[0])
|
|
126
|
+
) {
|
|
127
|
+
result = fromObjectLiteral(expr.arguments[0]);
|
|
128
|
+
} else if (ts.isObjectLiteralExpression(expr)) {
|
|
129
|
+
result = fromObjectLiteral(expr);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
ts.forEachChild(node, visit);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
visit(sf);
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const CONFIG_MESSAGE =
|
|
140
|
+
'小程序页面必须使用自定义导航栏:navigationStyle 只能是 "custom",禁止改成 default 或其他值。' +
|
|
141
|
+
'页面顶部请用 <CustomNavSpace /> 或 useCustomNavLayout() 避让状态栏与胶囊。';
|
|
142
|
+
|
|
143
|
+
const TEXT_STYLE_MESSAGE =
|
|
144
|
+
'请根据该页面首次进入时顶部区域的实际明暗,显式设置 navigationBarTextStyle:' +
|
|
145
|
+
'浅色顶部使用 "black",深色顶部使用 "white"。';
|
|
146
|
+
|
|
147
|
+
/** @type {import('eslint').Rule.RuleModule} */
|
|
148
|
+
const requireCustomNavigationStyle = {
|
|
149
|
+
meta: {
|
|
150
|
+
type: 'problem',
|
|
151
|
+
docs: {
|
|
152
|
+
description: '强制自定义导航,并要求 app fallback 与每个页面显式声明导航前景色',
|
|
153
|
+
},
|
|
154
|
+
schema: [],
|
|
155
|
+
},
|
|
156
|
+
create(context) {
|
|
157
|
+
const filePath = context.filename.replace(/\\/g, '/');
|
|
158
|
+
const isApp = filePath.endsWith('/src/app.config.ts') || filePath.endsWith('src/app.config.ts');
|
|
159
|
+
const isPageConfig = /\/src\/pages\/.+\.config\.ts$/.test(filePath);
|
|
160
|
+
if (!isApp && !isPageConfig) return {};
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
Program(node) {
|
|
164
|
+
const sourceText = context.sourceCode.getText(node);
|
|
165
|
+
const parsed = extractNavigationStyles(filePath, sourceText);
|
|
166
|
+
|
|
167
|
+
if (!parsed) {
|
|
168
|
+
context.report({
|
|
169
|
+
node,
|
|
170
|
+
message: `无法解析 ${isApp ? 'defineAppConfig' : 'definePageConfig'},请使用对象字面量声明。${CONFIG_MESSAGE}`,
|
|
171
|
+
});
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (isApp && parsed.windowStyle !== CUSTOM) {
|
|
176
|
+
context.report({
|
|
177
|
+
node,
|
|
178
|
+
message:
|
|
179
|
+
`src/app.config.ts 的 window.navigationStyle 必须为 "custom"(当前:${parsed.windowStyle ?? '未设置'})。${CONFIG_MESSAGE}`,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const textStyle = isApp ? parsed.windowTextStyle : parsed.pageTextStyle;
|
|
184
|
+
if (!NAVIGATION_TEXT_STYLES.has(textStyle)) {
|
|
185
|
+
context.report({
|
|
186
|
+
node,
|
|
187
|
+
message:
|
|
188
|
+
`${isApp ? 'src/app.config.ts 的 window' : '页面配置'}.navigationBarTextStyle ` +
|
|
189
|
+
`必须为 "black" 或 "white"(当前:${textStyle ?? '未设置'})。${TEXT_STYLE_MESSAGE}`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
for (const item of parsed.invalid) {
|
|
194
|
+
if (isApp && item.kind === 'window') continue;
|
|
195
|
+
context.report({
|
|
196
|
+
node,
|
|
197
|
+
message:
|
|
198
|
+
`禁止将 ${item.kind === 'window' ? 'window.' : ''}navigationStyle 设为 ${JSON.stringify(item.value)}。${CONFIG_MESSAGE}`,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
/** @type {import('eslint').Rule.RuleModule} */
|
|
207
|
+
const pagesMustUseCustomNavSpace = {
|
|
208
|
+
meta: {
|
|
209
|
+
type: 'problem',
|
|
210
|
+
docs: {
|
|
211
|
+
description: '页面入口必须使用 CustomNavSpace 或 useCustomNavLayout 避让自定义导航栏区域',
|
|
212
|
+
},
|
|
213
|
+
schema: [],
|
|
214
|
+
},
|
|
215
|
+
create(context) {
|
|
216
|
+
const filePath = context.filename.replace(/\\/g, '/');
|
|
217
|
+
if (!/\/src\/pages\/.+\/index\.[jt]sx$/.test(filePath)) return {};
|
|
218
|
+
|
|
219
|
+
let used = false;
|
|
220
|
+
|
|
221
|
+
return {
|
|
222
|
+
ImportDeclaration(node) {
|
|
223
|
+
if (typeof node.source.value === 'string' && CUSTOM_NAV_IMPORTS.has(node.source.value)) {
|
|
224
|
+
used = true;
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
'Program:exit'(node) {
|
|
228
|
+
if (used) return;
|
|
229
|
+
context.report({
|
|
230
|
+
node,
|
|
231
|
+
message:
|
|
232
|
+
'小程序页面必须 import <CustomNavSpace /> 或 useCustomNavLayout() 做顶部避让,' +
|
|
233
|
+
'禁止改回原生导航,也禁止只用固定 pt-* / safe-area 代替。',
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/** @type {import('eslint').Rule.RuleModule} */
|
|
241
|
+
const noNavigationControlApis = {
|
|
242
|
+
meta: {
|
|
243
|
+
type: 'problem',
|
|
244
|
+
docs: {
|
|
245
|
+
description: '禁止小程序页面调用会修改宿主导航栏或左上角按钮的 API',
|
|
246
|
+
},
|
|
247
|
+
schema: [],
|
|
248
|
+
},
|
|
249
|
+
create(context) {
|
|
250
|
+
function report(node, apiName) {
|
|
251
|
+
const reason = FORBIDDEN_NAVIGATION_APIS.get(apiName);
|
|
252
|
+
if (!reason) return;
|
|
253
|
+
|
|
254
|
+
context.report({
|
|
255
|
+
node,
|
|
256
|
+
message:
|
|
257
|
+
`小程序页面禁止使用 ${apiName}:${reason}。` +
|
|
258
|
+
'导航栏和左上角按钮由宿主及自定义导航模板统一管理。',
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
MemberExpression(node) {
|
|
264
|
+
report(node.property, getStaticPropertyName(node));
|
|
265
|
+
},
|
|
266
|
+
ImportSpecifier(node) {
|
|
267
|
+
const importedName = node.imported.type === 'Identifier'
|
|
268
|
+
? node.imported.name
|
|
269
|
+
: node.imported.value;
|
|
270
|
+
report(node.imported, importedName);
|
|
271
|
+
},
|
|
272
|
+
Property(node) {
|
|
273
|
+
if (node.parent.type !== 'ObjectPattern') return;
|
|
274
|
+
report(node.key, getPropertyKeyName(node));
|
|
275
|
+
},
|
|
276
|
+
CallExpression(node) {
|
|
277
|
+
if (node.callee.type !== 'Identifier') return;
|
|
278
|
+
report(node.callee, node.callee.name);
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
export default {
|
|
285
|
+
rules: {
|
|
286
|
+
'require-custom-navigation-style': requireCustomNavigationStyle,
|
|
287
|
+
'pages-must-use-custom-nav-space': pagesMustUseCustomNavSpace,
|
|
288
|
+
'no-navigation-control-apis': noNavigationControlApis,
|
|
289
|
+
},
|
|
290
|
+
};
|
package/src/eslint/taro.mjs
CHANGED
|
@@ -6,6 +6,7 @@ import reactHooksPlugin from 'eslint-plugin-react-hooks';
|
|
|
6
6
|
import importPlugin from 'eslint-plugin-import';
|
|
7
7
|
import globals from 'globals';
|
|
8
8
|
import microappPages from './eslint-plugin-microapp-pages.mjs';
|
|
9
|
+
import customNavigation from './eslint-plugin-custom-navigation.mjs';
|
|
9
10
|
|
|
10
11
|
const REMOTE_CSS_IMPORT_PATTERN =
|
|
11
12
|
/@import\s+(?:url\(\s*['"]?((?:https?:)?\/\/[^'")\s]+)['"]?\s*\)|['"]((?:https?:)?\/\/[^'"\s]+)['"])/g;
|
|
@@ -69,7 +70,7 @@ function createLucideColorCheckPlugin(importSources = ['@open-dy/lucide-taro'])
|
|
|
69
70
|
const cssImportGuardPlugin = {
|
|
70
71
|
processors: {
|
|
71
72
|
css: {
|
|
72
|
-
preprocess(text) {
|
|
73
|
+
preprocess(text, filename) {
|
|
73
74
|
const lines = text.replace(/\/\*[\s\S]*?\*\//g, comment => {
|
|
74
75
|
if (comment.includes('eslint-')) return comment;
|
|
75
76
|
return comment.replace(/[^\n]/g, ' ');
|
|
@@ -101,6 +102,18 @@ const cssImportGuardPlugin = {
|
|
|
101
102
|
].join(' ');
|
|
102
103
|
});
|
|
103
104
|
|
|
105
|
+
// Scope this guard to the SDK-based host app; OpenCard has its own CSS pipeline.
|
|
106
|
+
if (filename.replaceAll('\\', '/').endsWith('/src/app.css')) {
|
|
107
|
+
const css = lines.join('\n');
|
|
108
|
+
const imports = [...css.matchAll(/@import\s+(?:url\(\s*)?['"]([^'"]+)['"]/g)]
|
|
109
|
+
.map(match => match[1]);
|
|
110
|
+
const usesSdkTheme = imports.some(value => /^@[^/]+\/vibecoding-sdk-taro\/ui\/tailwind\.css$/.test(value));
|
|
111
|
+
const hasUtilities = imports.some(value => ['weapp-tailwindcss', 'tailwindcss', 'tailwindcss/utilities.css', 'weapp-tailwindcss/utilities.css'].includes(value))
|
|
112
|
+
|| /@tailwind\s+utilities\s*;/.test(css);
|
|
113
|
+
if (usesSdkTheme && !hasUtilities) {
|
|
114
|
+
virtualLines[0] = `${virtualLines[0] ?? ''} __cssMissingTailwindEntry();`;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
104
117
|
return [virtualLines.join('\n')];
|
|
105
118
|
},
|
|
106
119
|
postprocess(messages) {
|
|
@@ -249,6 +262,16 @@ function collectStaticStrings(node, result = []) {
|
|
|
249
262
|
|
|
250
263
|
const tailwindEnforcementPlugin = {
|
|
251
264
|
rules: {
|
|
265
|
+
'require-utilities-entry': {
|
|
266
|
+
create(context) {
|
|
267
|
+
return {
|
|
268
|
+
CallExpression(node) {
|
|
269
|
+
if (node.callee?.name !== '__cssMissingTailwindEntry') return;
|
|
270
|
+
context.report({ node, message: 'src/app.css 缺少 Tailwind 工具类入口。请保留模板的 @import "weapp-tailwindcss";;SDK ui/tailwind.css 只提供主题和组件扫描,不能替代此入口。' });
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
},
|
|
274
|
+
},
|
|
252
275
|
'no-arbitrary-font-size': {
|
|
253
276
|
create(context) {
|
|
254
277
|
function reportArbitraryFontSize(node, className) {
|
|
@@ -440,15 +463,25 @@ export function createMicroappTaroEslintConfig(options = {}) {
|
|
|
440
463
|
'tailwindcss/no-custom-classname': 'off',
|
|
441
464
|
},
|
|
442
465
|
},
|
|
466
|
+
{
|
|
467
|
+
files: ['src/**/*.{js,jsx,ts,tsx}'],
|
|
468
|
+
plugins: { customNavigation },
|
|
469
|
+
rules: {
|
|
470
|
+
'customNavigation/no-navigation-control-apis': 'error',
|
|
471
|
+
},
|
|
472
|
+
},
|
|
443
473
|
{
|
|
444
474
|
files: ['src/**/*.{js,jsx,ts,tsx}'],
|
|
445
475
|
ignores: ['src/network.ts'],
|
|
446
476
|
plugins: {
|
|
447
477
|
lucide: lucideColorCheckPlugin,
|
|
448
478
|
microappPages,
|
|
479
|
+
customNavigation,
|
|
449
480
|
tailwind: tailwindEnforcementPlugin,
|
|
450
481
|
},
|
|
451
482
|
rules: {
|
|
483
|
+
'customNavigation/require-custom-navigation-style': 'error',
|
|
484
|
+
'customNavigation/pages-must-use-custom-nav-space': 'error',
|
|
452
485
|
'microappPages/nav-url-in-app-pages': 'error',
|
|
453
486
|
// 'microappPages/page-dirs-in-app-pages': 'error',
|
|
454
487
|
'microappPages/declared-pages-must-exist': 'error',
|
|
@@ -508,6 +541,7 @@ export function createMicroappTaroEslintConfig(options = {}) {
|
|
|
508
541
|
},
|
|
509
542
|
processor: 'local/css',
|
|
510
543
|
rules: {
|
|
544
|
+
'tailwind/require-utilities-entry': 'error',
|
|
511
545
|
'no-undef': 'off',
|
|
512
546
|
'tailwind/no-arbitrary-font-size': 'error',
|
|
513
547
|
'no-restricted-syntax': ['error', ...baseRestrictedSyntaxRules],
|