@yahoo/uds 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/cli/README.md +50 -0
  2. package/cli/bin/uds-darwin-arm64-baseline +0 -0
  3. package/cli/bin/uds-linux-arm64 +0 -0
  4. package/cli/bin/uds-linux-x64-baseline +0 -0
  5. package/cli/cli.ts +21 -4
  6. package/cli/commands/codemod/codemod.ts +12 -9
  7. package/cli/commands/codemod/sizingProps.ts +1 -1
  8. package/cli/commands/login.ts +30 -0
  9. package/cli/commands/logout.ts +27 -0
  10. package/cli/commands/purge.ts +3 -1
  11. package/cli/commands/sync.ts +2 -0
  12. package/cli/commands/uds.ts +6 -1
  13. package/cli/commands/version.ts +2 -0
  14. package/cli/compile.ts +8 -9
  15. package/cli/consts.ts +5 -1
  16. package/cli/env.d.ts +5 -0
  17. package/cli/exec.ts +1 -1
  18. package/cli/preload.ts +17 -0
  19. package/cli/tsconfig.json +4 -4
  20. package/cli/uds-cli +6 -2
  21. package/cli/utils/analytics.ts +26 -0
  22. package/cli/utils/auth.ts +338 -0
  23. package/cli/utils/client_secrets.json +23 -0
  24. package/cli/utils/client_secrets.json.enc +0 -0
  25. package/cli/utils/configWorker.ts +3 -2
  26. package/cli/utils/getDirChoices.ts +0 -1
  27. package/cli/utils/secrets.ts +40 -0
  28. package/dist/analytics/server.cjs +1 -0
  29. package/dist/analytics/server.d.cts +1 -0
  30. package/dist/analytics/server.d.ts +1 -0
  31. package/dist/analytics/server.js +1 -0
  32. package/dist/chunk-3PK6DOFO.js +3 -0
  33. package/dist/chunk-5WBROFT5.cjs +1 -0
  34. package/dist/chunk-DCXVARRB.cjs +1 -0
  35. package/dist/chunk-DMMTEAJW.cjs +2 -0
  36. package/dist/chunk-EYFQOFYW.cjs +1 -0
  37. package/dist/chunk-FWF2C6TL.cjs +1 -0
  38. package/dist/chunk-GIJ2FHY5.cjs +1 -0
  39. package/dist/chunk-IUL5ZI4O.js +2 -0
  40. package/dist/chunk-JGIKFUBH.cjs +2 -0
  41. package/dist/chunk-P5B5IOMM.js +2 -0
  42. package/dist/chunk-PE2P7J44.js +2 -0
  43. package/dist/chunk-PFT3UA6K.cjs +2 -0
  44. package/dist/chunk-SUASN3GG.js +2 -0
  45. package/dist/chunk-VPR62GYQ.js +2 -0
  46. package/dist/chunk-X6F5UEQ5.js +2 -0
  47. package/dist/chunk-YM5TKITI.js +2 -0
  48. package/dist/chunk-YUHY3FXT.cjs +1 -0
  49. package/dist/chunk-ZV62SW5G.js +1 -0
  50. package/dist/client/index.cjs +3 -0
  51. package/dist/client/index.d.cts +97 -0
  52. package/dist/client/index.d.ts +97 -0
  53. package/dist/client/index.js +4 -0
  54. package/dist/experimental/index.cjs +2 -0
  55. package/dist/experimental/index.d.cts +469 -0
  56. package/dist/experimental/index.d.ts +469 -0
  57. package/dist/experimental/index.js +2 -0
  58. package/dist/fixtures.cjs +1506 -0
  59. package/dist/fixtures.d.cts +94 -0
  60. package/dist/fixtures.d.ts +94 -0
  61. package/dist/fixtures.js +1449 -0
  62. package/dist/flags.cjs +1 -0
  63. package/dist/flags.d.cts +17 -0
  64. package/dist/flags.d.ts +17 -0
  65. package/dist/flags.js +2 -0
  66. package/dist/index.cjs +1 -0
  67. package/dist/index.d.cts +385 -0
  68. package/dist/index.d.ts +385 -0
  69. package/dist/index.js +1 -0
  70. package/dist/metafile-cjs.json +1 -0
  71. package/dist/metafile-esm.json +1 -0
  72. package/dist/motionFeatures-I76FFCTS.js +1 -0
  73. package/dist/motionFeatures-P3FQL2KP.cjs +1 -0
  74. package/dist/styles/toast.css +3 -0
  75. package/dist/styles/toast.d.cts +2 -0
  76. package/dist/styles/toast.d.ts +2 -0
  77. package/dist/tailwind/plugin.cjs +2 -0
  78. package/dist/tailwind/plugin.d.cts +60 -0
  79. package/dist/tailwind/plugin.d.ts +60 -0
  80. package/dist/tailwind/plugin.js +2 -0
  81. package/dist/tailwind/purger.cjs +5 -0
  82. package/dist/tailwind/purger.d.cts +17 -0
  83. package/dist/tailwind/purger.d.ts +17 -0
  84. package/dist/tailwind/purger.js +6 -0
  85. package/dist/tailwind/tsMorph.cjs +1 -0
  86. package/dist/tailwind/tsMorph.d.cts +31 -0
  87. package/dist/tailwind/tsMorph.d.ts +31 -0
  88. package/dist/tailwind/tsMorph.js +1 -0
  89. package/dist/tailwind/utils.cjs +1 -0
  90. package/dist/tailwind/utils.d.cts +99 -0
  91. package/dist/tailwind/utils.d.ts +99 -0
  92. package/dist/tailwind/utils.js +1 -0
  93. package/dist/tokens/index.cjs +1 -0
  94. package/dist/tokens/index.d.cts +1127 -0
  95. package/dist/tokens/index.d.ts +1127 -0
  96. package/dist/tokens/index.js +1 -0
  97. package/dist/tokens/parseTokens.cjs +1 -0
  98. package/dist/tokens/parseTokens.d.cts +59 -0
  99. package/dist/tokens/parseTokens.d.ts +59 -0
  100. package/dist/tokens/parseTokens.js +1 -0
  101. package/dist/types-Pyccco5Q.d.cts +949 -0
  102. package/dist/types-Pyccco5Q.d.ts +949 -0
  103. package/fonts/mobile.cjs +1 -1
  104. package/package.json +48 -21
  105. package/cli/codemods/propsToClass.test.tsx +0 -97
  106. package/cli/utils/purgeCSS.test.ts +0 -210
package/cli/README.md CHANGED
@@ -3,6 +3,11 @@ import { Box, VStack } from '@yahoo/uds';
3
3
  import { RequiredChip } from '~/components/RequiredChip';
4
4
  import { DocImage } from '~/components/DocImage';
5
5
  import { PACKAGE_MANAGERS, CommandSnippet } from '~/components/CommandSnippet';
6
+ import { toPageTitle } from '~/utils/toPageTitle';
7
+
8
+ export const metadata = {
9
+ title: toPageTitle({ title: 'CLI', category: 'Tools' }),
10
+ };
6
11
 
7
12
  # Universal CLI
8
13
 
@@ -18,6 +23,17 @@ The Universal CLI is available as command, `uds`. The tool was created with [Blu
18
23
 
19
24
  1. To use the CLI, first [install](/docs/getting-started/quick-start#installation) the `@yahoo/uds` package as a dependency in your package.json, which has the UDS CLI as a binary.
20
25
 
26
+ 2. Log in to the CLI
27
+
28
+ <VStack spacingBottom="2">
29
+ <DocTabs
30
+ items={PACKAGE_MANAGERS.map((packageManager) => ({
31
+ label: packageManager,
32
+ content: <CommandSnippet name={packageManager} command="bun uds login" />,
33
+ }))}
34
+ />
35
+ </VStack>
36
+
21
37
  ## Commands
22
38
 
23
39
  > **Note**: If you are _not_ running the CLI from a package.json script you will need to call your package manager execute command before the binary in order to run it directly. i.e. `npx uds purge`
@@ -128,6 +144,24 @@ Any file added to commands/codemod will be available in prompt land.
128
144
  uds codemod
129
145
  ```
130
146
 
147
+ ### Login
148
+
149
+ The `uds login` command is used to authenticate the user to the CLI. We use
150
+ Google's OAuth2 flow, which is the same login flow used by the [Configurator](/docs/getting-started/using-configurator) and the documentation site. Logging in to the CLI helps us identify and track CLI usage and metrics.
151
+
152
+ ### Circumventing Login
153
+
154
+ There may be situations (such as CI runs) where you can't authenticate your personal account with the CLI. For this case, providing the `CI=true` and `UDS_TEAM_SLUG` env variables is required when using the CLI in a CI environment:
155
+
156
+ ```env
157
+ CI=true
158
+ UDS_TEAM_SLUG=<your-team-slug> uds <command>
159
+ ```
160
+
161
+ Your team slug can be found in your team's Configurator URL path:
162
+
163
+ <DocImage light={{ src: '/images/team-slug-screenshot.png' }} />
164
+
131
165
  ### Expo (WIP)
132
166
 
133
167
  The `uds expo` command is for building and launching React Native apps using Expo.
@@ -153,6 +187,22 @@ Commands are organized in a tree structure in `uds/cli/commands`. The root comma
153
187
 
154
188
  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-uds/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.
155
189
 
190
+ ### Testing the login flow
191
+
192
+ To test the login flow, the CLI starts a web server and opens browser window to
193
+ a login page in Configurator. In prod, it opens https://config.uds.build/login.
194
+ In local dev, http://localhost:4001/login is opened.
195
+
196
+ In the root of the UDS monorepo, run the following commands:
197
+
198
+ ```
199
+ # Start configurator app web server:
200
+ turbo --filter uds-configurator dev
201
+
202
+ # Run the CLI login command:
203
+ bun run --cwd packages/uds uds login
204
+ ```
205
+
156
206
  ### API Reference
157
207
 
158
208
  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.
Binary file
Binary file
package/cli/cli.ts CHANGED
@@ -2,12 +2,14 @@
2
2
  // Start bluebun to run the correct CLI command
3
3
  import { parseArgs } from 'node:util';
4
4
 
5
- import { run } from 'bluebun';
5
+ import { print, red, run } from 'bluebun';
6
6
 
7
- function main() {
7
+ import { getAuthenticatedUser } from './utils/auth';
8
+
9
+ async function main() {
8
10
  // We need to pass the path from Node to the Bun binaries
9
11
  // because there's an issue where the Bun binaries struggle to resolve
10
- const { values } = parseArgs({
12
+ const { values, positionals } = parseArgs({
11
13
  args: Bun.argv,
12
14
  options: {
13
15
  commandsPath: {
@@ -18,9 +20,24 @@ function main() {
18
20
  allowPositionals: true,
19
21
  });
20
22
 
23
+ const cliPath = values.commandsPath!.toString();
24
+ const isLoginCmd = positionals.includes('login');
25
+
26
+ if (!isLoginCmd) {
27
+ const user = await getAuthenticatedUser(cliPath);
28
+ if (!user) {
29
+ print(
30
+ red(
31
+ '🚨 Sign-in required. Please run `uds login` and use a @yahooinc.com email during sign-in.',
32
+ ),
33
+ );
34
+ return;
35
+ }
36
+ }
37
+
21
38
  run({
22
39
  name: 'uds',
23
- cliPath: values.commandsPath!.toString(),
40
+ cliPath,
24
41
  });
25
42
  }
26
43
 
@@ -1,6 +1,7 @@
1
1
  import { type Props } from 'bluebun';
2
2
  import prompts from 'prompts';
3
3
 
4
+ import { trackEvent } from '../../utils/analytics';
4
5
  import { getCommandHelp, getSubCommandsChoices } from '../../utils/getCommandHelp';
5
6
  import { getDirChoices } from '../../utils/getDirChoices';
6
7
 
@@ -13,6 +14,11 @@ export default {
13
14
  const isRootCommand = Boolean(!props?.first);
14
15
  const dirChoices = getDirChoices();
15
16
 
17
+ const runCodeMod = async (codemod: string, selectedDirs: string[]) => {
18
+ const mod = (await import(`./${codemod}`)).default;
19
+ return mod.run({ ...props, selectedDirs });
20
+ };
21
+
16
22
  if (isRootCommand) {
17
23
  // Prompt the user to setup the codemod runner
18
24
  const { selectedDirs, selectedCodemods, didConfirm } = await prompts([
@@ -49,10 +55,9 @@ export default {
49
55
 
50
56
  // Run each codemod and provide the selectedDirs
51
57
  return Promise.all(
52
- selectedCodemods.map(async (selectedCodemod: string[]) => {
53
- return await import(`./${selectedCodemod}`).then((codemod) =>
54
- codemod.default.run({ ...props, selectedDirs }),
55
- );
58
+ selectedCodemods.map(async (codemod: string) => {
59
+ await runCodeMod(codemod, selectedDirs);
60
+ return trackEvent('codemod', { codemod });
56
61
  }),
57
62
  );
58
63
  } else if (subCommandIsValid) {
@@ -71,11 +76,9 @@ export default {
71
76
  process.exit(1);
72
77
  }
73
78
 
74
- // Run the codemod
75
- return (await import(`./${props.first}`)).default.run({
76
- ...props,
77
- selectedDirs,
78
- });
79
+ const codemod = props.first!;
80
+ await runCodeMod(codemod, selectedDirs);
81
+ return trackEvent('codemod', { codemod });
79
82
  } else {
80
83
  // Throw the help message
81
84
  await getCommandHelp({
@@ -6,7 +6,7 @@ import { sizingPropToClassMap } from '../../codemods/utils/sizingPropToClassMap'
6
6
  export default {
7
7
  name: 'sizingProps',
8
8
  description: `Convert sizing props to classNames`,
9
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
9
+
10
10
  run: async (props: Props & { selectedDirs?: string[] }) => {
11
11
  spinStart('Running codemod...');
12
12
 
@@ -0,0 +1,30 @@
1
+ import { magenta, print, red } from 'bluebun';
2
+
3
+ import { trackEvent } from '../utils/analytics';
4
+ import { login } from '../utils/auth';
5
+
6
+ export default {
7
+ name: 'login',
8
+ description: '👤 Log in to UDS CLI',
9
+ alias: ['auth'],
10
+ run: async () => {
11
+ try {
12
+ const user = await login();
13
+ if (user) {
14
+ print(magenta(`🔒 Logged in as ${user.email}`));
15
+ return await trackEvent('login');
16
+ }
17
+ } catch (error) {
18
+ if (error instanceof Error) {
19
+ print(red(error.message));
20
+ } else {
21
+ print(
22
+ red(
23
+ `❌ An error occurred while logging in. Please ask in the #uds-ask channel for support.`,
24
+ ),
25
+ );
26
+ process.exitCode = 1;
27
+ }
28
+ }
29
+ },
30
+ };
@@ -0,0 +1,27 @@
1
+ import { magenta, print, red } from 'bluebun';
2
+
3
+ import { trackEvent } from '../utils/analytics';
4
+ import { logout } from '../utils/auth';
5
+
6
+ export default {
7
+ name: 'logout',
8
+ description: '👤 Sign out of UDS CLI',
9
+ run: async () => {
10
+ try {
11
+ // Track logout event before logout is run. Otherwise, there's no user object to track.
12
+ await trackEvent('logout');
13
+ await logout();
14
+ print(magenta('👋 You have been logged out.'));
15
+ } catch (error) {
16
+ if (error instanceof Error) {
17
+ print(red(error.message));
18
+ } else {
19
+ print(
20
+ red(
21
+ `❌ An error occurred while logging out. Please ask in the #uds-ask channel for support.`,
22
+ ),
23
+ );
24
+ }
25
+ }
26
+ },
27
+ };
@@ -1,5 +1,6 @@
1
1
  import { Props, spinStart, spinStop } from 'bluebun';
2
2
 
3
+ import { trackEvent } from '../utils/analytics';
3
4
  import { purge, PurgeOptions } from '../utils/purgeCSS';
4
5
 
5
6
  interface PurgeProps extends Props {
@@ -9,12 +10,13 @@ interface PurgeProps extends Props {
9
10
  export default {
10
11
  name: 'purge',
11
12
  description: `Purge unused CSS`,
12
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
+
13
14
  run: async (props: PurgeProps) => {
14
15
  spinStart('Purging css started...');
15
16
  try {
16
17
  await purge(props.options);
17
18
  spinStop('✅', 'Purging css done!');
19
+ return await trackEvent('purge');
18
20
  } catch (error) {
19
21
  if (error instanceof Error) {
20
22
  spinStop('❌', error.message);
@@ -1,5 +1,6 @@
1
1
  import { magenta, print, Props } from 'bluebun';
2
2
 
3
+ import { trackEvent } from '../utils/analytics';
3
4
  import { setupConfigWorker } from '../utils/setupConfigWorker';
4
5
  import { SyncOptions } from '../utils/types';
5
6
 
@@ -31,6 +32,7 @@ export default {
31
32
  }
32
33
  },
33
34
  });
35
+ return await trackEvent('sync', { id });
34
36
  } catch {
35
37
  console.error(
36
38
  '❌ An error occurred while syncing. Please reach out to #uds-ask channel for support.',
@@ -1,5 +1,7 @@
1
1
  import { print, type Props, red } from 'bluebun';
2
2
 
3
+ import { trackEvent } from '../utils/analytics';
4
+ import { getAuthenticatedUser } from '../utils/auth';
3
5
  import { getCommandHelp } from '../utils/getCommandHelp';
4
6
 
5
7
  export default {
@@ -8,7 +10,10 @@ export default {
8
10
  run: async (props: Props) => {
9
11
  if (props.first) {
10
12
  print(red(`Unknown command: ${props.first}`));
13
+ await trackEvent('unknown_cmd', { cmd: props.first });
11
14
  }
12
- await getCommandHelp(props);
15
+ const user = await getAuthenticatedUser();
16
+ const notes = user ? `🔒 Logged in as ${user.email}` : undefined;
17
+ await getCommandHelp({ ...props, notes });
13
18
  },
14
19
  };
@@ -1,11 +1,13 @@
1
1
  import { print } from 'bluebun';
2
2
 
3
3
  import packageJson from '../../package.json';
4
+ import { trackEvent } from '../utils/analytics';
4
5
 
5
6
  export default {
6
7
  name: 'version',
7
8
  description: `${packageJson.version}`,
8
9
  run: async () => {
9
10
  print(packageJson.version);
11
+ await trackEvent('version', { version: packageJson.version });
10
12
  },
11
13
  };
package/cli/compile.ts CHANGED
@@ -11,25 +11,24 @@ const __dirname = path.dirname(__filename);
11
11
  const libPath = __dirname;
12
12
  const entry = path.join(libPath, './cli.ts');
13
13
 
14
- const main = async () => {
14
+ async function main() {
15
15
  // Compile the UDS CLI for all the supported platforms
16
16
  await Promise.all(
17
- SUPPORTED_BUN_PLATFORMS.map(async (supportedPlatform) => {
18
- console.log(`Building UDS CLI for ${supportedPlatform}`);
19
- await $`bun build --compile --minify --sourcemap --target=bun-${supportedPlatform} ${entry} --outfile ${path.join(libPath, './bin', `./uds-${supportedPlatform}`)} `;
17
+ SUPPORTED_BUN_PLATFORMS.map((platform) => {
18
+ console.log(`Building UDS CLI for ${platform}`);
19
+ return $`bun build --compile --minify --sourcemap --target=bun-${platform} ${entry} --outfile ${path.join(libPath, './bin', `./uds-${platform}`)}`.quiet();
20
20
  }),
21
21
  );
22
22
 
23
23
  // Compile the script that will auto-detect the platform and architecture
24
- const shellOutput = await $`bun build ${path.join(libPath, './exec.ts')} --target node`;
24
+ const shellOutput = await $`bun build ${path.join(libPath, './exec.ts')} --target node`.text();
25
25
 
26
26
  // Add shebang at the top of the file and write to disk
27
27
  await Bun.write(
28
28
  path.join(libPath, './uds-cli'),
29
29
  `#!/usr/bin/env node \n
30
- // Note: This file is generated, do not edit directly! Edit exec.ts instead. \n` +
31
- shellOutput.text(),
30
+ // Note: This file is generated, do not edit directly! Edit exec.ts instead. \n` + shellOutput,
32
31
  );
33
- };
32
+ }
34
33
 
35
- await main();
34
+ main();
package/cli/consts.ts CHANGED
@@ -1,3 +1,7 @@
1
1
  // Supported target platforms by Bun
2
2
  // https://bun.sh/docs/bundler/executables#cross-compile-to-other-platforms
3
- export const SUPPORTED_BUN_PLATFORMS = ['linux-x64-baseline', 'darwin-arm64-baseline'];
3
+ export const SUPPORTED_BUN_PLATFORMS = [
4
+ 'linux-x64-baseline',
5
+ 'linux-arm64',
6
+ 'darwin-arm64-baseline',
7
+ ];
package/cli/env.d.ts CHANGED
@@ -14,6 +14,11 @@ declare module 'bun' {
14
14
  EXPO_USE_METRO_WORKSPACE_ROOT?: string;
15
15
  EXPO_BUNDLE_APP?: string;
16
16
  ESLINT_USE_FLAT_CONFIG?: string;
17
+ /** UDS purge command - which color and scale modes to keep */
17
18
  ENABLED_SCALE_AND_COLOR_MODES?: string;
19
+ /** UDS config id */
20
+ UDS_ID?: string;
21
+ /** UDS sync command - filename to write the config output */
22
+ UDS_OUT_FILE?: string;
18
23
  }
19
24
  }
package/cli/exec.ts CHANGED
@@ -28,7 +28,7 @@ const detectPlatform = () => {
28
28
  });
29
29
  } else {
30
30
  throw new Error(
31
- 'Unsupported platform 😢, pleaes reach out to the UDS team for support #uds-ask.',
31
+ 'Unsupported platform 😢, please reach out to the UDS team for support #uds-ask.',
32
32
  );
33
33
  }
34
34
  };
package/cli/preload.ts CHANGED
@@ -44,3 +44,20 @@ mock.module('@yahoo/uds/tailwind/purger', () => ({
44
44
  Button: '',
45
45
  },
46
46
  }));
47
+
48
+ mock.module('googleapis', () => ({
49
+ google: {
50
+ auth: {
51
+ OAuth2: mock(() => {}).mockImplementation(() => ({
52
+ getToken: () => Promise.resolve({ tokens: 'test' }),
53
+ setCredentials: mock(() => {}),
54
+ generateAuthUrl: mock(() => 'https://accounts.google.com/o/oauth2/v2/auth'),
55
+ })),
56
+ },
57
+ oauth2: () => ({
58
+ userinfo: {
59
+ get: () => Promise.resolve({ data: { email: 'foo@yahooinc.com' } }),
60
+ },
61
+ }),
62
+ },
63
+ }));
package/cli/tsconfig.json CHANGED
@@ -18,14 +18,14 @@
18
18
  "strict": true,
19
19
  "types": ["bun-types"],
20
20
  "target": "esnext",
21
- "lib": ["esnext"],
21
+ "lib": ["ESNext"],
22
22
  "module": "esnext",
23
23
  "moduleResolution": "bundler",
24
24
  "paths": {
25
25
  "@yahoo/uds/scripts/*": ["../scripts/*"],
26
26
  "@yahoo/uds/*": ["../src/*"],
27
27
  "@yahoo/uds/tailwind/tsMorph": ["../scripts/utils/tsMorph.ts"],
28
- "root/*": ["../../*"],
29
- },
30
- },
28
+ "root/*": ["../../*"]
29
+ }
30
+ }
31
31
  }
