Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/CONVENTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ Avoid polluting browser context or conflicting with customer own polyfills.

## Global object access

Use `globalObject` from `@datadog/browser-core` instead of `window` or `globalThis`. It is typed
Use `globalObject` from `@datadog/js-core/util` instead of `window` or `globalThis`. It is typed
as `GlobalObject`, a custom interface that marks browser APIs as optional when they are not
available in all supported browsers or execution contexts (e.g. Web Workers). This makes
availability checks explicit and type-safe.
Expand All @@ -111,7 +111,7 @@ availability checks explicit and type-safe.
- **OK** to use `globalObject`

```typescript
import { globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'

globalObject.navigator.locks?.request('my-lock', doWork)
globalObject.cookieStore?.get('my-cookie')
Expand Down
52 changes: 52 additions & 0 deletions eslint-local-rules/disallowReExportsFromOtherPackages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import type { TSESLint, TSESTree } from '@typescript-eslint/utils'
import { RuleCreator } from '@typescript-eslint/utils/eslint-utils'

type MessageIds = 'reExportFromOtherPackage'
type RuleContext = Readonly<TSESLint.RuleContext<MessageIds, readonly unknown[]>>

// Re-exporting from @datadog/js-core makes it look like the value belongs to the
// re-exporting package. Consumers should import it from @datadog/js-core directly.
//
// Customer-facing package entry points are excluded from this rule via the ESLint
// `ignores` config (see PUBLIC_PACKAGE_ENTRIES in eslint.config.ts).
const FORBIDDEN_RE_EXPORT_SOURCE = '@datadog/js-core'

export default RuleCreator.withoutDocs({
meta: {
docs: {
description: `Disallow re-exporting values from ${FORBIDDEN_RE_EXPORT_SOURCE}.`,
},
schema: [],
messages: {
Comment thread
BenoitZugmeyer marked this conversation as resolved.
reExportFromOtherPackage: `Re-exporting from ${FORBIDDEN_RE_EXPORT_SOURCE} is not allowed. Import this value directly from {{source}} instead.`,
},
type: 'suggestion',
},
create(context) {
return {
ExportNamedDeclaration(node) {
checkReExport(context, node)
},
ExportAllDeclaration(node) {
checkReExport(context, node)
},
}
},
})

function checkReExport(context: RuleContext, node: TSESTree.ExportNamedDeclaration | TSESTree.ExportAllDeclaration) {
const source = node.source
if (!source || typeof source.value !== 'string') {
Comment thread
BenoitZugmeyer marked this conversation as resolved.
return
}

if (!source.value.startsWith(FORBIDDEN_RE_EXPORT_SOURCE)) {
return
}

context.report({
node: source,
messageId: 'reExportFromOtherPackage',
data: { source: source.value },
})
}
2 changes: 2 additions & 0 deletions eslint-local-rules/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import disallowGenericUtils from './disallowGenericUtils.ts'
import disallowNonScripts from './disallowNonScripts.ts'
import enforceProdDepsImports from './enforceProdDepsImports.ts'
import secureCommandExecution from './secureCommandExecution.ts'
import disallowReExportsFromOtherPackages from './disallowReExportsFromOtherPackages.ts'
import monitorUntilCommentRules from './monitorUntilCommentRules.ts'

// Declare the local rules used by the Browser SDK
Expand All @@ -30,6 +31,7 @@ export default {
'disallow-generic-utils': disallowGenericUtils,
'disallow-non-scripts': disallowNonScripts,
'enforce-prod-deps-imports': enforceProdDepsImports,
'disallow-re-exports-from-other-packages': disallowReExportsFromOtherPackages,
'secure-command-execution': secureCommandExecution,
...monitorUntilCommentRules,
}
11 changes: 10 additions & 1 deletion eslint.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import eslintLocalRules from './eslint-local-rules/index.ts'
import { SCHEMAS } from './scripts/lib/generatedSchemaTypes.ts'

const SPEC_FILES = '**/*.{spec,specHelper}.{ts,tsx,js}'
const PUBLIC_PACKAGE_ENTRIES = 'packages/{browser-rum,browser-logs,browser-rum-slim}/src/entries/*.ts'
const MONITOR_UNTIL_COMMENT_EXPIRED_LEVEL =
(process.env.MONITOR_UNTIL_COMMENT_EXPIRED_LEVEL as 'warn' | 'error' | undefined) || 'warn'

Expand Down Expand Up @@ -417,6 +418,14 @@ export default defineConfig(
},
},

{
files: ['packages/*/src/**/*.ts'],
ignores: [SPEC_FILES, PUBLIC_PACKAGE_ENTRIES],
rules: {
'local-rules/disallow-re-exports-from-other-packages': 'error',
},
},

{
files: ['packages/*/src/**/*.ts'],
ignores: [SPEC_FILES],
Expand All @@ -426,7 +435,7 @@ export default defineConfig(
},

{
files: ['packages/{browser-rum,browser-logs,browser-rum-slim}/src/entries/*.ts'],
files: [PUBLIC_PACKAGE_ENTRIES],
rules: {
'local-rules/disallow-enum-exports': 'error',
},
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-core/src/domain/tags.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { DOCS_ORIGIN, MORE_DETAILS, display } from '../tools/display'
import { DOCS_ORIGIN, MORE_DETAILS } from '@datadog/js-core/util'
import { display } from '../tools/display'
import type { Configuration } from './configuration'

export const TAG_SIZE_LIMIT = 200
Expand Down
19 changes: 0 additions & 19 deletions packages/browser-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,9 @@ export {
export * from './tools/display'
export type { Encoder, EncoderResult } from './tools/encoder'
export { createIdentityEncoder } from './tools/encoder'
export { normalizeUrl, isValidUrl, getPathName, buildUrl } from '@datadog/js-core/util'
export * from './tools/utils/arrayUtils'

export * from './tools/serialisation/sanitize'
Comment thread
BenoitZugmeyer marked this conversation as resolved.
export { globalObject, isWorkerEnvironment } from '@datadog/js-core/util'
export type { GlobalObject } from '@datadog/js-core/util'
export { AbstractLifeCycle } from './tools/abstractLifeCycle'
export * from './domain/eventRateLimiter/createEventRateLimiter'
export * from './tools/utils/browserDetection'
Expand All @@ -106,22 +103,6 @@ export type { Context, ContextArray, ContextValue } from './tools/serialisation/
export { getCookie, getInitCookie, setCookie, deleteCookie, resetInitCookies } from './browser/cookie'
export { isCookieStoreSupported } from './browser/cookieAccess'
export type { WeakRef, WeakRefConstructor } from './browser/browser.types'
export type {
CookieStore,
NetworkInformation,
Navigator,
NetworkInterface,
NetworkEffectiveType,
Profiler,
ProfilerConstructor,
ProfilerTrace,
ProfilerInitOptions,
ProfilerFrame,
ProfilerStack,
ProfilerSample,
ProfilerResource,
SampleBufferFullEvent,
} from '@datadog/js-core/util'
export type { XhrCompleteContext, XhrStartContext, XhrContext } from './browser/xhrObservable'
export { initXhrObservable } from './browser/xhrObservable'
export type { FetchResolveContext, FetchStartContext, FetchContext } from './browser/fetchObservable'
Expand Down
3 changes: 1 addition & 2 deletions packages/browser-core/src/tools/display.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/* eslint-disable local-rules/disallow-side-effects */
import { createDisplay, DOCS_ORIGIN, MORE_DETAILS } from '@datadog/js-core/util'
import { createDisplay, DOCS_ORIGIN } from '@datadog/js-core/util'

export const display = createDisplay('Datadog Browser SDK:')

export { DOCS_ORIGIN, MORE_DETAILS }
export const DOCS_TROUBLESHOOTING = `${DOCS_ORIGIN}/real_user_monitoring/browser/troubleshooting`
3 changes: 2 additions & 1 deletion packages/browser-core/src/transport/batch.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { EndpointBuilder } from '@datadog/js-core/transport'
import { DOCS_TROUBLESHOOTING, MORE_DETAILS, display } from '../tools/display'
import { MORE_DETAILS } from '@datadog/js-core/util'
import { DOCS_TROUBLESHOOTING, display } from '../tools/display'
import type { Context } from '../tools/serialisation/context'
import { objectValues } from '../tools/utils/polyfills'
import { isPageExitReason, createPageMayExitObservable } from '../browser/pageMayExitObservable'
Expand Down
3 changes: 1 addition & 2 deletions packages/browser-core/test/emulate/buildLocation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { buildUrl } from '../../src'

import { buildUrl } from '@datadog/js-core/util'
export function buildLocation(url: string, base = location.href) {
const urlObject = buildUrl(url, base)
return {
Expand Down
2 changes: 1 addition & 1 deletion packages/browser-core/test/emulate/mockNavigator.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { NetworkInformation } from '@datadog/js-core/util'
import { registerCleanupTask } from '../registerCleanupTask'
import type { NetworkInformation } from '../../src'

export function setNavigatorOnLine(onLine: boolean) {
Object.defineProperty(navigator, 'onLine', {
Expand Down
2 changes: 1 addition & 1 deletion packages/browser-debugger/src/domain/api.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { mockClock, registerCleanupTask } from '@datadog/browser-core/test'
import { onEntry, onReturn, onThrow, initDebuggerTransport, resetDebuggerTransport } from './api'
import { display } from './display'
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-debugger/src/domain/api.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { globalObject } from '@datadog/js-core/util'
import type { Batch, Context, ContextValue } from '@datadog/browser-core'
import { timeStampNow } from '@datadog/js-core/time'
import { buildTag, generateUUID, globalObject, mergeArrays } from '@datadog/browser-core'
import { buildTag, generateUUID, mergeArrays } from '@datadog/browser-core'
import type { BrowserWindow, DebuggerInitConfiguration } from '../entries/main'
import { capture, captureFields } from './capture'
import type { CaptureContext } from './capture'
Expand Down
4 changes: 2 additions & 2 deletions packages/browser-debugger/src/domain/deliveryApi.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { GlobalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import type { GlobalObject } from '@datadog/js-core/util'
import { registerCleanupTask, mockClock, replaceMockable } from '@datadog/browser-core/test'
import type { Clock } from '@datadog/browser-core/test'
import { display } from './display'
Expand Down
11 changes: 2 additions & 9 deletions packages/browser-debugger/src/domain/deliveryApi.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
import { globalObject } from '@datadog/js-core/util'
import type { TimeoutId } from '@datadog/browser-core'
import { dateNow } from '@datadog/js-core/time'
import {
addTelemetryDebug,
fetch,
globalObject,
isServerError,
mockable,
setInterval,
clearInterval,
} from '@datadog/browser-core'
import { addTelemetryDebug, fetch, isServerError, mockable, setInterval, clearInterval } from '@datadog/browser-core'
import { INTAKE_SITE_US1 } from '@datadog/js-core/transport'
import type { Site } from '@datadog/js-core/transport'
import { display } from './display'
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-debugger/src/entries/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
* @see [Live Debugger Documentation](https://docs.datadoghq.com/tracing/live_debugger/)
*/

import { defineGlobal, globalObject, makePublicApi, mockable } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { defineGlobal, makePublicApi, mockable } from '@datadog/browser-core'
import type { PublicApi } from '@datadog/browser-core'
import type { Site } from '@datadog/js-core/transport'
import { initDebuggerTransport, onEntry, onReturn, onThrow } from '../domain/api'
Expand Down
2 changes: 1 addition & 1 deletion packages/browser-debugger/test/expressionTestCases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* Adapted from dd-trace-js/packages/dd-trace/test/debugger/devtools_client/condition-test-cases.js
*/

import { globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import type { ExpressionNode } from '../src/domain/expression'

export type VariableBindings = Record<string, unknown>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { isWorkerEnvironment } from '@datadog/browser-core'
import { isWorkerEnvironment } from '@datadog/js-core/util'
import type { CommonContext } from '../../rawLogsEvent.types'

export function buildCommonContext(): CommonContext {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { globalObject } from '@datadog/js-core/util'
import type { RelativeTime } from '@datadog/js-core/time'
import type { RumInternalContext } from '@datadog/browser-core'
import { globalObject, willSyntheticsInjectRum } from '@datadog/browser-core'
import { willSyntheticsInjectRum } from '@datadog/browser-core'
import { SKIPPED } from '@datadog/js-core/assembly'
import type { Hooks } from '../hooks'

Expand Down
3 changes: 2 additions & 1 deletion packages/browser-logs/src/entries/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
* @see [Browser Log Collection](https://docs.datadoghq.com/logs/log_collection/javascript/)
*/

import { defineGlobal, globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { defineGlobal } from '@datadog/browser-core'
import type { LogsPublicApi } from '../boot/logsPublicApi'
import { makeLogsPublicApi } from '../boot/logsPublicApi'

Expand Down
2 changes: 1 addition & 1 deletion packages/browser-rum-core/src/boot/preStartRum.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { isWorkerEnvironment } from '@datadog/js-core/util'
import { timeStampNow, clocksNow } from '@datadog/js-core/time'
import type { TimeStamp } from '@datadog/js-core/time'
import type { TrackingConsentState, DeflateWorker, Context, Telemetry, SessionManager } from '@datadog/browser-core'
Expand All @@ -23,7 +24,6 @@ import {
startTelemetry,
TelemetryService,
mockable,
isWorkerEnvironment,
startTelemetrySessionContext,
addTelemetryDebug,
setAllowUntrustedEvents,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { globalObject } from '@datadog/js-core/util'
import type { Subscription } from '@datadog/browser-core'
import { ONE_MINUTE } from '@datadog/js-core/time'
import { deleteCookie, globalObject, setCookie } from '@datadog/browser-core'
import { deleteCookie, setCookie } from '@datadog/browser-core'
import type { Clock } from '@datadog/browser-core/test'
import { mockClock } from '@datadog/browser-core/test'
import { WATCH_COOKIE_INTERVAL_DELAY, createCookieObservable } from './cookieObservable'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { globalObject } from '@datadog/js-core/util'
import { ONE_SECOND } from '@datadog/js-core/time'
import {
setInterval,
Expand All @@ -6,7 +7,6 @@ import {
addEventListener,
DOM_EVENT,
getCookie,
globalObject,
isCookieStoreSupported,
} from '@datadog/browser-core'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { buildLocation, registerCleanupTask, replaceMockable } from '@datadog/browser-core/test'
import { createLocationChangeObservable } from './locationChangeObservable'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { globalObject } from '@datadog/js-core/util'
import {
addEventListener,
DOM_EVENT,
globalObject,
instrumentMethod,
mockable,
Observable,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { globalObject, buildUrl } from '@datadog/js-core/util'
import type { RelativeTime } from '@datadog/js-core/time'
import type { Observable } from '@datadog/browser-core'
import { relativeNow } from '@datadog/js-core/time'
import { SESSION_TIME_OUT_DELAY, createValueHistory, mockable, globalObject } from '@datadog/browser-core'
import { buildUrl } from '@datadog/js-core/util'
import { SESSION_TIME_OUT_DELAY, createValueHistory, mockable } from '@datadog/browser-core'
import { DISCARDED } from '@datadog/js-core/assembly'
import type { LocationChange } from '../../browser/locationChangeObservable'
import type { LifeCycle } from '../lifeCycle'
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-rum-core/test/locationChangeSetup.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { globalObject } from '@datadog/js-core/util'
import { buildLocation, replaceMockable } from '@datadog/browser-core/test'
import { globalObject, Observable } from '@datadog/browser-core'
import { Observable } from '@datadog/browser-core'
import type { LocationChange } from '../src/browser/locationChangeObservable'

export function setupLocationObserver(initialLocation?: string) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import type { RumInitConfiguration, RumPublicApi } from '@datadog/browser-rum-core'
import { registerCleanupTask } from '../../../browser-core/test'
import { appendElement } from '../../../browser-rum-core/test'
Expand Down
4 changes: 2 additions & 2 deletions packages/browser-rum-nextjs/src/domain/nextjsPlugin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { buildUrl } from '@datadog/js-core/util'
import { globalObject, mockable, toIntegrations, toMajorVersionIntegration } from '@datadog/browser-core'
import { buildUrl, globalObject } from '@datadog/js-core/util'
import { mockable, toIntegrations, toMajorVersionIntegration } from '@datadog/browser-core'
import type { RumPlugin, RumPublicApi, StartRumResult } from '@datadog/browser-rum-core'

export type NextjsPlugin = Pick<Required<RumPlugin>, 'name' | 'onInit' | 'onRumStart' | 'getConfigurationTelemetry'>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { globalObject } from '@datadog/browser-core'

/**
* A Shopify Custom Pixel runs in a "lax" sandboxed iframe (`sandbox="allow-scripts"`, no
* `allow-same-origin`): it shares the parent page's cookie jar (same domain) but has an
Expand All @@ -14,6 +12,7 @@ import { globalObject } from '@datadog/browser-core'
* Shimming these away makes the SDK fall back to code paths that do work in this context
* (`document.cookie`, same-document promise chaining, `globalObject.URL`, always-focused state).
*/
import { globalObject } from '@datadog/js-core/util'
export function patchSandboxedIframeApis() {
disableProperty(globalObject, 'cookieStore')
disableProperty(navigator, 'locks')
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-rum-shopify/src/entries/main.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { defineGlobal, globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { defineGlobal } from '@datadog/browser-core'
import type { RumPublicApi } from '@datadog/browser-rum-core'
import { makeRumPublicApi } from '@datadog/browser-rum-core'
import { makeRecorderApi, makeProfilerApi } from '@datadog/browser-rum/internal'
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-rum-slim/src/entries/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// Keep the following in sync with packages/browser-rum/src/entries/main.ts
import { defineGlobal, globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { defineGlobal } from '@datadog/browser-core'
import type { RumPublicApi } from '@datadog/browser-rum-core'
import { makeRumPublicApi } from '@datadog/browser-rum-core'
import { makeRecorderApiStub } from '../boot/stubRecorderApi'
Expand Down
3 changes: 2 additions & 1 deletion packages/browser-rum-slim/src/entries/salesforce.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { defineGlobal, globalObject } from '@datadog/browser-core'
import { globalObject } from '@datadog/js-core/util'
import { defineGlobal } from '@datadog/browser-core'
import { registerCleanupTask } from '@datadog/browser-core/test'
import type { RumPublicApi } from '@datadog/browser-rum-core'
import { datadogRum } from './salesforce'
Expand Down
Loading
Loading