mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-22 04:05:48 +00:00
Compare commits
8 Commits
shadcn@2.6
...
shadcn@2.7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84d6c83bad | ||
|
|
5b8ee41511 | ||
|
|
7c3d34cdc9 | ||
|
|
56c4c83511 | ||
|
|
2821cb0e39 | ||
|
|
3c87402de2 | ||
|
|
20a88e1f15 | ||
|
|
cb19ab8464 |
@@ -98,7 +98,7 @@ To run the CLI locally, you can follow the workflow:
|
|||||||
1. Start by running the registry (main site) to make sure the components are up to date:
|
1. Start by running the registry (main site) to make sure the components are up to date:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm www:dev
|
pnpm v4:dev
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Run the development script for the CLI:
|
2. Run the development script for the CLI:
|
||||||
|
|||||||
2
apps/v4/.env.example
Normal file
2
apps/v4/.env.example
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
NEXT_PUBLIC_V0_URL=https://v0.dev
|
||||||
|
NEXT_PUBLIC_APP_URL=http://localhost:4000
|
||||||
1
apps/v4/.gitignore
vendored
1
apps/v4/.gitignore
vendored
@@ -32,6 +32,7 @@ yarn-error.log*
|
|||||||
|
|
||||||
# env files (can opt-in for committing if needed)
|
# env files (can opt-in for committing if needed)
|
||||||
.env*
|
.env*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
# vercel
|
# vercel
|
||||||
.vercel
|
.vercel
|
||||||
|
|||||||
@@ -328,6 +328,20 @@ Add custom theme variables to the `theme` object.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Add custom plugins
|
||||||
|
|
||||||
|
```json title="example-plugin.json" showLineNumbers
|
||||||
|
{
|
||||||
|
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
|
||||||
|
"name": "custom-plugin",
|
||||||
|
"type": "registry:component",
|
||||||
|
"css": {
|
||||||
|
"@plugin @tailwindcss/typography": {},
|
||||||
|
"@plugin foo": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Add custom animations
|
## Add custom animations
|
||||||
|
|
||||||
Note: you need to define both `@keyframes` in css and `theme` in cssVars to use animations.
|
Note: you need to define both `@keyframes` in css and `theme` in cssVars to use animations.
|
||||||
|
|||||||
@@ -260,11 +260,13 @@ Use to define CSS variables for your registry item.
|
|||||||
|
|
||||||
### css
|
### css
|
||||||
|
|
||||||
Use `css` to add new rules to the project's CSS file eg. `@layer base`, `@layer components`, `@utility`, `@keyframes`, etc.
|
Use `css` to add new rules to the project's CSS file eg. `@layer base`, `@layer components`, `@utility`, `@keyframes`, `@plugin`, etc.
|
||||||
|
|
||||||
```json title="registry-item.json" showLineNumbers
|
```json title="registry-item.json" showLineNumbers
|
||||||
{
|
{
|
||||||
"css": {
|
"css": {
|
||||||
|
"@plugin @tailwindcss/typography": {},
|
||||||
|
"@plugin foo": {},
|
||||||
"@layer base": {
|
"@layer base": {
|
||||||
"body": {
|
"body": {
|
||||||
"font-size": "var(--text-base)",
|
"font-size": "var(--text-base)",
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
"recharts": "2.15.1",
|
"recharts": "2.15.1",
|
||||||
"rehype-pretty-code": "^0.14.1",
|
"rehype-pretty-code": "^0.14.1",
|
||||||
"rimraf": "^6.0.1",
|
"rimraf": "^6.0.1",
|
||||||
"shadcn": "2.6.4",
|
"shadcn": "2.7.0",
|
||||||
"shiki": "^1.10.1",
|
"shiki": "^1.10.1",
|
||||||
"sonner": "^2.0.0",
|
"sonner": "^2.0.0",
|
||||||
"tailwind-merge": "^3.0.1",
|
"tailwind-merge": "^3.0.1",
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"path": "registry/new-york-v4/blocks/calendar-24.tsx",
|
"path": "registry/new-york-v4/blocks/calendar-24.tsx",
|
||||||
"content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/new-york-v4/ui/button\"\nimport { Calendar } from \"@/registry/new-york-v4/ui/calendar\"\nimport { Input } from \"@/registry/new-york-v4/ui/input\"\nimport { Label } from \"@/registry/new-york-v4/ui/label\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/new-york-v4/ui/popover\"\n\nexport default function Calendar24() {\n const [open, setOpen] = React.useState(false)\n const [date, setDate] = React.useState<Date | undefined>(undefined)\n\n return (\n <div className=\"flex gap-4\">\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"date\" className=\"px-1\">\n Date\n </Label>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n id=\"date\"\n className=\"w-32 justify-between font-normal\"\n >\n {date ? date.toLocaleDateString() : \"Select date\"}\n <ChevronDownIcon />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={date}\n captionLayout=\"dropdown\"\n onSelect={(date) => {\n setDate(date)\n setOpen(false)\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"time\" className=\"px-1\">\n Time\n </Label>\n <Input\n type=\"time\"\n id=\"time\"\n step=\"1\"\n defaultValue=\"10:30:00\"\n className=\"bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\"\n />\n </div>\n </div>\n )\n}\n",
|
"content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/new-york-v4/ui/button\"\nimport { Calendar } from \"@/registry/new-york-v4/ui/calendar\"\nimport { Input } from \"@/registry/new-york-v4/ui/input\"\nimport { Label } from \"@/registry/new-york-v4/ui/label\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/new-york-v4/ui/popover\"\n\nexport default function Calendar24() {\n const [open, setOpen] = React.useState(false)\n const [date, setDate] = React.useState<Date | undefined>(undefined)\n\n return (\n <div className=\"flex gap-4\">\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"date-picker\" className=\"px-1\">\n Date\n </Label>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n id=\"date-picker\"\n className=\"w-32 justify-between font-normal\"\n >\n {date ? date.toLocaleDateString() : \"Select date\"}\n <ChevronDownIcon />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={date}\n captionLayout=\"dropdown\"\n onSelect={(date) => {\n setDate(date)\n setOpen(false)\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"time-picker\" className=\"px-1\">\n Time\n </Label>\n <Input\n type=\"time\"\n id=\"time-picker\"\n step=\"1\"\n defaultValue=\"10:30:00\"\n className=\"bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\"\n />\n </div>\n </div>\n )\n}\n",
|
||||||
"type": "registry:component"
|
"type": "registry:component"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -20,14 +20,14 @@ export default function Calendar24() {
|
|||||||
return (
|
return (
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
<div className="flex flex-col gap-3">
|
<div className="flex flex-col gap-3">
|
||||||
<Label htmlFor="date" className="px-1">
|
<Label htmlFor="date-picker" className="px-1">
|
||||||
Date
|
Date
|
||||||
</Label>
|
</Label>
|
||||||
<Popover open={open} onOpenChange={setOpen}>
|
<Popover open={open} onOpenChange={setOpen}>
|
||||||
<PopoverTrigger asChild>
|
<PopoverTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
id="date"
|
id="date-picker"
|
||||||
className="w-32 justify-between font-normal"
|
className="w-32 justify-between font-normal"
|
||||||
>
|
>
|
||||||
{date ? date.toLocaleDateString() : "Select date"}
|
{date ? date.toLocaleDateString() : "Select date"}
|
||||||
@@ -48,12 +48,12 @@ export default function Calendar24() {
|
|||||||
</Popover>
|
</Popover>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col gap-3">
|
<div className="flex flex-col gap-3">
|
||||||
<Label htmlFor="time" className="px-1">
|
<Label htmlFor="time-picker" className="px-1">
|
||||||
Time
|
Time
|
||||||
</Label>
|
</Label>
|
||||||
<Input
|
<Input
|
||||||
type="time"
|
type="time"
|
||||||
id="time"
|
id="time-picker"
|
||||||
step="1"
|
step="1"
|
||||||
defaultValue="10:30:00"
|
defaultValue="10:30:00"
|
||||||
className="bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none"
|
className="bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none"
|
||||||
|
|||||||
6
apps/www/README.md
Normal file
6
apps/www/README.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# ui.shadcn.com
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> The site at ui.shadcn.com now points to `apps/v4`. All changes should be made in the `apps/v4` directory.
|
||||||
|
|
||||||
|
Licensed under the [MIT license](https://github.com/shadcn/ui/blob/main/LICENSE.md).
|
||||||
@@ -10,3 +10,4 @@ description: Every component recreated in Figma. With customizable props, typogr
|
|||||||
## Free
|
## Free
|
||||||
|
|
||||||
- [shadcn/ui design system](https://www.figma.com/community/file/1203061493325953101) by [Pietro Schirano](https://twitter.com/skirano) - A design companion for shadcn/ui. Each component was painstakingly crafted to perfectly match the code implementation.
|
- [shadcn/ui design system](https://www.figma.com/community/file/1203061493325953101) by [Pietro Schirano](https://twitter.com/skirano) - A design companion for shadcn/ui. Each component was painstakingly crafted to perfectly match the code implementation.
|
||||||
|
- [Obra shadcn/ui](https://www.figma.com/community/file/1514746685758799870/obra-shadcn-ui) by [Obra Studio](https://https://obra.studio/) - Carefully crafted kit designed in the philosophy of shadcn, tracks v4, MIT licensed
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
"react-resizable-panels": "^2.0.22",
|
"react-resizable-panels": "^2.0.22",
|
||||||
"react-wrap-balancer": "^0.4.1",
|
"react-wrap-balancer": "^0.4.1",
|
||||||
"recharts": "2.12.7",
|
"recharts": "2.12.7",
|
||||||
"shadcn": "2.6.4",
|
"shadcn": "2.7.0",
|
||||||
"sharp": "^0.32.6",
|
"sharp": "^0.32.6",
|
||||||
"sonner": "^1.2.3",
|
"sonner": "^1.2.3",
|
||||||
"swr": "2.2.6-beta.3",
|
"swr": "2.2.6-beta.3",
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"files": [
|
"files": [
|
||||||
{
|
{
|
||||||
"path": "registry/new-york-v4/blocks/calendar-24.tsx",
|
"path": "registry/new-york-v4/blocks/calendar-24.tsx",
|
||||||
"content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/new-york-v4/ui/button\"\nimport { Calendar } from \"@/registry/new-york-v4/ui/calendar\"\nimport { Input } from \"@/registry/new-york-v4/ui/input\"\nimport { Label } from \"@/registry/new-york-v4/ui/label\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/new-york-v4/ui/popover\"\n\nexport default function Calendar24() {\n const [open, setOpen] = React.useState(false)\n const [date, setDate] = React.useState<Date | undefined>(undefined)\n\n return (\n <div className=\"flex gap-4\">\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"date\" className=\"px-1\">\n Date\n </Label>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n id=\"date\"\n className=\"w-32 justify-between font-normal\"\n >\n {date ? date.toLocaleDateString() : \"Select date\"}\n <ChevronDownIcon />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={date}\n captionLayout=\"dropdown\"\n onSelect={(date) => {\n setDate(date)\n setOpen(false)\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"time\" className=\"px-1\">\n Time\n </Label>\n <Input\n type=\"time\"\n id=\"time\"\n step=\"1\"\n defaultValue=\"10:30:00\"\n className=\"bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\"\n />\n </div>\n </div>\n )\n}\n",
|
"content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\n\nimport { Button } from \"@/registry/new-york-v4/ui/button\"\nimport { Calendar } from \"@/registry/new-york-v4/ui/calendar\"\nimport { Input } from \"@/registry/new-york-v4/ui/input\"\nimport { Label } from \"@/registry/new-york-v4/ui/label\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@/registry/new-york-v4/ui/popover\"\n\nexport default function Calendar24() {\n const [open, setOpen] = React.useState(false)\n const [date, setDate] = React.useState<Date | undefined>(undefined)\n\n return (\n <div className=\"flex gap-4\">\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"date-picker\" className=\"px-1\">\n Date\n </Label>\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n id=\"date-picker\"\n className=\"w-32 justify-between font-normal\"\n >\n {date ? date.toLocaleDateString() : \"Select date\"}\n <ChevronDownIcon />\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto overflow-hidden p-0\" align=\"start\">\n <Calendar\n mode=\"single\"\n selected={date}\n captionLayout=\"dropdown\"\n onSelect={(date) => {\n setDate(date)\n setOpen(false)\n }}\n />\n </PopoverContent>\n </Popover>\n </div>\n <div className=\"flex flex-col gap-3\">\n <Label htmlFor=\"time-picker\" className=\"px-1\">\n Time\n </Label>\n <Input\n type=\"time\"\n id=\"time-picker\"\n step=\"1\"\n defaultValue=\"10:30:00\"\n className=\"bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none\"\n />\n </div>\n </div>\n )\n}\n",
|
||||||
"type": "registry:component"
|
"type": "registry:component"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1,5 +1,17 @@
|
|||||||
# @shadcn/ui
|
# @shadcn/ui
|
||||||
|
|
||||||
|
## 2.7.0
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [#7540](https://github.com/shadcn-ui/ui/pull/7540) [`cb19ab84646fc017c15fadc81fc47b695560a04c`](https://github.com/shadcn-ui/ui/commit/cb19ab84646fc017c15fadc81fc47b695560a04c) Thanks [@mrzachnugent](https://github.com/mrzachnugent)! - add support for expo
|
||||||
|
|
||||||
|
- [#7640](https://github.com/shadcn-ui/ui/pull/7640) [`7c3d34cdc91681815f8897709917ec9fbcd69245`](https://github.com/shadcn-ui/ui/commit/7c3d34cdc91681815f8897709917ec9fbcd69245) Thanks [@shadcn](https://github.com/shadcn)! - add support for @plugin in css
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- [#7609](https://github.com/shadcn-ui/ui/pull/7609) [`5b8ee41511fb5ff468d9218f97b8545e145d773c`](https://github.com/shadcn-ui/ui/commit/5b8ee41511fb5ff468d9218f97b8545e145d773c) Thanks [@xabierlameiro](https://github.com/xabierlameiro)! - fix typo in function name unnsetSpreadElements
|
||||||
|
|
||||||
## 2.6.4
|
## 2.6.4
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "shadcn",
|
"name": "shadcn",
|
||||||
"version": "2.6.4",
|
"version": "2.7.0",
|
||||||
"description": "Add components to your apps.",
|
"description": "Add components to your apps.",
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
"access": "public"
|
"access": "public"
|
||||||
|
|||||||
@@ -72,6 +72,14 @@ export const FRAMEWORKS = {
|
|||||||
tailwind: "https://tailwindcss.com/docs/guides/gatsby",
|
tailwind: "https://tailwindcss.com/docs/guides/gatsby",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
expo: {
|
||||||
|
name: "expo",
|
||||||
|
label: "Expo",
|
||||||
|
links: {
|
||||||
|
installation: "https://ui.shadcn.com/docs/installation/expo",
|
||||||
|
tailwind: "https://www.nativewind.dev/docs/getting-started/installation",
|
||||||
|
},
|
||||||
|
},
|
||||||
manual: {
|
manual: {
|
||||||
name: "manual",
|
name: "manual",
|
||||||
label: "Manual",
|
label: "Manual",
|
||||||
|
|||||||
@@ -146,6 +146,12 @@ export async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {
|
|||||||
return type
|
return type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Expo.
|
||||||
|
if (packageJson?.dependencies?.expo) {
|
||||||
|
type.framework = FRAMEWORKS["expo"]
|
||||||
|
return type
|
||||||
|
}
|
||||||
|
|
||||||
return type
|
return type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,8 +79,70 @@ function updateCssPlugin(css: z.infer<typeof registryItemCssSchema>) {
|
|||||||
|
|
||||||
const [, name, params] = atRuleMatch
|
const [, name, params] = atRuleMatch
|
||||||
|
|
||||||
|
// Special handling for plugins - place them after imports
|
||||||
|
if (name === "plugin") {
|
||||||
|
// Find existing plugin with same params
|
||||||
|
const existingPlugin = root.nodes?.find(
|
||||||
|
(node): node is AtRule =>
|
||||||
|
node.type === "atrule" &&
|
||||||
|
node.name === "plugin" &&
|
||||||
|
node.params === params
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!existingPlugin) {
|
||||||
|
const pluginRule = postcss.atRule({
|
||||||
|
name: "plugin",
|
||||||
|
params,
|
||||||
|
raws: { semicolon: true, before: "\n" },
|
||||||
|
})
|
||||||
|
|
||||||
|
// Find the last import or plugin node to insert after
|
||||||
|
const importNodes = root.nodes?.filter(
|
||||||
|
(node): node is AtRule =>
|
||||||
|
node.type === "atrule" && node.name === "import"
|
||||||
|
)
|
||||||
|
|
||||||
|
const pluginNodes = root.nodes?.filter(
|
||||||
|
(node): node is AtRule =>
|
||||||
|
node.type === "atrule" && node.name === "plugin"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (pluginNodes && pluginNodes.length > 0) {
|
||||||
|
// Insert after the last existing plugin
|
||||||
|
const lastPlugin = pluginNodes[pluginNodes.length - 1]
|
||||||
|
root.insertAfter(lastPlugin, pluginRule)
|
||||||
|
} else if (importNodes && importNodes.length > 0) {
|
||||||
|
// Insert after the last import if no plugins exist
|
||||||
|
const lastImport = importNodes[importNodes.length - 1]
|
||||||
|
root.insertAfter(lastImport, pluginRule)
|
||||||
|
// Add a break comment before the first plugin to create spacing
|
||||||
|
root.insertBefore(
|
||||||
|
pluginRule,
|
||||||
|
postcss.comment({ text: "---break---" })
|
||||||
|
)
|
||||||
|
// Add a break comment after the plugin for spacing from other content
|
||||||
|
root.insertAfter(
|
||||||
|
pluginRule,
|
||||||
|
postcss.comment({ text: "---break---" })
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
// If no imports or plugins, insert at the beginning
|
||||||
|
root.prepend(pluginRule)
|
||||||
|
// Add a break comment before the first plugin for spacing
|
||||||
|
root.insertBefore(
|
||||||
|
pluginRule,
|
||||||
|
postcss.comment({ text: "---break---" })
|
||||||
|
)
|
||||||
|
// Add a break comment after the plugin for spacing from other content
|
||||||
|
root.insertAfter(
|
||||||
|
pluginRule,
|
||||||
|
postcss.comment({ text: "---break---" })
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// Special handling for keyframes - place them under @theme inline
|
// Special handling for keyframes - place them under @theme inline
|
||||||
if (name === "keyframes") {
|
else if (name === "keyframes") {
|
||||||
let themeInline = root.nodes?.find(
|
let themeInline = root.nodes?.find(
|
||||||
(node): node is AtRule =>
|
(node): node is AtRule =>
|
||||||
node.type === "atrule" &&
|
node.type === "atrule" &&
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export async function updateDependencies(
|
|||||||
const dependenciesSpinner = spinner(`Installing dependencies.`, {
|
const dependenciesSpinner = spinner(`Installing dependencies.`, {
|
||||||
silent: options.silent,
|
silent: options.silent,
|
||||||
})?.start()
|
})?.start()
|
||||||
const packageManager = await getPackageManager(config.resolvedPaths.cwd)
|
const packageManager = await getUpdateDependenciesPackageManager(config)
|
||||||
|
|
||||||
// Offer to use --force or --legacy-peer-deps if using React 19 with npm.
|
// Offer to use --force or --legacy-peer-deps if using React 19 with npm.
|
||||||
let flag = ""
|
let flag = ""
|
||||||
@@ -62,38 +62,13 @@ export async function updateDependencies(
|
|||||||
|
|
||||||
dependenciesSpinner?.start()
|
dependenciesSpinner?.start()
|
||||||
|
|
||||||
if (dependencies?.length) {
|
await installWithPackageManager(
|
||||||
await execa(
|
packageManager,
|
||||||
packageManager,
|
dependencies,
|
||||||
[
|
devDependencies,
|
||||||
packageManager === "npm" ? "install" : "add",
|
config.resolvedPaths.cwd,
|
||||||
...(packageManager === "npm" && flag ? [`--${flag}`] : []),
|
flag
|
||||||
...(packageManager === "deno"
|
)
|
||||||
? dependencies.map((dep) => `npm:${dep}`)
|
|
||||||
: dependencies),
|
|
||||||
],
|
|
||||||
{
|
|
||||||
cwd: config.resolvedPaths.cwd,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (devDependencies?.length) {
|
|
||||||
await execa(
|
|
||||||
packageManager,
|
|
||||||
[
|
|
||||||
packageManager === "npm" ? "install" : "add",
|
|
||||||
...(packageManager === "npm" && flag ? [`--${flag}`] : []),
|
|
||||||
"-D",
|
|
||||||
...(packageManager === "deno"
|
|
||||||
? devDependencies.map((dep) => `npm:${dep}`)
|
|
||||||
: devDependencies),
|
|
||||||
],
|
|
||||||
{
|
|
||||||
cwd: config.resolvedPaths.cwd,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
dependenciesSpinner?.succeed()
|
dependenciesSpinner?.succeed()
|
||||||
}
|
}
|
||||||
@@ -113,3 +88,107 @@ function shouldPromptForNpmFlag(config: Config) {
|
|||||||
|
|
||||||
return hasReact19 && hasReactDayPicker8
|
return hasReact19 && hasReactDayPicker8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getUpdateDependenciesPackageManager(config: Config) {
|
||||||
|
const expoVersion = getPackageInfo(config.resolvedPaths.cwd, false)
|
||||||
|
?.dependencies?.expo
|
||||||
|
|
||||||
|
if (expoVersion) {
|
||||||
|
// Ensures package versions match the React Native version.
|
||||||
|
// https://docs.expo.dev/more/expo-cli/#install
|
||||||
|
return "expo"
|
||||||
|
}
|
||||||
|
|
||||||
|
return getPackageManager(config.resolvedPaths.cwd)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installWithPackageManager(
|
||||||
|
packageManager: Awaited<
|
||||||
|
ReturnType<typeof getUpdateDependenciesPackageManager>
|
||||||
|
>,
|
||||||
|
dependencies: string[],
|
||||||
|
devDependencies: string[],
|
||||||
|
cwd: string,
|
||||||
|
flag?: string
|
||||||
|
) {
|
||||||
|
if (packageManager === "npm") {
|
||||||
|
return installWithNpm(dependencies, devDependencies, cwd, flag)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packageManager === "deno") {
|
||||||
|
return installWithDeno(dependencies, devDependencies, cwd)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (packageManager === "expo") {
|
||||||
|
return installWithExpo(dependencies, devDependencies, cwd)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dependencies?.length) {
|
||||||
|
await execa(packageManager, ["add", ...dependencies], {
|
||||||
|
cwd,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (devDependencies?.length) {
|
||||||
|
await execa(packageManager, ["add", "-D", ...devDependencies], { cwd })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installWithNpm(
|
||||||
|
dependencies: string[],
|
||||||
|
devDependencies: string[],
|
||||||
|
cwd: string,
|
||||||
|
flag?: string
|
||||||
|
) {
|
||||||
|
if (dependencies.length) {
|
||||||
|
await execa(
|
||||||
|
"npm",
|
||||||
|
["install", ...(flag ? [`--${flag}`] : []), ...dependencies],
|
||||||
|
{ cwd }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (devDependencies.length) {
|
||||||
|
await execa(
|
||||||
|
"npm",
|
||||||
|
["install", ...(flag ? [`--${flag}`] : []), "-D", ...devDependencies],
|
||||||
|
{ cwd }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installWithDeno(
|
||||||
|
dependencies: string[],
|
||||||
|
devDependencies: string[],
|
||||||
|
cwd: string
|
||||||
|
) {
|
||||||
|
if (dependencies?.length) {
|
||||||
|
await execa("deno", ["add", ...dependencies.map((dep) => `npm:${dep}`)], {
|
||||||
|
cwd,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (devDependencies?.length) {
|
||||||
|
await execa(
|
||||||
|
"deno",
|
||||||
|
["add", "-D", ...devDependencies.map((dep) => `npm:${dep}`)],
|
||||||
|
{ cwd }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installWithExpo(
|
||||||
|
dependencies: string[],
|
||||||
|
devDependencies: string[],
|
||||||
|
cwd: string
|
||||||
|
) {
|
||||||
|
if (dependencies.length) {
|
||||||
|
await execa("npx", ["expo", "install", ...dependencies], { cwd })
|
||||||
|
}
|
||||||
|
|
||||||
|
if (devDependencies.length) {
|
||||||
|
await execa("npx", ["expo", "install", "-- -D", ...devDependencies], {
|
||||||
|
cwd,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ export function unnestSpreadProperties(obj: ObjectLiteralExpression) {
|
|||||||
initializer &&
|
initializer &&
|
||||||
initializer.isKind(SyntaxKind.ArrayLiteralExpression)
|
initializer.isKind(SyntaxKind.ArrayLiteralExpression)
|
||||||
) {
|
) {
|
||||||
unnsetSpreadElements(
|
unsetSpreadElements(
|
||||||
initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)
|
initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -387,7 +387,7 @@ export function unnestSpreadProperties(obj: ObjectLiteralExpression) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function unnsetSpreadElements(arr: ArrayLiteralExpression) {
|
export function unsetSpreadElements(arr: ArrayLiteralExpression) {
|
||||||
const elements = arr.getElements()
|
const elements = arr.getElements()
|
||||||
for (let j = 0; j < elements.length; j++) {
|
for (let j = 0; j < elements.length; j++) {
|
||||||
const element = elements[j]
|
const element = elements[j]
|
||||||
@@ -398,7 +398,7 @@ export function unnsetSpreadElements(arr: ArrayLiteralExpression) {
|
|||||||
)
|
)
|
||||||
} else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {
|
} else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {
|
||||||
// Recursive check on nested arrays
|
// Recursive check on nested arrays
|
||||||
unnsetSpreadElements(
|
unsetSpreadElements(
|
||||||
element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)
|
element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)
|
||||||
)
|
)
|
||||||
} else if (element.isKind(SyntaxKind.StringLiteral)) {
|
} else if (element.isKind(SyntaxKind.StringLiteral)) {
|
||||||
|
|||||||
@@ -328,4 +328,290 @@ describe("transformCss", () => {
|
|||||||
}"
|
}"
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("should add plugin directive", async () => {
|
||||||
|
const input = `@import "tailwindcss";`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin foo": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin foo;"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should group plugins together after imports", async () => {
|
||||||
|
const input = `@import "tailwindcss";
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility content-auto {
|
||||||
|
content-visibility: auto;
|
||||||
|
}`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin foo": {},
|
||||||
|
"@plugin bar": {},
|
||||||
|
"@layer components": {
|
||||||
|
".card": {
|
||||||
|
padding: "1rem",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin foo;
|
||||||
|
@plugin bar;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility content-auto {
|
||||||
|
content-visibility: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer components {
|
||||||
|
.card {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should not add duplicate plugins", async () => {
|
||||||
|
const input = `@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin foo;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin foo": {},
|
||||||
|
"@plugin bar": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin foo;
|
||||||
|
|
||||||
|
@plugin bar;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should add plugin when no imports exist", async () => {
|
||||||
|
const input = `@layer base {
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin foo": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"
|
||||||
|
@plugin foo;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should handle plugins with quoted parameters", async () => {
|
||||||
|
const input = `@import "tailwindcss";`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin @tailwindcss/typography": {},
|
||||||
|
"@plugin ./custom-plugin.js": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin @tailwindcss/typography;
|
||||||
|
@plugin ./custom-plugin.js;"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should handle plugins with complex parameters", async () => {
|
||||||
|
const input = `@import "tailwindcss";`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin tailwindcss/plugin": {},
|
||||||
|
"@plugin @headlessui/tailwindcss": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin tailwindcss/plugin;
|
||||||
|
@plugin @headlessui/tailwindcss;"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should handle multiple imports with plugins", async () => {
|
||||||
|
const input = `@import "tailwindcss";
|
||||||
|
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap");`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin foo": {},
|
||||||
|
"@plugin bar": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap");
|
||||||
|
|
||||||
|
@plugin foo;
|
||||||
|
@plugin bar;"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should add plugins to empty file", async () => {
|
||||||
|
const input = ``
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin foo": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"
|
||||||
|
@plugin foo"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should maintain plugin order with existing plugins", async () => {
|
||||||
|
const input = `@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin existing-plugin;
|
||||||
|
@plugin another-existing;`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin new-plugin": {},
|
||||||
|
"@plugin final-plugin": {},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
|
||||||
|
@plugin existing-plugin;
|
||||||
|
@plugin another-existing;
|
||||||
|
@plugin new-plugin;
|
||||||
|
@plugin final-plugin;"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("should handle comprehensive CSS with plugins", async () => {
|
||||||
|
const input = `@import "tailwindcss";
|
||||||
|
@import url("fonts.css");
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility content-auto {
|
||||||
|
content-visibility: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}`
|
||||||
|
|
||||||
|
const result = await transformCss(input, {
|
||||||
|
"@plugin @tailwindcss/typography": {},
|
||||||
|
"@plugin ./custom": {},
|
||||||
|
"@layer components": {
|
||||||
|
".btn": {
|
||||||
|
padding: "0.5rem 1rem",
|
||||||
|
"&:hover": {
|
||||||
|
"background-color": "blue",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"@utility animate-fast": {
|
||||||
|
"animation-duration": "0.1s",
|
||||||
|
},
|
||||||
|
"@keyframes spin-fast": {
|
||||||
|
"0%": { transform: "rotate(0deg)" },
|
||||||
|
"100%": { transform: "rotate(360deg)" },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(result).toMatchInlineSnapshot(`
|
||||||
|
"@import "tailwindcss";
|
||||||
|
@import url("fonts.css");
|
||||||
|
|
||||||
|
@plugin @tailwindcss/typography;
|
||||||
|
@plugin ./custom;
|
||||||
|
|
||||||
|
@layer base {
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility content-auto {
|
||||||
|
content-visibility: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fade {
|
||||||
|
from { opacity: 0; }
|
||||||
|
to { opacity: 1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer components {
|
||||||
|
.btn {
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
}
|
||||||
|
.btn:hover {
|
||||||
|
background-color: blue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@utility animate-fast {
|
||||||
|
animation-duration: 0.1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@theme inline {
|
||||||
|
@keyframes spin-fast {
|
||||||
|
0% {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
`)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import {
|
|||||||
buildTailwindThemeColorsFromCssVars, nestSpreadElements,
|
buildTailwindThemeColorsFromCssVars, nestSpreadElements,
|
||||||
nestSpreadProperties,
|
nestSpreadProperties,
|
||||||
transformTailwindConfig,
|
transformTailwindConfig,
|
||||||
unnestSpreadProperties, unnsetSpreadElements,
|
unnestSpreadProperties, unsetSpreadElements,
|
||||||
} from "../../../src/utils/updaters/update-tailwind-config"
|
} from "../../../src/utils/updaters/update-tailwind-config"
|
||||||
|
|
||||||
const SHARED_CONFIG = {
|
const SHARED_CONFIG = {
|
||||||
@@ -1186,7 +1186,7 @@ describe("unnestSpreadElements", () => {
|
|||||||
)
|
)
|
||||||
if (!configObject) throw new Error("Config object not found")
|
if (!configObject) throw new Error("Config object not found")
|
||||||
|
|
||||||
unnsetSpreadElements(configObject)
|
unsetSpreadElements(configObject)
|
||||||
|
|
||||||
const result = configObject.getText()
|
const result = configObject.getText()
|
||||||
expect(result.replace(/\s+/g, "")).toBe(expected.replace(/\s+/g, ""))
|
expect(result.replace(/\s+/g, "")).toBe(expected.replace(/\s+/g, ""))
|
||||||
|
|||||||
70
pnpm-lock.yaml
generated
70
pnpm-lock.yaml
generated
@@ -322,7 +322,7 @@ importers:
|
|||||||
specifier: ^6.0.1
|
specifier: ^6.0.1
|
||||||
version: 6.0.1
|
version: 6.0.1
|
||||||
shadcn:
|
shadcn:
|
||||||
specifier: 2.6.4
|
specifier: 2.7.0
|
||||||
version: link:../../packages/shadcn
|
version: link:../../packages/shadcn
|
||||||
shiki:
|
shiki:
|
||||||
specifier: ^1.10.1
|
specifier: ^1.10.1
|
||||||
@@ -602,7 +602,7 @@ importers:
|
|||||||
specifier: 2.12.7
|
specifier: 2.12.7
|
||||||
version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
version: 2.12.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||||
shadcn:
|
shadcn:
|
||||||
specifier: 2.6.4
|
specifier: 2.7.0
|
||||||
version: link:../../packages/shadcn
|
version: link:../../packages/shadcn
|
||||||
sharp:
|
sharp:
|
||||||
specifier: ^0.32.6
|
specifier: ^0.32.6
|
||||||
@@ -696,16 +696,6 @@ importers:
|
|||||||
specifier: ^4.1.2
|
specifier: ^4.1.2
|
||||||
version: 4.1.2
|
version: 4.1.2
|
||||||
|
|
||||||
packages/cli:
|
|
||||||
dependencies:
|
|
||||||
chalk:
|
|
||||||
specifier: ^5.4.1
|
|
||||||
version: 5.4.1
|
|
||||||
devDependencies:
|
|
||||||
tsup:
|
|
||||||
specifier: ^6.6.3
|
|
||||||
version: 6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))(typescript@5.7.3)
|
|
||||||
|
|
||||||
packages/shadcn:
|
packages/shadcn:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@antfu/ni':
|
'@antfu/ni':
|
||||||
@@ -4779,10 +4769,6 @@ packages:
|
|||||||
resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==}
|
resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==}
|
||||||
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
|
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
|
||||||
|
|
||||||
chalk@5.4.1:
|
|
||||||
resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
|
|
||||||
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
|
|
||||||
|
|
||||||
change-case@5.4.4:
|
change-case@5.4.4:
|
||||||
resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
|
resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==}
|
||||||
|
|
||||||
@@ -14349,8 +14335,6 @@ snapshots:
|
|||||||
|
|
||||||
chalk@5.2.0: {}
|
chalk@5.2.0: {}
|
||||||
|
|
||||||
chalk@5.4.1: {}
|
|
||||||
|
|
||||||
change-case@5.4.4: {}
|
change-case@5.4.4: {}
|
||||||
|
|
||||||
character-entities-html4@2.1.0: {}
|
character-entities-html4@2.1.0: {}
|
||||||
@@ -18447,14 +18431,6 @@ snapshots:
|
|||||||
postcss: 8.5.1
|
postcss: 8.5.1
|
||||||
ts-node: 10.9.2(@types/node@22.13.0)(typescript@4.9.5)
|
ts-node: 10.9.2(@types/node@22.13.0)(typescript@4.9.5)
|
||||||
|
|
||||||
postcss-load-config@3.1.4(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3)):
|
|
||||||
dependencies:
|
|
||||||
lilconfig: 2.1.0
|
|
||||||
yaml: 1.10.2
|
|
||||||
optionalDependencies:
|
|
||||||
postcss: 8.5.1
|
|
||||||
ts-node: 10.9.2(@types/node@22.13.0)(typescript@5.7.3)
|
|
||||||
|
|
||||||
postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.7.3)):
|
postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@types/node@17.0.45)(typescript@5.7.3)):
|
||||||
dependencies:
|
dependencies:
|
||||||
lilconfig: 3.1.3
|
lilconfig: 3.1.3
|
||||||
@@ -20100,25 +20076,6 @@ snapshots:
|
|||||||
yn: 3.1.1
|
yn: 3.1.1
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3):
|
|
||||||
dependencies:
|
|
||||||
'@cspotcode/source-map-support': 0.8.1
|
|
||||||
'@tsconfig/node10': 1.0.11
|
|
||||||
'@tsconfig/node12': 1.0.11
|
|
||||||
'@tsconfig/node14': 1.0.3
|
|
||||||
'@tsconfig/node16': 1.0.4
|
|
||||||
'@types/node': 22.13.0
|
|
||||||
acorn: 8.14.0
|
|
||||||
acorn-walk: 8.3.4
|
|
||||||
arg: 4.1.3
|
|
||||||
create-require: 1.1.1
|
|
||||||
diff: 4.0.2
|
|
||||||
make-error: 1.3.6
|
|
||||||
typescript: 5.7.3
|
|
||||||
v8-compile-cache-lib: 3.0.1
|
|
||||||
yn: 3.1.1
|
|
||||||
optional: true
|
|
||||||
|
|
||||||
ts-pattern@5.6.2: {}
|
ts-pattern@5.6.2: {}
|
||||||
|
|
||||||
tsconfck@3.1.4(typescript@5.7.3):
|
tsconfck@3.1.4(typescript@5.7.3):
|
||||||
@@ -20167,29 +20124,6 @@ snapshots:
|
|||||||
- supports-color
|
- supports-color
|
||||||
- ts-node
|
- ts-node
|
||||||
|
|
||||||
tsup@6.7.0(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))(typescript@5.7.3):
|
|
||||||
dependencies:
|
|
||||||
bundle-require: 4.2.1(esbuild@0.17.19)
|
|
||||||
cac: 6.7.14
|
|
||||||
chokidar: 3.6.0
|
|
||||||
debug: 4.4.0
|
|
||||||
esbuild: 0.17.19
|
|
||||||
execa: 5.1.1
|
|
||||||
globby: 11.1.0
|
|
||||||
joycon: 3.1.1
|
|
||||||
postcss-load-config: 3.1.4(postcss@8.5.1)(ts-node@10.9.2(@types/node@22.13.0)(typescript@5.7.3))
|
|
||||||
resolve-from: 5.0.0
|
|
||||||
rollup: 3.29.5
|
|
||||||
source-map: 0.8.0-beta.0
|
|
||||||
sucrase: 3.35.0
|
|
||||||
tree-kill: 1.2.2
|
|
||||||
optionalDependencies:
|
|
||||||
postcss: 8.5.1
|
|
||||||
typescript: 5.7.3
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- supports-color
|
|
||||||
- ts-node
|
|
||||||
|
|
||||||
tsutils@3.21.0(typescript@5.7.3):
|
tsutils@3.21.0(typescript@5.7.3):
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 1.14.1
|
tslib: 1.14.1
|
||||||
|
|||||||
Reference in New Issue
Block a user