diff --git a/.github/workflows/buildandtest.yml b/.github/workflows/buildandtest.yml index bd47d0c1d4..3436c3543a 100644 --- a/.github/workflows/buildandtest.yml +++ b/.github/workflows/buildandtest.yml @@ -311,6 +311,31 @@ jobs: - name: Run madge run: yarn circularDepCheck + job_api_report: + name: API Report Check + runs-on: ["ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04", "runner_group_id:10"] + needs: [job_build, diff_check] + if: ${{ needs.diff_check.outputs.skip_ci != 'true' }} + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - run: corepack enable + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + with: + package-manager-cache: false + node-version: 18 + cache: 'yarn' + cache-dependency-path: yarn.lock + - name: Install Dependencies + run: yarn install + - name: Download dist + uses: actions/download-artifact@v8 + with: + name: dist + path: packages/core/dist + - name: Check API Report + working-directory: packages/core + run: yarn api-report:check + job_bundle: name: Bundle runs-on: ["ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04", "runner_group_id:10"] diff --git a/.gitignore b/.gitignore index 84121de4b6..b6dea85f87 100644 --- a/.gitignore +++ b/.gitignore @@ -88,6 +88,9 @@ node_modules.bak !.yarn/plugins .pnp.* +# API Extractor temp files +/packages/core/temp/ + # Sentry React Native Monorepo /packages/core/README.md .env.sentry-build-plugin diff --git a/AGENTS.md b/AGENTS.md index b623b1e286..4bf2fad3df 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,6 +24,8 @@ yarn build | Run all linters | `yarn lint` | | Auto-fix lint | `yarn fix` | | Circular dep check | `yarn circularDepCheck` | +| API report generate | `yarn api-report` | +| API report check | `cd packages/core && yarn api-report:check` | | TS/JS lint | `yarn lint:lerna` | | Android lint | `yarn lint:android` | | Kotlin lint | `yarn lint:kotlin` | @@ -62,6 +64,7 @@ When asked to open a PR: - [ ] All tests pass (`yarn test`) - [ ] Linting passes (`yarn lint`) - [ ] No circular dependencies (`yarn circularDepCheck`) +- [ ] API report up to date (`yarn api-report` after `yarn build:sdk`) - [ ] Native code formatted correctly - [ ] TypeScript types are correct - [ ] Tests added/updated for changes @@ -72,7 +75,7 @@ Workflows in `.github/workflows/`: | Workflow | Purpose | |----------|---------| -| `buildandtest.yml` | TS compilation, Jest tests, linting, circular dep check, TS 3.8 compat | +| `buildandtest.yml` | TS compilation, Jest tests, linting, circular dep check, API report, TS 3.8 compat | | `native-tests.yml` | iOS/Android native tests across RN versions | | `e2e-v2.yml` | E2E tests with Maestro on Sauce Labs | | `sample-application.yml` | Sample RN app builds (iOS, Android, old/new arch) | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0839860ae5..b5b6b6e2ef 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -40,6 +40,19 @@ cd packages/core yarn test:watch ``` +## Public API Changes + +We track the public API surface using [@microsoft/api-extractor](https://api-extractor.com/). A baseline report is committed at `packages/core/etc/sentry-react-native.api.md`. CI will fail if the public API changes without updating this file. + +If your change modifies the public API (new exports, changed signatures, removed APIs): + +```sh +yarn build:sdk +yarn api-report +``` + +Review the diff in `packages/core/etc/sentry-react-native.api.md` and commit the updated report alongside your code changes. + ## Running the sample First, set up the Sentry CLI token. diff --git a/package.json b/package.json index a544387387..f3b8c46b17 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "swift:lint": "./scripts/swiftlint.sh", "run-ios": "cd samples/react-native && yarn react-native run-ios", "run-android": "cd samples/react-native && yarn react-native run-android", - "set-version-samples": "lerna run set-version" + "set-version-samples": "lerna run set-version", + "api-report": "yarn workspace @sentry/react-native api-report:generate" }, "devDependencies": { "@naturalcycles/ktlint": "^1.13.0", diff --git a/packages/core/api-extractor.json b/packages/core/api-extractor.json new file mode 100644 index 0000000000..9b2dc034bd --- /dev/null +++ b/packages/core/api-extractor.json @@ -0,0 +1,33 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "/dist/js/index.d.ts", + "bundledPackages": ["react-native"], + "compiler": { + "tsconfigFilePath": "/tsconfig.api-extractor.json" + }, + "apiReport": { + "enabled": true, + "reportFolder": "/etc/", + "reportFileName": "sentry-react-native.api.md" + }, + "docModel": { + "enabled": false + }, + "dtsRollup": { + "enabled": false + }, + "tsdocMetadata": { + "enabled": false + }, + "messages": { + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" } + }, + "compilerMessageReporting": { + "default": { "logLevel": "warning" } + }, + "tsdocMessageReporting": { + "default": { "logLevel": "none" } + } + } +} diff --git a/packages/core/etc/sentry-react-native.api.md b/packages/core/etc/sentry-react-native.api.md new file mode 100644 index 0000000000..7b12ea6ba6 --- /dev/null +++ b/packages/core/etc/sentry-react-native.api.md @@ -0,0 +1,751 @@ +## API Report File for "@sentry/react-native" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { addBreadcrumb } from '@sentry/core'; +import { addEventProcessor } from '@sentry/core'; +import { addIntegration } from '@sentry/core'; +import { AnthropicAiClient } from '@sentry/core'; +import { AnthropicAiInstrumentedMethod } from '@sentry/core'; +import { AnthropicAiOptions } from '@sentry/core'; +import { AnthropicAiResponse } from '@sentry/core'; +import { Breadcrumb } from '@sentry/core'; +import { browserApiErrorsIntegration } from '@sentry/react'; +import { globalHandlersIntegration as browserGlobalHandlersIntegration } from '@sentry/react'; +import { linkedErrorsIntegration as browserLinkedErrorsIntegration } from '@sentry/react'; +import type { BrowserOptions } from '@sentry/react'; +import type { CaptureContext } from '@sentry/core'; +import { captureEvent } from '@sentry/core'; +import { captureException } from '@sentry/core'; +import { captureFeedback } from '@sentry/core'; +import { captureMessage } from '@sentry/core'; +import { Client } from '@sentry/core'; +import type { ClientOptions } from '@sentry/core'; +import { CompiledGraph } from '@sentry/core'; +import { consoleLoggingIntegration } from '@sentry/browser'; +import { consoleSandbox } from '@sentry/core'; +import { createLangChainCallbackHandler } from '@sentry/core'; +import { createReduxEnhancer } from '@sentry/react'; +import { dedupeIntegration } from '@sentry/react'; +import type { Envelope } from '@sentry/core'; +import { ErrorBoundary } from '@sentry/react'; +import type { ErrorBoundaryProps } from '@sentry/react'; +import { ErrorEvent } from '@sentry/core'; +import { Event as Event_2 } from '@sentry/core'; +import type { EventHint } from '@sentry/core'; +import { Exception } from '@sentry/core'; +import { extraErrorDataIntegration } from '@sentry/react'; +import { FeatureFlagsIntegration } from '@sentry/browser'; +import { featureFlagsIntegration } from '@sentry/browser'; +import type { FeedbackFormData } from '@sentry/core'; +import { functionToStringIntegration } from '@sentry/react'; +import { getActiveSpan } from '@sentry/core'; +import { getClient } from '@sentry/core'; +import { getCurrentScope } from '@sentry/core'; +import { getGlobalScope } from '@sentry/core'; +import { getIsolationScope } from '@sentry/core'; +import { getRootSpan } from '@sentry/core'; +import { GoogleGenAIChat } from '@sentry/core'; +import { GoogleGenAIClient } from '@sentry/core'; +import { GoogleGenAIOptions } from '@sentry/core'; +import { httpClientIntegration } from '@sentry/react'; +import { httpContextIntegration } from '@sentry/react'; +import { inboundFiltersIntegration } from '@sentry/react'; +import { instrumentAnthropicAiClient } from '@sentry/core'; +import { InstrumentedMethod } from '@sentry/core'; +import { instrumentGoogleGenAIClient } from '@sentry/core'; +import { instrumentLangGraph } from '@sentry/core'; +import { instrumentOpenAiClient } from '@sentry/core'; +import { instrumentStateGraphCompile } from '@sentry/core'; +import { Integration } from '@sentry/core'; +import { LangChainIntegration } from '@sentry/core'; +import { LangChainOptions } from '@sentry/core'; +import { LangGraphIntegration } from '@sentry/core'; +import { LangGraphOptions } from '@sentry/core'; +import { lastEventId } from '@sentry/core'; +import type { ListRenderItem } from '@react-native/virtualized-lists'; +import type { ListRenderItemInfo } from '@react-native/virtualized-lists'; +import { logger } from '@sentry/browser'; +import type { makeFetchTransport } from '@sentry/browser'; +import { Metric } from '@sentry/core'; +import { metrics } from '@sentry/browser'; +import { OpenAiClient } from '@sentry/core'; +import { OpenAiOptions } from '@sentry/core'; +import type { Options } from '@sentry/core'; +import { Profiler } from '@sentry/react'; +import * as React_2 from 'react'; +import { replayIntegration } from '@sentry/react'; +import type { ReplayRecordingMode } from '@sentry/core'; +import { rewriteFramesIntegration } from '@sentry/react'; +import { Scope } from '@sentry/core'; +import { SdkInfo } from '@sentry/core'; +import { SendFeedbackParams } from '@sentry/core'; +import { setContext } from '@sentry/core'; +import { setCurrentClient } from '@sentry/core'; +import { setExtra } from '@sentry/core'; +import { setExtras } from '@sentry/core'; +import { setMeasurement } from '@sentry/core'; +import { setTag } from '@sentry/core'; +import { setTags } from '@sentry/core'; +import { setUser } from '@sentry/core'; +import { SeverityLevel } from '@sentry/core'; +import { Span } from '@sentry/core'; +import type { SpanAttributeValue } from '@sentry/core'; +import { spanIsSampled } from '@sentry/core'; +import { spanToJSON } from '@sentry/core'; +import { StackFrame } from '@sentry/core'; +import { Stacktrace } from '@sentry/core'; +import { startInactiveSpan } from '@sentry/core'; +import { startSpan } from '@sentry/core'; +import { startSpanManual } from '@sentry/core'; +import type { StartSpanOptions } from '@sentry/core'; +import { suppressTracing } from '@sentry/core'; +import { Thread } from '@sentry/core'; +import { TransactionEvent } from '@sentry/core'; +import type { TransportMakeRequestResponse } from '@sentry/core'; +import { useProfiler } from '@sentry/react'; +import { User } from '@sentry/core'; +import { UserFeedback } from '@sentry/core'; +import type { ViewabilityConfig } from '@react-native/virtualized-lists'; +import type { ViewToken } from '@react-native/virtualized-lists'; +import type { VirtualizedListProps } from '@react-native/virtualized-lists'; +import type { VirtualizedListWithoutRenderItemProps } from '@react-native/virtualized-lists'; +import { withActiveSpan } from '@sentry/core'; +import { withErrorBoundary } from '@sentry/react'; +import { withProfiler } from '@sentry/react'; + +export { addBreadcrumb } + +export { addEventProcessor } + +export { addIntegration } + +export { AnthropicAiClient } + +export { AnthropicAiInstrumentedMethod } + +export { AnthropicAiOptions } + +export { AnthropicAiResponse } + +// @public +export function appLoaded(): void; + +// @public (undocumented) +export const appRegistryIntegration: () => Integration & { + onRunApplication: (callback: () => void) => void; +}; + +// Warning: (ae-forgotten-export) The symbol "AppStartIntegration" needs to be exported by the entry point index.d.ts +// +// @public +export const appStartIntegration: (input?: { + standalone?: boolean; +}) => AppStartIntegration; + +export { Breadcrumb } + +// Warning: (ae-forgotten-export) The symbol "BreadcrumbsOptions" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export const breadcrumbsIntegration: (options?: Partial) => Integration; + +export { browserApiErrorsIntegration } + +export { browserGlobalHandlersIntegration } + +export { browserLinkedErrorsIntegration } + +// Warning: (ae-forgotten-export) The symbol "ReplayConfiguration" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "Replay" needs to be exported by the entry point index.d.ts +// +// @public +export const browserReplayIntegration: (options?: ReplayConfiguration) => Replay; + +export { captureEvent } + +export { captureException } + +export { captureFeedback } + +export { captureMessage } + +// @public +export function close(): Promise; + +export { CompiledGraph } + +export { consoleLoggingIntegration } + +export { consoleSandbox } + +// @public +export function crashedLastRun(): Promise; + +export { createLangChainCallbackHandler } + +// @public (undocumented) +export const createNativeFramesIntegrations: (enable: boolean | undefined) => Integration | undefined; + +// @public +export function createReactNativeRewriteFrames(): Integration; + +export { createReduxEnhancer } + +// @public +export function createTimeToFullDisplay(input: { + useFocusEffect: (callback: () => void) => void; +}): React_2.ComponentType; + +// @public +export function createTimeToInitialDisplay(input: { + useFocusEffect: (callback: () => void) => void; +}): React_2.ComponentType; + +// @public +export const debugSymbolicatorIntegration: () => Integration; + +export { dedupeIntegration } + +// @public +export const deeplinkIntegration: (...args: any[]) => Integration; + +// @public +export const deviceContextIntegration: () => Integration; + +// @public (undocumented) +export const disableFeedbackOnShake: () => void; + +// @public (undocumented) +export const enableFeedbackOnShake: () => void; + +export { ErrorBoundary } + +export { ErrorEvent } + +export { Event_2 as Event } + +// @public +export const eventOriginIntegration: () => Integration; + +export { Exception } + +// @public +export interface ExpoAsset { + // (undocumented) + fromModule(virtualAssetModule: number | string): ExpoAssetInstance; + // Warning: (ae-forgotten-export) The symbol "ExpoAssetInstance" needs to be exported by the entry point index.d.ts + // + // (undocumented) + loadAsync(moduleId: number | number[] | string | string[]): Promise; +} + +// @public +export const expoConstantsIntegration: () => Integration; + +// @public +export const expoContextIntegration: () => Integration; + +// @public +export interface ExpoImage { + // (undocumented) + clearDiskCache?(): Promise; + // (undocumented) + clearMemoryCache?(): Promise; + // Warning: (ae-forgotten-export) The symbol "ExpoImageSource" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "ExpoImageLoadOptions" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "ExpoImageRef" needs to be exported by the entry point index.d.ts + // + // (undocumented) + loadAsync(source: ExpoImageSource | string | number, options?: ExpoImageLoadOptions): Promise; + // (undocumented) + prefetch(urls: string | string[], cachePolicyOrOptions?: any): Promise; +} + +// @public +export interface ExpoRouter { + // (undocumented) + back?: () => void; + // (undocumented) + navigate?: (...args: unknown[]) => void; + // (undocumented) + prefetch?: (href: string | { + pathname?: string; + params?: Record; + }) => void | Promise; + // (undocumented) + push?: (...args: unknown[]) => void; + // (undocumented) + replace?: (...args: unknown[]) => void; +} + +// @public +export const expoUpdatesListenerIntegration: () => Integration; + +export { extraErrorDataIntegration } + +export { FeatureFlagsIntegration } + +export { featureFlagsIntegration } + +// Warning: (ae-forgotten-export) The symbol "FeedbackButtonProps" needs to be exported by the entry point index.d.ts +// +// @beta @deprecated (undocumented) +export class FeedbackButton extends React_2.Component { + constructor(props: FeedbackButtonProps); + componentDidMount(): void; + componentWillUnmount(): void; + render(): React_2.ReactNode; +} + +// Warning: (ae-forgotten-export) The symbol "FeedbackFormProps" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "FeedbackFormState" needs to be exported by the entry point index.d.ts +// +// @beta +class FeedbackForm extends React_2.Component { + constructor(props: FeedbackFormProps); + componentDidMount(): void; + componentWillUnmount(): void; + // (undocumented) + static defaultProps: FeedbackFormProps; + // (undocumented) + handleFeedbackSubmit: () => void; + // (undocumented) + onScreenshotButtonPress: () => void; + render(): React_2.ReactNode; + static reset(): void; +} +export { FeedbackForm } +export { FeedbackForm as FeedbackWidget } + +// Warning: (ae-forgotten-export) The symbol "FeedbackIntegration" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export const feedbackIntegration: (initOptions?: Partial & { + buttonOptions?: FeedbackButtonProps; + screenshotButtonOptions?: ScreenshotButtonProps; + colorScheme?: "system" | "light" | "dark"; + themeLight?: Partial; + themeDark?: Partial; + enableShakeToReport?: boolean; +}) => FeedbackIntegration; + +// @public +export function flush(): Promise; + +export { functionToStringIntegration } + +export { getActiveSpan } + +export { getClient } + +// Warning: (ae-forgotten-export) The symbol "ReactNativeTracingIntegration" needs to be exported by the entry point index.d.ts +// +// @public +export function getCurrentReactNativeTracingIntegration(): ReactNativeTracingIntegration | undefined; + +export { getCurrentScope } + +// @public +export function getDataFromUri(uri: string): Promise; + +// @public +export function getDefaultIdleNavigationSpanOptions(): StartSpanOptions; + +export { getGlobalScope } + +export { getIsolationScope } + +// @public +export function getReactNativeTracingIntegration(client: Client): ReactNativeTracingIntegration | undefined; + +export { getRootSpan } + +// Warning: (ae-forgotten-export) The symbol "GlobalErrorBoundaryState" needs to be exported by the entry point index.d.ts +// +// @public +export class GlobalErrorBoundary extends React_2.Component { + // (undocumented) + componentDidMount(): void; + // (undocumented) + componentDidUpdate(prevProps: GlobalErrorBoundaryProps): void; + // (undocumented) + componentWillUnmount(): void; + // (undocumented) + render(): React_2.ReactNode; + // (undocumented) + state: GlobalErrorBoundaryState; +} + +// @public +export type GlobalErrorBoundaryProps = ErrorBoundaryProps & { + includeNonFatalGlobalErrors?: boolean; + includeUnhandledRejections?: boolean; +}; + +export { GoogleGenAIChat } + +export { GoogleGenAIClient } + +export { GoogleGenAIOptions } + +// Warning: (ae-forgotten-export) The symbol "GraphQLReactNativeIntegrationOptions" needs to be exported by the entry point index.d.ts +// +// @public +export function graphqlIntegration(options: GraphQLReactNativeIntegrationOptions): Integration; + +// Warning: (ae-forgotten-export) The symbol "HermesProfilingOptions" needs to be exported by the entry point index.d.ts +// +// @public +export const hermesProfilingIntegration: (initOptions?: HermesProfilingOptions) => Integration; + +// @public @deprecated (undocumented) +export const hideFeedbackButton: () => void; + +export { httpClientIntegration } + +export { httpContextIntegration } + +export { inboundFiltersIntegration } + +// @public +export function init(passedOptions: ReactNativeOptions): void; + +export { instrumentAnthropicAiClient } + +export { InstrumentedMethod } + +export { instrumentGoogleGenAIClient } + +export { instrumentLangGraph } + +export { instrumentOpenAiClient } + +export { instrumentStateGraphCompile } + +export { LangChainIntegration } + +export { LangChainOptions } + +export { LangGraphIntegration } + +export { LangGraphOptions } + +export { lastEventId } + +// @public (undocumented) +export const logEnricherIntegration: () => Integration; + +export { logger } + +// Warning: (ae-forgotten-export) The symbol "HostComponent" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "ViewProps" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export const Mask: HostComponent | React_2.ComponentType; + +export { Metric } + +export { metrics } + +// Warning: (ae-forgotten-export) The symbol "MobileReplayOptions" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "MobileReplayIntegration" needs to be exported by the entry point index.d.ts +// +// @public +export const mobileReplayIntegration: (initOptions?: MobileReplayOptions) => MobileReplayIntegration; + +// @public +export const modulesLoaderIntegration: () => Integration; + +// @public +export function nativeCrash(): void; + +// @public +export const nativeFramesIntegration: () => Integration; + +// Warning: (ae-forgotten-export) The symbol "LinkedErrorsOptions" needs to be exported by the entry point index.d.ts +// +// @public +export const nativeLinkedErrorsIntegration: (options?: Partial) => Integration; + +// @public +export interface NativeLogEntry { + // (undocumented) + component: string; + // (undocumented) + level: string; + // (undocumented) + message: string; +} + +// @public +export const nativeReleaseIntegration: () => Integration; + +export { OpenAiClient } + +export { OpenAiOptions } + +// @public +export const primitiveTagIntegration: () => Integration; + +export { Profiler } + +// Warning: (ae-forgotten-export) The symbol "ReactNativeClientOptions" needs to be exported by the entry point index.d.ts +// +// @public +export class ReactNativeClient extends Client { + constructor(options: ReactNativeClientOptions); + // @deprecated + captureUserFeedback(feedback: UserFeedback): void; + // (undocumented) + close(): PromiseLike; + emit(hook: string, ...rest: unknown[]): void; + // (undocumented) + eventFromException(exception: unknown, hint?: EventHint): PromiseLike; + // (undocumented) + eventFromMessage(message: string, level?: SeverityLevel, hint?: EventHint): PromiseLike; + // (undocumented) + init(): void; + nativeCrash(): void; + on(hook: string, callback: unknown): () => void; + // (undocumented) + sendEnvelope(envelope: Envelope): PromiseLike; +} + +// Warning: (ae-forgotten-export) The symbol "ReactNativeErrorHandlersOptions" needs to be exported by the entry point index.d.ts +// +// @public +export const reactNativeErrorHandlersIntegration: (options?: Partial) => Integration; + +// @public +export const reactNativeInfoIntegration: () => Integration; + +// Warning: (ae-forgotten-export) The symbol "ReactNativeNavigationOptions" needs to be exported by the entry point index.d.ts +// +// @public +export const reactNativeNavigationIntegration: (input: ReactNativeNavigationOptions) => Integration; + +// Warning: (ae-forgotten-export) The symbol "ReactNativeTransportOptions" needs to be exported by the entry point index.d.ts +// Warning: (ae-forgotten-export) The symbol "BaseReactNativeOptions" needs to be exported by the entry point index.d.ts +// +// @public +export interface ReactNativeOptions extends Omit, '_experiments'>, BaseReactNativeOptions { +} + +// Warning: (ae-forgotten-export) The symbol "ReactNativeTracingOptions" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export const reactNativeTracingIntegration: (options?: Partial) => Integration & { + options: ReactNativeTracingOptions; + state: ReactNativeTracingState; + setCurrentRoute: (route: string) => void; +}; + +// Warning: (ae-forgotten-export) The symbol "ReactNavigationIntegrationOptions" needs to be exported by the entry point index.d.ts +// +// @public +export const reactNavigationIntegration: (input?: Partial) => Integration & { + registerNavigationContainer: (navigationContainerRef: unknown) => void; + options: ReactNavigationIntegrationOptions; +}; + +export { rewriteFramesIntegration } + +export { Scope } + +// @public +export const screenshotIntegration: () => Integration; + +// @public (undocumented) +export const SDK_NAME = "sentry.javascript.react-native"; + +// @public (undocumented) +export const SDK_VERSION: string; + +export { SdkInfo } + +// @public +export const sdkInfoIntegration: () => Integration; + +export { SendFeedbackParams } + +// @public +export function sentryTraceGesture( +label: string, gesture: GestureT): GestureT; + +export { setContext } + +export { setCurrentClient } + +export { setExtra } + +export { setExtras } + +export { setMeasurement } + +export { setTag } + +export { setTags } + +export { setUser } + +export { SeverityLevel } + +// @public @deprecated (undocumented) +export const showFeedbackButton: () => void; + +// @public (undocumented) +const showFeedbackForm: () => void; +export { showFeedbackForm } +export { showFeedbackForm as showFeedbackWidget } + +export { Span } + +export { spanIsSampled } + +export { spanToJSON } + +// Warning: (ae-forgotten-export) The symbol "SpotlightReactNativeIntegrationOptions" needs to be exported by the entry point index.d.ts +// +// @public +export function spotlightIntegration(input?: SpotlightReactNativeIntegrationOptions): Integration; + +export { StackFrame } + +export { Stacktrace } + +// @public +export const stallTrackingIntegration: (input?: { + minimumStallThresholdMs?: number; +}) => Integration; + +// Warning: (ae-forgotten-export) The symbol "defaultIdleOptions" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export const startIdleNavigationSpan: (startSpanOption: StartSpanOptions, input?: Partial & { + isAppRestart?: boolean; +}) => Span | undefined; + +// @public +export const startIdleSpan: (startSpanOption: StartSpanOptions, input: { + finalTimeout: number | undefined; + idleTimeout: number | undefined; +}) => Span; + +export { startInactiveSpan } + +export { startSpan } + +export { startSpanManual } + +// @public @deprecated +export function startTimeToFullDisplaySpan(options?: Omit & { + name?: string; + timeoutMs?: number; + isAutoInstrumented?: boolean; +}): Span | undefined; + +// @public @deprecated +export function startTimeToInitialDisplaySpan(options?: Omit & { + name?: string; + isAutoInstrumented?: boolean; +}): Span | undefined; + +// Warning: (ae-forgotten-export) The symbol "SupabaseReactNativeIntegrationOptions" needs to be exported by the entry point index.d.ts +// +// @public +export function supabaseIntegration(options: SupabaseReactNativeIntegrationOptions): Integration; + +export { suppressTracing } + +export { Thread } + +// @public (undocumented) +export const timeToDisplayIntegration: () => Integration; + +// @public (undocumented) +export type TimeToDisplayProps = { + children?: React_2.ReactNode; + record?: boolean; +}; + +// @public +export function TimeToFullDisplay(props: TimeToDisplayProps): React_2.ReactElement; + +// @public +export function TimeToInitialDisplay(props: TimeToDisplayProps): React_2.ReactElement; + +// Warning: (ae-forgotten-export) The symbol "TouchEventBoundaryProps" needs to be exported by the entry point index.d.ts +// +// @public +export class TouchEventBoundary extends React_2.Component { + constructor(props: TouchEventBoundaryProps); + componentDidMount(): void; + componentDidUpdate(): void; + // (undocumented) + static defaultProps: Partial; + // (undocumented) + static displayName: string; + // (undocumented) + readonly name: string; + // (undocumented) + render(): React_2.ReactNode; +} + +export { TransactionEvent } + +// @public (undocumented) +export const Unmask: HostComponent | React_2.ComponentType; + +export { useProfiler } + +export { User } + +export { UserFeedback } + +// @public (undocumented) +export const userInteractionIntegration: () => Integration; + +// @public +export const viewHierarchyIntegration: () => Integration; + +export { withActiveSpan } + +export { withErrorBoundary } + +// @public +export function withGlobalErrorBoundary

