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
1 change: 0 additions & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@
"typescript": "^5.9.3"
},
"dependencies": {
"@datadog/js-core": "0.0.3",
"spark-md5": "^3.0.2"
}
}
2 changes: 1 addition & 1 deletion packages/core/src/configuration/configuration.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { EvaluationContext, FlagValueType, JsonValue, ResolutionReason } from '@openfeature/core'
import type { TimeStamp } from '../time'

/**
* Internal flags configuration for DatadogProvider.
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/configuration/exposureEvent.types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { EvaluationContext } from '@openfeature/core'
import type { TimeStamp } from '../time'

export interface ExposureEvent {
allocation: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { TimeStamp } from '@datadog/js-core/time'
import { timeStampNow } from '@datadog/js-core/time'
import type { EvaluationContext, EvaluationContextValue, EvaluationDetails, FlagValue } from '@openfeature/core'
import { getMD5Hash } from '../obfuscation'
import { type TimeStamp, timeStampNow } from '../time'
import { createFlagEvaluationEvent } from './flagEvaluationEvent'
import type { FlagEvaluationEvent } from './flagEvaluationEvent.types'

Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/configuration/flagEvaluationEvent.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { EvaluationContextValue } from '@openfeature/core'
import type { TimeStamp } from '../time'
import type { FlagEvaluationEvent } from './flagEvaluationEvent.types'

interface FlagEvaluationAggregationData {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { EvaluationContextValue } from '@openfeature/core'
import type { TimeStamp } from '../time'

export interface FlagEvaluationEvent {
flag: {
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/configuration/wire.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { EvaluationContext } from '@openfeature/core'
import type { TimeStamp } from '../time'
import type { FlagsConfiguration } from './configuration'

type ConfigurationWire = {
Expand Down
3 changes: 1 addition & 2 deletions packages/core/src/evaluation/evaluateForSubject.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type { TimeStamp } from '@datadog/js-core/time'
import { timeStampNow } from '@datadog/js-core/time'
import type { ErrorCode, EvaluationContext, FlagValueType, Logger, ResolutionDetails } from '@openfeature/core'
import type { FlagTypeToValue, PrecomputedFlagMetadata } from '../configuration'
import { type TimeStamp, timeStampNow } from '../time'
import { TargetingKeyMissingError } from './errors'
import { createEvaluationTimestampMetadata } from './evaluationMetadata'
import { matchesShard } from './matchesShard'
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/evaluation/evaluation.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { timeStampNow } from '@datadog/js-core/time'
import type { ErrorCode, EvaluationContext, FlagValueType, Logger, ResolutionDetails } from '@openfeature/core'
import type { FlagTypeToValue } from '../configuration'
import { timeStampNow } from '../time'
import { TargetingKeyMissingError } from './errors'
import { evaluateForSubject } from './evaluateForSubject'
import { createEvaluationTimestampMetadata } from './evaluationMetadata'
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/evaluation/evaluationMetadata.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { PrecomputedFlagMetadata } from '../configuration'
import type { TimeStamp } from '../time'

export function createEvaluationTimestampMetadata(evaluationTimestampMs: TimeStamp): PrecomputedFlagMetadata {
return { __dd_eval_timestamp_ms: evaluationTimestampMs } as PrecomputedFlagMetadata
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export * from './cache'
export * from './configuration'
export * from './evaluation'
export * from './obfuscation'
export * from './time'

// Build environment placeholder for testing
const _SDK_VERSION = __BUILD_ENV__SDK_VERSION__
6 changes: 6 additions & 0 deletions packages/core/src/time.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/** Unix epoch timestamp in milliseconds. */
export type TimeStamp = number & { t: 'Epoch time' }

export function timeStampNow(): TimeStamp {
return new Date().getTime() as TimeStamp
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { TimeStamp } from '@datadog/js-core/time'
import { createFlagEvaluationEvent } from '../../src/configuration/flagEvaluationEvent'
import type { TimeStamp } from '../../src/time'

describe('createFlagEvaluationEvent', () => {
it('should include targeting_key when it is a non-empty string', () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/core/test/evaluation/evaluateForSubject.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { TimeStamp } from '@datadog/js-core/time'
import type { EvaluationContext, Logger } from '@openfeature/core'
import { evaluateForSubject, type Flag } from '../../src/evaluation'
import type { TimeStamp } from '../../src/time'

describe('evaluateForSubject', () => {
let logger: Logger
Expand Down
3 changes: 1 addition & 2 deletions packages/node-server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@datadog/flagging-core": "2.0.1",
"@datadog/js-core": "0.0.3"
"@datadog/flagging-core": "2.0.1"
},
"peerDependencies": {
"@openfeature/server-sdk": ">=1.15.1"
Expand Down
2 changes: 1 addition & 1 deletion packages/node-server/src/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import {
createExposureEvent,
type ExposureEvent,
LRUInMemoryAssignmentCache,
timeStampNow,
} from '@datadog/flagging-core'
import { timeStampNow } from '@datadog/js-core/time'
import type { EvaluationContext } from '@openfeature/core'
import type {
EvaluationDetails,
Expand Down
65 changes: 65 additions & 0 deletions scripts/assert-node-package-purity.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
'use strict'

const fs = require('node:fs')
const path = require('node:path')

const forbiddenPackageNames = [/^@datadog\/browser-/, /^@datadog\/js-core$/, /^@datadog\/openfeature-browser$/]
const browserSdkRepository = /github\.com[/:]DataDog\/browser-sdk(?:\.git)?$/i

const found = new Set()
const visited = new Set()

function inspectPackage(packageDirectory) {
let realDirectory
try {
realDirectory = fs.realpathSync(packageDirectory)
} catch {
return
}

if (visited.has(realDirectory)) return
visited.add(realDirectory)

const manifestPath = path.join(realDirectory, 'package.json')
if (fs.existsSync(manifestPath)) {
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'))
const repository = typeof manifest.repository === 'string' ? manifest.repository : manifest.repository?.url
const isBrowserSdkDependency =
forbiddenPackageNames.some((pattern) => pattern.test(manifest.name)) ||
browserSdkRepository.test(repository ?? '')
if (isBrowserSdkDependency) {
found.add(manifest.name)
}
}

inspectNodeModules(path.join(realDirectory, 'node_modules'))
}

function inspectNodeModules(nodeModulesDirectory) {
if (!fs.existsSync(nodeModulesDirectory)) return

for (const entry of fs.readdirSync(nodeModulesDirectory, { withFileTypes: true })) {
if (entry.name.startsWith('.')) continue

const entryPath = path.join(nodeModulesDirectory, entry.name)
if (entry.name.startsWith('@')) {
for (const scopedEntry of fs.readdirSync(entryPath, { withFileTypes: true })) {
if (scopedEntry.isDirectory() || scopedEntry.isSymbolicLink()) {
inspectPackage(path.join(entryPath, scopedEntry.name))
}
}
} else if (entry.isDirectory() || entry.isSymbolicLink()) {
inspectPackage(entryPath)
}
}
}

inspectNodeModules(path.resolve(process.argv[2] ?? 'node_modules'))

if (found.size > 0) {
console.error('ERROR: Node packages must not install browser SDK dependencies')
for (const packageName of [...found].sort()) console.error(packageName)
process.exit(1)
}

console.log('Verified Node packages do not install browser SDK dependencies')
2 changes: 2 additions & 0 deletions scripts/test-node-package-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ if [ "$WITH_OPENFEATURE" = true ]; then
fi
fi

node "$REPO_ROOT/scripts/assert-node-package-purity.js" node_modules

# Run tests
echo ""
echo "Running tests..."
Expand Down
2 changes: 0 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,6 @@ __metadata:
version: 0.0.0-use.local
resolution: "@datadog/flagging-core@workspace:packages/core"
dependencies:
"@datadog/js-core": "npm:0.0.3"
"@openfeature/core": "npm:^1.9.2"
"@types/jest": "npm:^30.0.0"
"@types/node": "npm:^18.0.0"
Expand Down Expand Up @@ -741,7 +740,6 @@ __metadata:
resolution: "@datadog/openfeature-node-server@workspace:packages/node-server"
dependencies:
"@datadog/flagging-core": "npm:2.0.1"
"@datadog/js-core": "npm:0.0.3"
"@openfeature/core": "npm:1.9.2"
"@openfeature/server-sdk": "npm:1.20.2"
"@types/jest": "npm:^30.0.0"
Expand Down