@yahoo/uds 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- package/cli/README.md +78 -131
- package/cli/commands/purge.ts +7 -3
- package/cli/env.d.ts +1 -0
- package/cli/utils/purgeCSS.test.ts +43 -3
- package/cli/utils/purgeCSS.ts +100 -14
- package/dist/Image.native-B3I4JoH3.d.cts +38 -0
- package/dist/Image.native-DUAFJodS.d.ts +38 -0
- package/dist/VStack-BHlRUsOR.d.cts +103 -0
- package/dist/VStack-DMb_RGRS.d.ts +103 -0
- package/dist/experimental/index.cjs +1 -1
- package/dist/experimental/index.d.cts +8 -8
- package/dist/experimental/index.d.ts +8 -8
- package/dist/experimental/index.js +1 -1
- package/dist/experimental/index.native.cjs +1 -1
- package/dist/experimental/index.native.d.cts +3 -3
- package/dist/experimental/index.native.d.ts +3 -3
- package/dist/experimental/index.native.js +1 -1
- package/dist/fixtures.cjs +1946 -0
- package/dist/fixtures.d.ts +81 -0
- package/dist/fixtures.js +1910 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +41 -236
- package/dist/index.d.ts +41 -236
- package/dist/index.js +1 -1
- package/dist/{index.native-CisPq4BI.d.ts → index.native-BTfOSmUx.d.ts} +1 -1
- package/dist/{index.native-DJlx-bfM.d.cts → index.native-Bm-r2Dpa.d.cts} +1 -1
- package/dist/index.native.cjs +1 -1
- package/dist/index.native.d.cts +20 -83
- package/dist/index.native.d.ts +20 -83
- package/dist/index.native.js +1 -1
- package/dist/styles/globals.css +0 -1
- package/dist/styles/toast.css +1 -0
- package/dist/styles/toast.d.cts +2 -0
- package/dist/styles/toast.d.ts +2 -0
- package/dist/tailwindPlugin.cjs +1 -1
- package/dist/tailwindPlugin.d.cts +8 -2
- package/dist/tailwindPlugin.d.ts +8 -2
- package/dist/tailwindPlugin.js +1 -1
- package/dist/tailwindPurge.cjs +1 -1
- package/dist/tailwindPurge.js +1 -1
- package/dist/tokens/index.cjs +1 -1
- package/dist/tokens/index.d.cts +2 -2
- package/dist/tokens/index.d.ts +2 -2
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/index.native.cjs +1 -1
- package/dist/tokens/index.native.d.cts +2 -2
- package/dist/tokens/index.native.d.ts +2 -2
- package/dist/tokens/index.native.js +1 -1
- package/dist/tokens/parseTokens.cjs +1 -1
- package/dist/tokens/parseTokens.d.cts +8 -18
- package/dist/tokens/parseTokens.d.ts +8 -18
- package/dist/tokens/parseTokens.js +1 -1
- package/dist/tokens/parseTokens.native.cjs +1 -1
- package/dist/tokens/parseTokens.native.d.cts +4 -21
- package/dist/tokens/parseTokens.native.d.ts +4 -21
- package/dist/tokens/parseTokens.native.js +1 -1
- package/dist/{types-CzJpH_Oi.d.cts → types-COiuE8XK.d.cts} +49 -138
- package/dist/{types-CzJpH_Oi.d.ts → types-COiuE8XK.d.ts} +49 -138
- package/package.json +13 -12
- package/dist/Image.native-C6kOWgnf.d.ts +0 -38
- package/dist/Image.native-VeXt5aeI.d.cts +0 -38
- package/dist/VStack-BSD9TbBd.d.cts +0 -114
- package/dist/VStack-Dk3-8IyU.d.ts +0 -114
- package/dist/fixtures/index.cjs +0 -1
- package/dist/fixtures/index.d.cts +0 -154
- package/dist/fixtures/index.d.ts +0 -154
- package/dist/fixtures/index.js +0 -1
package/cli/README.md
CHANGED
@@ -1,181 +1,128 @@
|
|
1
|
+
import { Box } from '@yahoo/uds';
|
2
|
+
import { RequiredChip } from '~/components/RequiredChip';
|
3
|
+
import { DocImage } from '~/components/DocImage';
|
4
|
+
|
1
5
|
# Universal CLI
|
2
6
|
|
3
|
-
|
7
|
+
> **Early preview notice**: The CLI tool currently requires Bun. This requirement may change in the future but you will need to install and use Bun locally to use the `uds` command.
|
4
8
|
|
5
|
-
Bluebun relies on Bun APIs and is designed to be extremely fast, with no-dependencies.
|
9
|
+
The Universal CLI is available as command, `uds`. The tool was created with [Bluebun](https://github.com/jamonholmgren/bluebun/) (inspired by [Gluegun](https://github.com/infinitered/gluegun)), but is specifically designed to be used with [Bun](https://bun.sh). Bluebun relies on Bun APIs and is designed to be extremely fast, with no-dependencies.
|
6
10
|
|
7
|
-
|
11
|
+
<Box justifyContent="center">
|
12
|
+
<DocImage light={{ src: '/images/cli-screenshot.png', width: 500, height: 356 }} />
|
13
|
+
</Box>
|
8
14
|
|
9
|
-
|
15
|
+
## Requirements
|
10
16
|
|
11
|
-
|
17
|
+
1. To use the CLI, first [install](/docs/getting-started/quick-start#installation) the `@yahoo/uds` package as a dependency in your package.json. This makes the tool available in your repo.
|
12
18
|
|
13
|
-
|
19
|
+
- Install Bun if you don't already have it:
|
14
20
|
|
15
|
-
|
21
|
+
```bash
|
22
|
+
curl -fsSL https://bun.sh/install | bash
|
23
|
+
```
|
16
24
|
|
17
|
-
|
25
|
+
## Commands
|
18
26
|
|
19
|
-
|
20
|
-
| ------- | -------- | --------------- |
|
21
|
-
| id | true | |
|
22
|
-
| outFile | false | ./uds.config.ts |
|
27
|
+
> **Note**: If you are _not_ running the CLI from a package.json script you will need to add `bun` before the binary in order to run it directly. i.e. `bun uds purge`
|
23
28
|
|
24
|
-
|
25
|
-
uds sync --id [id] --outFile [path]
|
29
|
+
The following command are available after installing `@yahoo/uds`:
|
26
30
|
|
27
|
-
|
28
|
-
```
|
31
|
+
### Sync
|
29
32
|
|
30
|
-
|
33
|
+
The `uds sync` command fetches the latest design config from the [Configurator](/docs/getting-started/using-configurator) and writes it to a file in your project.
|
31
34
|
|
32
|
-
|
33
|
-
| ------------ | -------- | --------------- |
|
34
|
-
| UDS_ID | true | |
|
35
|
-
| UDS_OUT_FILE | false | ./uds.config.ts |
|
35
|
+
#### Flags
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
37
|
+
| Flag | Description | Default | Required |
|
38
|
+
| --------- | --------------------------- | --------------- | ---------------- |
|
39
|
+
| `id` | ID from the Configurator | | <RequiredChip /> |
|
40
|
+
| `outFile` | File to write the output to | ./uds.config.ts | |
|
40
41
|
|
41
|
-
|
42
|
+
**Example:**
|
42
43
|
|
43
44
|
```shell
|
44
|
-
uds
|
45
|
-
uds
|
46
|
-
uds expo launch --profile [profile] --platform [ios|android]
|
47
|
-
uds expo update --profile [profile] --platform [ios|android]
|
48
|
-
uds expo --help
|
49
|
-
```
|
50
|
-
|
51
|
-
## Purge CSS
|
52
|
-
|
53
|
-
```shell
|
54
|
-
uds purge
|
45
|
+
uds sync --id [id] --outFile [path]
|
46
|
+
uds sync --id [id]
|
55
47
|
```
|
56
48
|
|
57
|
-
|
49
|
+
#### Enviornment variables
|
58
50
|
|
59
|
-
|
51
|
+
Alternatively, you can use environment variables instead of flags.
|
60
52
|
|
61
|
-
|
53
|
+
| Variable | Description | Default | Required |
|
54
|
+
| -------------- | --------------------------- | --------------- | ---------------- |
|
55
|
+
| `UDS_ID` | ID from the Configurator | | <RequiredChip /> |
|
56
|
+
| `UDS_OUT_FILE` | File to write the output to | ./uds.config.ts | |
|
62
57
|
|
63
|
-
|
58
|
+
**Example:**
|
64
59
|
|
60
|
+
```shell
|
61
|
+
UDS_ID=[id] UDS_OUT_FILE=[path] uds sync
|
65
62
|
```
|
66
|
-
cli/
|
67
|
-
commands/
|
68
|
-
pizza.ts # pizza
|
69
|
-
help.ts # pizza help
|
70
|
-
bake/
|
71
|
-
bake.ts # pizza bake
|
72
|
-
cheese.ts # pizza bake cheese
|
73
|
-
pepperoni.ts # pizza bake pepperoni
|
74
|
-
```
|
75
63
|
|
76
|
-
|
64
|
+
### Purge
|
65
|
+
|
66
|
+
The `uds purge` command is used to optimize and reduce the amount of CSS produced by your app.
|
77
67
|
|
78
|
-
|
68
|
+
Running this command produces a `./dist/safelist.ts` file in the root of your project. This file imported in your `tailwind.config.js` and passed to the `safelist` configuration option.
|
79
69
|
|
80
70
|
```typescript
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
// bake it!
|
89
|
-
},
|
71
|
+
/** @type {import('tailwindcss').Config} */
|
72
|
+
const { safelist } = require(`${__dirname}/dist/safelist.ts`);
|
73
|
+
|
74
|
+
module.exports = {
|
75
|
+
content: ['./pages/**/*.{html,jsx,tsx}', './components/**/*.{html,jsx,tsx}'],
|
76
|
+
safelist,
|
77
|
+
// ...
|
90
78
|
};
|
91
79
|
```
|
92
80
|
|
93
|
-
|
94
|
-
|
95
|
-
Commands have the following properties:
|
81
|
+
For more information about safelisting classes in Tailwind, visit the [official documentation](https://tailwindcss.com/docs/content-configuration#safelisting-classes)
|
96
82
|
|
97
|
-
|
98
|
-
- `description` - a description of the command for the automatic help system
|
99
|
-
- `alias` - an array of aliases for the command (can also be a single string)
|
100
|
-
- `run` - the function that is run when the command is run, usually `async`
|
83
|
+
**Example:**
|
101
84
|
|
102
|
-
|
103
|
-
|
104
|
-
|
85
|
+
```shell
|
86
|
+
uds purge
|
87
|
+
```
|
105
88
|
|
106
|
-
|
89
|
+
#### Enviornment variables
|
107
90
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
- `commandPath` - the path to the command that was run (e.g. `["bake", "cheese"]`)
|
112
|
-
- `arguments` - the positional arguments passed to the command (e.g. `["convection"]`)
|
113
|
-
- `options` - the options passed to the command (e.g. `{ sliced: true, temp: 400, time: 30 }`)
|
114
|
-
- `first` - the first argument passed to the command (e.g. `"convection"`)
|
115
|
-
- `second` - the second argument passed to the command (e.g. `undefined`)
|
116
|
-
- `third` - the third argument passed to the command (e.g. `undefined`)
|
91
|
+
| Variable | Description | Default | Required |
|
92
|
+
| ------------------------------- | ------------------------------------------- | ------- | -------- |
|
93
|
+
| `ENABLED_SCALE_AND_COLOR_MODES` | Selects which color and scale modes to keep | all | |
|
117
94
|
|
118
|
-
|
95
|
+
**Example:**
|
119
96
|
|
120
|
-
```
|
121
|
-
|
122
|
-
import { createPizza, slice } from './_pizza';
|
123
|
-
import { convectionBake, toasterBake, regularBake } from './_bakePizza';
|
124
|
-
|
125
|
-
export default {
|
126
|
-
name: 'bake',
|
127
|
-
description: 'Bake a pizza',
|
128
|
-
alias: ['b'],
|
129
|
-
run: async (props: Props) => {
|
130
|
-
const { first, second, third, options } = props;
|
131
|
-
|
132
|
-
const pizza = createPizza();
|
133
|
-
|
134
|
-
spinStart('Baking pizza...');
|
135
|
-
if (first === 'convection') {
|
136
|
-
await convectionBake(pizza, options.temp, options.time);
|
137
|
-
} else if (first === 'toaster') {
|
138
|
-
await toasterBake(pizza, options.temp, options.time);
|
139
|
-
} else {
|
140
|
-
await regularBake(pizza, options.temp, options.time);
|
141
|
-
}
|
142
|
-
spinStop('✅ Pizza baked!');
|
143
|
-
|
144
|
-
spinStart('Slicing pizza...');
|
145
|
-
if (options.sliced) {
|
146
|
-
await slice(pizza);
|
147
|
-
}
|
148
|
-
spinStop('✅ Pizza sliced!');
|
149
|
-
},
|
150
|
-
};
|
97
|
+
```shell
|
98
|
+
ENABLED_SCALE_AND_COLOR_MODES="dark,large" uds purge
|
151
99
|
```
|
152
100
|
|
153
|
-
|
101
|
+
### Expo (WIP)
|
154
102
|
|
155
|
-
|
103
|
+
The `uds expo` command is for building and launching React Native apps using Expo.
|
104
|
+
This command is still a WIP and is only used internally at the moment.
|
156
105
|
|
157
|
-
```
|
158
|
-
|
106
|
+
```shell
|
107
|
+
uds expo build --profile [profile] --platform [ios|android]
|
108
|
+
uds expo dev --profile [profile] --platform [ios|android]
|
109
|
+
uds expo launch --profile [profile] --platform [ios|android]
|
110
|
+
uds expo update --profile [profile] --platform [ios|android]
|
111
|
+
uds expo --help
|
159
112
|
```
|
160
113
|
|
161
|
-
|
114
|
+
## Development
|
115
|
+
|
116
|
+
The CLI is created with [Bluebun](https://github.com/jamonholmgren/bluebun/) (inspired by [Gluegun](https://github.com/infinitered/gluegun)), but specifically designed to be used with [Bun](https://bun.sh). Bluebun relies on Bun APIs and is designed to be extremely fast, with no-dependencies.
|
162
117
|
|
163
|
-
|
118
|
+
### Adding a command
|
164
119
|
|
165
|
-
|
166
|
-
- [cli](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/cli.md) - start the CLI without running the command
|
167
|
-
- [commandHelp](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/commandHelp.md) - get a list of all commands and their descriptions
|
120
|
+
Commands are organized in a tree structure in `uds/cli/commands`. The root command is the name of the CLI (`uds`) and in `uds.ts`, which subcommand being in its own file. See the Bluebun [Command docs](https://github.com/jamonholmgren/bluebun/blob/main/docs/commands.md) for more information on usage docs and creating command files.
|
168
121
|
|
169
|
-
|
122
|
+
**Important note:**
|
170
123
|
|
171
|
-
-
|
172
|
-
- [cursor](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/cursor.md) - manipulate the cursor
|
173
|
-
- [inputKey](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/inputKey.md) - wait for a single keypress
|
174
|
-
- [inputKeys](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/inputKeys.md) - wait for and handle multiple keypresses
|
124
|
+
Adding nested commands, i.e. `uds expo dev` does work correctly when UDS is consumed from npm. As a workaround, please see code for expo/expo.ts for re-routing sub-commands from the root command file. To verify your CLI command works correctly you should run `npm pack` within the packages/uds directory. Once you have your generated tarball you should copy that tarball to a test application such as https://github.com/yahoo-design/uds-nextjs-demo, then add `"@yahoo/uds": "file:./tarball-generated-from-npm-pack.tgz` to it's dependencies and run an install. Now you should be able to run `bun uds [your command name]` to test your functionality.
|
175
125
|
|
176
|
-
|
126
|
+
### API Reference
|
177
127
|
|
178
|
-
- [
|
179
|
-
- [spinner](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/spinner.md) - start and stop a spinner
|
180
|
-
- [progress](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/progress.md) - start, update, and stop a progress bar
|
181
|
-
- [styles and colors](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference/styles.md) - style and colorize text
|
128
|
+
Bluebun comes with a number of built-in utilities that are exported from the main `bluebun` package. See [reference guide](https://github.com/jamonholmgren/bluebun/blob/main/docs/reference.md) for more.
|
package/cli/commands/purge.ts
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
import { Props, spinStart, spinStop } from 'bluebun';
|
2
2
|
|
3
|
-
import { purge } from '../utils/purgeCSS';
|
3
|
+
import { purge, PurgeOptions } from '../utils/purgeCSS';
|
4
|
+
|
5
|
+
interface PurgeProps extends Props {
|
6
|
+
options: PurgeOptions;
|
7
|
+
}
|
4
8
|
|
5
9
|
export default {
|
6
10
|
name: 'purge',
|
7
11
|
description: `Purge unused CSS`,
|
8
12
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
9
|
-
run: async (props:
|
13
|
+
run: async (props: PurgeProps) => {
|
10
14
|
spinStart('Purging css...');
|
11
15
|
|
12
|
-
await purge();
|
16
|
+
await purge(props.options);
|
13
17
|
|
14
18
|
spinStop('✅', 'Purging css done!');
|
15
19
|
},
|
package/cli/env.d.ts
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
import { defaultTokensConfig } from '@yahoo/uds/tokens';
|
1
2
|
import { describe, expect, it } from 'bun:test';
|
2
3
|
import { Project } from 'ts-morph';
|
3
4
|
|
4
5
|
import {
|
6
|
+
getClassesForEnabledThemesAndScales,
|
5
7
|
getComponentsToConvertToTW,
|
6
8
|
getFiles,
|
7
9
|
getTailwindSafelist,
|
@@ -87,9 +89,29 @@ describe('purgeCSS', () => {
|
|
87
89
|
it('returns the tailwind classes corresponding to the props on a component', () => {
|
88
90
|
const res = getTailwindSafelist(project, IMPORTED_UDS_COMPONENTS);
|
89
91
|
|
90
|
-
expect(res).toEqual(
|
91
|
-
'container
|
92
|
-
|
92
|
+
expect(res).toEqual([
|
93
|
+
'container',
|
94
|
+
'fill',
|
95
|
+
'',
|
96
|
+
'items-start',
|
97
|
+
'items-end',
|
98
|
+
'items-center',
|
99
|
+
'items-stretch',
|
100
|
+
'items-baseline',
|
101
|
+
'justify-start',
|
102
|
+
'justify-end',
|
103
|
+
'justify-center',
|
104
|
+
'justify-between',
|
105
|
+
'justify-around',
|
106
|
+
'justify-evenly',
|
107
|
+
'text-accent',
|
108
|
+
'text-alert',
|
109
|
+
'text-black',
|
110
|
+
'text-brand',
|
111
|
+
'text-positive',
|
112
|
+
'text-warning',
|
113
|
+
'text-white',
|
114
|
+
]);
|
93
115
|
});
|
94
116
|
});
|
95
117
|
|
@@ -136,4 +158,22 @@ describe('purgeCSS', () => {
|
|
136
158
|
]);
|
137
159
|
});
|
138
160
|
});
|
161
|
+
|
162
|
+
describe('getClassesForEnabledThemesAndScales', () => {
|
163
|
+
it('returns the list of classes related to the mode/themes we have in the config', () => {
|
164
|
+
const classes = getClassesForEnabledThemesAndScales(defaultTokensConfig);
|
165
|
+
|
166
|
+
expect(classes).toEqual([
|
167
|
+
'uds-color-mode-light',
|
168
|
+
'uds-color-mode-dark',
|
169
|
+
'uds-scale-mode-xsmall',
|
170
|
+
'uds-scale-mode-small',
|
171
|
+
'uds-scale-mode-medium',
|
172
|
+
'uds-scale-mode-large',
|
173
|
+
'uds-scale-mode-xlarge',
|
174
|
+
'uds-scale-mode-xxlarge',
|
175
|
+
'uds-scale-mode-xxxlarge',
|
176
|
+
]);
|
177
|
+
});
|
178
|
+
});
|
139
179
|
});
|
package/cli/utils/purgeCSS.ts
CHANGED
@@ -11,16 +11,45 @@ import {
|
|
11
11
|
findReferencesAsJsxElements,
|
12
12
|
getUsedPropsInReference,
|
13
13
|
} from '@yahoo/uds/tailwindPurge/utils';
|
14
|
-
import {
|
14
|
+
import {
|
15
|
+
ColorModeConfig,
|
16
|
+
DARK_COLOR_MODE_CLASSNAME,
|
17
|
+
LARGE_SCALE_MODE_CLASSNAME,
|
18
|
+
LIGHT_COLOR_MODE_CLASSNAME,
|
19
|
+
MEDIUM_SCALE_MODE_CLASSNAME,
|
20
|
+
ScaleModeConfig,
|
21
|
+
SMALL_SCALE_MODE_CLASSNAME,
|
22
|
+
UniversalTokensConfig,
|
23
|
+
XLARGE_SCALE_MODE_CLASSNAME,
|
24
|
+
XSMALL_SCALE_MODE_CLASSNAME,
|
25
|
+
XXLARGE_SCALE_MODE_CLASSNAME,
|
26
|
+
XXXLARGE_SCALE_MODE_CLASSNAME,
|
27
|
+
} from '@yahoo/uds/tokens';
|
28
|
+
import { print, spinStart, spinStop } from 'bluebun';
|
15
29
|
import FastGlob from 'fast-glob';
|
16
30
|
import { JsxOpeningElement, JsxSelfClosingElement, Project, ts } from 'ts-morph';
|
17
31
|
|
18
|
-
|
32
|
+
const scaleModeToClass: { [key in keyof ScaleModeConfig]: string } = {
|
33
|
+
large: LARGE_SCALE_MODE_CLASSNAME,
|
34
|
+
medium: MEDIUM_SCALE_MODE_CLASSNAME,
|
35
|
+
small: SMALL_SCALE_MODE_CLASSNAME,
|
36
|
+
xLarge: XLARGE_SCALE_MODE_CLASSNAME,
|
37
|
+
xSmall: XSMALL_SCALE_MODE_CLASSNAME,
|
38
|
+
xxLarge: XXLARGE_SCALE_MODE_CLASSNAME,
|
39
|
+
xxxLarge: XXXLARGE_SCALE_MODE_CLASSNAME,
|
40
|
+
};
|
41
|
+
|
42
|
+
const colorModeToClass: { [key in keyof ColorModeConfig]: string } = {
|
43
|
+
dark: DARK_COLOR_MODE_CLASSNAME,
|
44
|
+
light: LIGHT_COLOR_MODE_CLASSNAME,
|
45
|
+
};
|
46
|
+
|
47
|
+
type SafeList = string[];
|
19
48
|
type ImportsList = string[];
|
20
49
|
type Files = string[];
|
21
50
|
|
22
51
|
// TODO: use CLI args to power the output file path
|
23
|
-
const OUTPUT_FILE_PATH = Bun.file(`${Bun.env.PWD}/dist/safelist.
|
52
|
+
const OUTPUT_FILE_PATH = Bun.file(`${Bun.env.PWD}/dist/safelist.ts`);
|
24
53
|
|
25
54
|
export const getFiles = async (): Promise<Files> => {
|
26
55
|
const workspaceDir = Bun.env.PWD;
|
@@ -75,7 +104,10 @@ export const parseFiles = (project: Project, files: Files): ImportsList => {
|
|
75
104
|
sourceFile
|
76
105
|
?.getImportDeclarations()
|
77
106
|
.filter((declaration) => {
|
78
|
-
return
|
107
|
+
return (
|
108
|
+
declaration.getModuleSpecifier().getText().includes('@yahoo/uds') ||
|
109
|
+
declaration.getModuleSpecifier().getText().includes('@yahoo/uds/experimental')
|
110
|
+
);
|
79
111
|
})
|
80
112
|
.map((declaration) => {
|
81
113
|
return declaration.getNamedImports().map((namedImport) => namedImport.getName());
|
@@ -96,7 +128,7 @@ export const parseFiles = (project: Project, files: Files): ImportsList => {
|
|
96
128
|
};
|
97
129
|
|
98
130
|
export const getTailwindSafelist = (project: Project, componentList: string[]): SafeList => {
|
99
|
-
|
131
|
+
const safeList: SafeList = [];
|
100
132
|
const validVariants = new Set<string>(variantsList);
|
101
133
|
const usedProps = new Set<string>();
|
102
134
|
componentList.forEach((component: string) => {
|
@@ -119,13 +151,14 @@ export const getTailwindSafelist = (project: Project, componentList: string[]):
|
|
119
151
|
});
|
120
152
|
|
121
153
|
// get the inline TW classes used in each component
|
122
|
-
safeList
|
154
|
+
safeList.push(...componentToTwClasses[component].replaceAll('\\', '').split(' '));
|
123
155
|
}
|
124
156
|
});
|
125
157
|
|
126
158
|
for (const prop of usedProps) {
|
127
|
-
safeList
|
159
|
+
safeList.push(...variantToTailwindClass[prop].replaceAll('\\', '').split(' '));
|
128
160
|
}
|
161
|
+
|
129
162
|
return safeList;
|
130
163
|
};
|
131
164
|
|
@@ -136,7 +169,10 @@ export const getTailwindSafelist = (project: Project, componentList: string[]):
|
|
136
169
|
* const usedProps = getUsedProps(project, 'HStack');
|
137
170
|
*/
|
138
171
|
export const getUsedProps = (project: Project, component: string) => {
|
139
|
-
const references
|
172
|
+
const references: (JsxOpeningElement | JsxSelfClosingElement)[] = [];
|
173
|
+
references.push(...findNamedImportReferences(project, '@yahoo/uds', component));
|
174
|
+
references.push(...findNamedImportReferences(project, '@yahoo/uds/experimental', component));
|
175
|
+
|
140
176
|
// for each reference find the used/references props
|
141
177
|
const usedProps = references.map((reference) => getUsedPropsInReference(reference)).flat();
|
142
178
|
|
@@ -152,7 +188,7 @@ const saveToFile = async (safeList: SafeList) => {
|
|
152
188
|
//! This file is generated by purgeCSS.ts from @yahoo/uds
|
153
189
|
//! Do not edit directly
|
154
190
|
//! If there is issue with this file please report to #ask-uds
|
155
|
-
const
|
191
|
+
export const safelist = ${JSON.stringify(safeList)};
|
156
192
|
`;
|
157
193
|
|
158
194
|
await Bun.write(OUTPUT_FILE_PATH, fileContent);
|
@@ -177,24 +213,74 @@ export const getComponentsToConvertToTW = (udsImport: ImportsList): string[] =>
|
|
177
213
|
return Array.from(set) as string[];
|
178
214
|
};
|
179
215
|
|
180
|
-
|
216
|
+
/**
|
217
|
+
* Get the classes that corresponds to the used modes
|
218
|
+
*/
|
219
|
+
export const getClassesForEnabledThemesAndScales = (config: UniversalTokensConfig): string[] => {
|
220
|
+
const classes: string[] = [];
|
221
|
+
|
222
|
+
// TODO: Remove this once the config supports toggling colorModes and scaleModes
|
223
|
+
if (Bun.env.ENABLED_SCALE_AND_COLOR_MODES) {
|
224
|
+
Bun.env.ENABLED_SCALE_AND_COLOR_MODES.split(',').map((mode) => {
|
225
|
+
mode = mode.trim();
|
226
|
+
if (colorModeToClass[mode as keyof ColorModeConfig]) {
|
227
|
+
classes.push(colorModeToClass[mode as keyof ColorModeConfig]);
|
228
|
+
} else if (scaleModeToClass[mode as keyof ScaleModeConfig]) {
|
229
|
+
classes.push(scaleModeToClass[mode as keyof ScaleModeConfig]);
|
230
|
+
}
|
231
|
+
});
|
232
|
+
} else {
|
233
|
+
for (const colorMode in config.colorMode) {
|
234
|
+
classes.push(colorModeToClass[colorMode as keyof ColorModeConfig]);
|
235
|
+
}
|
236
|
+
for (const scaleMode in config.scaleMode) {
|
237
|
+
classes.push(scaleModeToClass[scaleMode as keyof ScaleModeConfig]);
|
238
|
+
}
|
239
|
+
}
|
240
|
+
|
241
|
+
return classes;
|
242
|
+
};
|
243
|
+
|
244
|
+
type PurgeOptions = {
|
245
|
+
config?: string;
|
246
|
+
};
|
247
|
+
|
248
|
+
async function purge({
|
249
|
+
config: configPath = Bun.env.UDS_OUT_FILE ?? './uds.config.ts',
|
250
|
+
}: PurgeOptions) {
|
181
251
|
const workspaceDir = Bun.env.PWD;
|
182
252
|
const srcDir = path.join(workspaceDir, '/tsconfig.json');
|
183
253
|
const project = new Project({
|
184
254
|
tsConfigFilePath: srcDir,
|
185
255
|
});
|
186
256
|
|
257
|
+
// we need to load the UDS config
|
258
|
+
const configAbsolutePath = path.resolve(workspaceDir, configPath);
|
259
|
+
const { config } = await import(configAbsolutePath);
|
260
|
+
|
187
261
|
spinStart('Getting used UDS components...');
|
188
|
-
|
262
|
+
|
263
|
+
// 1. Get all files from the current dir
|
264
|
+
print('Loading the project...');
|
189
265
|
const files = await getFiles();
|
266
|
+
|
190
267
|
// 2. For each file get the imports;
|
268
|
+
print('Going through the imports...');
|
191
269
|
const udsImports = parseFiles(project, files);
|
192
|
-
|
270
|
+
|
271
|
+
// 3. Now that we have the imported components
|
272
|
+
print('Finding all the components imported from UDS...');
|
193
273
|
const udsComponents = getComponentsToConvertToTW(udsImports);
|
274
|
+
|
194
275
|
// 4. Generate the CSS we need
|
276
|
+
print('🧑🍳 Cooking...');
|
195
277
|
const safeList = getTailwindSafelist(project, udsComponents);
|
278
|
+
const themesAndScalesClasses = getClassesForEnabledThemesAndScales(config);
|
279
|
+
|
196
280
|
// 5. Write the allowlist to a file
|
197
|
-
await saveToFile(safeList);
|
281
|
+
await saveToFile(safeList.concat(themesAndScalesClasses));
|
282
|
+
|
283
|
+
spinStop('Generated your safelist!');
|
198
284
|
}
|
199
285
|
|
200
|
-
export { purge };
|
286
|
+
export { purge, type PurgeOptions };
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import * as react from 'react';
|
2
|
+
import { i as UniversalPressableProps, j as UniversalIconButtonProps, k as UniversalImageProps } from './types-COiuE8XK.cjs';
|
3
|
+
import { View, PressableProps as PressableProps$1, StyleProp, ViewStyle } from 'react-native';
|
4
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
5
|
+
import { ImageProps as ImageProps$1 } from 'expo-image';
|
6
|
+
|
7
|
+
type NativePressableProps = Omit<PressableProps$1, 'children' | 'style' | 'onPress'> & {
|
8
|
+
style?: StyleProp<ViewStyle>;
|
9
|
+
};
|
10
|
+
interface PressableProps extends UniversalPressableProps, NativePressableProps {
|
11
|
+
}
|
12
|
+
declare const Pressable: react.ForwardRefExoticComponent<PressableProps & react.RefAttributes<View>>;
|
13
|
+
|
14
|
+
interface IconButtonProps extends PressableProps, UniversalIconButtonProps {
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* An icon button element that can be used to trigger an action.
|
18
|
+
* @example
|
19
|
+
```tsx
|
20
|
+
import { IconButton } from "@yahoo/uds";
|
21
|
+
|
22
|
+
export function IconButtonDemo() {
|
23
|
+
return (
|
24
|
+
<IconButton variant="accent-outline" color="primary" name="close" onPress={console.log} />
|
25
|
+
)
|
26
|
+
}
|
27
|
+
```
|
28
|
+
*/
|
29
|
+
declare const IconButton: react.ForwardRefExoticComponent<IconButtonProps & react.RefAttributes<View>>;
|
30
|
+
|
31
|
+
interface ImageProps extends Omit<ImageProps$1, 'alt' | 'source'>, UniversalImageProps {
|
32
|
+
}
|
33
|
+
/**
|
34
|
+
* An image element
|
35
|
+
*/
|
36
|
+
declare function Image({ width: imageWidth, height: imageHeight, src, alt, contentFit, backgroundColor, borderRadius, borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius, borderColor, borderColorOnActive, borderColorOnFocus, borderColorOnChecked, borderColorOnHover, borderStartColor, borderEndColor, borderTopColor, borderBottomColor, borderWidth, borderVerticalWidth, borderHorizontalWidth, borderStartWidth, borderEndWidth, borderTopWidth, borderBottomWidth, alignContent, alignItems, alignSelf, flex, flexDirection, flexGrow, flexShrink, flexWrap, justifyContent, flexBasis, display, overflow, overflowX, overflowY, position, spacing, spacingHorizontal, spacingVertical, spacingBottom, spacingEnd, spacingStart, spacingTop, offset, offsetVertical, offsetHorizontal, offsetBottom, offsetEnd, offsetStart, offsetTop, columnGap, rowGap, minHeight, maxHeight, minWidth, maxWidth, ...props }: ImageProps): react_jsx_runtime.JSX.Element;
|
37
|
+
|
38
|
+
export { type ImageProps as I, type PressableProps as P, IconButton as a, type IconButtonProps as b, Image as c, Pressable as d };
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import * as react from 'react';
|
2
|
+
import { i as UniversalPressableProps, j as UniversalIconButtonProps, k as UniversalImageProps } from './types-COiuE8XK.js';
|
3
|
+
import { View, PressableProps as PressableProps$1, StyleProp, ViewStyle } from 'react-native';
|
4
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
5
|
+
import { ImageProps as ImageProps$1 } from 'expo-image';
|
6
|
+
|
7
|
+
type NativePressableProps = Omit<PressableProps$1, 'children' | 'style' | 'onPress'> & {
|
8
|
+
style?: StyleProp<ViewStyle>;
|
9
|
+
};
|
10
|
+
interface PressableProps extends UniversalPressableProps, NativePressableProps {
|
11
|
+
}
|
12
|
+
declare const Pressable: react.ForwardRefExoticComponent<PressableProps & react.RefAttributes<View>>;
|
13
|
+
|
14
|
+
interface IconButtonProps extends PressableProps, UniversalIconButtonProps {
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* An icon button element that can be used to trigger an action.
|
18
|
+
* @example
|
19
|
+
```tsx
|
20
|
+
import { IconButton } from "@yahoo/uds";
|
21
|
+
|
22
|
+
export function IconButtonDemo() {
|
23
|
+
return (
|
24
|
+
<IconButton variant="accent-outline" color="primary" name="close" onPress={console.log} />
|
25
|
+
)
|
26
|
+
}
|
27
|
+
```
|
28
|
+
*/
|
29
|
+
declare const IconButton: react.ForwardRefExoticComponent<IconButtonProps & react.RefAttributes<View>>;
|
30
|
+
|
31
|
+
interface ImageProps extends Omit<ImageProps$1, 'alt' | 'source'>, UniversalImageProps {
|
32
|
+
}
|
33
|
+
/**
|
34
|
+
* An image element
|
35
|
+
*/
|
36
|
+
declare function Image({ width: imageWidth, height: imageHeight, src, alt, contentFit, backgroundColor, borderRadius, borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius, borderColor, borderColorOnActive, borderColorOnFocus, borderColorOnChecked, borderColorOnHover, borderStartColor, borderEndColor, borderTopColor, borderBottomColor, borderWidth, borderVerticalWidth, borderHorizontalWidth, borderStartWidth, borderEndWidth, borderTopWidth, borderBottomWidth, alignContent, alignItems, alignSelf, flex, flexDirection, flexGrow, flexShrink, flexWrap, justifyContent, flexBasis, display, overflow, overflowX, overflowY, position, spacing, spacingHorizontal, spacingVertical, spacingBottom, spacingEnd, spacingStart, spacingTop, offset, offsetVertical, offsetHorizontal, offsetBottom, offsetEnd, offsetStart, offsetTop, columnGap, rowGap, minHeight, maxHeight, minWidth, maxWidth, ...props }: ImageProps): react_jsx_runtime.JSX.Element;
|
37
|
+
|
38
|
+
export { type ImageProps as I, type PressableProps as P, IconButton as a, type IconButtonProps as b, Image as c, Pressable as d };
|