@yahoo/uds 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/cli/README.md +2 -8
  2. package/cli/bunfig.toml +3 -0
  3. package/cli/commands/expo/_setup.ts +1 -0
  4. package/cli/commands/expo/build.ts +1 -1
  5. package/cli/commands/expo/launch.ts +1 -1
  6. package/cli/commands/purge.ts +1 -1
  7. package/cli/commands/sync.ts +16 -4
  8. package/cli/commands/uds.ts +4 -1
  9. package/cli/commands/version.ts +1 -1
  10. package/cli/preload.ts +32 -0
  11. package/cli/utils/configWorker.ts +30 -11
  12. package/cli/utils/getCommandHelp.ts +22 -13
  13. package/cli/utils/purgeCSS.test.ts +99 -0
  14. package/cli/utils/purgeCSS.ts +5 -5
  15. package/cli/utils/setupConfigWorker.ts +8 -38
  16. package/cli/utils/types.ts +5 -2
  17. package/dist/{Image.native-tkOXN29I.d.ts → Image.native-C6kOWgnf.d.ts} +1 -1
  18. package/dist/{Image.native-jCNIrPZD.d.cts → Image.native-VeXt5aeI.d.cts} +1 -1
  19. package/dist/VStack-BSD9TbBd.d.cts +114 -0
  20. package/dist/VStack-Dk3-8IyU.d.ts +114 -0
  21. package/dist/experimental/index.cjs +1 -1
  22. package/dist/experimental/index.d.cts +5 -4
  23. package/dist/experimental/index.d.ts +5 -4
  24. package/dist/experimental/index.js +1 -1
  25. package/dist/experimental/index.native.cjs +1 -1
  26. package/dist/experimental/index.native.d.cts +3 -3
  27. package/dist/experimental/index.native.d.ts +3 -3
  28. package/dist/experimental/index.native.js +1 -1
  29. package/dist/fixtures/index.cjs +1 -1
  30. package/dist/fixtures/index.d.cts +15 -1
  31. package/dist/fixtures/index.d.ts +15 -1
  32. package/dist/fixtures/index.js +1 -1
  33. package/dist/index.cjs +1 -1
  34. package/dist/index.d.cts +133 -184
  35. package/dist/index.d.ts +133 -184
  36. package/dist/index.js +1 -1
  37. package/dist/{index.native-xVHqKK0u.d.ts → index.native-CisPq4BI.d.ts} +1 -1
  38. package/dist/{index.native--Dm3KDDS.d.cts → index.native-DJlx-bfM.d.cts} +1 -1
  39. package/dist/index.native.cjs +1 -1
  40. package/dist/index.native.d.cts +5 -5
  41. package/dist/index.native.d.ts +5 -5
  42. package/dist/index.native.js +1 -1
  43. package/dist/tailwindPlugin.cjs +1 -1
  44. package/dist/tailwindPlugin.d.cts +1 -1
  45. package/dist/tailwindPlugin.d.ts +1 -1
  46. package/dist/tailwindPlugin.js +1 -1
  47. package/dist/tailwindPurge.cjs +1 -1
  48. package/dist/tailwindPurge.js +1 -1
  49. package/dist/tokens/index.cjs +1 -1
  50. package/dist/tokens/index.d.cts +2 -2
  51. package/dist/tokens/index.d.ts +2 -2
  52. package/dist/tokens/index.js +1 -1
  53. package/dist/tokens/index.native.cjs +1 -1
  54. package/dist/tokens/index.native.d.cts +2 -2
  55. package/dist/tokens/index.native.d.ts +2 -2
  56. package/dist/tokens/index.native.js +1 -1
  57. package/dist/tokens/parseTokens.cjs +1 -1
  58. package/dist/tokens/parseTokens.d.cts +1 -1
  59. package/dist/tokens/parseTokens.d.ts +1 -1
  60. package/dist/tokens/parseTokens.js +1 -1
  61. package/dist/tokens/parseTokens.native.d.cts +1 -1
  62. package/dist/tokens/parseTokens.native.d.ts +1 -1
  63. package/dist/{types-7oEBWtMQ.d.cts → types-CzJpH_Oi.d.cts} +2 -2
  64. package/dist/{types-7oEBWtMQ.d.ts → types-CzJpH_Oi.d.ts} +2 -2
  65. package/package.json +4 -2
  66. package/dist/Pressable-2kgXQNVs.d.cts +0 -55
  67. package/dist/Pressable-LIDkIIAF.d.ts +0 -55
  68. /package/dist/{types-J4DLS6Xj.d.cts → types-FO65RM-W.d.cts} +0 -0
  69. /package/dist/{types-J4DLS6Xj.d.ts → types-FO65RM-W.d.ts} +0 -0
package/cli/README.md CHANGED
@@ -8,10 +8,10 @@ Bluebun relies on Bun APIs and is designed to be extremely fast, with no-depende
8
8
 
9
9
  # Commands
10
10
 
11
- In any consumer of `@yahoo/uds` the following commands are available:
12
-
13
11
  > Please 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`
14
12
 
13
+ In any consumer of `@yahoo/uds` the following commands are available:
14
+
15
15
  ## Config
16
16
 
17
17
  ### Using args
@@ -23,9 +23,7 @@ In any consumer of `@yahoo/uds` the following commands are available:
23
23
 
24
24
  ```shell
25
25
  uds sync --id [id] --outFile [path]
26
- ```
27
26
 
28
- ```shell
29
27
  uds sync --id [id]
30
28
  ```
31
29
 
@@ -36,10 +34,6 @@ uds sync --id [id]
36
34
  | UDS_ID | true | |
37
35
  | UDS_OUT_FILE | false | ./uds.config.ts |
38
36
 
39
- ```shell
40
- UDS_ID=[id] uds sync --outFile [path]
41
- ```
42
-
43
37
  ```shell
44
38
  UDS_ID=[id] UDS_OUT_FILE=[path] uds sync
45
39
  ```
@@ -0,0 +1,3 @@
1
+ [test]
2
+ # Load these modules before running tests.
3
+ preload = ["./preload"]
@@ -1,6 +1,7 @@
1
1
  import fs from 'node:fs';
2
2
  import os from 'node:os';
3
3
 
4
+ // @ts-expect-error this is a transitive dep of expo, which is required in consumers to even run this setup
4
5
  import { EasJsonAccessor, EasJsonUtils, Platform } from '@expo/eas-json';
5
6
  import { print, type Props } from 'bluebun';
6
7
  import { $, semver, which } from 'bun';
@@ -4,7 +4,7 @@ import { type MobileProps, needsBinary, needsBrewFormula, setup } from './_setup
4
4
 
5
5
  export default {
6
6
  name: 'build',
7
- description: '🚀 Build',
7
+ description: '🏗️ Build',
8
8
  run: async (props: MobileProps) => {
9
9
  const { platform, profile, output } = await setup({
10
10
  props,
@@ -5,7 +5,7 @@ import { setup } from './_setup';
5
5
 
6
6
  export default {
7
7
  name: 'launch',
8
- description: '🚀 Launch',
8
+ description: '📱 Launch',
9
9
  run: async (props: MobileProps) => {
10
10
  const { platform, output } = await setup({
11
11
  props,
@@ -11,6 +11,6 @@ export default {
11
11
 
12
12
  await purge();
13
13
 
14
- spinStop('✅ Purging css done!');
14
+ spinStop('✅', 'Purging css done!');
15
15
  },
16
16
  };
@@ -1,4 +1,4 @@
1
- import { Props } from 'bluebun';
1
+ import { magenta, print, Props } from 'bluebun';
2
2
 
3
3
  import { setupConfigWorker } from '../utils/setupConfigWorker';
4
4
  import { SyncOptions } from '../utils/types';
@@ -9,10 +9,22 @@ interface SyncProps extends Props {
9
9
 
10
10
  export default {
11
11
  name: 'sync',
12
- description: '🌈 Sync',
13
- run: async ({ options }: SyncProps) => {
12
+ description: '🔄 Update to latest design config 🎨',
13
+ alias: ['update'],
14
+ run: async ({ name, commandPath, options }: SyncProps) => {
15
+ const { id = Bun.env.UDS_ID, outFile = Bun.env.UDS_OUT_FILE } = options;
16
+
17
+ if (!id || typeof id === 'boolean') {
18
+ console.error(
19
+ '\nMissing config ID. Please pass an --id flag or set the UDS_ID env variable.\n',
20
+ );
21
+ print(`${magenta('Usage:')} ${name} ${commandPath} --id <config-id>\n`);
22
+ return;
23
+ }
24
+
14
25
  await setupConfigWorker({
15
- ...options,
26
+ id,
27
+ outFile: outFile ?? './uds.config.ts',
16
28
  onUpdate: ({ worker }) => {
17
29
  if (!options.watch) {
18
30
  worker.terminate();
@@ -1,4 +1,4 @@
1
- import { type Props } from 'bluebun';
1
+ import { print, type Props, red } from 'bluebun';
2
2
 
3
3
  import { getCommandHelp } from '../utils/getCommandHelp';
4
4
 
@@ -6,6 +6,9 @@ export default {
6
6
  name: 'uds',
7
7
  description: '',
8
8
  run: async (props: Props) => {
9
+ if (props.first) {
10
+ print(red(`Unknown command: ${props.first}`));
11
+ }
9
12
  await getCommandHelp(props);
10
13
  },
11
14
  };
@@ -4,7 +4,7 @@ import packageJson from '../../package.json';
4
4
 
5
5
  export default {
6
6
  name: 'version',
7
- description: `💾 ${packageJson.version}`,
7
+ description: `${packageJson.version}`,
8
8
  run: async () => {
9
9
  print(packageJson.version);
10
10
  },
package/cli/preload.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { jest, mock } from 'bun:test';
2
+
3
+ const mockFastGlob = jest.fn().mockResolvedValue(['/pages/PageA.tsx', '/pages/PageB.tsx']);
4
+
5
+ mock.module('fast-glob', () => ({ __esModule: true, default: mockFastGlob }));
6
+
7
+ mock.module('@yahoo/uds/tailwindPurge', () => ({
8
+ componentsDependencies: {
9
+ Button: ['Icon', 'Pressable', 'Text'],
10
+ Spinner: [],
11
+ HStack: ['Box'],
12
+ },
13
+ componentToVariants: {
14
+ Button: ['color'],
15
+ HStack: ['alignItems', 'justifyContent'],
16
+ Icon: ['color'],
17
+ Text: ['fontSize', 'fontFamily'],
18
+ Pressable: ['display'],
19
+ },
20
+ variantsList: ['color', 'alignItems', 'justifyContent', 'display', 'fontSize', 'fontFamily'],
21
+ variantToTailwindClass: {
22
+ color: 'text-accent text-alert text-black text-brand text-positive text-warning text-white',
23
+ alignItems: 'items-start items-end items-center items-stretch items-baseline',
24
+ justifyContent:
25
+ 'justify-start justify-end justify-center justify-between justify-around justify-evenly',
26
+ display:
27
+ 'block inline-block inline flex inline-flex table inline-table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row-group table-row flow-root grid contents',
28
+ fontSize: 'font-size-display1 font-size-title1 ',
29
+ fontFamily:
30
+ 'font-icons font-sans font-sans-beta font-sans-condensed font-serif-text font-serif-display font-display1 font-title1 font-title2 font-title3 font-title4 font-headline1 font-body1 font-label1 font-label2 font-caption1 font-caption2 font-legal1',
31
+ },
32
+ }));
@@ -1,30 +1,49 @@
1
1
  // prevents TS errors
2
2
  declare var self: Worker;
3
3
 
4
- import { $ } from 'bun';
4
+ import { UniversalTokensConfig } from '@yahoo/uds/tokens';
5
5
 
6
6
  import { ConfigWorkerThreadMessage } from './types';
7
7
 
8
+ const CLOUD_FUNCTION = 'https://syncconfig-j57v6zmjrq-uc.a.run.app';
9
+
8
10
  self.onmessage = async ({ data }: ConfigWorkerThreadMessage) => {
11
+ const { id } = data.resp;
12
+
9
13
  if (data.type === 'init') {
10
14
  try {
11
- // Only listen for updates if firebase is available. This will only be available in UDS monorepo atm
15
+ // The firebase packaage available if we're in the UDS monorepo. Listen for updates.
12
16
  const firebase = await import('database/firebase');
13
- console.write('Fetching from local database package...\n');
14
- firebase.onBranchSnapshot(data.resp.id, ({ config, status }) => {
17
+
18
+ // Bail if the branch doesn't exist in configurator.
19
+ const branchExists = await firebase.branchExists(id);
20
+ if (!branchExists) {
21
+ throw new Error(`Config id '${id}' does not exist in the Configurator.`);
22
+ }
23
+
24
+ console.log('Fetching using local database package...');
25
+
26
+ firebase.onBranchSnapshot(id, ({ config, status }) => {
15
27
  postMessage({ type: 'update', resp: { config, status } });
16
28
  });
17
29
  } catch (err) {
18
30
  try {
19
- const res =
20
- await $`curl https://syncconfig-j57v6zmjrq-uc.a.run.app?id=${data.resp.id}`.json();
21
- if (res?.config) {
22
- postMessage({ type: 'update', resp: { config: res.config, status: 'error' } });
23
- } else {
24
- throw Error;
31
+ console.log('Fetching from configurator...');
32
+
33
+ const resp = await fetch(`${CLOUD_FUNCTION}?id=${id}`);
34
+ if (!resp.ok) {
35
+ throw new Error(`Error fetching config id '${id}'. Does it exist in the Configurator?`);
25
36
  }
37
+
38
+ const { config } = ((await resp.json()) as { config: UniversalTokensConfig }) ?? {};
39
+ if (!config) {
40
+ throw new Error('Config JSON could not be parsed.');
41
+ }
42
+
43
+ postMessage({ type: 'update', resp: { config, status: 'error' } });
26
44
  } catch (err) {
27
- throw new Error('Error fetching config');
45
+ console.error(`\n${(err as Error).message}\n`);
46
+ throw err;
28
47
  }
29
48
  }
30
49
  }
@@ -1,21 +1,21 @@
1
1
  import {
2
- bold,
3
2
  calcWidestCommandName,
4
- CommandTree,
3
+ type CommandTree,
5
4
  commandTree,
6
5
  cyan,
7
6
  gray,
7
+ green,
8
+ magenta,
8
9
  print,
9
- Props,
10
+ type Props,
10
11
  white,
11
12
  } from 'bluebun';
12
13
 
13
14
  /**
14
- *
15
15
  * The formatting from bluebun for the help command is not great.
16
16
  * I forked code from https://github.com/jamonholmgren/bluebun/blob/main/src/command-help.ts
17
17
  *
18
- * TODO: Maybe create helpers for better styling control for this & other features
18
+ * TODO: create helpers for better styling control for this & other features
19
19
  *
20
20
  * Some packages to checkout:
21
21
  * - https://github.com/wobsoriano/blipgloss
@@ -29,7 +29,7 @@ async function formatHelp(initialProps: Props) {
29
29
  const _tree = await commandTree(initialProps);
30
30
  const tree = categoryToFilter ? { [categoryToFilter]: _tree[categoryToFilter] } : _tree;
31
31
 
32
- const widest = calcWidestCommandName(tree) + 5;
32
+ const widest = calcWidestCommandName(tree) + 10;
33
33
 
34
34
  function generateHelp(cmdTree: CommandTree, prefix: string): string[] {
35
35
  return Object.keys(cmdTree).flatMap((key) => {
@@ -49,16 +49,25 @@ async function formatHelp(initialProps: Props) {
49
49
 
50
50
  const helpLines = generateHelp(tree, name);
51
51
 
52
- const help = `${bold(white('Commands:'))}
53
-
54
- ${helpLines.join('\n')}
55
- `;
52
+ // https://texteditor.com/multiline-text-art/
53
+ const banner = `
54
+ █ █ █▀▄ ▄▀▀ ▄▀▀ █ █
55
+ ▀▄█ █▄▀ ▄██ ▀▄▄ █▄▄ █
56
+ Universal Design System
57
+ `.trim();
58
+
59
+ const help = `
60
+ ${green(banner)}
61
+
62
+ ${magenta(`Usage: ${white(`${name} <command>`)}`)}
63
+
64
+ ${magenta('Commands:')}
65
+ ${helpLines.join('\n')}
66
+ `;
56
67
 
57
68
  return help;
58
69
  }
59
70
 
60
71
  export async function getCommandHelp(props: Props) {
61
- print('');
62
- const helpText = await formatHelp(props);
63
- print(helpText);
72
+ print(await formatHelp(props));
64
73
  }
@@ -0,0 +1,99 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { Project } from 'ts-morph';
3
+
4
+ import {
5
+ getComponentsToConvertToTW,
6
+ getFiles,
7
+ getTailwindSafelist,
8
+ isUDSComponent,
9
+ parseFiles,
10
+ } from './purgeCSS';
11
+
12
+ const PAGE_A_CODE = `
13
+ import { Button } from '@yahoo/uds';
14
+
15
+ const PageA = () => {
16
+ return (
17
+ <div>
18
+ <Button> Click me </Button>
19
+ </div>
20
+ )
21
+ }
22
+ `;
23
+
24
+ const PAGE_B_CODE = `
25
+ import { HStack, Spinner } from '@yahoo/uds';
26
+ import { noop } from 'lodash';
27
+
28
+ const PageB = () => {
29
+ return (
30
+ <div>
31
+ <HStack flexGrow="1" alignItems="center" justifyContent="center">
32
+ <Spinner />
33
+ </HStack>
34
+ </div>
35
+ )
36
+ }
37
+ `;
38
+
39
+ const FILES = ['/pages/PageA.tsx', '/pages/PageB.tsx'];
40
+ const IMPORTED_UDS_COMPONENTS = ['Button', 'HStack', 'Spinner'];
41
+
42
+ describe('purgeCSS', () => {
43
+ const project = new Project();
44
+
45
+ describe('getFiles', () => {
46
+ it('returns the list of files', async () => {
47
+ const files = await getFiles();
48
+
49
+ expect(files).toEqual(FILES);
50
+ });
51
+ });
52
+
53
+ describe('parseFiles', () => {
54
+ it('returns the list of imports from @yahoo/uds', () => {
55
+ project.createSourceFile(FILES[0], PAGE_A_CODE, {
56
+ overwrite: true,
57
+ });
58
+ project.createSourceFile(FILES[1], PAGE_B_CODE, {
59
+ overwrite: true,
60
+ });
61
+
62
+ const res = parseFiles(project, FILES);
63
+
64
+ expect(res).toEqual(IMPORTED_UDS_COMPONENTS);
65
+ });
66
+ });
67
+
68
+ describe('getTailwindSafelist', () => {
69
+ it('returns the tailwind classes corresponding to the props on a component', () => {
70
+ const res = getTailwindSafelist(IMPORTED_UDS_COMPONENTS);
71
+
72
+ expect(res).toEqual(
73
+ 'text-accent text-alert text-black text-brand text-positive text-warning text-white items-start items-end items-center items-stretch items-baseline justify-start justify-end justify-center justify-between justify-around justify-evenly ',
74
+ );
75
+ });
76
+ });
77
+
78
+ describe('getComponentsToConvertToTW', () => {
79
+ it('should get just exports which are components from UDS', () => {
80
+ const res = getComponentsToConvertToTW(['Button', 'HStack', 'randomThingy']);
81
+
82
+ expect(res).toEqual(['Button', 'Icon', 'Pressable', 'Text', 'HStack', 'Box']);
83
+ });
84
+ });
85
+
86
+ describe('isUDSComponent', () => {
87
+ it('returns true if the component is exported from UDS', () => {
88
+ const res = isUDSComponent('Button');
89
+
90
+ expect(res).toBeTrue();
91
+ });
92
+
93
+ it('returns false if the component is not exported from UDS', () => {
94
+ const res = isUDSComponent('NotUdsComponent');
95
+
96
+ expect(res).toBeFalse();
97
+ });
98
+ });
99
+ });
@@ -17,7 +17,7 @@ type Files = string[];
17
17
  // TODO: use CLI args to power the output file path
18
18
  const OUTPUT_FILE_PATH = Bun.file(`${Bun.env.PWD}/dist/safelist.js`);
19
19
 
20
- const getFiles = async (): Promise<Files> => {
20
+ export const getFiles = async (): Promise<Files> => {
21
21
  const workspaceDir = Bun.env.PWD;
22
22
  const srcDir = path.join(workspaceDir, '/src/');
23
23
  const files = await FastGlob(`${srcDir}/**/*.{jsx,tsx}`);
@@ -28,7 +28,7 @@ const getFiles = async (): Promise<Files> => {
28
28
  /**
29
29
  * Given a file it returns the list of imports from @yahoo/uds
30
30
  */
31
- const parseFiles = (project: Project, files: Files): ImportsList => {
31
+ export const parseFiles = (project: Project, files: Files): ImportsList => {
32
32
  const importsSet = new Set();
33
33
 
34
34
  const importsPerFile: string[] = files
@@ -59,7 +59,7 @@ const parseFiles = (project: Project, files: Files): ImportsList => {
59
59
  return Array.from(importsSet) as string[];
60
60
  };
61
61
 
62
- const getTailwindSafelist = (componentList: string[]): SafeList => {
62
+ export const getTailwindSafelist = (componentList: string[]): SafeList => {
63
63
  const validVariants = new Set<string>(variantsList);
64
64
  const usedProps = new Set<string>();
65
65
  componentList.forEach((component: string) => {
@@ -79,7 +79,7 @@ const getTailwindSafelist = (componentList: string[]): SafeList => {
79
79
  return safeList;
80
80
  };
81
81
 
82
- const isUDSComponent = (component: string): boolean => {
82
+ export const isUDSComponent = (component: string): boolean => {
83
83
  return !!componentToVariants[component];
84
84
  };
85
85
 
@@ -94,7 +94,7 @@ const saveToFile = async (safeList: SafeList) => {
94
94
  await Bun.write(OUTPUT_FILE_PATH, fileContent);
95
95
  };
96
96
 
97
- const getComponentsToConvertToTW = (udsImport: ImportsList): string[] => {
97
+ export const getComponentsToConvertToTW = (udsImport: ImportsList): string[] => {
98
98
  // filter out just the components
99
99
  const components = udsImport.filter((importedItem) => !!componentToVariants[importedItem]);
100
100
  const set = new Set();
@@ -2,52 +2,22 @@ import path from 'node:path';
2
2
 
3
3
  import { sortKeys } from './sortKeys';
4
4
  import { ConfigWorkerMainThreadMessage, SyncOptions } from './types';
5
-
6
- const workerPath = path.resolve(import.meta.dir, './configWorker');
7
- const workerURL = new URL(Bun.pathToFileURL(workerPath)).href;
8
-
9
5
  interface ConfigWorkerOptions extends SyncOptions {
10
6
  onUpdate?: (params: { worker: Worker }) => void;
11
7
  }
12
8
 
13
- export async function setupConfigWorker({
14
- id = Bun.env.UDS_ID,
15
- outFile = Bun.env.UDS_OUT_FILE,
16
- onUpdate,
17
- }: ConfigWorkerOptions = {}) {
18
- const workspaceDir = Bun.env.PWD;
19
- let configID = id;
20
- let configOutFile = outFile ?? './uds.config.ts';
21
-
22
- // If we didn't get the config ID from the command line or env vars, check for a uds.json file
23
- if (!configID) {
24
- const udsConfigFile = Bun.file(`${workspaceDir}/uds.json`);
25
- const udsConfigFileExists = await udsConfigFile.exists();
26
- if (udsConfigFileExists) {
27
- const configJsonFile = (await udsConfigFile.json()) as { id: string; outFile: string };
28
-
29
- configID = configJsonFile.id;
30
- configOutFile = configJsonFile.outFile;
31
- }
32
- }
33
-
34
- // have _nothing_, warn the eng to do something
35
- if (!configID) {
36
- console.error(
37
- '\nMissing config ID. Please pass in --id, set UDS_ID in your .env, or create a uds.json file with { "id": "your-config-id" } defined.\n',
38
- );
39
- process.exit(1);
40
- }
41
-
42
- const outFilePath = `${workspaceDir}/${configOutFile}`;
9
+ export async function setupConfigWorker({ id, outFile, onUpdate }: ConfigWorkerOptions) {
10
+ const workerPath = path.resolve(import.meta.dir, './configWorker');
11
+ const workerURL = Bun.pathToFileURL(workerPath).href;
12
+ const outFilePath = `${Bun.env.PWD}/${outFile}`;
43
13
 
44
14
  const worker = new Worker(workerURL);
45
15
 
46
16
  worker.addEventListener('open', () => {
47
- worker.postMessage({ type: 'init', resp: { id: configID } });
17
+ worker.postMessage({ type: 'init', resp: { id } });
48
18
  });
49
19
 
50
- worker.onmessage = async ({ data }: ConfigWorkerMainThreadMessage) => {
20
+ worker.addEventListener('message', async ({ data }: ConfigWorkerMainThreadMessage) => {
51
21
  if (data.type === 'update') {
52
22
  // Firebase does not guarantee the order of the keys in the config
53
23
  // this can give us a false diff when writing to existing file
@@ -59,11 +29,11 @@ import { type UniversalTokensConfig } from '@yahoo/uds';
59
29
  export const config: UniversalTokensConfig = ${JSON.stringify(sortedConfig, null, 2)};
60
30
  `.trimStart();