package/cli/uds-cli CHANGED
@@ -7,7 +7,11 @@ import path from "path";
7
7
  import { fileURLToPath } from "url";
8
8
 
9
9
  // cli/consts.ts
10
- var SUPPORTED_BUN_PLATFORMS = ["linux-x64-baseline", "darwin-arm64-baseline"];
10
+ var SUPPORTED_BUN_PLATFORMS = [
11
+ "linux-x64-baseline",
12
+ "linux-arm64",
13
+ "darwin-arm64-baseline"
14
+ ];
11
15
 
12
16
  // cli/exec.ts
13
17
  var detectPlatform = () => {
@@ -23,7 +27,7 @@ var detectPlatform = () => {
23
27
  stdio: "inherit"
24
28
  });
25
29
  } else {
26
- throw new Error("Unsupported platform \uD83D\uDE22, pleaes reach out to the UDS team for support #uds-ask.");
30
+ throw new Error("Unsupported platform \uD83D\uDE22, please reach out to the UDS team for support #uds-ask.");
27
31
  }
28
32
  };
29
33
  detectPlatform();
@@ -0,0 +1,26 @@
1
+ import {
2
+ type EventName,
3
+ GA_MEASUREMENT_IDS,
4
+ GA_MEASUREMENT_SECRETS,
5
+ track,
6
+ } from '@yahoo/uds/analytics/server';
7
+
8
+ import { getAuthenticatedUser } from './auth';
9
+
10
+ export async function setup() {
11
+ const user = await getAuthenticatedUser();
12
+ if (user) {
13
+ await track.init({
14
+ appName: 'cli',
15
+ apiSecret: GA_MEASUREMENT_SECRETS.cli,
16
+ measurementId: GA_MEASUREMENT_IDS.cli,
17
+ // @ts-expect-error type is fine
18
+ user,
19
+ });
20
+ }
21
+ }
22
+
23
+ export async function trackEvent(...args: Parameters<typeof track.event<EventName['cli']>>) {
24
+ await setup();
25
+ await track.event(...args);
26
+ }