diff --git a/apps/E2E/package.json b/apps/E2E/package.json index e6d2ff65f3..f0ed11e639 100644 --- a/apps/E2E/package.json +++ b/apps/E2E/package.json @@ -76,7 +76,6 @@ "metro-config": "^0.80.3", "rimraf": "^5.0.1", "ts-node": "^10.7.0", - "typescript": "^5.8.0", "webdriverio": "catalog:" }, "installConfig": { diff --git a/apps/fluent-tester/package.json b/apps/fluent-tester/package.json index 3a739f81b6..fde1fe1021 100644 --- a/apps/fluent-tester/package.json +++ b/apps/fluent-tester/package.json @@ -126,7 +126,6 @@ "react-native-svg-transformer": "^1.0.0", "react-native-test-app": "^3.9.2", "react-test-renderer": "18.2.0", - "typescript": "^5.8.0", "webdriverio": "catalog:" }, "jest": { diff --git a/apps/win32/package.json b/apps/win32/package.json index 02b8fb6b58..291c5264a5 100644 --- a/apps/win32/package.json +++ b/apps/win32/package.json @@ -56,8 +56,7 @@ "metro-config": "^0.80.3", "react-native-svg-transformer": "^1.0.0", "react-test-renderer": "18.2.0", - "rimraf": "^5.0.1", - "typescript": "4.9.4" + "rimraf": "^5.0.1" }, "jest": { "preset": "react-native" diff --git a/change/@fluentui-react-native-2552706f-e2bf-48ec-9338-40f70585ef0a.json b/change/@fluentui-react-native-2552706f-e2bf-48ec-9338-40f70585ef0a.json new file mode 100644 index 0000000000..eb544f63ac --- /dev/null +++ b/change/@fluentui-react-native-2552706f-e2bf-48ec-9338-40f70585ef0a.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui/react-native", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-composition-963099f4-6c7f-4550-b115-cf4c2aef586c.json b/change/@fluentui-react-native-composition-963099f4-6c7f-4550-b115-cf4c2aef586c.json new file mode 100644 index 0000000000..0d7be90c51 --- /dev/null +++ b/change/@fluentui-react-native-composition-963099f4-6c7f-4550-b115-cf4c2aef586c.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/composition", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-e2e-testing-0c3def4f-56a5-4bb1-a0a6-8ab07b83a644.json b/change/@fluentui-react-native-e2e-testing-0c3def4f-56a5-4bb1-a0a6-8ab07b83a644.json new file mode 100644 index 0000000000..f1ba3f6c34 --- /dev/null +++ b/change/@fluentui-react-native-e2e-testing-0c3def4f-56a5-4bb1-a0a6-8ab07b83a644.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/e2e-testing", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-framework-base-e2a8b64d-6fa9-4391-a923-ec253f174196.json b/change/@fluentui-react-native-framework-base-e2a8b64d-6fa9-4391-a923-ec253f174196.json new file mode 100644 index 0000000000..414dac6bcb --- /dev/null +++ b/change/@fluentui-react-native-framework-base-e2a8b64d-6fa9-4391-a923-ec253f174196.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/framework-base", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-link-03b8b201-a7f2-48c0-9cc1-b46312059e92.json b/change/@fluentui-react-native-link-03b8b201-a7f2-48c0-9cc1-b46312059e92.json new file mode 100644 index 0000000000..9206996de4 --- /dev/null +++ b/change/@fluentui-react-native-link-03b8b201-a7f2-48c0-9cc1-b46312059e92.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/link", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-menu-f3879ad2-c25c-4130-88c4-d016f9973466.json b/change/@fluentui-react-native-menu-f3879ad2-c25c-4130-88c4-d016f9973466.json new file mode 100644 index 0000000000..66d6926d96 --- /dev/null +++ b/change/@fluentui-react-native-menu-f3879ad2-c25c-4130-88c4-d016f9973466.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/menu", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-tester-b64bc336-b954-4a11-9265-d74646de4651.json b/change/@fluentui-react-native-tester-b64bc336-b954-4a11-9265-d74646de4651.json new file mode 100644 index 0000000000..2fc82e7950 --- /dev/null +++ b/change/@fluentui-react-native-tester-b64bc336-b954-4a11-9265-d74646de4651.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/tester", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-tester-win32-3a4e8f94-8fa9-4d13-960b-0edf342aea99.json b/change/@fluentui-react-native-tester-win32-3a4e8f94-8fa9-4d13-960b-0edf342aea99.json new file mode 100644 index 0000000000..e9d763dea7 --- /dev/null +++ b/change/@fluentui-react-native-tester-win32-3a4e8f94-8fa9-4d13-960b-0edf342aea99.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/tester-win32", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-text-67789c0c-338f-4dba-95db-266880f9c1e2.json b/change/@fluentui-react-native-text-67789c0c-338f-4dba-95db-266880f9c1e2.json new file mode 100644 index 0000000000..08fc14e478 --- /dev/null +++ b/change/@fluentui-react-native-text-67789c0c-338f-4dba-95db-266880f9c1e2.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/text", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-native-use-slot-1fce7885-a2a7-4a22-859c-7b856fc86b40.json b/change/@fluentui-react-native-use-slot-1fce7885-a2a7-4a22-859c-7b856fc86b40.json new file mode 100644 index 0000000000..4b6488b43b --- /dev/null +++ b/change/@fluentui-react-native-use-slot-1fce7885-a2a7-4a22-859c-7b856fc86b40.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@fluentui-react-native/use-slot", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@uifabricshared-theming-react-native-a5e7705e-dcba-45bf-af47-d25599dcd0fb.json b/change/@uifabricshared-theming-react-native-a5e7705e-dcba-45bf-af47-d25599dcd0fb.json new file mode 100644 index 0000000000..1fe9df713b --- /dev/null +++ b/change/@uifabricshared-theming-react-native-a5e7705e-dcba-45bf-af47-d25599dcd0fb.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "switch repo to typescript 5.x", + "packageName": "@uifabricshared/theming-react-native", + "email": "jasonmo@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/package.json b/package.json index 010f471f91..52fec52321 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "prettier": "^2.4.1", "react": "18.2.0", "react-native": "^0.74.0", - "typescript": "^4.9.4" + "typescript": "^5.8.0" }, "workspaces": [ "apps/*", diff --git a/packages/components/Link/src/useLink.ts b/packages/components/Link/src/useLink.ts index 1ad3484e39..131d82a6e2 100644 --- a/packages/components/Link/src/useLink.ts +++ b/packages/components/Link/src/useLink.ts @@ -12,7 +12,7 @@ import { import type { LinkProps, LinkInfo } from './Link.types'; /*These callbacks are not implemented on iOS/macOS, and cause Redboxes if passed in. Limit to only windows/win32 for now*/ -const isWinPlatform = Platform.OS === (('win32' as any) || 'windows'); +const isWinPlatform = Platform.OS === ('win32' as any) || Platform.OS === 'windows'; const filteredProps = isWinPlatform ? {} : { diff --git a/packages/components/Menu/src/MenuCallout/MenuCallout.android.tsx b/packages/components/Menu/src/MenuCallout/MenuCallout.android.tsx index 42e8959d3f..d9f2f06d41 100644 --- a/packages/components/Menu/src/MenuCallout/MenuCallout.android.tsx +++ b/packages/components/Menu/src/MenuCallout/MenuCallout.android.tsx @@ -41,8 +41,8 @@ export const MenuCallout = stagedComponent((props: MenuCalloutProps) => { }, ]} > - {context.menuHeight + tokens.minPadding >= tokens.maxHeight || - context.menuHeight + tokens.minPadding >= mergedProps.maxHeight ? ( + {context.menuHeight + tokens.minPadding >= (tokens.maxHeight as number) || + context.menuHeight + tokens.minPadding >= (mergedProps.maxHeight as number) ? ( {children} ) : ( {children} diff --git a/packages/components/Menu/src/MenuItemCheckbox/MenuItemCheckbox.tsx b/packages/components/Menu/src/MenuItemCheckbox/MenuItemCheckbox.tsx index 2f734d2294..0bf5b2834b 100644 --- a/packages/components/Menu/src/MenuItemCheckbox/MenuItemCheckbox.tsx +++ b/packages/components/Menu/src/MenuItemCheckbox/MenuItemCheckbox.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { Image, Platform, Pressable, View } from 'react-native'; -import type { Slots, UseSlots } from '@fluentui-react-native/framework'; +import type { Slots, UseSlots, FinalRender } from '@fluentui-react-native/framework'; import { compose, mergeProps, withSlots } from '@fluentui-react-native/framework'; import { IconV1 as Icon } from '@fluentui-react-native/icon'; import { TextV1 as Text } from '@fluentui-react-native/text'; @@ -43,8 +43,8 @@ export const MenuItemCheckbox = compose({ export const menuItemFinalRender = ( menuItem: MenuItemCheckboxInfo, Slots: Slots, -): React.FunctionComponent => { - return (final: MenuItemCheckboxProps, children: React.ReactNode) => { +): FinalRender => { + return (final: MenuItemCheckboxProps, ...children: React.ReactNode[]) => { const { accessibilityLabel, icon, tooltip, ...mergedProps } = mergeProps(menuItem.props, final); const checkmarkXml = ` diff --git a/packages/components/Menu/src/MenuItemRadio/MenuItemRadio.tsx b/packages/components/Menu/src/MenuItemRadio/MenuItemRadio.tsx index b4d703aa00..415db4e644 100644 --- a/packages/components/Menu/src/MenuItemRadio/MenuItemRadio.tsx +++ b/packages/components/Menu/src/MenuItemRadio/MenuItemRadio.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { Image, Platform, Pressable, View } from 'react-native'; -import type { Slots, UseSlots } from '@fluentui-react-native/framework'; +import type { Slots, UseSlots, FinalRender } from '@fluentui-react-native/framework'; import { compose, mergeProps, withSlots } from '@fluentui-react-native/framework'; import { IconV1 as Icon } from '@fluentui-react-native/icon'; import { TextV1 as Text } from '@fluentui-react-native/text'; @@ -39,8 +39,8 @@ export const MenuItemRadio = compose({ export const menuItemRadioFinalRender = ( menuItem: MenuItemRadioInfo, Slots: Slots, -): React.FunctionComponent => { - return (final: MenuItemRadioProps, children: React.ReactNode) => { +): FinalRender => { + return (final: MenuItemRadioProps, ...children: React.ReactNode[]) => { const { accessibilityLabel, icon, tooltip, ...mergedProps } = mergeProps(menuItem.props, final); const checkmarkXml = ` diff --git a/packages/components/Text/src/Text.tsx b/packages/components/Text/src/Text.tsx index 00b5794c52..1456546244 100644 --- a/packages/components/Text/src/Text.tsx +++ b/packages/components/Text/src/Text.tsx @@ -117,15 +117,15 @@ export const Text = compressible((props: TextProps, useTo }; } - const isWinPlatform = Platform.OS === (('win32' as any) || 'windows'); + const isWin32Platform = Platform.OS === ('win32' as any); const filteredProps = { - onKeyUp: isWinPlatform ? onKeyUp : undefined, - keyUpEvents: isWinPlatform ? keyUpEvents : undefined, + onKeyUp: isWin32Platform ? onKeyUp : undefined, + keyUpEvents: isWin32Platform ? keyUpEvents : undefined, validKeysUp: undefined, - onKeyDown: isWinPlatform ? onKeyDown : undefined, - keyDownEvents: isWinPlatform ? keyDownEvents : undefined, + onKeyDown: isWin32Platform ? onKeyDown : undefined, + keyDownEvents: isWin32Platform ? keyDownEvents : undefined, validKeysDown: undefined, - onAccessibilityTap: isWinPlatform ? onAccTap : undefined, + onAccessibilityTap: isWin32Platform ? onAccTap : undefined, }; // return a continuation function that allows this text to be compressed diff --git a/packages/deprecated/theming-react-native/package.json b/packages/deprecated/theming-react-native/package.json index 085ef9db3c..96f0343ea7 100644 --- a/packages/deprecated/theming-react-native/package.json +++ b/packages/deprecated/theming-react-native/package.json @@ -52,8 +52,7 @@ "react": "18.2.0", "react-native": "^0.74.0", "react-native-macos": "^0.74.0", - "react-native-windows": "^0.74.0", - "typescript": "4.9.4" + "react-native-windows": "^0.74.0" }, "peerDependencies": { "@office-iss/react-native-win32": "^0.74.0", diff --git a/packages/framework-base/src/component-patterns/render.types.ts b/packages/framework-base/src/component-patterns/render.types.ts index 52589e6a01..815ad39250 100644 --- a/packages/framework-base/src/component-patterns/render.types.ts +++ b/packages/framework-base/src/component-patterns/render.types.ts @@ -50,9 +50,13 @@ export type LegacyDirectComponent = React.FunctionComponent & { }; /** - * Legacy type name used for consistency with old rendering patterns. + * Slot function type used in the composition framework. Slot functions return React elements (not arbitrary ReactNode values) + * since they always either call staged render functions or React.createElement. */ -export type SlotFn = LegacyDirectComponent; +export type SlotFn = { + (props: TProps, ...children: React.ReactNode[]): React.ReactElement | null; + _canCompose?: boolean; +}; /** * MULTI-STAGE RENDERING diff --git a/packages/framework/composition/src/composeFactory.ts b/packages/framework/composition/src/composeFactory.ts index 6a0b78c011..c7fc4c32dc 100644 --- a/packages/framework/composition/src/composeFactory.ts +++ b/packages/framework/composition/src/composeFactory.ts @@ -1,6 +1,6 @@ import type { MergeOptions } from '@fluentui-react-native/framework-base'; import { immutableMergeCore } from '@fluentui-react-native/framework-base'; -import type { ComposableFunction } from '@fluentui-react-native/framework-base'; +import type { ComposableFunction, FinalRender } from '@fluentui-react-native/framework-base'; import { stagedComponent } from '@fluentui-react-native/framework-base'; import type { UseSlotOptions, Slots } from '@fluentui-react-native/use-slots'; import { buildUseSlots } from '@fluentui-react-native/use-slots'; @@ -25,7 +25,7 @@ export type ComposeFactoryOptions) => React.FunctionComponent; + useRender: (props: TProps, useSlots: UseStyledSlots) => FinalRender; /** * optional statics to attach to the component diff --git a/packages/framework/eslint-config-rules/tsconfig.json b/packages/framework/eslint-config-rules/tsconfig.json index d1242b336d..b973060012 100644 --- a/packages/framework/eslint-config-rules/tsconfig.json +++ b/packages/framework/eslint-config-rules/tsconfig.json @@ -5,5 +5,6 @@ "checkJs": true, "noEmit": true }, - "include": ["eslint.config.js"] + "include": ["eslint.config.js"], + "exclude": [] } diff --git a/packages/framework/use-slot/src/useSlot.ts b/packages/framework/use-slot/src/useSlot.ts index 8ecfaad8db..d473437ac0 100644 --- a/packages/framework/use-slot/src/useSlot.ts +++ b/packages/framework/use-slot/src/useSlot.ts @@ -2,7 +2,7 @@ import * as React from 'react'; import { mergeProps } from '@fluentui-react-native/framework-base'; -import type { SlotFn, NativeReactType } from '@fluentui-react-native/framework-base'; +import type { SlotFn, NativeReactType, FinalRender } from '@fluentui-react-native/framework-base'; import type { ComposableFunction, StagedRender } from '@fluentui-react-native/framework-base'; /** @@ -27,9 +27,9 @@ export function useSlot( component: NativeReactType | ComposableFunction, props: TProps, filter?: (propName: string) => boolean, -): React.FunctionComponent { +): SlotFn { // some types to make things cleaner - type ResultHolder = { result: React.FunctionComponent | TProps }; + type ResultHolder = { result: FinalRender | TProps }; type MemoTuple = [SlotFn, ResultHolder]; // extract the staged component function if that pattern is being used, will be undefined if it is a standard component @@ -54,8 +54,9 @@ export function useSlot( } // now if result was a function then call it directly, if not go through the standard React.createElement process + // Type assertion is safe here because result is either FinalRender (from stagedComponent) or TProps (props object) return typeof result === 'function' - ? (result as React.FunctionComponent)(props, ...children) + ? (result as FinalRender)(props, ...children) : React.createElement(component, props, ...children); }; // mark the slotFn so that withSlots knows to handle it differently diff --git a/packages/libraries/core/tsconfig.json b/packages/libraries/core/tsconfig.json index 555ee5da3d..a9d3e78c42 100644 --- a/packages/libraries/core/tsconfig.json +++ b/packages/libraries/core/tsconfig.json @@ -11,8 +11,7 @@ "noEmitOnError": true, "skipLibCheck": true, "noUnusedLocals": true, - "strict": true, - "suppressImplicitAnyIndexErrors": true + "strict": true }, "include": ["src"] } diff --git a/scripts/src/tasks/build.js b/scripts/src/tasks/build.js index 1b876d5811..145b9ad91f 100644 --- a/scripts/src/tasks/build.js +++ b/scripts/src/tasks/build.js @@ -104,6 +104,15 @@ function getBuildTargets(cwd = process.cwd()) { async function buildTarget(target, cwd) { const { module, outDir } = target; const extraArgs = ['--outDir', outDir, '--module', module]; + + // TypeScript 5.8+ requires moduleResolution to match module when using Node16 + // Set moduleResolution to match the module setting + if (module === 'node16') { + extraArgs.push('--moduleResolution', 'node16'); + } else if (module === 'esnext') { + extraArgs.push('--moduleResolution', 'bundler'); + } + const result = await runScript('tsc', ...extraArgs); if (result !== 0) { diff --git a/tester_deps/package.json b/tester_deps/package.json index fdcc431ddd..0b8c5523ad 100644 --- a/tester_deps/package.json +++ b/tester_deps/package.json @@ -23,7 +23,7 @@ "@wdio/spec-reporter": "^9.12.6", "appium": "^2.11.2", "appium-windows-driver": "^2.12.18", - "typescript": "^4.9.4", + "typescript": "^5.8.0", "webdriverio": "^9.12.6" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index fb8a086641..e189c17953 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3261,7 +3261,6 @@ __metadata: react-native-windows: "npm:^0.74.0" rimraf: "npm:^5.0.1" ts-node: "npm:^10.7.0" - typescript: "npm:^5.8.0" webdriverio: "catalog:" languageName: unknown linkType: soft @@ -4428,7 +4427,7 @@ __metadata: prettier: "npm:^2.4.1" react: "npm:18.2.0" react-native: "npm:^0.74.0" - typescript: "npm:^4.9.4" + typescript: "npm:^5.8.0" languageName: unknown linkType: soft @@ -4733,7 +4732,6 @@ __metadata: react-native-svg-transformer: "npm:^1.0.0" react-test-renderer: "npm:18.2.0" rimraf: "npm:^5.0.1" - typescript: "npm:4.9.4" peerDependencies: "@office-iss/react-native-win32": ^0.74.0 peerDependenciesMeta: @@ -4836,7 +4834,6 @@ __metadata: react-native-test-app: "npm:^3.9.2" react-native-windows: "npm:^0.74.0" react-test-renderer: "npm:18.2.0" - typescript: "npm:^5.8.0" webdriverio: "catalog:" peerDependenciesMeta: "@office-iss/react-native-win32": @@ -8523,7 +8520,6 @@ __metadata: react-native: "npm:^0.74.0" react-native-macos: "npm:^0.74.0" react-native-windows: "npm:^0.74.0" - typescript: "npm:4.9.4" peerDependencies: "@office-iss/react-native-win32": ^0.74.0 react: 18.2.0 @@ -21035,16 +21031,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:4.9.4": - version: 4.9.4 - resolution: "typescript@npm:4.9.4" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5008b97a2a3afdbe57ea70e504ebc8ec98f18d888059dfb7932a41f566a1360a28afc8de2a440fd6143b4014cc6d2616079931dc690c7513c2d21fa53957e0ec - languageName: node - linkType: hard - "typescript@npm:>=4.7.0, typescript@npm:^5.8.0": version: 5.8.3 resolution: "typescript@npm:5.8.3" @@ -21055,16 +21041,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^4.9.4": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5f6cad2e728a8a063521328e612d7876e12f0d8a8390d3b3aaa452a6a65e24e9ac8ea22beb72a924fd96ea0a49ea63bb4e251fb922b12eedfb7f7a26475e5c56 - languageName: node - linkType: hard - "typescript@npm:^5.8.3": version: 5.9.3 resolution: "typescript@npm:5.9.3" @@ -21075,16 +21051,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A4.9.4#optional!builtin": - version: 4.9.4 - resolution: "typescript@patch:typescript@npm%3A4.9.4#optional!builtin::version=4.9.4&hash=289587" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/d2949ccbf74e52ec8a153e5b2996439854e40937334b97374d4985c47465de1b63a611f15dc9bab9a8ae735fbedfabdf30f55e968778d890600f8472c286a08a - languageName: node - linkType: hard - "typescript@patch:typescript@npm%3A>=4.7.0#optional!builtin, typescript@patch:typescript@npm%3A^5.8.0#optional!builtin": version: 5.8.3 resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" @@ -21095,16 +21061,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^4.9.4#optional!builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/e3333f887c6829dfe0ab6c1dbe0dd1e3e2aeb56c66460cb85c5440c566f900c833d370ca34eb47558c0c69e78ced4bfe09b8f4f98b6de7afed9b84b8d1dd06a1 - languageName: node - linkType: hard - "typescript@patch:typescript@npm%3A^5.8.3#optional!builtin": version: 5.9.3 resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5"