61
31
 
62
- console.log(`✅ Synced UDS config ${configID} to ${outFilePath}`);
32
+ console.log(`✅ Synced UDS config ${id} to ${outFilePath}`);
63
33
  await Bun.write(outFilePath, configContent);
64
34
  onUpdate?.({ worker });
65
35
  }
66
- };
36
+ });
67
37
 
68
38
  // Register a handler for the SIGINT signal (Ctrl + C)
69
39
  process.on('SIGINT', () => {
@@ -7,7 +7,10 @@ export type ConfigWorkerMainThreadMessage = MessageEvent<{
7
7
  }>;
8
8
 
9
9
  export type SyncOptions = {
10
- id?: string;
11
- outFile?: string;
10
+ /** Configurator (branch) id */
11
+ id: string;
12
+ /** The file to write the config to. Defaults to uds.config.ts. */
13
+ outFile: string;
14
+ /** Enable watch mode? */
12
15
  watch?: boolean;
13
16
  };
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { j as UniversalPressableProps, m as UniversalIconButtonProps, n as UniversalImageProps } from './types-7oEBWtMQ.js';
2
+ import { l as UniversalPressableProps, n as UniversalIconButtonProps, o as UniversalImageProps } from './types-CzJpH_Oi.js';
3
3
  import { View, PressableProps as PressableProps$1, StyleProp, ViewStyle } from 'react-native';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import { ImageProps as ImageProps$1 } from 'expo-image';
@@ -1,5 +1,5 @@
1
1
  import * as react from 'react';
2
- import { j as UniversalPressableProps, m as UniversalIconButtonProps, n as UniversalImageProps } from './types-7oEBWtMQ.cjs';
2
+ import { l as UniversalPressableProps, n as UniversalIconButtonProps, o as UniversalImageProps } from './types-CzJpH_Oi.cjs';
3
3
  import { View, PressableProps as PressableProps$1, StyleProp, ViewStyle } from 'react-native';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
5
  import { ImageProps as ImageProps$1 } from 'expo-image';
@@ -0,0 +1,114 @@
1
+ import * as react from 'react';
2
+ import { k as UniversalBoxProps, l as UniversalPressableProps, m as UniversalStackProps } from './types-CzJpH_Oi.cjs';
3
+
4
+ type DivProps = React.HTMLAttributes<HTMLDivElement>;
5
+ interface BoxProps extends UniversalBoxProps, DivProps {
6
+ }
7
+ /**
8
+ * A layout primitive that can be used to compose other components.
9
+ * @example
10
+ ```tsx
11
+ import { Box } from "@yahoo/uds"
12
+
13
+ export function Demo() {
14
+ return (
15
+ <Box
16
+ bordered
17
+ backgroundColor="primary"
18
+ borderRadius="md"
19
+ spacing='6'
20
+ >
21
+ Any kind of content can go here!
22
+ </Box>
23
+ )
24
+ }
25
+ ```
26
+ */
27
+ declare const Box: react.ForwardRefExoticComponent<BoxProps & react.RefAttributes<HTMLDivElement>>;
28
+
29
+ type HtmlButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'color' | 'name'>;
30
+ interface PressableProps extends UniversalPressableProps, HtmlButtonProps {
31
+ }
32
+ /**
33
+ * Provides press interactions with accessibility support.
34
+ * @example
35
+ ```tsx
36
+ import { Pressable, Text } from "@yahoo/uds"
37
+
38
+ export function Demo() {
39
+ return (
40
+ <Pressable
41
+ onClick={console.log}
42
+ backgroundColor="secondary"
43
+ bordered
44
+ borderColor="primary"
45
+ borderRadius="lg"
46
+ >
47
+ <Text variant="body1" spacingHorizontal="7" spacingVertical="5">Click me...</Text>
48
+ </Pressable>
49
+ )
50
+ }
51
+ ```
52
+ */
53
+ declare const Pressable: react.ForwardRefExoticComponent<PressableProps & react.RefAttributes<HTMLButtonElement>>;
54
+
55
+ type VStackProps = UniversalStackProps & DivProps;
56
+ /**
57
+ * The VStack is essentially the same component as [Box](/components/box) where it uses [flexbox](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox) but it lays out content in a column. VStack also allows for gaps between children via the `gap` prop.
58
+ *
59
+ * You should use VStack when:
60
+ *
61
+ * - you want to lay content out in rows that are sized to their content (height only, by default each child will fill the width of the VStack)
62
+ * - you want to add gaps between columns
63
+ * - you want to lay content out in columns that fill the available space within the parent container
64
+ * - you need columns of proportionate size to each other (also known as a ratio-based layout)
65
+ *
66
+ * @example
67
+ * #### Rows with Gaps
68
+ *
69
+ * ```tsx
70
+ * import { Box, VStack } from "@yahoo/uds"
71
+ *
72
+ * export function Demo() {
73
+ * return (
74
+ * <VStack gap="6">
75
+ * <Box spacing="6" backgroundColor="secondary">
76
+ * First
77
+ * </Box>
78
+ * <Box spacing="6" backgroundColor="secondary">
79
+ * Second
80
+ * </Box>
81
+ * <Box spacing="6" backgroundColor="secondary">
82
+ * Third
83
+ * </Box>
84
+ * </VStack>
85
+ * )
86
+ * }
87
+ * ```
88
+ *
89
+ * #### Rows that Have Proportionate Sizes
90
+ *
91
+ * ```tsx
92
+ * import { Box, VStack } from "@yahoo/uds"
93
+ *
94
+ * export function Demo() {
95
+ * return (
96
+ * <VStack gap="6">
97
+ * <Box spacing="6" flexGrow="1" backgroundColor="secondary">
98
+ * First
99
+ * </Box>
100
+ * <Box spacing="6" flexGrow="2" backgroundColor="secondary">
101
+ * Second
102
+ * </Box>
103
+ * <Box spacing="6" flexGrow="3" backgroundColor="secondary">
104
+ * Third
105
+ * </Box>
106
+ * </VStack>
107
+ * )
108
+ * }
109
+ * ```
110
+ *
111
+ **/
112
+ declare const VStack: react.ForwardRefExoticComponent<UniversalStackProps & DivProps & react.RefAttributes<HTMLDivElement>>;
113
+
114
+ export { Box as B, type DivProps as D, Pressable as P, VStack as V, type BoxProps as a, type PressableProps as b, type VStackProps as c };