>(WrappedComponent: React_2.ComponentType

, errorBoundaryOptions: GlobalErrorBoundaryProps): React_2.FC

; + +export { withProfiler } + +// @public +export function withScope(callback: (scope: Scope) => T): T | undefined; + +// @public +export const withTouchEventBoundary: (InnerComponent: React_2.ComponentType, boundaryProps?: TouchEventBoundaryProps) => React_2.FunctionComponent; + +// Warning: (ae-forgotten-export) The symbol "ReactNativeWrapperOptions" needs to be exported by the entry point index.d.ts +// +// @public +export function wrap

>(RootComponent: React_2.ComponentType

, options?: ReactNativeWrapperOptions): React_2.ComponentType

; + +// @public +export function wrapExpoAsset(assetClass: T): T; + +// @public +export function wrapExpoImage(imageClass: T): T; + +// @public +export function wrapExpoRouter(router: T): T; + +// Warnings were encountered during analysis: +// +// src/js/feedback/integration.ts:21:5 - (ae-forgotten-export) The symbol "ScreenshotButtonProps" needs to be exported by the entry point index.d.ts +// src/js/feedback/integration.ts:23:5 - (ae-forgotten-export) The symbol "FeedbackFormTheme" needs to be exported by the entry point index.d.ts +// src/js/tracing/reactnativetracing.ts:94:3 - (ae-forgotten-export) The symbol "ReactNativeTracingState" needs to be exported by the entry point index.d.ts + +// (No @packageDocumentation comment for this package) + +``` diff --git a/packages/core/package.json b/packages/core/package.json index ca2e3c53f5..c5e27d5360 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -42,7 +42,9 @@ "fix:fmt": "oxfmt \"{src,test,scripts,plugin/src}/**/**.ts\" \"{src,test}/**/**.tsx\"", "lint": "npx run-s lint:oxlint lint:fmt", "lint:oxlint": "sh -c 'OUT=$(OXLINT_TSGOLINT_DANGEROUSLY_SUPPRESS_PROGRAM_DIAGNOSTICS=true oxlint --type-aware --tsconfig tsconfig.lint.json --deny-warnings 2>&1); echo \"$OUT\"; echo \"$OUT\" | grep -qE \"Found 0 warnings and 0 errors\"'", - "lint:fmt": "oxfmt --check \"{src,test,scripts,plugin/src}/**/**.ts\" \"{src,test}/**/**.tsx\"" + "lint:fmt": "oxfmt --check \"{src,test,scripts,plugin/src}/**/**.ts\" \"{src,test}/**/**.tsx\"", + "api-report:generate": "api-extractor run --local --verbose", + "api-report:check": "api-extractor run --verbose" }, "bin": { "sentry-eas-build-on-complete": "scripts/eas-build-hook.js", @@ -82,6 +84,7 @@ "devDependencies": { "@babel/core": "^7.26.7", "@expo/metro-config": "~0.20.0", + "@microsoft/api-extractor": "^7.58.7", "@mswjs/interceptors": "^0.25.15", "@react-native/babel-preset": "0.80.0", "@sentry-internal/eslint-plugin-sdk": "10.51.0", diff --git a/packages/core/src/js/version.ts b/packages/core/src/js/version.ts index 8e8ed89000..e041ce46c7 100644 --- a/packages/core/src/js/version.ts +++ b/packages/core/src/js/version.ts @@ -1,3 +1,3 @@ export const SDK_PACKAGE_NAME = 'npm:@sentry/react-native'; export const SDK_NAME = 'sentry.javascript.react-native'; -export const SDK_VERSION = '8.10.0'; +export const SDK_VERSION: string = '8.10.0'; diff --git a/packages/core/tsconfig.api-extractor.json b/packages/core/tsconfig.api-extractor.json new file mode 100644 index 0000000000..5f6d355f86 --- /dev/null +++ b/packages/core/tsconfig.api-extractor.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "module": "commonjs" + } +} diff --git a/yarn.lock b/yarn.lock index b19f221be3..ef7898aaca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6752,6 +6752,59 @@ __metadata: languageName: node linkType: hard +"@microsoft/api-extractor-model@npm:7.33.8": + version: 7.33.8 + resolution: "@microsoft/api-extractor-model@npm:7.33.8" + dependencies: + "@microsoft/tsdoc": ~0.16.0 + "@microsoft/tsdoc-config": ~0.18.1 + "@rushstack/node-core-library": 5.23.1 + checksum: 66c9cc290b03ce55673b6e3f5a828cdc86a8438c906cb4441006634c1511b529ee34f384525e14ecadebd213d746128f926d518940f798037dd53ee139954568 + languageName: node + linkType: hard + +"@microsoft/api-extractor@npm:^7.58.7": + version: 7.58.7 + resolution: "@microsoft/api-extractor@npm:7.58.7" + dependencies: + "@microsoft/api-extractor-model": 7.33.8 + "@microsoft/tsdoc": ~0.16.0 + "@microsoft/tsdoc-config": ~0.18.1 + "@rushstack/node-core-library": 5.23.1 + "@rushstack/rig-package": 0.7.3 + "@rushstack/terminal": 0.24.0 + "@rushstack/ts-command-line": 5.3.9 + diff: ~8.0.2 + minimatch: 10.2.3 + resolve: ~1.22.1 + semver: ~7.7.4 + source-map: ~0.6.1 + typescript: 5.9.3 + bin: + api-extractor: bin/api-extractor + checksum: afd717a85f4e4b287fb795eb8a77f1b131532dd36ae57a2fe2e02bd43d3795254ff783f63ab459054001b5bf221923a4cf48c8f898f97c36f14f587d57d571f5 + languageName: node + linkType: hard + +"@microsoft/tsdoc-config@npm:~0.18.1": + version: 0.18.1 + resolution: "@microsoft/tsdoc-config@npm:0.18.1" + dependencies: + "@microsoft/tsdoc": 0.16.0 + ajv: ~8.18.0 + jju: ~1.4.0 + resolve: ~1.22.2 + checksum: d8dc159d4af1c59375511c336b689a227a14abfab5b75125c8ac1d955f069aeb7f9fd5a419936229f09a333594c6eb0473f24b7552b222b9c5790015e460657d + languageName: node + linkType: hard + +"@microsoft/tsdoc@npm:0.16.0, @microsoft/tsdoc@npm:~0.16.0": + version: 0.16.0 + resolution: "@microsoft/tsdoc@npm:0.16.0" + checksum: 8aece3371a45a18af4233a5d6f8ac94612c8baef65f782f925b0c1f5a98802f031e6bf8b487a849ceb35f4cc6c2ea15ba82a4497c72b50e5b33771ecd62729cd + languageName: node + linkType: hard + "@mswjs/interceptors@npm:^0.25.15": version: 0.25.16 resolution: "@mswjs/interceptors@npm:0.25.16" @@ -10946,6 +10999,77 @@ __metadata: languageName: node linkType: hard +"@rushstack/node-core-library@npm:5.23.1": + version: 5.23.1 + resolution: "@rushstack/node-core-library@npm:5.23.1" + dependencies: + ajv: ~8.18.0 + ajv-draft-04: ~1.0.0 + ajv-formats: ~3.0.1 + fs-extra: ~11.3.0 + import-lazy: ~4.0.0 + jju: ~1.4.0 + resolve: ~1.22.1 + semver: ~7.7.4 + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 0ddcb18010f5a01a90b6321a0a90f5c9df04c4eeed0799c380b5cdac1a902c35ddb5e5cafed6e8d18faae180ee43f52228af64b051e5f3f2f0d71ce0de039545 + languageName: node + linkType: hard + +"@rushstack/problem-matcher@npm:0.2.1": + version: 0.2.1 + resolution: "@rushstack/problem-matcher@npm:0.2.1" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: a1ae5b80d6166b82fe39ea0951ac62957b3fc48e3488bcd65d6137d2ef9dd4011de1176ced0db67a75b8230156a6b22864112ddcaf503d5bc15947ea2770c051 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.7.3": + version: 0.7.3 + resolution: "@rushstack/rig-package@npm:0.7.3" + dependencies: + jju: ~1.4.0 + resolve: ~1.22.1 + checksum: c3d8cfd901a94dee952d6fb48fe46c122cb926dd8c6af592829bf513ecf4b055d67ad61a61c2e446439e1f647de006b662edbe79c4c6667f22253e7a1b243441 + languageName: node + linkType: hard + +"@rushstack/terminal@npm:0.24.0": + version: 0.24.0 + resolution: "@rushstack/terminal@npm:0.24.0" + dependencies: + "@rushstack/node-core-library": 5.23.1 + "@rushstack/problem-matcher": 0.2.1 + supports-color: ~8.1.1 + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 40a60d7755836fae0018f534f24601ac8f668c5430b62b32670ed26bc95ef1dc5e8d5ae2452fe28a06f402d27a9a854b242737c53ad151bf6b835f0b2b47bf48 + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:5.3.9": + version: 5.3.9 + resolution: "@rushstack/ts-command-line@npm:5.3.9" + dependencies: + "@rushstack/terminal": 0.24.0 + "@types/argparse": 1.0.38 + argparse: ~1.0.9 + string-argv: ~0.3.1 + checksum: df0bd720d8902d8a4860b1357e0842684a57012fe4c9076eebc7bb4ccf9277972a5b3be66d8220d16df63dead23c6c91469a54be8b080d5af73865db6c125513 + languageName: node + linkType: hard + "@sec-ant/readable-stream@npm:^0.4.1": version: 0.4.1 resolution: "@sec-ant/readable-stream@npm:0.4.1" @@ -11238,6 +11362,7 @@ __metadata: dependencies: "@babel/core": ^7.26.7 "@expo/metro-config": ~0.20.0 + "@microsoft/api-extractor": ^7.58.7 "@mswjs/interceptors": ^0.25.15 "@react-native/babel-preset": 0.80.0 "@sentry-internal/eslint-plugin-sdk": 10.51.0 @@ -11613,6 +11738,13 @@ __metadata: languageName: node linkType: hard +"@types/argparse@npm:1.0.38": + version: 1.0.38 + resolution: "@types/argparse@npm:1.0.38" + checksum: 26ed7e3f1e3595efdb883a852f5205f971b798e4c28b7e30a32c5298eee596e8b45834ce831f014d250b9730819ab05acff5b31229666d3af4ba465b4697d0eb + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -12663,7 +12795,19 @@ __metadata: languageName: node linkType: hard -"ajv-formats@npm:3.0.1": +"ajv-draft-04@npm:~1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 3f11fa0e7f7359bef6608657f02ab78e9cc62b1fb7bdd860db0d00351b3863a1189c1a23b72466d2d82726cab4eb20725c76f5e7c134a89865e2bfd0e6828137 + languageName: node + linkType: hard + +"ajv-formats@npm:3.0.1, ajv-formats@npm:~3.0.1": version: 3.0.1 resolution: "ajv-formats@npm:3.0.1" dependencies: @@ -12677,7 +12821,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.18.0, ajv@npm:^8.0.0, ajv@npm:^8.18.0": +"ajv@npm:8.18.0, ajv@npm:^8.0.0, ajv@npm:^8.18.0, ajv@npm:~8.18.0": version: 8.18.0 resolution: "ajv@npm:8.18.0" dependencies: @@ -13190,7 +13334,7 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.7": +"argparse@npm:^1.0.7, argparse@npm:~1.0.9": version: 1.0.10 resolution: "argparse@npm:1.0.10" dependencies: @@ -14234,7 +14378,7 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^5.0.5": +"brace-expansion@npm:^5.0.2, brace-expansion@npm:^5.0.5": version: 5.0.5 resolution: "brace-expansion@npm:5.0.5" dependencies: @@ -18844,6 +18988,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:~11.3.0": + version: 11.3.4 + resolution: "fs-extra@npm:11.3.4" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: 3d1453db564b20ad58adf7c9583d0821546bd05e158865407fa2767af774ad8353418118655005f48c5bd0dbda19ea4bd053f8a5dcef2ce2e97580f7a039a221 + languageName: node + linkType: hard + "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -19592,6 +19747,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.3": + version: 2.0.3 + resolution: "hasown@npm:2.0.3" + dependencies: + function-bind: ^1.1.2 + checksum: bb06756a13dc4e6d1f45993c86c23f12d167c6c30a7dcc907aec5042300b4eb255615a0e5ed2c65014b93bf8bfcff111d991032c5c01ddefb340aa64b329bd55 + languageName: node + linkType: hard + "hermes-compiler@npm:0.14.1": version: 0.14.1 resolution: "hermes-compiler@npm:0.14.1" @@ -20065,6 +20229,13 @@ __metadata: languageName: node linkType: hard +"import-lazy@npm:~4.0.0": + version: 4.0.0 + resolution: "import-lazy@npm:4.0.0" + checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + languageName: node + linkType: hard + "import-local@npm:3.1.0": version: 3.1.0 resolution: "import-local@npm:3.1.0" @@ -20426,6 +20597,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.1": + version: 2.16.2 + resolution: "is-core-module@npm:2.16.2" + dependencies: + hasown: ^2.0.3 + checksum: 9317844b4959f8fb268bfc1b4e24033d60058235c2e7273499c2abfd8e4510e7059b1339bd9109766293747daa3e0b5a89095fb2825a866a4093563fe8fdf16f + languageName: node + linkType: hard + "is-data-view@npm:^1.0.1": version: 1.0.1 resolution: "is-data-view@npm:1.0.1" @@ -21672,6 +21852,13 @@ __metadata: languageName: node linkType: hard +"jju@npm:~1.4.0": + version: 1.4.0 + resolution: "jju@npm:1.4.0" + checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f + languageName: node + linkType: hard + "joi@npm:^17.2.1": version: 17.13.3 resolution: "joi@npm:17.13.3" @@ -25118,6 +25305,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:10.2.3": + version: 10.2.3 + resolution: "minimatch@npm:10.2.3" + dependencies: + brace-expansion: ^5.0.2 + checksum: 896a87685c0d376e7679e99c37072f92eeb0df003d63cd422e8fc48ea727108d9f722531a0a8d23fe7d776faccaca424d5765e7af3b0c5e1dfb73fabcc60f612 + languageName: node + linkType: hard + "minimatch@npm:^10.1.1, minimatch@npm:^10.2.2, minimatch@npm:^10.2.3": version: 10.2.4 resolution: "minimatch@npm:10.2.4" @@ -29571,6 +29767,20 @@ __metadata: languageName: node linkType: hard +"resolve@npm:~1.22.1, resolve@npm:~1.22.2": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" + dependencies: + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4dc5a614b32142ef9ab455b242ed33c472c4ea50df17dbe1e9dac5fe0eebd7d5fdb7cb9cc8ad2165e5e0f07694498a74e7fbd6cc1599e20d84682cce1b80a4dc + languageName: node + linkType: hard + "resolve@npm:~1.7.1": version: 1.7.1 resolution: "resolve@npm:1.7.1" @@ -29628,6 +29838,20 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@~1.22.1#~builtin, resolve@patch:resolve@~1.22.2#~builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#~builtin::version=1.22.12&hash=c3c19d" + dependencies: + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 0cc5b060cbe081c85c331ac2eb08e8a54f0a195b899d5001822e5d3e2b335da651b1eed3d259fea904c22a0da9324a061e0e7ceab5dbeb5bcab5250b625754e1 + languageName: node + linkType: hard + "responselike@npm:^3.0.0": version: 3.0.0 resolution: "responselike@npm:3.0.0" @@ -30021,7 +30245,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.7.4": +"semver@npm:7.7.4, semver@npm:~7.7.4": version: 7.7.4 resolution: "semver@npm:7.7.4" bin: @@ -31150,6 +31374,13 @@ __metadata: languageName: node linkType: hard +"string-argv@npm:~0.3.1": + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 8703ad3f3db0b2641ed2adbb15cf24d3945070d9a751f9e74a924966db9f325ac755169007233e8985a39a6a292f14d4fee20482989b89b96e473c4221508a0f + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -31542,7 +31773,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0": +"supports-color@npm:^8.0.0, supports-color@npm:~8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -32355,6 +32586,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:5.9.3, typescript@npm:^5.8.3, typescript@npm:~5.9.2, typescript@npm:~5.9.3": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 0d0ffb84f2cd072c3e164c79a2e5a1a1f4f168e84cb2882ff8967b92afe1def6c2a91f6838fb58b168428f9458c57a2ba06a6737711fdd87a256bbe83e9a217f + languageName: node + linkType: hard + "typescript@npm:>=3 < 6": version: 5.5.4 resolution: "typescript@npm:5.5.4" @@ -32375,16 +32616,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.8.3, typescript@npm:~5.9.2, typescript@npm:~5.9.3": - version: 5.9.3 - resolution: "typescript@npm:5.9.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 0d0ffb84f2cd072c3e164c79a2e5a1a1f4f168e84cb2882ff8967b92afe1def6c2a91f6838fb58b168428f9458c57a2ba06a6737711fdd87a256bbe83e9a217f - languageName: node - linkType: hard - "typescript@npm:next": version: 5.7.0-dev.20240829 resolution: "typescript@npm:5.7.0-dev.20240829" @@ -32425,7 +32656,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^5.8.3#~builtin, typescript@patch:typescript@~5.9.2#~builtin, typescript@patch:typescript@~5.9.3#~builtin": +"typescript@patch:typescript@5.9.3#~builtin, typescript@patch:typescript@^5.8.3#~builtin, typescript@patch:typescript@~5.9.2#~builtin, typescript@patch:typescript@~5.9.3#~builtin": version: 5.9.3 resolution: "typescript@patch:typescript@npm%3A5.9.3#~builtin::version=5.9.3&hash=29ae49" bin: