diff --git a/.eslintrc.js b/.eslintrc.js index 51d1d1a344..6d950d28c1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,9 +1,20 @@ -module.exports = { +import stylistic from '@stylistic/eslint-plugin'; + +const __dirname = import.meta.dirname; + +const stylisticConfig = stylistic.configs.customize({ + semi: true, + arrowParens: true, + braceStyle: '1tbs', + quoteProps: 'as-needed', +}); + +export default { env: { node: true, 'jest/globals': true, }, - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], parser: '@typescript-eslint/parser', parserOptions: { project: [ @@ -12,8 +23,9 @@ module.exports = { ], tsconfigRootDir: __dirname, }, - plugins: ['@typescript-eslint', 'import', 'prettier', 'jest'], + plugins: ['@typescript-eslint', '@stylistic', 'simple-import-sort', 'import', 'jest'], ignorePatterns: [ + '**/node_modules/**', '**/dist/**', '**/vercel/examples/**', '**/react-native/example/**', @@ -22,6 +34,7 @@ module.exports = { '**/server-ai/examples/chat-judge/**', '**/server-ai/examples/direct-judge/**', '**/fromExternal/**', + '**/next-env.d.ts', ], rules: { 'no-param-reassign': 'error', @@ -42,7 +55,20 @@ module.exports = { 'error', { ignoreRestSiblings: true, argsIgnorePattern: '^_', varsIgnorePattern: '^__' }, ], - 'prettier/prettier': ['error'], + + ...stylisticConfig.rules, + '@stylistic/quotes': ['error', 'single', { avoidEscape: true }], + '@stylistic/operator-linebreak': ['error', 'after'], + '@stylistic/jsx-one-expression-per-line': 'off', + 'simple-import-sort/imports': ['error', { + groups: [ + ['^\\u0000'], + ['^node:', '^(?!@launchdarkly)(?!\\.)'], + ['^@launchdarkly'], + ['^\\.'], + ], + }], + 'simple-import-sort/exports': 'error', 'class-methods-use-this': 'off', 'import/no-extraneous-dependencies': [ 'error', diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index e43a1c6132..0000000000 --- a/.prettierignore +++ /dev/null @@ -1,13 +0,0 @@ -.vscode-test/ -out/ -dist/ -test-fixtures/ -node_modules/ -docs/ -.yarn -coverage -.next -.vscode -**/*/CHANGELOG.md -packages/sdk/akamai-edgekv/src/edgekv/edgekv.js -packages/sdk/cloudflare/src/createPlatformInfo.ts diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 932bffe392..0000000000 --- a/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "singleQuote": true, - "printWidth": 100, - "plugins": ["@trivago/prettier-plugin-sort-imports"], - "importOrder": ["^@launchdarkly/(.*)$", "^[./]"], - "importOrderCaseInsensitive": true, - "importOrderSeparation": true, - "importOrderSortSpecifiers": true -} diff --git a/package.json b/package.json index 03acc80b90..98aaf87a51 100644 --- a/package.json +++ b/package.json @@ -66,23 +66,20 @@ "//": "When using build:doc you need to specify the workspace. 'yarn run build:doc -- packages/shared/common' for example.", "build:doc": "npx typedoc --options $1/typedoc.json", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint -- --fix", + "lint:fix": "npx eslint . --ext .ts --fix", "test": "echo Please run tests for individual packages.", "coverage": "npm run test -- --coverage", "contract-test-harness": "curl -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/master/downloader/run.sh \\ | VERSION=v2 PARAMS=\"-url http://localhost:8000 -debug -stop-service-at-end $TEST_HARNESS_PARAMS\" sh", - "prettier": "npx prettier --write \"**/*.{js,ts,tsx,json,yaml,yml,md}\" --log-level warn", - "check": "yarn && yarn prettier && yarn lint && tsc && yarn build" + "check": "yarn && yarn lint && tsc && yarn build" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.56.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", - "prettier": "^3.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "typedoc": "0.25.0", "typescript": "5.1.6" }, diff --git a/packages/ai-providers/server-ai-langchain/package.json b/packages/ai-providers/server-ai-langchain/package.json index 1295c625f3..08a6bc1679 100644 --- a/packages/ai-providers/server-ai-langchain/package.json +++ b/packages/ai-providers/server-ai-langchain/package.json @@ -26,9 +26,8 @@ "scripts": { "build": "tsup-node", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test", + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", "test": "jest" }, "files": [ @@ -47,19 +46,17 @@ "@langchain/core": "^0.3.0", "@launchdarkly/server-sdk-ai": "^0.17.1", "@opentelemetry/api": "^1.9.0", + "@stylistic/eslint-plugin": "^4.0.0", "@traceloop/instrumentation-langchain": "^0.22.0", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.6.1", "langchain": "^0.3.0", - "prettier": "^3.0.0", "ts-jest": "^29.1.1", "tsup": "^8.5.1", "typescript": "5.1.6" diff --git a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts index fbaa38dfa2..97507f5164 100644 --- a/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts +++ b/packages/ai-providers/server-ai-langchain/src/LangChainProvider.ts @@ -2,7 +2,6 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { AIMessage, HumanMessage, SystemMessage } from '@langchain/core/messages'; import { initChatModel } from 'langchain/chat_models/universal'; -import { AIProvider } from '@launchdarkly/server-sdk-ai'; import type { ChatResponse, LDAIConfig, @@ -12,6 +11,7 @@ import type { LDTokenUsage, StructuredResponse, } from '@launchdarkly/server-sdk-ai'; +import { AIProvider } from '@launchdarkly/server-sdk-ai'; let instrumentPromise: Promise | undefined; @@ -61,7 +61,7 @@ export class LangChainProvider extends AIProvider { } catch { logger?.debug( 'OpenTelemetry instrumentation not available for LangChain provider. ' + - 'Install @traceloop/instrumentation-langchain to enable automatic tracing.', + 'Install @traceloop/instrumentation-langchain to enable automatic tracing.', ); } })(); diff --git a/packages/ai-providers/server-ai-openai/package.json b/packages/ai-providers/server-ai-openai/package.json index 2c9f302d9b..f6c5a175e6 100644 --- a/packages/ai-providers/server-ai-openai/package.json +++ b/packages/ai-providers/server-ai-openai/package.json @@ -26,9 +26,8 @@ "scripts": { "build": "tsup-node", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test", + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", "test": "jest" }, "files": [ @@ -46,19 +45,17 @@ "@launchdarkly/js-server-sdk-common": "2.18.5", "@launchdarkly/server-sdk-ai": "^0.17.1", "@opentelemetry/api": "^1.9.0", + "@stylistic/eslint-plugin": "^4.0.0", "@traceloop/instrumentation-openai": "^0.22.0", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.6.1", "openai": "^5.0.0", - "prettier": "^3.0.0", "ts-jest": "^29.1.1", "tsup": "^8.5.1", "typescript": "5.1.6" diff --git a/packages/ai-providers/server-ai-openai/src/OpenAIProvider.ts b/packages/ai-providers/server-ai-openai/src/OpenAIProvider.ts index 283c8952df..be49e84cc1 100644 --- a/packages/ai-providers/server-ai-openai/src/OpenAIProvider.ts +++ b/packages/ai-providers/server-ai-openai/src/OpenAIProvider.ts @@ -1,6 +1,5 @@ import { OpenAI } from 'openai'; -import { AIProvider } from '@launchdarkly/server-sdk-ai'; import type { ChatResponse, LDAIConfig, @@ -10,6 +9,7 @@ import type { LDTokenUsage, StructuredResponse, } from '@launchdarkly/server-sdk-ai'; +import { AIProvider } from '@launchdarkly/server-sdk-ai'; let instrumentPromise: Promise | undefined; @@ -71,7 +71,7 @@ export class OpenAIProvider extends AIProvider { } catch { logger?.debug( 'OpenTelemetry instrumentation not available for OpenAI provider. ' + - 'Install @traceloop/instrumentation-openai to enable automatic tracing.', + 'Install @traceloop/instrumentation-openai to enable automatic tracing.', ); } })(); diff --git a/packages/ai-providers/server-ai-vercel/package.json b/packages/ai-providers/server-ai-vercel/package.json index 9da3cdddf7..812770519c 100644 --- a/packages/ai-providers/server-ai-vercel/package.json +++ b/packages/ai-providers/server-ai-vercel/package.json @@ -26,9 +26,8 @@ "scripts": { "build": "tsup-node", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test", + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", "test": "jest" }, "files": [ @@ -49,18 +48,16 @@ "@ai-sdk/mistral": "^2.0.0", "@ai-sdk/openai": "^2.0.0", "@launchdarkly/server-sdk-ai": "^0.17.1", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.5.3", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "ai": "^5.0.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.6.1", - "prettier": "^3.0.0", "ts-jest": "^29.1.1", "tsup": "^8.5.1", "typescript": "5.1.6" diff --git a/packages/ai-providers/server-ai-vercel/src/VercelProvider.ts b/packages/ai-providers/server-ai-vercel/src/VercelProvider.ts index 0f98e8ece2..b306452e5c 100644 --- a/packages/ai-providers/server-ai-vercel/src/VercelProvider.ts +++ b/packages/ai-providers/server-ai-vercel/src/VercelProvider.ts @@ -1,6 +1,5 @@ import { generateObject, generateText, jsonSchema, LanguageModel } from 'ai'; -import { AIProvider } from '@launchdarkly/server-sdk-ai'; import type { ChatResponse, LDAIConfig, @@ -10,6 +9,7 @@ import type { LDTokenUsage, StructuredResponse, } from '@launchdarkly/server-sdk-ai'; +import { AIProvider } from '@launchdarkly/server-sdk-ai'; import type { ModelUsageTokens, diff --git a/packages/ai-providers/server-ai-vercel/src/index.ts b/packages/ai-providers/server-ai-vercel/src/index.ts index 6e7eb55023..281b05d0a2 100644 --- a/packages/ai-providers/server-ai-vercel/src/index.ts +++ b/packages/ai-providers/server-ai-vercel/src/index.ts @@ -1,7 +1,7 @@ -export { VercelProvider } from './VercelProvider'; export type { VercelAIModelParameters, VercelAISDKConfig, VercelAISDKMapOptions, VercelAISDKProvider, } from './types'; +export { VercelProvider } from './VercelProvider'; diff --git a/packages/sdk/akamai-base/example/ldClient.ts b/packages/sdk/akamai-base/example/ldClient.ts index 46fc1fa020..e3ea42c893 100644 --- a/packages/sdk/akamai-base/example/ldClient.ts +++ b/packages/sdk/akamai-base/example/ldClient.ts @@ -1,6 +1,6 @@ import { EdgeProvider, init, LDContext } from '@launchdarkly/akamai-server-base-sdk'; -export type { LDContext, EdgeProvider }; +export type { EdgeProvider, LDContext }; const flagData = ` { diff --git a/packages/sdk/akamai-base/package.json b/packages/sdk/akamai-base/package.json index ecccbfeb43..2f001b8192 100644 --- a/packages/sdk/akamai-base/package.json +++ b/packages/sdk/akamai-base/package.json @@ -40,29 +40,27 @@ "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test && yarn doc" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test && yarn doc", + "lint:fix": "eslint . --ext .ts --fix" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.1", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.1", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "rimraf": "^5.0.0", "rollup": "^3.23.0", "rollup-plugin-generate-package-json": "^3.2.0", diff --git a/packages/sdk/akamai-edgekv/package.json b/packages/sdk/akamai-edgekv/package.json index 207034ba28..176df0f81f 100644 --- a/packages/sdk/akamai-edgekv/package.json +++ b/packages/sdk/akamai-edgekv/package.json @@ -40,29 +40,27 @@ "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test && yarn doc" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test && yarn doc", + "lint:fix": "eslint . --ext .ts --fix" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.1", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.1", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "rimraf": "^5.0.0", "rollup": "^3.23.0", "rollup-plugin-generate-package-json": "^3.2.0", diff --git a/packages/sdk/browser/__tests__/MockHasher.ts b/packages/sdk/browser/__tests__/MockHasher.ts index c8da071294..64bcd910b7 100644 --- a/packages/sdk/browser/__tests__/MockHasher.ts +++ b/packages/sdk/browser/__tests__/MockHasher.ts @@ -4,9 +4,11 @@ export class MockHasher implements Hasher { update(_data: string): Hasher { return this; } + digest?(_encoding: string): string { return 'hashed'; } + async asyncDigest?(_encoding: string): Promise { return 'hashed'; } diff --git a/packages/sdk/browser/__tests__/bootstrap.test.ts b/packages/sdk/browser/__tests__/bootstrap.test.ts index 7dff550686..696ea4f805 100644 --- a/packages/sdk/browser/__tests__/bootstrap.test.ts +++ b/packages/sdk/browser/__tests__/bootstrap.test.ts @@ -121,7 +121,7 @@ it('can read old bootstrap data', () => { expect(logger.info).not.toHaveBeenCalled(); expect(logger.warn).toHaveBeenCalledWith( 'LaunchDarkly client was initialized with bootstrap data that did not' + - ' include flag metadata. Events may not be sent correctly.', + ' include flag metadata. Events may not be sent correctly.', ); expect(logger.warn).toHaveBeenCalledTimes(1); expect(logger.error).not.toHaveBeenCalled(); @@ -143,7 +143,7 @@ it('can handle invalid bootstrap data', () => { expect(logger.info).not.toHaveBeenCalled(); expect(logger.warn).toHaveBeenCalledWith( 'LaunchDarkly bootstrap data is not available because the back end' + - ' could not read the flags.', + ' could not read the flags.', ); expect(logger.warn).toHaveBeenCalledTimes(1); expect(logger.error).not.toHaveBeenCalled(); diff --git a/packages/sdk/browser/contract-tests/entity/package.json b/packages/sdk/browser/contract-tests/entity/package.json index 664bc7c7bc..e12ec731cd 100644 --- a/packages/sdk/browser/contract-tests/entity/package.json +++ b/packages/sdk/browser/contract-tests/entity/package.json @@ -11,23 +11,21 @@ "build": "tsc --noEmit && vite build", "lint": "eslint ./src", "start:adapter": "sdk-testharness-server adapter", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../../.prettierignore" + "lint:fix": "eslint ./src --fix" }, "dependencies": { "@launchdarkly/js-client-sdk": "workspace:^", "@launchdarkly/js-contract-test-utils": "workspace:^" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "playwright": "^1.49.1", - "prettier": "^3.0.0", "typescript": "^5.5.3", "vite": "^5.4.1" } diff --git a/packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts b/packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts index 17a88b61fc..20ab9aebb3 100644 --- a/packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts +++ b/packages/sdk/browser/contract-tests/entity/src/ClientEntity.ts @@ -8,6 +8,7 @@ import { SynchronizerEntry, } from '@launchdarkly/js-client-sdk'; import { + ClientSideTestHook as TestHook, CommandParams, CommandType, CreateInstanceParams, @@ -16,7 +17,6 @@ import { SDKConfigDataSynchronizer, SDKConfigModeDefinition, SDKConfigParams, - ClientSideTestHook as TestHook, ValueType, } from '@launchdarkly/js-contract-test-utils/client'; @@ -123,9 +123,9 @@ function makeSdkConfig(options: SDKConfigParams, tag: string) { if (options.dataSystem.connectionModeConfig) { const connMode = options.dataSystem.connectionModeConfig; - dataSystem.automaticModeSwitching = connMode.initialConnectionMode - ? { type: 'manual', initialConnectionMode: connMode.initialConnectionMode } - : false; + dataSystem.automaticModeSwitching = connMode.initialConnectionMode ? + { type: 'manual', initialConnectionMode: connMode.initialConnectionMode } : + false; if (connMode.customConnectionModes) { const connectionModes: Record = {}; @@ -323,9 +323,9 @@ export async function newSdkClientEntity(options: CreateInstanceParams) { const timeout = options.configuration.startWaitTimeMs !== null && - options.configuration.startWaitTimeMs !== undefined - ? options.configuration.startWaitTimeMs - : 5000; + options.configuration.startWaitTimeMs !== undefined ? + options.configuration.startWaitTimeMs : + 5000; const sdkConfig = makeSdkConfig(options.configuration, options.tag); const initialContext = options.configuration.clientSide?.initialUser || diff --git a/packages/sdk/browser/contract-tests/entity/src/TestHarnessWebSocket.ts b/packages/sdk/browser/contract-tests/entity/src/TestHarnessWebSocket.ts index 6f82d0c5ea..15cc4166df 100644 --- a/packages/sdk/browser/contract-tests/entity/src/TestHarnessWebSocket.ts +++ b/packages/sdk/browser/contract-tests/entity/src/TestHarnessWebSocket.ts @@ -12,7 +12,7 @@ export default class TestHarnessWebSocket { constructor(private readonly _url: string) {} connect() { - this._logger.info(`Connecting to web socket.`); + this._logger.info('Connecting to web socket.'); this._ws = new WebSocket(this._url, ['v1']); this._ws.onopen = () => { this._logger.info('Connected to websocket.'); @@ -24,7 +24,7 @@ export default class TestHarnessWebSocket { }, 1000); }; this._ws.onerror = (err) => { - this._logger.info(`error:`, err); + this._logger.info('error:', err); }; this._ws.onmessage = async (msg) => { diff --git a/packages/sdk/browser/contract-tests/entity/src/main.ts b/packages/sdk/browser/contract-tests/entity/src/main.ts index 9869306e36..00e1f9079d 100644 --- a/packages/sdk/browser/contract-tests/entity/src/main.ts +++ b/packages/sdk/browser/contract-tests/entity/src/main.ts @@ -1,5 +1,5 @@ -// eslint-disable-next-line prettier/prettier import './style.css'; + import TestHarnessWebSocket from './TestHarnessWebSocket'; async function runContractTests() { diff --git a/packages/sdk/browser/package.json b/packages/sdk/browser/package.json index fdb9152cbd..3d4fb0889d 100644 --- a/packages/sdk/browser/package.json +++ b/packages/sdk/browser/package.json @@ -39,28 +39,26 @@ "clean": "rimraf dist", "build": "tsup", "lint": "eslint . --ext .ts,.tsx", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "npx jest --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts,.tsx --fix" }, "dependencies": { "@launchdarkly/js-client-sdk-common": "1.26.1" }, "devDependencies": { "@jest/globals": "^29.7.0", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.5.11", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "ts-jest": "^29.1.1", "tsup": "^8.3.5", diff --git a/packages/sdk/browser/src/BrowserClient.ts b/packages/sdk/browser/src/BrowserClient.ts index 465bcfbaac..e192b5d84b 100644 --- a/packages/sdk/browser/src/BrowserClient.ts +++ b/packages/sdk/browser/src/BrowserClient.ts @@ -11,13 +11,13 @@ import { FlagManager, Hook, internal, - LDIdentifyOptions as LDBaseIdentifyOptions, LDClientImpl, LDContext, LDEmitter, LDEmitterEventName, LDFlagValue, LDHeaders, + LDIdentifyOptions as LDBaseIdentifyOptions, LDIdentifyResult, LDPluginEnvironmentMetadata, LDWaitForInitializationOptions, @@ -239,9 +239,9 @@ class BrowserClientImpl extends LDClientImpl { identifyOptions?: LDIdentifyOptions, ): Promise { const options = - identifyOptions?.sheddable === undefined - ? { ...identifyOptions, sheddable: true } - : identifyOptions; + identifyOptions?.sheddable === undefined ? + { ...identifyOptions, sheddable: true } : + identifyOptions; const res = await super.identifyResult(context, options); // Ensure that we do not start the goal manager if start() is not called. if (this.startPromise) { @@ -254,14 +254,14 @@ class BrowserClientImpl extends LDClientImpl { if (!this.dataManager.setConnectionMode) { this.logger.warn( 'setConnectionMode requires the FDv2 data system (dataSystem option). ' + - 'The call has no effect without it.', + 'The call has no effect without it.', ); return; } if (mode !== undefined && !(mode in MODE_TABLE)) { this.logger.warn( `setConnectionMode called with invalid mode '${mode}'. ` + - `Valid modes: ${Object.keys(MODE_TABLE).join(', ')}.`, + `Valid modes: ${Object.keys(MODE_TABLE).join(', ')}.`, ); return; } diff --git a/packages/sdk/browser/src/LDClient.ts b/packages/sdk/browser/src/LDClient.ts index 5a86a4835e..99f34b1904 100644 --- a/packages/sdk/browser/src/LDClient.ts +++ b/packages/sdk/browser/src/LDClient.ts @@ -1,9 +1,9 @@ import { - LDClient as CommonClient, - LDStartOptions as CommonLDStartOptions, FDv2ConnectionMode, + LDClient as CommonClient, LDContext, LDIdentifyResult, + LDStartOptions as CommonLDStartOptions, LDWaitForInitializationOptions, LDWaitForInitializationResult, } from '@launchdarkly/js-client-sdk-common'; diff --git a/packages/sdk/browser/src/common.ts b/packages/sdk/browser/src/common.ts index e20785b264..5349072aa4 100644 --- a/packages/sdk/browser/src/common.ts +++ b/packages/sdk/browser/src/common.ts @@ -10,56 +10,56 @@ export type { AutoEnvAttributes, BasicLogger, BasicLoggerOptions, + CacheDataSourceEntry, + EndpointConfig, EvaluationSeriesContext, EvaluationSeriesData, + // FDv2 data system configuration types. + FDv2ConnectionMode, Hook, HookMetadata, IdentifySeriesContext, IdentifySeriesData, IdentifySeriesResult, IdentifySeriesStatus, + InitializerEntry, LDContext, LDContextCommon, LDContextMeta, LDContextStrict, + LDDebugOverride, LDEvaluationDetail, LDEvaluationDetailTyped, LDEvaluationReason, LDFlagSet, LDFlagValue, - LDTimeoutError, + LDIdentifyError, + LDIdentifyResult, + LDIdentifyShed, + LDIdentifySuccess, + LDIdentifyTimeout, LDInspection, LDLogger, LDLogLevel, LDMultiKindContext, - LDSingleKindContext, - TrackSeriesContext, + LDPluginApplicationMetadata, LDPluginBase, LDPluginEnvironmentMetadata, - LDPluginSdkMetadata, - LDPluginApplicationMetadata, LDPluginMetadata, - LDIdentifyResult, - LDIdentifySuccess, - LDIdentifyError, - LDIdentifyTimeout, - LDIdentifyShed, - LDDebugOverride, - LDWaitForInitializationOptions, - LDWaitForInitializationResult, + LDPluginSdkMetadata, + LDSingleKindContext, + LDTimeoutError, LDWaitForInitializationComplete, LDWaitForInitializationFailed, + LDWaitForInitializationOptions, + LDWaitForInitializationResult, LDWaitForInitializationTimeout, - // FDv2 data system configuration types. - FDv2ConnectionMode, - InitializerEntry, - SynchronizerEntry, - ModeDefinition, ManualModeSwitching, - CacheDataSourceEntry, + ModeDefinition, PollingDataSourceEntry, StreamingDataSourceEntry, - EndpointConfig, + SynchronizerEntry, + TrackSeriesContext, } from '@launchdarkly/js-client-sdk-common'; /** diff --git a/packages/sdk/browser/src/index.ts b/packages/sdk/browser/src/index.ts index 8889f1a9ec..327dc01b7b 100644 --- a/packages/sdk/browser/src/index.ts +++ b/packages/sdk/browser/src/index.ts @@ -18,8 +18,8 @@ import { BrowserOptions as LDOptions } from './options'; export * from './common'; export type { LDClient, LDOptions, LDStartOptions }; -export type { BrowserDataSystemOptions } from './options'; export type { LDPlugin } from './LDPlugin'; +export type { BrowserDataSystemOptions } from './options'; /** * Creates an instance of the LaunchDarkly client. Note that the client will not be ready to diff --git a/packages/sdk/browser/src/platform/BrowserRequests.ts b/packages/sdk/browser/src/platform/BrowserRequests.ts index 5e73467843..be5ebcec34 100644 --- a/packages/sdk/browser/src/platform/BrowserRequests.ts +++ b/packages/sdk/browser/src/platform/BrowserRequests.ts @@ -1,7 +1,7 @@ import { + EventSource as LDEventSource, EventSourceCapabilities, EventSourceInitDict, - EventSource as LDEventSource, Options, Requests, Response, diff --git a/packages/sdk/browser/src/platform/DefaultBrowserEventSource.ts b/packages/sdk/browser/src/platform/DefaultBrowserEventSource.ts index 4a2ea36998..1f604a903f 100644 --- a/packages/sdk/browser/src/platform/DefaultBrowserEventSource.ts +++ b/packages/sdk/browser/src/platform/DefaultBrowserEventSource.ts @@ -2,9 +2,9 @@ import { DefaultBackoff, EventListener, EventName, + EventSource as LDEventSource, EventSourceInitDict, HttpErrorResponse, - EventSource as LDEventSource, } from '@launchdarkly/js-client-sdk-common'; /** diff --git a/packages/sdk/cloudflare/example/package.json b/packages/sdk/cloudflare/example/package.json index 6f22b792e9..3fd4574e08 100644 --- a/packages/sdk/cloudflare/example/package.json +++ b/packages/sdk/cloudflare/example/package.json @@ -15,7 +15,6 @@ "jest": "^29.7.0", "jest-environment-miniflare": "^2.5.0", "miniflare": "^2.5.0", - "prettier": "^3.2.5", "ts-jest": "^28.0.3", "typescript": "5.1.6", "wrangler": "3.114.17" diff --git a/packages/sdk/cloudflare/package.json b/packages/sdk/cloudflare/package.json index 7e5bc48e1a..a1dec8753d 100644 --- a/packages/sdk/cloudflare/package.json +++ b/packages/sdk/cloudflare/package.json @@ -34,10 +34,10 @@ "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts --fix" }, "dependencies": { "@cloudflare/workers-types": "^4.20230321.0", @@ -50,21 +50,19 @@ "@rollup/plugin-node-resolve": "^15.2.1", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.3", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.0", "@types/rollup-plugin-generate-package-json": "^3.2.3", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", "miniflare": "^2.13.0", - "prettier": "^3.0.0", "rimraf": "^5.0.1", "rollup": "^3.29.2", "rollup-plugin-filesize": "^10.0.0", diff --git a/packages/sdk/cloudflare/src/index.ts b/packages/sdk/cloudflare/src/index.ts index 5400290e58..69674ef41d 100644 --- a/packages/sdk/cloudflare/src/index.ts +++ b/packages/sdk/cloudflare/src/index.ts @@ -22,10 +22,10 @@ import { import createPlatformInfo from './createPlatformInfo'; export { - createMigration, BasicLogger, type BasicLoggerOptions, type Cache, + createMigration, EdgeFeatureStore, type EdgeProvider, integrations, @@ -33,26 +33,26 @@ export { type LDBigSegmentsOptions, type LDClient, type LDClientContext, - type LDContext, LDConcurrentExecution, + type LDContext, type LDEvaluationDetail, type LDEvaluationDetailTyped, type LDFeatureStore, - type LDFlagValue, type LDFlagsState, type LDFlagsStateOptions, + type LDFlagValue, type LDLogger, - type LDMigration, type LDMethodResult, - type LDMigrationOptions, + type LDMigration, type LDMigrationOpEvent, + type LDMigrationOptions, type LDMigrationOrigin, type LDMigrationReadResult, type LDMigrationResult, LDMigrationStage, LDMigrationSuccess, - type LDMigrationWriteResult, type LDMigrationVariation, + type LDMigrationWriteResult, type LDProxyOptions, type LDTLSOptions, type LDWaitForInitializationOptions, diff --git a/packages/sdk/combined-browser/package.json b/packages/sdk/combined-browser/package.json index 32b9963f2b..0c54abb3b4 100644 --- a/packages/sdk/combined-browser/package.json +++ b/packages/sdk/combined-browser/package.json @@ -39,10 +39,10 @@ "clean": "rimraf dist", "build": "tsup", "lint": "eslint . --ext .ts,.tsx", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "npx jest --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts,.tsx --fix" }, "dependencies": { "@launchdarkly/js-client-sdk": "4.6.3", @@ -51,18 +51,16 @@ }, "devDependencies": { "@jest/globals": "^29.7.0", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.5.11", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "ts-jest": "^29.1.1", "tsup": "^8.3.5", diff --git a/packages/sdk/combined-browser/src/index.ts b/packages/sdk/combined-browser/src/index.ts index 9bfd844c04..54491b2e83 100644 --- a/packages/sdk/combined-browser/src/index.ts +++ b/packages/sdk/combined-browser/src/index.ts @@ -20,7 +20,6 @@ import Observability, { ObserveOptions } from '@launchdarkly/observability'; import SessionReplay, { RecordOptions } from '@launchdarkly/session-replay'; export * from '@launchdarkly/js-client-sdk'; - export { LDObserve, ObserveOptions } from '@launchdarkly/observability'; export { LDRecord, RecordOptions } from '@launchdarkly/session-replay'; diff --git a/packages/sdk/electron/__tests__/ElectronClient.ipcMain.test.ts b/packages/sdk/electron/__tests__/ElectronClient.ipcMain.test.ts index 2b126859c9..dba6e33eee 100644 --- a/packages/sdk/electron/__tests__/ElectronClient.ipcMain.test.ts +++ b/packages/sdk/electron/__tests__/ElectronClient.ipcMain.test.ts @@ -1,5 +1,5 @@ -import { ipcMain } from 'electron'; import type { IpcMain } from 'electron'; +import { ipcMain } from 'electron'; import type { LDContext, diff --git a/packages/sdk/electron/__tests__/bridge/LDClientBridge.test.ts b/packages/sdk/electron/__tests__/bridge/LDClientBridge.test.ts index e5a8de2e14..066daa6b59 100644 --- a/packages/sdk/electron/__tests__/bridge/LDClientBridge.test.ts +++ b/packages/sdk/electron/__tests__/bridge/LDClientBridge.test.ts @@ -1,6 +1,7 @@ +import '../../src/bridge'; + import { ipcRenderer } from 'electron'; -import '../../src/bridge'; import type { LDClientBridge } from '../../src/bridge/LDClientBridge'; import { deriveNamespace } from '../../src/ElectronIPC'; import type { LDContext } from '../../src/index'; diff --git a/packages/sdk/electron/__tests__/platform/ElectronRequests.test.ts b/packages/sdk/electron/__tests__/platform/ElectronRequests.test.ts index 11ccb91bd7..ed9af6ec84 100644 --- a/packages/sdk/electron/__tests__/platform/ElectronRequests.test.ts +++ b/packages/sdk/electron/__tests__/platform/ElectronRequests.test.ts @@ -36,9 +36,9 @@ beforeEach(() => { resolve({ method: req.method, body: - req.headers['content-encoding'] === 'gzip' - ? Buffer.concat(chunks) - : Buffer.concat(chunks).toString(), + req.headers['content-encoding'] === 'gzip' ? + Buffer.concat(chunks) : + Buffer.concat(chunks).toString(), headers: req.headers, }); }); diff --git a/packages/sdk/electron/contract-tests/entity/forge.config.ts b/packages/sdk/electron/contract-tests/entity/forge.config.ts index 642a6ccb97..3763fc30bf 100644 --- a/packages/sdk/electron/contract-tests/entity/forge.config.ts +++ b/packages/sdk/electron/contract-tests/entity/forge.config.ts @@ -1,4 +1,5 @@ /* eslint-disable import/no-extraneous-dependencies */ +import { FuseV1Options, FuseVersion } from '@electron/fuses'; import { MakerDeb } from '@electron-forge/maker-deb'; import { MakerRpm } from '@electron-forge/maker-rpm'; import { MakerSquirrel } from '@electron-forge/maker-squirrel'; @@ -6,7 +7,6 @@ import { MakerZIP } from '@electron-forge/maker-zip'; import { FusesPlugin } from '@electron-forge/plugin-fuses'; import { VitePlugin } from '@electron-forge/plugin-vite'; import type { ForgeConfig } from '@electron-forge/shared-types'; -import { FuseV1Options, FuseVersion } from '@electron/fuses'; const config: ForgeConfig = { packagerConfig: { diff --git a/packages/sdk/electron/contract-tests/entity/package.json b/packages/sdk/electron/contract-tests/entity/package.json index a46dac3cc2..67ccfecc7b 100644 --- a/packages/sdk/electron/contract-tests/entity/package.json +++ b/packages/sdk/electron/contract-tests/entity/package.json @@ -22,11 +22,13 @@ "@electron-forge/plugin-vite": "^7.11.1", "@electron/fuses": "^1.8.0", "@launchdarkly/electron-client-sdk": "workspace:^", + "@stylistic/eslint-plugin": "^4.0.0", "@types/electron-squirrel-startup": "^1.0.2", "@types/express": "^5.0.6", "@typescript-eslint/parser": "^5.62.0", "electron": "^40.2.1", "eslint": "^8.57.1", + "eslint-plugin-simple-import-sort": "^12.0.0", "playwright": "^1.49.1", "typescript": "~4.5.4", "vite": "^5.4.21" diff --git a/packages/sdk/electron/contract-tests/entity/src/ClientEntity.ts b/packages/sdk/electron/contract-tests/entity/src/ClientEntity.ts index 657301ae71..3365c5e692 100644 --- a/packages/sdk/electron/contract-tests/entity/src/ClientEntity.ts +++ b/packages/sdk/electron/contract-tests/entity/src/ClientEntity.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { app } from 'electron'; import fs from 'node:fs'; import path from 'node:path'; +import { app } from 'electron'; // eslint-disable-next-line import/no-extraneous-dependencies import { @@ -12,12 +12,12 @@ import { resetElectronStorage, } from '@launchdarkly/electron-client-sdk'; import { + ClientSideTestHook as TestHook, CommandParams, CommandType, CreateInstanceParams, makeLogger, SDKConfigParams, - ClientSideTestHook as TestHook, ValueType, } from '@launchdarkly/js-contract-test-utils/client'; @@ -267,9 +267,9 @@ export async function createEntity(options: CreateInstanceParams) { const timeoutMs = options.configuration.startWaitTimeMs !== null && - options.configuration.startWaitTimeMs !== undefined - ? options.configuration.startWaitTimeMs - : 5000; + options.configuration.startWaitTimeMs !== undefined ? + options.configuration.startWaitTimeMs : + 5000; const sdkConfig = makeSdkConfig(options.configuration, options.tag); const initialContext = options.configuration.clientSide?.initialUser || diff --git a/packages/sdk/electron/example/package.json b/packages/sdk/electron/example/package.json index b069c6a8c6..1e89480956 100644 --- a/packages/sdk/electron/example/package.json +++ b/packages/sdk/electron/example/package.json @@ -26,10 +26,12 @@ "@electron-forge/plugin-vite": "^7.11.1", "@electron/fuses": "^1.8.0", "@playwright/test": "^1.58.2", + "@stylistic/eslint-plugin": "^4.0.0", "@types/electron-squirrel-startup": "^1.0.2", "@typescript-eslint/parser": "^5.62.0", "electron": "^40.4.1", "eslint": "^8.57.1", + "eslint-plugin-simple-import-sort": "^12.0.0", "playwright": "^1.49.1", "typescript": "~4.5.4", "vite": "^5.4.21" diff --git a/packages/sdk/electron/package.json b/packages/sdk/electron/package.json index 3b7f3e6b3b..0c70a48495 100644 --- a/packages/sdk/electron/package.json +++ b/packages/sdk/electron/package.json @@ -45,7 +45,7 @@ "scripts": { "build": "tsup", "lint": "eslint . --ext .ts", - "lint:fix": "yarn lint --fix", + "lint:fix": "eslint . --ext .ts --fix", "test": "jest" }, "peerDependencies": { @@ -57,19 +57,17 @@ "launchdarkly-eventsource": "2.2.0" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "electron": "^34.5.6", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "ts-jest": "^29.0.5", "tsup": "^8.5.1", "typedoc": "0.25.0", diff --git a/packages/sdk/electron/src/ElectronClient.ts b/packages/sdk/electron/src/ElectronClient.ts index b32a7b1cba..85f8ebeafe 100644 --- a/packages/sdk/electron/src/ElectronClient.ts +++ b/packages/sdk/electron/src/ElectronClient.ts @@ -1,5 +1,5 @@ -import { ipcMain } from 'electron'; import type { IpcMainEvent, MessagePortMain } from 'electron'; +import { ipcMain } from 'electron'; import { AutoEnvAttributes, @@ -81,10 +81,10 @@ export class ElectronClient extends LDClientImpl { const { useClientSideId } = validatedElectronOptions; const internalOptions: LDClientInternalOptions = { - analyticsEventPath: useClientSideId ? `/events/bulk/${credential}` : `/mobile`, - diagnosticEventPath: useClientSideId - ? `/events/diagnostic/${credential}` - : `/mobile/events/diagnostic`, + analyticsEventPath: useClientSideId ? `/events/bulk/${credential}` : '/mobile', + diagnosticEventPath: useClientSideId ? + `/events/diagnostic/${credential}` : + '/mobile/events/diagnostic', highTimeoutThreshold: 15, getImplementationHooks: (_environmentMetadata: LDPluginEnvironmentMetadata) => internal.safeGetHooks(logger, _environmentMetadata, validatedElectronOptions.plugins), @@ -145,9 +145,9 @@ export class ElectronClient extends LDClientImpl { identifyOptions?: LDIdentifyOptions, ): Promise { const options = - identifyOptions?.sheddable === undefined - ? { ...identifyOptions, sheddable: true } - : identifyOptions; + identifyOptions?.sheddable === undefined ? + { ...identifyOptions, sheddable: true } : + identifyOptions; return super.identifyResult(context, options); } diff --git a/packages/sdk/electron/src/LDCommon.ts b/packages/sdk/electron/src/LDCommon.ts index 87f72731ba..5f1933a704 100644 --- a/packages/sdk/electron/src/LDCommon.ts +++ b/packages/sdk/electron/src/LDCommon.ts @@ -1,7 +1,6 @@ import { BasicLogger, BasicLoggerOptions, LDLogger } from '@launchdarkly/js-client-sdk-common'; export type { - LDIdentifyOptions, AutoEnvAttributes, BasicLogger, BasicLoggerOptions, @@ -17,34 +16,35 @@ export type { LDContextCommon, LDContextMeta, LDContextStrict, + LDDebugOverride, LDEvaluationDetail, LDEvaluationDetailTyped, LDEvaluationReason, LDFlagSet, LDFlagValue, - LDTimeoutError, + LDIdentifyError, + LDIdentifyOptions, + LDIdentifyResult, + LDIdentifyShed, + LDIdentifySuccess, + LDIdentifyTimeout, LDInspection, LDLogger, LDLogLevel, LDMultiKindContext, - LDSingleKindContext, - TrackSeriesContext, + LDPluginApplicationMetadata, LDPluginBase, LDPluginEnvironmentMetadata, - LDPluginSdkMetadata, - LDPluginApplicationMetadata, LDPluginMetadata, - LDIdentifyResult, - LDIdentifySuccess, - LDIdentifyError, - LDIdentifyTimeout, - LDIdentifyShed, - LDDebugOverride, - LDWaitForInitializationOptions, - LDWaitForInitializationResult, + LDPluginSdkMetadata, + LDSingleKindContext, + LDTimeoutError, LDWaitForInitializationComplete, LDWaitForInitializationFailed, + LDWaitForInitializationOptions, + LDWaitForInitializationResult, LDWaitForInitializationTimeout, + TrackSeriesContext, } from '@launchdarkly/js-client-sdk-common'; /** diff --git a/packages/sdk/electron/src/index.ts b/packages/sdk/electron/src/index.ts index cd6913c60c..9bcc3790ee 100644 --- a/packages/sdk/electron/src/index.ts +++ b/packages/sdk/electron/src/index.ts @@ -10,8 +10,8 @@ export * from './LDCommon'; export { resetElectronStorage } from './platform/ElectronStorage'; export type { - ElectronOptions as LDOptions, LDClient, + ElectronOptions as LDOptions, LDPlugin, LDProxyOptions, LDStartOptions, diff --git a/packages/sdk/electron/src/options.ts b/packages/sdk/electron/src/options.ts index 1da697b26a..c21125db3b 100644 --- a/packages/sdk/electron/src/options.ts +++ b/packages/sdk/electron/src/options.ts @@ -14,6 +14,7 @@ class ConnectionModeValidator implements TypeValidator { is(u: unknown): u is ConnectionMode { return u === 'offline' || u === 'streaming' || u === 'polling'; } + getType(): string { return 'ConnectionMode (offline | streaming | polling)'; } diff --git a/packages/sdk/electron/src/platform/ElectronRequests.ts b/packages/sdk/electron/src/platform/ElectronRequests.ts index 902242eb32..bcd4cb875a 100644 --- a/packages/sdk/electron/src/platform/ElectronRequests.ts +++ b/packages/sdk/electron/src/platform/ElectronRequests.ts @@ -128,16 +128,15 @@ export default class ElectronRequests implements platform.Requests { // Note this does not affect SSE as the event source is not using this fetch implementation. if (options.method?.toLowerCase() === 'get') { headers['accept-encoding'] = 'gzip'; - } - // For post requests we are going to support compressed post bodies if the - // enableEventCompression config setting is true and the compressBodyIfPossible - // option is true. - else if ( + } else if ( this._enableBodyCompression && !!options.compressBodyIfPossible && options.method?.toLowerCase() === 'post' && options.body ) { + // For post requests we are going to support compressed post bodies if the + // enableEventCompression config setting is true and the compressBodyIfPossible + // option is true. headers['content-encoding'] = 'gzip'; bodyData = await gzip(Buffer.from(options.body, 'utf8')); } diff --git a/packages/sdk/electron/src/platform/HeaderWrapper.ts b/packages/sdk/electron/src/platform/HeaderWrapper.ts index 9c447c2a8f..0c86d89923 100644 --- a/packages/sdk/electron/src/platform/HeaderWrapper.ts +++ b/packages/sdk/electron/src/platform/HeaderWrapper.ts @@ -34,7 +34,7 @@ export default class HeaderWrapper implements platform.Headers { // We want to use generators here for the simplicity of maintaining // this interface. Also they aren't expected to be high frequency usage. - *values(): Iterable { + * values(): Iterable { for (const key of this.keys()) { const val = this.get(key); if (val !== null) { @@ -43,7 +43,7 @@ export default class HeaderWrapper implements platform.Headers { } } - *entries(): Iterable<[string, string]> { + * entries(): Iterable<[string, string]> { for (const key of this.keys()) { const val = this.get(key); if (val !== null) { diff --git a/packages/sdk/fastly/package.json b/packages/sdk/fastly/package.json index 7441d9b8fc..c76319a3ac 100644 --- a/packages/sdk/fastly/package.json +++ b/packages/sdk/fastly/package.json @@ -42,8 +42,8 @@ "lint": "eslint . --ext .ts", "test": "npx jest --runInBand", "coverage": "yarn test --coverage", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts --fix" }, "dependencies": { "@fastly/js-compute": "^3.30.1", @@ -51,18 +51,16 @@ "crypto-js": "^4.2.0" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^5.2.2", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.2.2", "@types/jest": "^29.5.14", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^10.0.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.11.0", - "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", - "prettier": "^3.4.2", "rimraf": "^6.0.1", "ts-jest": "^29.2.5", "tsup": "^8.3.5", diff --git a/packages/sdk/fastly/src/platform/requests.ts b/packages/sdk/fastly/src/platform/requests.ts index 3315c3b078..4da2d8b4bf 100644 --- a/packages/sdk/fastly/src/platform/requests.ts +++ b/packages/sdk/fastly/src/platform/requests.ts @@ -1,5 +1,4 @@ /// -import { NullEventSource } from '@launchdarkly/js-server-sdk-common'; import type { EventSource, EventSourceCapabilities, @@ -8,6 +7,7 @@ import type { Requests, Response, } from '@launchdarkly/js-server-sdk-common'; +import { NullEventSource } from '@launchdarkly/js-server-sdk-common'; export default class EdgeRequests implements Requests { eventsBackend: string; diff --git a/packages/sdk/react-native/__tests__/MobileDataManager.test.ts b/packages/sdk/react-native/__tests__/MobileDataManager.test.ts index fdbf72ad35..64ac7560db 100644 --- a/packages/sdk/react-native/__tests__/MobileDataManager.test.ts +++ b/packages/sdk/react-native/__tests__/MobileDataManager.test.ts @@ -139,7 +139,7 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/msdk/evalx/contexts/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); @@ -155,13 +155,13 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/meval/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/meval`; + return '/meval'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), baseHeaders, @@ -365,7 +365,7 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/msdk/evalx/contexts/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); @@ -379,13 +379,13 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/meval/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/meval`; + return '/meval'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), baseHeaders, @@ -425,7 +425,7 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/msdk/evalx/contexts/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); @@ -439,13 +439,13 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/meval/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/meval`; + return '/meval'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), baseHeaders, @@ -479,7 +479,7 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/msdk/evalx/contexts/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); @@ -493,13 +493,13 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/meval/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/meval`; + return '/meval'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), baseHeaders, @@ -540,7 +540,7 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/msdk/evalx/contexts/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); @@ -554,13 +554,13 @@ describe('given a MobileDataManager with mocked dependencies', () => { return `/meval/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/meval`; + return '/meval'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), baseHeaders, diff --git a/packages/sdk/react-native/__tests__/platform/ConnectionManager.test.ts b/packages/sdk/react-native/__tests__/platform/ConnectionManager.test.ts index 9bc8e20c1a..be9b66908b 100644 --- a/packages/sdk/react-native/__tests__/platform/ConnectionManager.test.ts +++ b/packages/sdk/react-native/__tests__/platform/ConnectionManager.test.ts @@ -23,9 +23,11 @@ class MockDetector implements StateDetector { setApplicationStateListener(fn: (state: ApplicationState) => void): void { this.appStateListener = fn; } + setNetworkStateListener(fn: (state: NetworkState) => void): void { this.networkStateListener = fn; } + stopListening(): void { this.appStateListener = undefined; this.networkStateListener = undefined; diff --git a/packages/sdk/react-native/contract-tests/entity/src/ClientEntity.ts b/packages/sdk/react-native/contract-tests/entity/src/ClientEntity.ts index 19d87944d9..40cec0f4f3 100644 --- a/packages/sdk/react-native/contract-tests/entity/src/ClientEntity.ts +++ b/packages/sdk/react-native/contract-tests/entity/src/ClientEntity.ts @@ -1,10 +1,10 @@ import { + ClientSideTestHook as TestHook, CommandParams, CommandType, CreateInstanceParams, makeLogger, SDKConfigParams, - ClientSideTestHook as TestHook, ValueType, } from '@launchdarkly/js-contract-test-utils/client'; import { @@ -208,15 +208,15 @@ export async function newSdkClientEntity(options: CreateInstanceParams) { const timeout = options.configuration.startWaitTimeMs !== null && - options.configuration.startWaitTimeMs !== undefined - ? options.configuration.startWaitTimeMs - : 5000; + options.configuration.startWaitTimeMs !== undefined ? + options.configuration.startWaitTimeMs : + 5000; const sdkConfig = makeSdkConfig(options.configuration, options.tag); - const autoEnvAttributes = options.configuration.clientSide?.includeEnvironmentAttributes - ? AutoEnvAttributes.Enabled - : AutoEnvAttributes.Disabled; + const autoEnvAttributes = options.configuration.clientSide?.includeEnvironmentAttributes ? + AutoEnvAttributes.Enabled : + AutoEnvAttributes.Disabled; const initialContext = options.configuration.clientSide?.initialUser || diff --git a/packages/sdk/react-native/contract-tests/entity/src/TestHarnessWebSocket.ts b/packages/sdk/react-native/contract-tests/entity/src/TestHarnessWebSocket.ts index 24cd7cff2b..8a35c13257 100644 --- a/packages/sdk/react-native/contract-tests/entity/src/TestHarnessWebSocket.ts +++ b/packages/sdk/react-native/contract-tests/entity/src/TestHarnessWebSocket.ts @@ -20,7 +20,7 @@ export default class TestHarnessWebSocket { connect() { this._intentionalClose = false; - this._logger.info(`Connecting to web socket.`); + this._logger.info('Connecting to web socket.'); this._ws = new WebSocket(this._url, 'v1'); this._ws.onopen = () => { this._logger.info('Connected to websocket.'); @@ -36,7 +36,7 @@ export default class TestHarnessWebSocket { } }; this._ws.onerror = (err) => { - this._logger.info(`error:`, err); + this._logger.info('error:', err); }; this._ws.onmessage = async (msg) => { diff --git a/packages/sdk/react-native/package.json b/packages/sdk/react-native/package.json index c9b50f1523..d18fbff9b1 100644 --- a/packages/sdk/react-native/package.json +++ b/packages/sdk/react-native/package.json @@ -31,10 +31,10 @@ "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts,.tsx", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "jest", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts,.tsx --fix" }, "peerDependencies": { "react": "*", @@ -46,21 +46,19 @@ "base64-js": "^1.5.1" }, "devDependencies": { + "@stylistic/eslint-plugin": "^4.0.0", "@testing-library/react": "^14.1.2", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.5.11", "@types/react": "^18.2.31", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", "launchdarkly-js-test-helpers": "^2.2.0", "metro-react-native-babel-preset": "^0.77.0", - "prettier": "^3.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-native": "^0.73.1", diff --git a/packages/sdk/react-native/src/ReactNativeLDClient.ts b/packages/sdk/react-native/src/ReactNativeLDClient.ts index f21a717a1f..ce0c2b9e48 100644 --- a/packages/sdk/react-native/src/ReactNativeLDClient.ts +++ b/packages/sdk/react-native/src/ReactNativeLDClient.ts @@ -99,8 +99,8 @@ export default class ReactNativeLDClient extends LDClientImpl { const validatedRnOptions = validateOptions(options, logger); const internalOptions: LDClientInternalOptions = { - analyticsEventPath: `/mobile`, - diagnosticEventPath: `/mobile/events/diagnostic`, + analyticsEventPath: '/mobile', + diagnosticEventPath: '/mobile/events/diagnostic', highTimeoutThreshold: 15, getImplementationHooks: (_environmentMetadata: LDPluginEnvironmentMetadata) => internal.safeGetHooks(logger, _environmentMetadata, validatedRnOptions.plugins), @@ -263,7 +263,7 @@ export default class ReactNativeLDClient extends LDClientImpl { if (mode !== undefined && !(mode in MODE_TABLE)) { this.logger.warn( `setConnectionMode called with invalid mode '${mode}'. ` + - `Valid modes: ${Object.keys(MODE_TABLE).join(', ')}.`, + `Valid modes: ${Object.keys(MODE_TABLE).join(', ')}.`, ); return; } diff --git a/packages/sdk/react-native/src/hooks/variation/index.ts b/packages/sdk/react-native/src/hooks/variation/index.ts index ee37f1e8c7..d543054893 100644 --- a/packages/sdk/react-native/src/hooks/variation/index.ts +++ b/packages/sdk/react-native/src/hooks/variation/index.ts @@ -1,2 +1,2 @@ -export * from './useVariation'; export * from './useTypedVariation'; +export * from './useVariation'; diff --git a/packages/sdk/react-native/src/index.ts b/packages/sdk/react-native/src/index.ts index 765e433bb7..19871fbac9 100644 --- a/packages/sdk/react-native/src/index.ts +++ b/packages/sdk/react-native/src/index.ts @@ -8,17 +8,16 @@ import ReactNativeLDClient from './ReactNativeLDClient'; import RNOptions, { RNDataSystemOptions, RNStorage } from './RNOptions'; -export * from '@launchdarkly/js-client-sdk-common'; - export * from './hooks'; -export * from './provider'; export * from './LDPlugin'; +export * from './provider'; +export * from '@launchdarkly/js-client-sdk-common'; // Override the common type with a client specific one. // TODO: we will remove this once we major version this SDK. export type { - LDEvaluationDetailTyped, LDEvaluationDetail, + LDEvaluationDetailTyped, } from './hooks/variation/LDEvaluationDetail'; -export { ReactNativeLDClient, RNOptions as LDOptions, RNDataSystemOptions, RNStorage }; +export { RNOptions as LDOptions, ReactNativeLDClient, RNDataSystemOptions, RNStorage }; diff --git a/packages/sdk/react-native/src/options.ts b/packages/sdk/react-native/src/options.ts index af7587dd0d..7a8128d23b 100644 --- a/packages/sdk/react-native/src/options.ts +++ b/packages/sdk/react-native/src/options.ts @@ -14,6 +14,7 @@ class ConnectionModeValidator implements TypeValidator { is(u: unknown): u is ConnectionMode { return u === 'offline' || u === 'streaming' || u === 'polling'; } + getType(): string { return 'ConnectionMode (offline | streaming | polling)'; } diff --git a/packages/sdk/react-native/src/platform/locale.ts b/packages/sdk/react-native/src/platform/locale.ts index 3fff16028b..8b808d406c 100644 --- a/packages/sdk/react-native/src/platform/locale.ts +++ b/packages/sdk/react-native/src/platform/locale.ts @@ -5,8 +5,8 @@ import { NativeModules, Platform } from 'react-native'; * https://dev.to/medaimane/localization-and-internationalization-in-react-native-reaching-global-audiences-3acj */ const locale = - Platform.OS === 'ios' - ? NativeModules.SettingsManager?.settings?.AppleLocale // iOS - : NativeModules.I18nManager?.localeIdentifier; + Platform.OS === 'ios' ? + NativeModules.SettingsManager?.settings?.AppleLocale : // iOS + NativeModules.I18nManager?.localeIdentifier; export default locale; diff --git a/packages/sdk/react-native/src/provider/reactContext.ts b/packages/sdk/react-native/src/provider/reactContext.ts index e1b4526fb8..9a1b82c534 100644 --- a/packages/sdk/react-native/src/provider/reactContext.ts +++ b/packages/sdk/react-native/src/provider/reactContext.ts @@ -12,4 +12,4 @@ export const context = createContext({ const { Provider, Consumer } = context; -export { Provider, Consumer }; +export { Consumer, Provider }; diff --git a/packages/sdk/react/contract-tests/package.json b/packages/sdk/react/contract-tests/package.json index 54dca94711..43a157f22a 100644 --- a/packages/sdk/react/contract-tests/package.json +++ b/packages/sdk/react/contract-tests/package.json @@ -9,8 +9,7 @@ "dev": "next dev -p 8002", "build": "next build", "start:entity": "next dev -p 8002", - "start:browser": "node open-browser.mjs http://localhost:8002", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../../.prettierignore" + "start:browser": "node open-browser.mjs http://localhost:8002" }, "dependencies": { "@launchdarkly/js-contract-test-utils": "workspace:^", @@ -20,16 +19,15 @@ "react-dom": "19.2.3" }, "devDependencies": { + "@stylistic/eslint-plugin": "^4.0.0", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "playwright": "^1.49.1", - "prettier": "^3.0.0", "typescript": "^5" } } diff --git a/packages/sdk/react/examples/hello-react/e2e/verify.spec.ts b/packages/sdk/react/examples/hello-react/e2e/verify.spec.ts index 77a19b4fd4..12f04350ef 100644 --- a/packages/sdk/react/examples/hello-react/e2e/verify.spec.ts +++ b/packages/sdk/react/examples/hello-react/e2e/verify.spec.ts @@ -5,7 +5,7 @@ test('feature flag evaluates to true', async ({ page }) => { await expect(page.getByText('SDK successfully initialized!')).toBeVisible({ timeout: 10000 }); - await expect(page.getByText(`feature flag evaluates to true`, { exact: false })).toBeVisible({ + await expect(page.getByText('feature flag evaluates to true', { exact: false })).toBeVisible({ timeout: 10000, }); }); diff --git a/packages/sdk/react/package.json b/packages/sdk/react/package.json index 89a29bb3db..1b0379a833 100644 --- a/packages/sdk/react/package.json +++ b/packages/sdk/react/package.json @@ -22,7 +22,7 @@ "build": "tsup", "test": "npx jest --ci", "lint": "eslint . --ext .ts,.tsx", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore" + "lint:fix": "eslint . --ext .ts,.tsx --fix" }, "type": "module", "exports": { @@ -43,22 +43,20 @@ "dist" ], "devDependencies": { + "@stylistic/eslint-plugin": "^4.0.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.0", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.5.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^30.2.0", "jest-environment-jsdom": "^30.0.0", - "prettier": "^3.8.1", "react": "^19.2.4", "react-dom": "^19.2.4", "tsup": "^8.5.1", diff --git a/packages/sdk/react/src/client/createNoopClient.ts b/packages/sdk/react/src/client/createNoopClient.ts index a2fa94b0a7..bc32880b05 100644 --- a/packages/sdk/react/src/client/createNoopClient.ts +++ b/packages/sdk/react/src/client/createNoopClient.ts @@ -45,9 +45,9 @@ export function createNoopClient(bootstrap?: object): LDReactClient { } function getDetail(key: string, defaultValue: T, typeCheck?: (v: unknown) => v is T) { - const value = typeCheck - ? getVariation(key, defaultValue, typeCheck) - : getJsonVariation(key, defaultValue); + const value = typeCheck ? + getVariation(key, defaultValue, typeCheck) : + getJsonVariation(key, defaultValue); return { value, variationIndex: null, diff --git a/packages/sdk/react/src/client/deprecated-hooks/useFlags.ts b/packages/sdk/react/src/client/deprecated-hooks/useFlags.ts index ce5c189ecb..f676c48511 100644 --- a/packages/sdk/react/src/client/deprecated-hooks/useFlags.ts +++ b/packages/sdk/react/src/client/deprecated-hooks/useFlags.ts @@ -51,9 +51,9 @@ function toFlagsProxy(client: LDReactClient, rawFlags: T): return cache.get(prop as string); } - const pristineKey = useCamelCase - ? (flagKeyMap[prop as string] ?? (prop as string)) - : (prop as string); + const pristineKey = useCamelCase ? + (flagKeyMap[prop as string] ?? (prop as string)) : + (prop as string); const result = client.variation(pristineKey, currentValue); cache.set(prop as string, result); return result; diff --git a/packages/sdk/react/src/client/hooks/index.ts b/packages/sdk/react/src/client/hooks/index.ts index fc042aeeda..16a12eafdd 100644 --- a/packages/sdk/react/src/client/hooks/index.ts +++ b/packages/sdk/react/src/client/hooks/index.ts @@ -2,13 +2,13 @@ export { useInitializationStatus } from './useInitializationStatus'; export { useLDClient } from './useLDClient'; export { useBoolVariation, - useStringVariation, - useNumberVariation, useJsonVariation, + useNumberVariation, + useStringVariation, } from './useVariation'; export { useBoolVariationDetail, - useStringVariationDetail, - useNumberVariationDetail, useJsonVariationDetail, + useNumberVariationDetail, + useStringVariationDetail, } from './useVariationDetail'; diff --git a/packages/sdk/react/src/client/index.ts b/packages/sdk/react/src/client/index.ts index cf211e3dbe..4441424d84 100644 --- a/packages/sdk/react/src/client/index.ts +++ b/packages/sdk/react/src/client/index.ts @@ -1,11 +1,10 @@ -export type * from '@launchdarkly/js-client-sdk'; +export * from './deprecated-hooks'; +export * from './hooks'; export * from './LDClient'; export * from './LDOptions'; - -export { LDReactContext, initLDReactContext } from './provider/LDReactContext'; -export { createLDReactProvider, createLDReactProviderWithClient } from './provider/LDReactProvider'; -export { LDIsomorphicClientProvider } from './provider/LDIsomorphicClientProvider'; -export type { LDIsomorphicClientProviderProps } from './provider/LDIsomorphicClientProvider'; export { createClient } from './LDReactClient'; -export * from './deprecated-hooks'; -export * from './hooks'; +export type { LDIsomorphicClientProviderProps } from './provider/LDIsomorphicClientProvider'; +export { LDIsomorphicClientProvider } from './provider/LDIsomorphicClientProvider'; +export { initLDReactContext, LDReactContext } from './provider/LDReactContext'; +export { createLDReactProvider, createLDReactProviderWithClient } from './provider/LDReactProvider'; +export type * from '@launchdarkly/js-client-sdk'; diff --git a/packages/sdk/react/src/server/LDServerSession.ts b/packages/sdk/react/src/server/LDServerSession.ts index fa93ce68e9..d8a1440872 100644 --- a/packages/sdk/react/src/server/LDServerSession.ts +++ b/packages/sdk/react/src/server/LDServerSession.ts @@ -49,7 +49,7 @@ export function createLDServerWrapper( if (!isServer()) { throw new Error( 'createLDServerWrapper must only be called on the server. ' + - 'Ensure this module is not imported from client components.', + 'Ensure this module is not imported from client components.', ); } @@ -124,7 +124,7 @@ export function useLDServerSession(): LDServerSession | null { if (!isServer()) { throw new Error( 'useLDServerSession must only be called on the server. ' + - 'Ensure this module is not imported from client components.', + 'Ensure this module is not imported from client components.', ); } diff --git a/packages/sdk/react/src/server/index.ts b/packages/sdk/react/src/server/index.ts index 2134a98986..4f69d5af7b 100644 --- a/packages/sdk/react/src/server/index.ts +++ b/packages/sdk/react/src/server/index.ts @@ -1,5 +1,5 @@ export type * from './LDClient'; +export type { LDIsomorphicProviderProps } from './LDIsomorphicProvider'; +export { LDIsomorphicProvider } from './LDIsomorphicProvider'; export type * from './LDServerBaseClient'; export * from './LDServerSession'; -export { LDIsomorphicProvider } from './LDIsomorphicProvider'; -export type { LDIsomorphicProviderProps } from './LDIsomorphicProvider'; diff --git a/packages/sdk/server-ai/examples/agent-graph-traversal/src/index.ts b/packages/sdk/server-ai/examples/agent-graph-traversal/src/index.ts index 6bf1d1cf42..bbe688280b 100644 --- a/packages/sdk/server-ai/examples/agent-graph-traversal/src/index.ts +++ b/packages/sdk/server-ai/examples/agent-graph-traversal/src/index.ts @@ -1,7 +1,7 @@ /* eslint-disable no-console */ import { init, type LDContext } from '@launchdarkly/node-server-sdk'; -import { initAi } from '@launchdarkly/server-sdk-ai'; import type { AgentGraphNode } from '@launchdarkly/server-sdk-ai'; +import { initAi } from '@launchdarkly/server-sdk-ai'; const GRAPH_KEY = process.env.LAUNCHDARKLY_GRAPH_KEY || 'sample-graph'; diff --git a/packages/sdk/server-ai/examples/bedrock/package.json b/packages/sdk/server-ai/examples/bedrock/package.json index b29f58754b..e4eebf25d1 100644 --- a/packages/sdk/server-ai/examples/bedrock/package.json +++ b/packages/sdk/server-ai/examples/bedrock/package.json @@ -10,9 +10,8 @@ "build": "tsc", "start": "yarn build && node ./dist/index.js", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test" }, "keywords": [ "launchdarkly", @@ -27,17 +26,15 @@ "@launchdarkly/server-sdk-ai": "0.17.1" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@tsconfig/node20": "20.1.4", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "typedoc": "0.25.0", "typescript": "^5.5.3" diff --git a/packages/sdk/server-ai/examples/chat-judge/package.json b/packages/sdk/server-ai/examples/chat-judge/package.json index 85f5f51fce..4d052387d7 100644 --- a/packages/sdk/server-ai/examples/chat-judge/package.json +++ b/packages/sdk/server-ai/examples/chat-judge/package.json @@ -7,7 +7,8 @@ "scripts": { "build": "tsc", "lint": "npx eslint . --ext .ts", - "start": "yarn build && node ./dist/index.js" + "start": "yarn build && node ./dist/index.js", + "lint:fix": "npx eslint . --ext .ts --fix" }, "dependencies": { "@launchdarkly/node-server-sdk": "9.10.12", @@ -18,17 +19,15 @@ "dotenv": "^16.0.0" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@tsconfig/node20": "20.1.4", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "typedoc": "0.25.0", "typescript": "^5.5.3" diff --git a/packages/sdk/server-ai/examples/direct-judge/package.json b/packages/sdk/server-ai/examples/direct-judge/package.json index 2177254855..410baf4714 100644 --- a/packages/sdk/server-ai/examples/direct-judge/package.json +++ b/packages/sdk/server-ai/examples/direct-judge/package.json @@ -7,7 +7,8 @@ "scripts": { "build": "tsc", "lint": "npx eslint . --ext .ts", - "start": "yarn build && node ./dist/index.js" + "start": "yarn build && node ./dist/index.js", + "lint:fix": "npx eslint . --ext .ts --fix" }, "dependencies": { "@launchdarkly/node-server-sdk": "9.10.12", @@ -18,17 +19,15 @@ "dotenv": "^16.0.0" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@tsconfig/node20": "20.1.4", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "typedoc": "0.25.0", "typescript": "^5.5.3" diff --git a/packages/sdk/server-ai/examples/openai-observability/src/index.ts b/packages/sdk/server-ai/examples/openai-observability/src/index.ts index d13c01349f..608de2c6cf 100644 --- a/packages/sdk/server-ai/examples/openai-observability/src/index.ts +++ b/packages/sdk/server-ai/examples/openai-observability/src/index.ts @@ -1,7 +1,8 @@ /* eslint-disable no-console */ +import 'dotenv/config'; + import { registerInstrumentations } from '@opentelemetry/instrumentation'; import { OpenAIInstrumentation } from '@traceloop/instrumentation-openai'; -import 'dotenv/config'; import { init, type LDContext } from '@launchdarkly/node-server-sdk'; import { Observability } from '@launchdarkly/observability-node'; diff --git a/packages/sdk/server-ai/examples/openai/package.json b/packages/sdk/server-ai/examples/openai/package.json index b7d04a4085..b4d84ee433 100644 --- a/packages/sdk/server-ai/examples/openai/package.json +++ b/packages/sdk/server-ai/examples/openai/package.json @@ -9,9 +9,8 @@ "build": "tsc", "start": "yarn build && node ./dist/index.js", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test" }, "keywords": [ "launchdarkly", @@ -27,17 +26,15 @@ "openai": "^4.58.1" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@tsconfig/node20": "20.1.4", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "typedoc": "0.25.0", "typescript": "^5.5.3" diff --git a/packages/sdk/server-ai/examples/vercel-ai/package.json b/packages/sdk/server-ai/examples/vercel-ai/package.json index eba0f630e3..fa11072649 100644 --- a/packages/sdk/server-ai/examples/vercel-ai/package.json +++ b/packages/sdk/server-ai/examples/vercel-ai/package.json @@ -9,9 +9,8 @@ "build": "tsc", "start": "yarn build && node ./dist/index.js", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test" }, "keywords": [ "launchdarkly", @@ -29,17 +28,15 @@ "zod": "^3.23.8" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@tsconfig/node20": "20.1.4", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.7.0", - "prettier": "^3.0.0", "rimraf": "^5.0.5", "typedoc": "0.25.0", "typescript": "^5.5.3" diff --git a/packages/sdk/server-ai/package.json b/packages/sdk/server-ai/package.json index 4e512cf4d8..585c4cc8ad 100644 --- a/packages/sdk/server-ai/package.json +++ b/packages/sdk/server-ai/package.json @@ -26,9 +26,8 @@ "scripts": { "build": "tsup-node", "lint": "npx eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "lint:fix": "yarn run lint --fix", - "check": "yarn prettier && yarn lint && yarn build && yarn test", + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", "test": "jest" }, "files": [ @@ -46,18 +45,16 @@ }, "devDependencies": { "@launchdarkly/js-server-sdk-common": "2.18.5", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.5.3", "@types/mustache": "^4.2.5", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.6.1", - "prettier": "^3.0.0", "ts-jest": "^29.1.1", "tsup": "^8.5.1", "typescript": "5.1.6" diff --git a/packages/sdk/server-ai/src/LDAIClientImpl.ts b/packages/sdk/server-ai/src/LDAIClientImpl.ts index 316a84e56d..ce39d6405a 100644 --- a/packages/sdk/server-ai/src/LDAIClientImpl.ts +++ b/packages/sdk/server-ai/src/LDAIClientImpl.ts @@ -1,5 +1,5 @@ -import Mustache from 'mustache'; import { randomUUID } from 'node:crypto'; +import Mustache from 'mustache'; import { LDContext, LDLogger } from '@launchdarkly/js-server-sdk-common'; diff --git a/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts b/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts index d2f4265371..a898dd118a 100644 --- a/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts +++ b/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts @@ -124,9 +124,9 @@ export class LDAIConfigTrackerImpl implements LDAIConfigTracker { return; } if (result.metricKey !== undefined && result.score !== undefined) { - const trackData = result.judgeConfigKey - ? { ...this.getTrackData(), judgeConfigKey: result.judgeConfigKey } - : this.getTrackData(); + const trackData = result.judgeConfigKey ? + { ...this.getTrackData(), judgeConfigKey: result.judgeConfigKey } : + this.getTrackData(); this._ldClient.track(result.metricKey, this._context, trackData, result.score); } } diff --git a/packages/sdk/server-ai/src/api/chat/index.ts b/packages/sdk/server-ai/src/api/chat/index.ts index f7876298ea..59c3029d13 100644 --- a/packages/sdk/server-ai/src/api/chat/index.ts +++ b/packages/sdk/server-ai/src/api/chat/index.ts @@ -1,2 +1,2 @@ -export * from './types'; export * from './TrackedChat'; +export * from './types'; diff --git a/packages/sdk/server-ai/src/api/graph/index.ts b/packages/sdk/server-ai/src/api/graph/index.ts index 9d899029d5..4a875c9207 100644 --- a/packages/sdk/server-ai/src/api/graph/index.ts +++ b/packages/sdk/server-ai/src/api/graph/index.ts @@ -1,4 +1,4 @@ -export * from './types'; -export * from './LDGraphTracker'; -export * from './AgentGraphNode'; export * from './AgentGraphDefinition'; +export * from './AgentGraphNode'; +export * from './LDGraphTracker'; +export * from './types'; diff --git a/packages/sdk/server-ai/src/api/index.ts b/packages/sdk/server-ai/src/api/index.ts index 7470ef740c..d4334b6f2f 100644 --- a/packages/sdk/server-ai/src/api/index.ts +++ b/packages/sdk/server-ai/src/api/index.ts @@ -1,7 +1,7 @@ -export * from './config'; export * from './chat'; +export * from './config'; export * from './graph'; export * from './judge'; -export * from './metrics'; export * from './LDAIClient'; +export * from './metrics'; export * from './providers'; diff --git a/packages/sdk/server-ai/src/api/metrics/index.ts b/packages/sdk/server-ai/src/api/metrics/index.ts index a7026f62d8..87a73edcda 100644 --- a/packages/sdk/server-ai/src/api/metrics/index.ts +++ b/packages/sdk/server-ai/src/api/metrics/index.ts @@ -1,6 +1,6 @@ export * from './BedrockTokenUsage'; -export * from './OpenAiUsage'; -export * from './LDFeedbackKind'; export * from './LDAIMetrics'; +export * from './LDFeedbackKind'; export * from './LDTokenUsage'; +export * from './OpenAiUsage'; export * from './VercelAISDKTokenUsage'; diff --git a/packages/sdk/server-ai/src/api/providers/AIProvider.ts b/packages/sdk/server-ai/src/api/providers/AIProvider.ts index e83ea2a834..a5fe5fa78e 100644 --- a/packages/sdk/server-ai/src/api/providers/AIProvider.ts +++ b/packages/sdk/server-ai/src/api/providers/AIProvider.ts @@ -18,6 +18,7 @@ export abstract class AIProvider { constructor(logger?: LDLogger) { this.logger = logger; } + /** * Invoke the chat model with an array of messages. * This method should convert messages to provider format, invoke the model, diff --git a/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts b/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts index 608c9cdc29..459f5b4c19 100644 --- a/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts +++ b/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts @@ -36,9 +36,9 @@ beforeEach(() => { resolve({ method: req.method, body: - req.headers['content-encoding'] === 'gzip' - ? Buffer.concat(chunks) - : Buffer.concat(chunks).toString(), + req.headers['content-encoding'] === 'gzip' ? + Buffer.concat(chunks) : + Buffer.concat(chunks).toString(), headers: req.headers, }); }); diff --git a/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts b/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts index c23852dae9..c40360fef8 100644 --- a/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts +++ b/packages/sdk/server-node/contract-tests/src/sdkClientEntity.ts @@ -75,15 +75,15 @@ export function makeSdkConfig(options: ServerSDKConfigParams, tag: string): LDOp cf.bigSegments = { store: () => new BigSegmentTestStore(bigSegmentsOptions.callbackUri), userCacheSize: bigSegmentsOptions.userCacheSize, - userCacheTime: bigSegmentsOptions.userCacheTimeMs - ? bigSegmentsOptions.userCacheTimeMs / 1000 - : undefined, - statusPollInterval: bigSegmentsOptions.statusPollIntervalMs - ? bigSegmentsOptions.statusPollIntervalMs / 1000 - : undefined, - staleAfter: bigSegmentsOptions.staleAfterMs - ? bigSegmentsOptions.staleAfterMs / 1000 - : undefined, + userCacheTime: bigSegmentsOptions.userCacheTimeMs ? + bigSegmentsOptions.userCacheTimeMs / 1000 : + undefined, + statusPollInterval: bigSegmentsOptions.statusPollIntervalMs ? + bigSegmentsOptions.statusPollIntervalMs / 1000 : + undefined, + staleAfter: bigSegmentsOptions.staleAfterMs ? + bigSegmentsOptions.staleAfterMs / 1000 : + undefined, }; } @@ -218,9 +218,9 @@ export async function newSdkClientEntity(options: CreateInstanceParams): Promise log.info(`Creating client with configuration: ${JSON.stringify(options.configuration)}`); const timeout = options.configuration.startWaitTimeMs !== null && - options.configuration.startWaitTimeMs !== undefined - ? options.configuration.startWaitTimeMs - : 5000; + options.configuration.startWaitTimeMs !== undefined ? + options.configuration.startWaitTimeMs : + 5000; const client: LDClient = ld.init( options.configuration.credential || 'unknown-sdk-key', makeSdkConfig(options.configuration as ServerSDKConfigParams, options.tag), diff --git a/packages/sdk/server-node/package.json b/packages/sdk/server-node/package.json index fc857e5601..41faeda0ad 100644 --- a/packages/sdk/server-node/package.json +++ b/packages/sdk/server-node/package.json @@ -41,7 +41,7 @@ "test": "npx jest --ci --runInBand", "build": "npx tsc", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint --fix" + "lint:fix": "npx eslint . --ext .ts --fix" }, "license": "Apache-2.0", "dependencies": { @@ -50,18 +50,16 @@ "launchdarkly-eventsource": "2.2.0" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "ts-jest": "^29.0.5", "typedoc": "0.25.0", "typescript": "5.1.6" diff --git a/packages/sdk/server-node/src/api/index.ts b/packages/sdk/server-node/src/api/index.ts index 5ace2345c0..c73b8876d3 100644 --- a/packages/sdk/server-node/src/api/index.ts +++ b/packages/sdk/server-node/src/api/index.ts @@ -1,2 +1,2 @@ -export * from './LDClient'; export * from './interfaces'; +export * from './LDClient'; diff --git a/packages/sdk/server-node/src/index.ts b/packages/sdk/server-node/src/index.ts index db9ef00199..2b64ea3320 100644 --- a/packages/sdk/server-node/src/index.ts +++ b/packages/sdk/server-node/src/index.ts @@ -22,7 +22,7 @@ export { LDOptions }; // So the below exports replace them with the Node specific variants. // These exports are explicit to override those from common. -export { LDClient, BigSegmentStoreStatusProvider } from './api'; +export { BigSegmentStoreStatusProvider, LDClient } from './api'; /** * Creates an instance of the LaunchDarkly client. diff --git a/packages/sdk/server-node/src/platform/HeaderWrapper.ts b/packages/sdk/server-node/src/platform/HeaderWrapper.ts index dee99edc92..ac3b968e17 100644 --- a/packages/sdk/server-node/src/platform/HeaderWrapper.ts +++ b/packages/sdk/server-node/src/platform/HeaderWrapper.ts @@ -34,7 +34,7 @@ export default class HeaderWrapper implements platform.Headers { // We want to use generators here for the simplicity of maintaining // this interface. Also they aren't expected to be high frequency usage. - *values(): Iterable { + * values(): Iterable { for (const key of this.keys()) { const val = this.get(key); if (val !== null) { @@ -43,7 +43,7 @@ export default class HeaderWrapper implements platform.Headers { } } - *entries(): Iterable<[string, string]> { + * entries(): Iterable<[string, string]> { for (const key of this.keys()) { const val = this.get(key); if (val !== null) { diff --git a/packages/sdk/server-node/src/platform/NodeRequests.ts b/packages/sdk/server-node/src/platform/NodeRequests.ts index 4a8962acab..39c899d3c1 100644 --- a/packages/sdk/server-node/src/platform/NodeRequests.ts +++ b/packages/sdk/server-node/src/platform/NodeRequests.ts @@ -132,16 +132,15 @@ export default class NodeRequests implements platform.Requests { // Note this does not affect SSE as the event source is not using this fetch implementation. if (options.method?.toLowerCase() === 'get') { headers['accept-encoding'] = 'gzip'; - } - // For post requests we are going to support compressed post bodies if the - // enableEventCompression config setting is true and the compressBodyIfPossible - // option is true. - else if ( + } else if ( this._enableBodyCompression && !!options.compressBodyIfPossible && options.method?.toLowerCase() === 'post' && options.body ) { + // For post requests we are going to support compressed post bodies if the + // enableEventCompression config setting is true and the compressBodyIfPossible + // option is true. headers['content-encoding'] = 'gzip'; bodyData = await gzip(Buffer.from(options.body, 'utf8')); } diff --git a/packages/sdk/shopify-oxygen/contract-tests/src/utils/clientPool.ts b/packages/sdk/shopify-oxygen/contract-tests/src/utils/clientPool.ts index d0ca93dcdb..3a38ff3008 100644 --- a/packages/sdk/shopify-oxygen/contract-tests/src/utils/clientPool.ts +++ b/packages/sdk/shopify-oxygen/contract-tests/src/utils/clientPool.ts @@ -25,9 +25,9 @@ export default class ClientPool { switch (command) { case 'evaluate': { const { flagKey, context, defaultValue, detail } = rest.evaluate; - const evaluation = detail - ? await client.variationDetail(flagKey, context, defaultValue) - : await client.variation(flagKey, context, defaultValue); + const evaluation = detail ? + await client.variationDetail(flagKey, context, defaultValue) : + await client.variation(flagKey, context, defaultValue); res.status(200); res.json({ value: evaluation }); break; diff --git a/packages/sdk/shopify-oxygen/package.json b/packages/sdk/shopify-oxygen/package.json index b303495bd5..f976d1055a 100644 --- a/packages/sdk/shopify-oxygen/package.json +++ b/packages/sdk/shopify-oxygen/package.json @@ -53,15 +53,15 @@ "devDependencies": { "@jest/globals": "^30.2.0", "@shopify/oxygen-workers-types": "^4.2.0", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "rimraf": "^5.0.1", "ts-jest": "^29.1.0", diff --git a/packages/sdk/shopify-oxygen/src/index.ts b/packages/sdk/shopify-oxygen/src/index.ts index 06237d1ea3..a842f0ccd3 100644 --- a/packages/sdk/shopify-oxygen/src/index.ts +++ b/packages/sdk/shopify-oxygen/src/index.ts @@ -1,9 +1,10 @@ +// Polyfill timer functions for Shopify Oxygen runtime +import './polyfills/timers'; + import { LDClientImpl, LDOptions } from '@launchdarkly/js-server-sdk-common'; import Platform from './platform'; import platformInfo from './platform/OxygenInfo'; -// Polyfill timer functions for Shopify Oxygen runtime -import './polyfills/timers'; import { createCallbacks, createOptions, OxygenLDOptions, validateOptions } from './utils'; export * from '@launchdarkly/js-server-sdk-common'; diff --git a/packages/sdk/shopify-oxygen/src/platform/OxygenRequests.ts b/packages/sdk/shopify-oxygen/src/platform/OxygenRequests.ts index d46b08cabb..9d47f262b0 100644 --- a/packages/sdk/shopify-oxygen/src/platform/OxygenRequests.ts +++ b/packages/sdk/shopify-oxygen/src/platform/OxygenRequests.ts @@ -1,4 +1,3 @@ -import { NullEventSource } from '@launchdarkly/js-server-sdk-common'; import type { EventSource, EventSourceCapabilities, @@ -6,6 +5,7 @@ import type { Options, platform, } from '@launchdarkly/js-server-sdk-common'; +import { NullEventSource } from '@launchdarkly/js-server-sdk-common'; import { OxygenCacheOptions } from '../utils/validateOptions'; diff --git a/packages/sdk/svelte/example/.eslintrc.cjs b/packages/sdk/svelte/example/.eslintrc.cjs index 0b757582c0..b102c1f005 100644 --- a/packages/sdk/svelte/example/.eslintrc.cjs +++ b/packages/sdk/svelte/example/.eslintrc.cjs @@ -5,7 +5,6 @@ module.exports = { 'eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:svelte/recommended', - 'prettier' ], parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint'], diff --git a/packages/sdk/svelte/example/.prettierrc b/packages/sdk/svelte/example/.prettierrc deleted file mode 100644 index 95730232b6..0000000000 --- a/packages/sdk/svelte/example/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] -} diff --git a/packages/sdk/svelte/example/package.json b/packages/sdk/svelte/example/package.json index e0b597fc01..3c938b4300 100644 --- a/packages/sdk/svelte/example/package.json +++ b/packages/sdk/svelte/example/package.json @@ -28,6 +28,7 @@ "svelte": "^5.4.0" }, "devDependencies": { + "@stylistic/eslint-plugin": "^4.0.0", "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/package": "^2.0.0", @@ -36,11 +37,9 @@ "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "eslint-plugin-svelte": "^2.35.1", "jsdom": "^24.0.0", - "prettier": "^3.1.1", - "prettier-plugin-svelte": "^3.1.2", "svelte-check": "^3.6.0", "tslib": "^2.4.1", "typescript": "^5.0.0", diff --git a/packages/sdk/svelte/package.json b/packages/sdk/svelte/package.json index beafd13b23..3a9d2640ad 100644 --- a/packages/sdk/svelte/package.json +++ b/packages/sdk/svelte/package.json @@ -36,13 +36,13 @@ "package": "svelte-kit sync && svelte-package && publint", "prepublishOnly": "npm run package", "lint": "eslint . --ext .ts,.tsx", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", - "check": "yarn prettier && yarn lint && yarn build && yarn test", + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", "test": "vitest run", "test:dev": "vitest dev", "test:ui": "vitest --ui", "test:coverage": "vitest --coverage", - "test:e2e": "playwright test" + "test:e2e": "playwright test", + "lint:fix": "eslint . --ext .ts,.tsx --fix" }, "peerDependencies": { "svelte": "^4.0.0" @@ -53,6 +53,7 @@ }, "devDependencies": { "@playwright/test": "^1.28.1", + "@stylistic/eslint-plugin": "^4.0.0", "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/package": "^2.0.0", @@ -64,14 +65,11 @@ "@vitest/coverage-v8": "^2.1.8", "@vitest/ui": "^2.1.8", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "eslint-plugin-svelte": "^2.35.1", "jsdom": "^24.0.0", - "prettier": "^3.0.0", - "prettier-plugin-svelte": "^3.1.2", "publint": "^0.1.9", "rimraf": "^5.0.5", "svelte": "^5.4.0", diff --git a/packages/sdk/svelte/src/lib/client/SvelteLDClient.ts b/packages/sdk/svelte/src/lib/client/SvelteLDClient.ts index 0c67f5cdd4..0f10e182a3 100644 --- a/packages/sdk/svelte/src/lib/client/SvelteLDClient.ts +++ b/packages/sdk/svelte/src/lib/client/SvelteLDClient.ts @@ -1,4 +1,4 @@ -import { derived, type Readable, readonly, writable, type Writable } from 'svelte/store'; +import { derived, type Readable, readonly, type Writable, writable } from 'svelte/store'; import { createClient, diff --git a/packages/sdk/svelte/src/lib/index.ts b/packages/sdk/svelte/src/lib/index.ts index ed62c5043d..e7a1f67489 100644 --- a/packages/sdk/svelte/src/lib/index.ts +++ b/packages/sdk/svelte/src/lib/index.ts @@ -2,5 +2,5 @@ export { LD } from './client/SvelteLDClient.js'; // Export Components -export { default as LDProvider } from './provider/LDProvider.svelte'; export { default as LDFlag } from './LDFlag.svelte'; +export { default as LDProvider } from './provider/LDProvider.svelte'; diff --git a/packages/sdk/vercel/examples/complete/package.json b/packages/sdk/vercel/examples/complete/package.json index 12d541db1a..6137e30636 100644 --- a/packages/sdk/vercel/examples/complete/package.json +++ b/packages/sdk/vercel/examples/complete/package.json @@ -20,11 +20,13 @@ }, "devDependencies": { "@next/eslint-plugin-next": "14.1.2", + "@stylistic/eslint-plugin": "^4.0.0", "@types/node": "^18.15.5", "@types/react": "latest", "autoprefixer": "^10.4.14", "eslint": "^8.36.0", "eslint-config-next": "canary", + "eslint-plugin-simple-import-sort": "^12.0.0", "postcss": "^8.4.21", "tailwindcss": "^3.2.7", "turbo": "^1.8.5", diff --git a/packages/sdk/vercel/package.json b/packages/sdk/vercel/package.json index c0d99060d5..45979d26da 100644 --- a/packages/sdk/vercel/package.json +++ b/packages/sdk/vercel/package.json @@ -30,10 +30,10 @@ "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts --fix" }, "dependencies": { "@launchdarkly/js-server-sdk-common-edge": "2.6.18", @@ -41,19 +41,17 @@ "crypto-js": "^4.1.1" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "rimraf": "^5.0.0", "ts-jest": "^29.1.0", "typedoc": "0.25.0", diff --git a/packages/shared/akamai-edgeworker-sdk/__tests__/platform/requests.test.ts b/packages/shared/akamai-edgeworker-sdk/__tests__/platform/requests.test.ts index fbd2555992..635588312e 100644 --- a/packages/shared/akamai-edgeworker-sdk/__tests__/platform/requests.test.ts +++ b/packages/shared/akamai-edgeworker-sdk/__tests__/platform/requests.test.ts @@ -10,7 +10,7 @@ describe('given a default instance of requests', () => { describe('fetch', () => { it('Basic request always returns empty text', async () => { - const res = await requests.fetch(`http://localhost`); + const res = await requests.fetch('http://localhost'); expect(res.headers).toEqual({}); expect(res.status).toEqual(0); const text = await res.text(); @@ -18,7 +18,7 @@ describe('given a default instance of requests', () => { }); it('Basic request always returns empty json', async () => { - const res = await requests.fetch(`http://localhost`); + const res = await requests.fetch('http://localhost'); expect(res.headers).toEqual({}); expect(res.status).toEqual(0); const json = await res.json(); @@ -28,7 +28,7 @@ describe('given a default instance of requests', () => { describe('create event source', () => { it('event source should have undefined methods', async () => { - const eventsource = requests.createEventSource(`http://localhost`, {} as EventSourceInitDict); + const eventsource = requests.createEventSource('http://localhost', {} as EventSourceInitDict); expect(eventsource.onclose).toBeUndefined(); expect(eventsource.onerror).toBeUndefined(); expect(eventsource.onopen).toBeUndefined(); diff --git a/packages/shared/akamai-edgeworker-sdk/package.json b/packages/shared/akamai-edgeworker-sdk/package.json index ecb4c691e6..3aca1ed71c 100644 --- a/packages/shared/akamai-edgeworker-sdk/package.json +++ b/packages/shared/akamai-edgeworker-sdk/package.json @@ -25,26 +25,24 @@ "build": "npx tsc", "clean": "npx tsc --build --clean", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint -- --fix" + "lint:fix": "npx eslint . --ext .ts --fix" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.1", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.1", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "rimraf": "^5.0.0", "rollup": "^3.23.0", "rollup-plugin-generate-package-json": "^3.2.0", diff --git a/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts b/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts index b5f9cf9fec..9076e946ec 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line max-classes-per-file import { - LDClientImpl, LDClient as LDClientType, + LDClientImpl, LDOptions, } from '@launchdarkly/js-server-sdk-common'; diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts index 69cbeeb5e6..5254f29fe6 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts @@ -1,5 +1,4 @@ /* eslint-disable max-classes-per-file */ -import { Headers, NullEventSource } from '@launchdarkly/js-server-sdk-common'; import type { EventSource, EventSourceCapabilities, @@ -8,6 +7,7 @@ import type { Requests, Response, } from '@launchdarkly/js-server-sdk-common'; +import { Headers, NullEventSource } from '@launchdarkly/js-server-sdk-common'; class NoopResponse implements Response { headers: Headers; diff --git a/packages/shared/common/__tests__/internal/events/EventSender.test.ts b/packages/shared/common/__tests__/internal/events/EventSender.test.ts index 65c6d06866..f086524e49 100644 --- a/packages/shared/common/__tests__/internal/events/EventSender.test.ts +++ b/packages/shared/common/__tests__/internal/events/EventSender.test.ts @@ -218,7 +218,7 @@ describe('given an event sender', () => { eventSender.sendEventData(LDEventType.AnalyticsEvents, testEventData1), ); - const errorMessage = `Received error 413 for event posting - giving up permanently`; + const errorMessage = 'Received error 413 for event posting - giving up permanently'; const { status, error } = eventSenderResult; diff --git a/packages/shared/common/__tests__/subsystem/DataSystem/CompositeDataSource.test.ts b/packages/shared/common/__tests__/subsystem/DataSystem/CompositeDataSource.test.ts index 79cb4e6ee7..02990e2221 100644 --- a/packages/shared/common/__tests__/subsystem/DataSystem/CompositeDataSource.test.ts +++ b/packages/shared/common/__tests__/subsystem/DataSystem/CompositeDataSource.test.ts @@ -409,7 +409,7 @@ it('falls back to FDv1 synchronizers when FDv1 fallback error is reported', asyn DataSourceState.Closed, new LDFlagDeliveryFallbackError( DataSourceErrorKind.ErrorResponse, - `Response header indicates to fallback to FDv1`, + 'Response header indicates to fallback to FDv1', 403, ), ); @@ -656,7 +656,7 @@ it('it reports DataSourceState Closed when all synchronizers report Closed with expect(statusCallback).toHaveBeenNthCalledWith(5, DataSourceState.Interrupted, expect.anything()); // sync2 closed with unrecoverable error expect(statusCallback).toHaveBeenNthCalledWith(6, DataSourceState.Closed, { name: 'ExhaustedDataSources', - message: `CompositeDataSource has exhausted all configured initializers and synchronizers.`, + message: 'CompositeDataSource has exhausted all configured initializers and synchronizers.', }); }); diff --git a/packages/shared/common/package.json b/packages/shared/common/package.json index 50fb37d4de..b25bcf8447 100644 --- a/packages/shared/common/package.json +++ b/packages/shared/common/package.json @@ -36,9 +36,8 @@ "build": "npx tsc --noEmit && rollup -c rollup.config.js && npm run make-package-jsons", "clean": "rimraf dist", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint --fix", - "prettier": "prettier --write 'src/*.@(js|ts|tsx|json)'", - "check": "yarn && yarn prettier && yarn lint && tsc && yarn test" + "lint:fix": "npx eslint . --ext .ts --fix", + "check": "yarn && yarn lint:fix && yarn lint && tsc && yarn test" }, "license": "Apache-2.0", "devDependencies": { @@ -47,18 +46,16 @@ "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.1", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "rimraf": "6.0.1", "rollup": "^3.23.0", "ts-jest": "^29.0.5", diff --git a/packages/shared/common/src/ContextFilter.ts b/packages/shared/common/src/ContextFilter.ts index 34f78a53e7..fe334c520d 100644 --- a/packages/shared/common/src/ContextFilter.ts +++ b/packages/shared/common/src/ContextFilter.ts @@ -129,9 +129,9 @@ export default class ContextFilter { redactAllAttributes: boolean, ) { return ( - redactAllAttributes - ? Object.keys(single).map((k) => new AttributeReference(k, true)) - : [...this._privateAttributes, ...context.privateAttributes(kind)] + redactAllAttributes ? + Object.keys(single).map((k) => new AttributeReference(k, true)) : + [...this._privateAttributes, ...context.privateAttributes(kind)] ).filter((attr) => !protectedAttributes.some((protectedAttr) => protectedAttr.compare(attr))); } diff --git a/packages/shared/common/src/api/context/index.ts b/packages/shared/common/src/api/context/index.ts index 4edf6d88a4..27e13dab13 100644 --- a/packages/shared/common/src/api/context/index.ts +++ b/packages/shared/common/src/api/context/index.ts @@ -1,6 +1,6 @@ +export * from './LDContext'; export * from './LDContextCommon'; export * from './LDContextMeta'; export * from './LDMultiKindContext'; export * from './LDSingleKindContext'; export * from './LDUser'; -export * from './LDContext'; diff --git a/packages/shared/common/src/api/index.ts b/packages/shared/common/src/api/index.ts index a8c527830a..bfd6cb995d 100644 --- a/packages/shared/common/src/api/index.ts +++ b/packages/shared/common/src/api/index.ts @@ -1,7 +1,7 @@ export * from './context'; -export * from './logging'; export * from './data'; +export * from './integrations'; +export * from './logging'; export * from './options'; export * from './platform'; export * as subsystem from './subsystem'; -export * from './integrations'; diff --git a/packages/shared/common/src/api/subsystem/index.ts b/packages/shared/common/src/api/subsystem/index.ts index bace160f64..ce31eb8901 100644 --- a/packages/shared/common/src/api/subsystem/index.ts +++ b/packages/shared/common/src/api/subsystem/index.ts @@ -7,12 +7,12 @@ import { LDStreamProcessor } from './LDStreamProcessor'; export { DataSource, DataSourceState, + LDContextDeduplicator, LDDataSourceFactory, + LDDeliveryStatus, LDEventProcessor, - LDContextDeduplicator, LDEventSender, - LDDeliveryStatus, - LDEventType, LDEventSenderResult, + LDEventType, LDStreamProcessor, }; diff --git a/packages/shared/common/src/datasource/CompositeDataSource.ts b/packages/shared/common/src/datasource/CompositeDataSource.ts index 98aba652b5..8584d034df 100644 --- a/packages/shared/common/src/datasource/CompositeDataSource.ts +++ b/packages/shared/common/src/datasource/CompositeDataSource.ts @@ -147,7 +147,7 @@ export class CompositeDataSource implements DataSource { // this error indicates we should fallback to only using FDv1 synchronizers if (err instanceof LDFlagDeliveryFallbackError) { - this._logger?.debug(`Falling back to FDv1`); + this._logger?.debug('Falling back to FDv1'); this._syncFactories = this._fdv1Synchronizers; } } @@ -190,7 +190,7 @@ export class CompositeDataSource implements DataSource { transition: 'stop', err: { name: 'ExhaustedDataSources', - message: `CompositeDataSource has exhausted all configured initializers and synchronizers.`, + message: 'CompositeDataSource has exhausted all configured initializers and synchronizers.', }, }); } diff --git a/packages/shared/common/src/datasource/index.ts b/packages/shared/common/src/datasource/index.ts index 497a7588fe..7991960707 100644 --- a/packages/shared/common/src/datasource/index.ts +++ b/packages/shared/common/src/datasource/index.ts @@ -12,8 +12,8 @@ import { export { Backoff, CompositeDataSource, - DefaultBackoff, DataSourceErrorKind, + DefaultBackoff, LDFileDataSourceError, LDFlagDeliveryFallbackError, LDPollingError, diff --git a/packages/shared/common/src/index.ts b/packages/shared/common/src/index.ts index 9f88a96b07..ff7f557620 100644 --- a/packages/shared/common/src/index.ts +++ b/packages/shared/common/src/index.ts @@ -14,25 +14,24 @@ import { } from './datasource'; export * from './api'; -export * from './validators'; +export * from './errors'; +export * as internal from './internal'; export * from './logging'; export * from './options'; export * from './utils'; - -export * as internal from './internal'; -export * from './errors'; +export * from './validators'; export { AttributeReference, + Backoff, + CompositeDataSource, Context, ContextFilter, - CompositeDataSource, DataSourceErrorKind, - Backoff, DefaultBackoff, + LDFileDataSourceError, + LDFlagDeliveryFallbackError, LDPollingError, LDStreamingError, StreamingErrorHandler, - LDFileDataSourceError, - LDFlagDeliveryFallbackError, }; diff --git a/packages/shared/common/src/internal/events/EventProcessor.ts b/packages/shared/common/src/internal/events/EventProcessor.ts index 401d2fc4b6..d5e035acc8 100644 --- a/packages/shared/common/src/internal/events/EventProcessor.ts +++ b/packages/shared/common/src/internal/events/EventProcessor.ts @@ -219,8 +219,8 @@ export default class EventProcessor implements LDEventProcessor { if (this._shutdown) { throw new LDInvalidSDKKeyError( 'Events cannot be posted because a permanent error has been encountered. ' + - 'This is most likely an invalid SDK key. The specific error information ' + - 'is logged independently.', + 'This is most likely an invalid SDK key. The specific error information ' + + 'is logged independently.', ); } diff --git a/packages/shared/common/src/internal/events/EventSender.ts b/packages/shared/common/src/internal/events/EventSender.ts index 0c16752403..62d17edd58 100644 --- a/packages/shared/common/src/internal/events/EventSender.ts +++ b/packages/shared/common/src/internal/events/EventSender.ts @@ -18,6 +18,7 @@ export default class EventSender implements LDEventSender { private _defaultHeaders: { [key: string]: string; }; + private _diagnosticEventsUri: string; private _eventsUri: string; private _requests: Requests; diff --git a/packages/shared/common/src/internal/events/EventSummarizer.ts b/packages/shared/common/src/internal/events/EventSummarizer.ts index 9bd68a21ea..06ede44aa1 100644 --- a/packages/shared/common/src/internal/events/EventSummarizer.ts +++ b/packages/shared/common/src/internal/events/EventSummarizer.ts @@ -109,9 +109,9 @@ export default class EventSummarizer implements LDEventSummarizer { features, kind: 'summary', context: - this._context !== undefined && this._singleContext - ? this._contextFilter?.filter(this._context) - : undefined, + this._context !== undefined && this._singleContext ? + this._contextFilter?.filter(this._context) : + undefined, }; this._clearSummary(); return event; diff --git a/packages/shared/common/src/internal/events/MultiEventSummarizer.ts b/packages/shared/common/src/internal/events/MultiEventSummarizer.ts index c2007642a2..4b605bbe09 100644 --- a/packages/shared/common/src/internal/events/MultiEventSummarizer.ts +++ b/packages/shared/common/src/internal/events/MultiEventSummarizer.ts @@ -10,6 +10,7 @@ export default class MultiEventSummarizer implements LDMultiEventSummarizer { private readonly _contextFilter: ContextFilter, private readonly _logger?: LDLogger, ) {} + private _summarizers: Record = {}; summarizeEvent(event: InputEvent) { diff --git a/packages/shared/common/src/internal/events/index.ts b/packages/shared/common/src/internal/events/index.ts index 4744c33530..920d681d33 100644 --- a/packages/shared/common/src/internal/events/index.ts +++ b/packages/shared/common/src/internal/events/index.ts @@ -11,14 +11,14 @@ import shouldSample from './sampling'; export { ClientMessages, + EventProcessor, + EventProcessorOptions, InputCustomEvent, InputEvalEvent, InputEvent, InputIdentifyEvent, InputMigrationEvent, - EventProcessor, - EventProcessorOptions, - shouldSample, - NullEventProcessor, LDInternalOptions, + NullEventProcessor, + shouldSample, }; diff --git a/packages/shared/common/src/internal/fdv2/index.ts b/packages/shared/common/src/internal/fdv2/index.ts index f845af0ea1..f123a25bc8 100644 --- a/packages/shared/common/src/internal/fdv2/index.ts +++ b/packages/shared/common/src/internal/fdv2/index.ts @@ -2,7 +2,6 @@ import { fdv1PayloadAdaptor as FDv1PayloadAdaptor } from './FDv1PayloadAdaptor'; import { PayloadProcessor } from './payloadProcessor'; import { PayloadStreamReader } from './payloadStreamReader'; import type { FDv2Event, FDv2EventsCollection } from './proto'; -import { createProtocolHandler } from './protocolHandler'; import type { ObjProcessors, Payload, @@ -14,6 +13,7 @@ import type { ProtocolState, Update, } from './protocolHandler'; +import { createProtocolHandler } from './protocolHandler'; export { createProtocolHandler, FDv1PayloadAdaptor, PayloadProcessor, PayloadStreamReader }; diff --git a/packages/shared/common/src/internal/index.ts b/packages/shared/common/src/internal/index.ts index 7c1630e1b0..d4820af6fd 100644 --- a/packages/shared/common/src/internal/index.ts +++ b/packages/shared/common/src/internal/index.ts @@ -3,6 +3,6 @@ export * from './diagnostics'; export * from './evaluation'; export * from './events'; export * from './fdv2'; +export * from './json'; export * from './metadata'; export * from './plugins'; -export * from './json'; diff --git a/packages/shared/common/src/internal/plugins/safeGetName.ts b/packages/shared/common/src/internal/plugins/safeGetName.ts index f5ed364212..9ef0536891 100644 --- a/packages/shared/common/src/internal/plugins/safeGetName.ts +++ b/packages/shared/common/src/internal/plugins/safeGetName.ts @@ -10,7 +10,7 @@ export function safeGetName( try { return plugin.getMetadata().name || UNKNOWN_PLUGIN_NAME; } catch { - logger.error(`Exception thrown getting metadata for plugin. Unable to get plugin name.`); + logger.error('Exception thrown getting metadata for plugin. Unable to get plugin name.'); return UNKNOWN_PLUGIN_NAME; } } diff --git a/packages/shared/common/src/logging/index.ts b/packages/shared/common/src/logging/index.ts index ee031f1f05..2c3715500d 100644 --- a/packages/shared/common/src/logging/index.ts +++ b/packages/shared/common/src/logging/index.ts @@ -2,4 +2,4 @@ import BasicLogger from './BasicLogger'; import createSafeLogger from './createSafeLogger'; import SafeLogger from './SafeLogger'; -export { BasicLogger, SafeLogger, createSafeLogger }; +export { BasicLogger, createSafeLogger, SafeLogger }; diff --git a/packages/shared/common/src/options/ApplicationTags.ts b/packages/shared/common/src/options/ApplicationTags.ts index 41dcaf921f..31694bf815 100644 --- a/packages/shared/common/src/options/ApplicationTags.ts +++ b/packages/shared/common/src/options/ApplicationTags.ts @@ -43,7 +43,7 @@ export default class ApplicationTags { if (!valid) { logger?.warn(message); } else if (key === 'versionName') { - tags[`application-version-name`] = [value]; + tags['application-version-name'] = [value]; } else { tags[`application-${key}`] = [value]; } diff --git a/packages/shared/common/src/options/index.ts b/packages/shared/common/src/options/index.ts index 04181131cb..736d350ca5 100644 --- a/packages/shared/common/src/options/index.ts +++ b/packages/shared/common/src/options/index.ts @@ -5,10 +5,10 @@ import ServiceEndpoints, { getEventsUri, getPollingUri, getStreamingUri } from ' export { ApplicationTags, - OptionMessages, - ServiceEndpoints, ClientContext, - getStreamingUri, - getPollingUri, getEventsUri, + getPollingUri, + getStreamingUri, + OptionMessages, + ServiceEndpoints, }; diff --git a/packages/shared/common/src/utils/http.ts b/packages/shared/common/src/utils/http.ts index 347c63f4eb..023bcdee25 100644 --- a/packages/shared/common/src/utils/http.ts +++ b/packages/shared/common/src/utils/http.ts @@ -30,9 +30,9 @@ export function defaultHeaders( } if (wrapperName) { - headers['x-launchdarkly-wrapper'] = wrapperVersion - ? `${wrapperName}/${wrapperVersion}` - : wrapperName; + headers['x-launchdarkly-wrapper'] = wrapperVersion ? + `${wrapperName}/${wrapperVersion}` : + wrapperName; } if (tags?.value) { diff --git a/packages/shared/common/src/utils/index.ts b/packages/shared/common/src/utils/index.ts index 9dd1503c62..91ca7be5ab 100644 --- a/packages/shared/common/src/utils/index.ts +++ b/packages/shared/common/src/utils/index.ts @@ -12,19 +12,19 @@ import { VoidFunction } from './VoidFunction'; export { base64UrlEncode, + cancelableTimedPromise, + type CancelableTimeout, clone, debounce, deepCompact, defaultHeaders, fastDeepEqual, httpErrorMessage, - noop, LDHeaders, - shouldRetry, + noop, secondsToMillis, + shouldRetry, sleep, timedPromise, VoidFunction, - type CancelableTimeout, - cancelableTimedPromise, }; diff --git a/packages/shared/sdk-client/__tests__/TestDataManager.ts b/packages/shared/sdk-client/__tests__/TestDataManager.ts index f6670f6045..60bc1f0567 100644 --- a/packages/shared/sdk-client/__tests__/TestDataManager.ts +++ b/packages/shared/sdk-client/__tests__/TestDataManager.ts @@ -40,6 +40,7 @@ export default class TestDataManager extends BaseDataManager { diagnosticsManager, ); } + override async identify( identifyResolve: () => void, identifyReject: (err: Error) => void, @@ -117,13 +118,13 @@ export function makeTestDataManagerFactory( return `/msdk/evalx/contexts/${base64UrlEncode(_plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), () => ({ diff --git a/packages/shared/sdk-client/__tests__/datasource/fdv2/FDv2Requestor.test.ts b/packages/shared/sdk-client/__tests__/datasource/fdv2/FDv2Requestor.test.ts index c293a07cc8..e166297d30 100644 --- a/packages/shared/sdk-client/__tests__/datasource/fdv2/FDv2Requestor.test.ts +++ b/packages/shared/sdk-client/__tests__/datasource/fdv2/FDv2Requestor.test.ts @@ -33,9 +33,9 @@ function makeRequests( value: string = '{}', statusCode: number = 200, ): { - requests: Requests; - fetch: jest.Mock; -} { + requests: Requests; + fetch: jest.Mock; + } { const { response } = mockResponse(value, statusCode); const fetch = jest.fn().mockResolvedValue(response); return { diff --git a/packages/shared/sdk-client/__tests__/flag-manager/FlagPersistence.test.ts b/packages/shared/sdk-client/__tests__/flag-manager/FlagPersistence.test.ts index 515ac2a6c9..af31e4cadd 100644 --- a/packages/shared/sdk-client/__tests__/flag-manager/FlagPersistence.test.ts +++ b/packages/shared/sdk-client/__tests__/flag-manager/FlagPersistence.test.ts @@ -271,7 +271,7 @@ describe('FlagPersistence tests', () => { const contextIndexKey = await namespaceForContextIndex(TEST_NAMESPACE); const indexData = await memoryStorage.get(contextIndexKey); - expect(indexData).toContain(`"timestamp":2`); + expect(indexData).toContain('"timestamp":2'); }); test('upsert updates persistence', async () => { diff --git a/packages/shared/sdk-client/__tests__/flag-manager/bootstrap.test.ts b/packages/shared/sdk-client/__tests__/flag-manager/bootstrap.test.ts index 1a04fd80bd..9f7dce80fd 100644 --- a/packages/shared/sdk-client/__tests__/flag-manager/bootstrap.test.ts +++ b/packages/shared/sdk-client/__tests__/flag-manager/bootstrap.test.ts @@ -64,7 +64,7 @@ it('can read old bootstrap data without $flagsState', () => { }); expect(logger.warn).toHaveBeenCalledWith( 'LaunchDarkly client was initialized with bootstrap data that did not include flag' + - ' metadata. Events may not be sent correctly.', + ' metadata. Events may not be sent correctly.', ); }); diff --git a/packages/shared/sdk-client/package.json b/packages/shared/sdk-client/package.json index 46dcec0eb8..197ea8149b 100644 --- a/packages/shared/sdk-client/package.json +++ b/packages/shared/sdk-client/package.json @@ -38,8 +38,7 @@ "clean": "rimraf dist", "lint": "npx eslint . --ext .ts", "lint:fix": "npx eslint . --ext .ts --fix", - "prettier": "prettier --write 'src/*.@(js|ts|tsx|json)'", - "check": "yarn && yarn prettier && yarn lint && tsc && yarn test" + "check": "yarn && yarn lint:fix && yarn lint && tsc && yarn test" }, "license": "Apache-2.0", "dependencies": { @@ -51,6 +50,7 @@ "@rollup/plugin-node-resolve": "^15.0.2", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@testing-library/dom": "^9.3.1", "@testing-library/jest-dom": "^5.16.5", "@types/jest": "^29.5.3", @@ -58,15 +58,13 @@ "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.6.1", "jest-diff": "^29.6.1", "jest-environment-jsdom": "^29.6.1", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "rimraf": "6.0.1", "rollup": "^3.23.0", "ts-jest": "^29.1.1", diff --git a/packages/shared/sdk-client/src/HookRunner.ts b/packages/shared/sdk-client/src/HookRunner.ts index 87bda82cdd..105d211dcf 100644 --- a/packages/shared/sdk-client/src/HookRunner.ts +++ b/packages/shared/sdk-client/src/HookRunner.ts @@ -35,7 +35,7 @@ function getHookName(logger: LDLogger, hook: Hook): string { try { return hook.getMetadata().name || UNKNOWN_HOOK_NAME; } catch { - logger.error(`Exception thrown getting metadata for hook. Unable to get hook name.`); + logger.error('Exception thrown getting metadata for hook. Unable to get hook name.'); return UNKNOWN_HOOK_NAME; } } diff --git a/packages/shared/sdk-client/src/LDClientImpl.ts b/packages/shared/sdk-client/src/LDClientImpl.ts index d60d737558..f1c8716984 100644 --- a/packages/shared/sdk-client/src/LDClientImpl.ts +++ b/packages/shared/sdk-client/src/LDClientImpl.ts @@ -258,9 +258,9 @@ export default class LDClientImpl implements LDClient, LDClientIdentifyResult { // code. We are returned the unchecked context so that if a consumer identifies with an invalid context // and then calls getContext, they get back the same context they provided, without any assertion about // validity. - return this._activeContextTracker.hasContext() - ? clone(this._activeContextTracker.getUnwrappedContext()) - : undefined; + return this._activeContextTracker.hasContext() ? + clone(this._activeContextTracker.getUnwrappedContext()) : + undefined; } protected getInternalContext(): Context | undefined { @@ -398,8 +398,8 @@ export default class LDClientImpl implements LDClient, LDClientIdentifyResult { if (identifyTimeout > this._highTimeoutThreshold) { this.logger.warn( 'The identify function was called with a timeout greater than ' + - `${this._highTimeoutThreshold} seconds. We recommend a timeout of less than ` + - `${this._highTimeoutThreshold} seconds.`, + `${this._highTimeoutThreshold} seconds. We recommend a timeout of less than ` + + `${this._highTimeoutThreshold} seconds.`, ); } @@ -700,6 +700,7 @@ export default class LDClientImpl implements LDClient, LDClientIdentifyResult { ); return value; } + variationDetail(flagKey: string, defaultValue?: LDFlagValue): LDEvaluationDetail { return this._hookRunner.withEvaluation( flagKey, diff --git a/packages/shared/sdk-client/src/api/datasource/index.ts b/packages/shared/sdk-client/src/api/datasource/index.ts index 0795f0f33c..ab5898a64c 100644 --- a/packages/shared/sdk-client/src/api/datasource/index.ts +++ b/packages/shared/sdk-client/src/api/datasource/index.ts @@ -1,25 +1,25 @@ -export type { default as FDv2ConnectionMode } from './FDv2ConnectionMode'; export type { + CacheDataSourceEntry, + DataSourceEntry, EndpointConfig, FDv1FallbackConfig, - CacheDataSourceEntry, + InitializerEntry, PollingDataSourceEntry, StreamingDataSourceEntry, - InitializerEntry, SynchronizerEntry, - DataSourceEntry, } from './DataSourceEntry'; -export type { ModeDefinition } from './ModeDefinition'; +export type { default as FDv2ConnectionMode } from './FDv2ConnectionMode'; export type { - LDClientDataSystemOptions, AutomaticModeSwitchingConfig, + LDClientDataSystemOptions, ManualModeSwitching, } from './LDClientDataSystemOptions'; +export type { ModeDefinition } from './ModeDefinition'; export type { - LifecycleState, - ModeState, ConfiguredMode, + LifecycleState, ModeResolution, ModeResolutionEntry, ModeResolutionTable, + ModeState, } from './ModeResolution'; diff --git a/packages/shared/sdk-client/src/api/index.ts b/packages/shared/sdk-client/src/api/index.ts index de03c367fb..6dca642946 100644 --- a/packages/shared/sdk-client/src/api/index.ts +++ b/packages/shared/sdk-client/src/api/index.ts @@ -1,16 +1,16 @@ import ConnectionMode from './ConnectionMode'; -export * from './LDOptions'; +export * from './integrations'; export * from './LDClient'; export * from './LDEvaluationDetail'; -export * from './integrations'; +export * from './LDOptions'; export { ConnectionMode }; +export * from './datasource'; +export * from './LDContext'; export * from './LDIdentifyOptions'; -export * from './LDInspection'; export * from './LDIdentifyResult'; +export * from './LDInspection'; export * from './LDPlugin'; export * from './LDStartOptions'; export * from './LDWaitForInitialization'; -export * from './LDContext'; -export * from './datasource'; diff --git a/packages/shared/sdk-client/src/configuration/Configuration.ts b/packages/shared/sdk-client/src/configuration/Configuration.ts index de296ec2bd..07ae84c468 100644 --- a/packages/shared/sdk-client/src/configuration/Configuration.ts +++ b/packages/shared/sdk-client/src/configuration/Configuration.ts @@ -131,6 +131,7 @@ export default class ConfigurationImpl implements Configuration { name?: string; versionName?: string; }; + public readonly bootstrap?: LDFlagSet; // TODO: implement requestHeaderTransform @@ -158,6 +159,7 @@ export default class ConfigurationImpl implements Configuration { public readonly getImplementationHooks: ( environmentMetadata: LDPluginEnvironmentMetadata, ) => Hook[]; + public readonly dataSystem?: InternalDataSystemOptions; // Allow indexing Configuration by a string diff --git a/packages/shared/sdk-client/src/configuration/index.ts b/packages/shared/sdk-client/src/configuration/index.ts index cdb5c13444..95362993ee 100644 --- a/packages/shared/sdk-client/src/configuration/index.ts +++ b/packages/shared/sdk-client/src/configuration/index.ts @@ -8,7 +8,7 @@ import ConfigurationImpl, { export { Configuration, ConfigurationImpl, - LDClientInternalOptions, DEFAULT_POLLING, DEFAULT_STREAM, + LDClientInternalOptions, }; diff --git a/packages/shared/sdk-client/src/configuration/validateOptions.ts b/packages/shared/sdk-client/src/configuration/validateOptions.ts index 98fde7f557..5fa6d7645c 100644 --- a/packages/shared/sdk-client/src/configuration/validateOptions.ts +++ b/packages/shared/sdk-client/src/configuration/validateOptions.ts @@ -235,9 +235,9 @@ export function anyOf(...validators: TypeValidator[]): CompoundValidator { validate(value: unknown, name: string, logger?: LDLogger, defaults?: unknown) { const match = validators.find((v) => v.is(value)); if (match) { - return isCompoundValidator(match) - ? match.validate(value, name, logger, defaults) - : { value }; + return isCompoundValidator(match) ? + match.validate(value, name, logger, defaults) : + { value }; } logger?.warn(OptionMessages.wrongOptionType(name, this.getType(), typeof value)); return undefined; diff --git a/packages/shared/sdk-client/src/configuration/validators.ts b/packages/shared/sdk-client/src/configuration/validators.ts index 64f1629c36..81327738a0 100644 --- a/packages/shared/sdk-client/src/configuration/validators.ts +++ b/packages/shared/sdk-client/src/configuration/validators.ts @@ -48,13 +48,13 @@ export default function createValidators( hooks: TypeValidators.createTypeArray('Hook[]', {}), inspectors: TypeValidators.createTypeArray('LDInspection', {}), cleanOldPersistentData: TypeValidators.Boolean, - dataSystem: options?.dataSystemDefaults - ? validatorOf(dataSystemValidators, { + dataSystem: options?.dataSystemDefaults ? + validatorOf(dataSystemValidators, { defaults: { ...options.dataSystemDefaults, connectionModes: MODE_TABLE, } as unknown as Record, - }) - : TypeValidators.Object, + }) : + TypeValidators.Object, }; } diff --git a/packages/shared/sdk-client/src/datasource/ConnectionModeConfig.ts b/packages/shared/sdk-client/src/datasource/ConnectionModeConfig.ts index 6e2070430f..026bb884d8 100644 --- a/packages/shared/sdk-client/src/datasource/ConnectionModeConfig.ts +++ b/packages/shared/sdk-client/src/datasource/ConnectionModeConfig.ts @@ -103,11 +103,11 @@ const connectionModesValidator = recordOf( export type { ModeTable }; export { - MODE_TABLE, - MODE_DEFINITION_DEFAULTS, - DEFAULT_FDV1_FALLBACK_POLL_INTERVAL_SECONDS, BACKGROUND_POLL_INTERVAL_SECONDS, + connectionModesValidator, connectionModeValidator, + DEFAULT_FDV1_FALLBACK_POLL_INTERVAL_SECONDS, + MODE_DEFINITION_DEFAULTS, + MODE_TABLE, modeDefinitionValidators, - connectionModesValidator, }; diff --git a/packages/shared/sdk-client/src/datasource/DataSourceStatusManager.ts b/packages/shared/sdk-client/src/datasource/DataSourceStatusManager.ts index f028b4ca08..3fa9990034 100644 --- a/packages/shared/sdk-client/src/datasource/DataSourceStatusManager.ts +++ b/packages/shared/sdk-client/src/datasource/DataSourceStatusManager.ts @@ -56,9 +56,9 @@ export function createDataSourceStatusManager( function updateState(requestedState: DataSourceState, isError = false) { const newState = - requestedState === 'INTERRUPTED' && state === 'INITIALIZING' // don't go to interrupted from initializing (recoverable errors when initializing are not noteworthy) - ? 'INITIALIZING' - : requestedState; + requestedState === 'INTERRUPTED' && state === 'INITIALIZING' ? // don't go to interrupted from initializing (recoverable errors when initializing are not noteworthy) + 'INITIALIZING' : + requestedState; const changedState = state !== newState; if (changedState) { diff --git a/packages/shared/sdk-client/src/datasource/Endpoints.ts b/packages/shared/sdk-client/src/datasource/Endpoints.ts index daa2ab7748..d0ece2813d 100644 --- a/packages/shared/sdk-client/src/datasource/Endpoints.ts +++ b/packages/shared/sdk-client/src/datasource/Endpoints.ts @@ -55,7 +55,7 @@ export function mobileFdv1Endpoints(): DataSourceEndpoints { return `/msdk/evalx/contexts/${base64UrlEncode(plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/msdk/evalx/context`; + return '/msdk/evalx/context'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post for FDv1 unsupported.'); @@ -69,13 +69,13 @@ export function mobileFdv1Endpoints(): DataSourceEndpoints { return `/meval/${base64UrlEncode(plainContextString, encoding)}`; }, pathReport(_encoding: Encoding, _plainContextString: string): string { - return `/meval`; + return '/meval'; }, pathPost(_encoding: Encoding, _plainContextString: string): string { throw new Error('Post for FDv1 unsupported.'); }, pathPing(_encoding: Encoding, _plainContextString: string): string { - return `/mping`; + return '/mping'; }, }), }; @@ -95,7 +95,7 @@ export function fdv2Endpoints(): DataSourceEndpoints { throw new Error('Report for FDv2 unsupported.'); }, pathPost(_encoding: Encoding, _plainContextString: string): string { - return `/sdk/poll/eval`; + return '/sdk/poll/eval'; }, pathPing(_encoding: Encoding, _plainContextString: string): string { throw new Error('Ping for polling unsupported.'); @@ -109,7 +109,7 @@ export function fdv2Endpoints(): DataSourceEndpoints { throw new Error('Report for FDv2 unsupported.'); }, pathPost(_encoding: Encoding, _plainContextString: string): string { - return `/sdk/stream/eval`; + return '/sdk/stream/eval'; }, pathPing(_encoding: Encoding, _plainContextString: string): string { throw new Error('Ping for streaming unsupported.'); diff --git a/packages/shared/sdk-client/src/datasource/FDv2DataManagerBase.ts b/packages/shared/sdk-client/src/datasource/FDv2DataManagerBase.ts index 29b9b3c552..56ae09fec3 100644 --- a/packages/shared/sdk-client/src/datasource/FDv2DataManagerBase.ts +++ b/packages/shared/sdk-client/src/datasource/FDv2DataManagerBase.ts @@ -140,9 +140,9 @@ export function createFDv2DataManagerBase( const endpoints = fdv2Endpoints(); // Merge user-provided connection mode overrides into the mode table. - const effectiveModeTable: ModeTable = config.dataSystem?.connectionModes - ? { ...modeTable, ...config.dataSystem.connectionModes } - : modeTable; + const effectiveModeTable: ModeTable = config.dataSystem?.connectionModes ? + { ...modeTable, ...config.dataSystem.connectionModes } : + modeTable; // --- Mutable state --- let selector: string | undefined; @@ -246,9 +246,9 @@ export function createFDv2DataManagerBase( ctx: SourceFactoryContext, includeInitializers: boolean, ): { - initializerFactories: InitializerFactory[]; - synchronizerSlots: SynchronizerSlot[]; - } { + initializerFactories: InitializerFactory[]; + synchronizerSlots: SynchronizerSlot[]; + } { const initializerFactories: InitializerFactory[] = []; if (includeInitializers) { modeDef.initializers @@ -284,17 +284,17 @@ export function createFDv2DataManagerBase( const fallbackPollIntervalMs = (fallbackConfig?.pollInterval ?? config.pollInterval) * 1000; const fallbackServiceEndpoints = - fallbackConfig?.endpoints?.pollingBaseUri || fallbackConfig?.endpoints?.streamingBaseUri - ? new ServiceEndpoints( - fallbackConfig.endpoints.streamingBaseUri ?? ctx.serviceEndpoints.streaming, - fallbackConfig.endpoints.pollingBaseUri ?? ctx.serviceEndpoints.polling, - ctx.serviceEndpoints.events, - ctx.serviceEndpoints.analyticsEventPath, - ctx.serviceEndpoints.diagnosticEventPath, - ctx.serviceEndpoints.includeAuthorizationHeader, - ctx.serviceEndpoints.payloadFilterKey, - ) - : ctx.serviceEndpoints; + fallbackConfig?.endpoints?.pollingBaseUri || fallbackConfig?.endpoints?.streamingBaseUri ? + new ServiceEndpoints( + fallbackConfig.endpoints.streamingBaseUri ?? ctx.serviceEndpoints.streaming, + fallbackConfig.endpoints.pollingBaseUri ?? ctx.serviceEndpoints.polling, + ctx.serviceEndpoints.events, + ctx.serviceEndpoints.analyticsEventPath, + ctx.serviceEndpoints.diagnosticEventPath, + ctx.serviceEndpoints.includeAuthorizationHeader, + ctx.serviceEndpoints.payloadFilterKey, + ) : + ctx.serviceEndpoints; const fdv1RequestorFactory = () => makeRequestor( diff --git a/packages/shared/sdk-client/src/datasource/LDClientDataSystemOptions.ts b/packages/shared/sdk-client/src/datasource/LDClientDataSystemOptions.ts index 3aa4a61dff..c26823a7c7 100644 --- a/packages/shared/sdk-client/src/datasource/LDClientDataSystemOptions.ts +++ b/packages/shared/sdk-client/src/datasource/LDClientDataSystemOptions.ts @@ -114,9 +114,9 @@ function resolveForegroundMode( } export { - dataSystemValidators, - resolveForegroundMode, BROWSER_DATA_SYSTEM_DEFAULTS, - MOBILE_DATA_SYSTEM_DEFAULTS, + dataSystemValidators, DESKTOP_DATA_SYSTEM_DEFAULTS, + MOBILE_DATA_SYSTEM_DEFAULTS, + resolveForegroundMode, }; diff --git a/packages/shared/sdk-client/src/datasource/ModeResolver.ts b/packages/shared/sdk-client/src/datasource/ModeResolver.ts index 7f764e3879..efd2b2ad7e 100644 --- a/packages/shared/sdk-client/src/datasource/ModeResolver.ts +++ b/packages/shared/sdk-client/src/datasource/ModeResolver.ts @@ -76,8 +76,8 @@ const DESKTOP_TRANSITION_TABLE: ModeResolutionTable = [ ]; export { - resolveConnectionMode, - MOBILE_TRANSITION_TABLE, BROWSER_TRANSITION_TABLE, DESKTOP_TRANSITION_TABLE, + MOBILE_TRANSITION_TABLE, + resolveConnectionMode, }; diff --git a/packages/shared/sdk-client/src/datasource/Requestor.ts b/packages/shared/sdk-client/src/datasource/Requestor.ts index 5d8308a60f..28495f5675 100644 --- a/packages/shared/sdk-client/src/datasource/Requestor.ts +++ b/packages/shared/sdk-client/src/datasource/Requestor.ts @@ -53,9 +53,9 @@ export function makeRequestor( body = plainContextString; // context is in body for REPORT } - const path = useReport - ? paths.pathReport(encoding, plainContextString) - : paths.pathGet(encoding, plainContextString); + const path = useReport ? + paths.pathReport(encoding, plainContextString) : + paths.pathGet(encoding, plainContextString); const parameters: { key: string; value: string }[] = [...(baseQueryParams ?? [])]; if (withReasons) { diff --git a/packages/shared/sdk-client/src/datasource/fdv2/FDv1PollingSynchronizer.ts b/packages/shared/sdk-client/src/datasource/fdv2/FDv1PollingSynchronizer.ts index d3545b9371..b1bf089919 100644 --- a/packages/shared/sdk-client/src/datasource/fdv2/FDv1PollingSynchronizer.ts +++ b/packages/shared/sdk-client/src/datasource/fdv2/FDv1PollingSynchronizer.ts @@ -130,9 +130,9 @@ export function createFDv1PollingSynchronizer( resultQueue.put({ type: 'status', state: 'interrupted', - errorInfo: requestError.status - ? errorInfoFromHttpError(requestError.status) - : errorInfoFromNetworkError(requestError.message), + errorInfo: requestError.status ? + errorInfoFromHttpError(requestError.status) : + errorInfoFromNetworkError(requestError.message), fdv1Fallback: false, }); } diff --git a/packages/shared/sdk-client/src/datasource/fdv2/PollingBase.ts b/packages/shared/sdk-client/src/datasource/fdv2/PollingBase.ts index 31b0b84971..87d9f6a4e8 100644 --- a/packages/shared/sdk-client/src/datasource/fdv2/PollingBase.ts +++ b/packages/shared/sdk-client/src/datasource/fdv2/PollingBase.ts @@ -133,9 +133,9 @@ export async function poll( logger?.error(`Polling request failed with HTTP error: ${response.status}`); const recoverable = response.status <= 0 || isHttpRecoverable(response.status); - return recoverable - ? interrupted(errorInfo, fdv1Fallback) - : terminalError(errorInfo, fdv1Fallback); + return recoverable ? + interrupted(errorInfo, fdv1Fallback) : + terminalError(errorInfo, fdv1Fallback); } // Successful response — process FDv2 events diff --git a/packages/shared/sdk-client/src/datasource/fdv2/index.ts b/packages/shared/sdk-client/src/datasource/fdv2/index.ts index 019251c18a..b3667ebd1d 100644 --- a/packages/shared/sdk-client/src/datasource/fdv2/index.ts +++ b/packages/shared/sdk-client/src/datasource/fdv2/index.ts @@ -1,12 +1,11 @@ export type { AsyncQueue } from './AsyncQueue'; export { createAsyncQueue } from './AsyncQueue'; - export type { CacheInitializerConfig } from './CacheInitializer'; export { createCacheInitializerFactory } from './CacheInitializer'; - +export { calculatePollDelay } from './calculatePollDelay'; +export { createFDv1PollingSynchronizer } from './FDv1PollingSynchronizer'; export type { FDv2PollResponse, FDv2Requestor } from './FDv2Requestor'; export { makeFDv2Requestor } from './FDv2Requestor'; - export type { ChangeSetResult, FDv2SourceResult, @@ -24,17 +23,12 @@ export { shutdown, terminalError, } from './FDv2SourceResult'; - export type { Initializer } from './Initializer'; -export type { Synchronizer } from './Synchronizer'; - -export { calculatePollDelay } from './calculatePollDelay'; export { poll } from './PollingBase'; export { createPollingInitializer } from './PollingInitializer'; -export { createFDv1PollingSynchronizer } from './FDv1PollingSynchronizer'; export { createPollingSynchronizer } from './PollingSynchronizer'; - export type { PingHandler, StreamingFDv2Base } from './StreamingFDv2Base'; export { createStreamingBase } from './StreamingFDv2Base'; export { createStreamingInitializer } from './StreamingInitializerFDv2'; export { createStreamingSynchronizer } from './StreamingSynchronizerFDv2'; +export type { Synchronizer } from './Synchronizer'; diff --git a/packages/shared/sdk-client/src/flag-manager/bootstrap.ts b/packages/shared/sdk-client/src/flag-manager/bootstrap.ts index 3f7191e581..b0092724ca 100644 --- a/packages/shared/sdk-client/src/flag-manager/bootstrap.ts +++ b/packages/shared/sdk-client/src/flag-manager/bootstrap.ts @@ -17,7 +17,7 @@ export function readFlagsFromBootstrap( if (!metadata && keys.length) { logger.warn( 'LaunchDarkly client was initialized with bootstrap data that did not include flag' + - ' metadata. Events may not be sent correctly.', + ' metadata. Events may not be sent correctly.', ); } if (data[validKey] === false) { diff --git a/packages/shared/sdk-client/src/index.ts b/packages/shared/sdk-client/src/index.ts index 951ddc078c..98d5b99a91 100644 --- a/packages/shared/sdk-client/src/index.ts +++ b/packages/shared/sdk-client/src/index.ts @@ -6,7 +6,6 @@ import LDClientImpl from './LDClientImpl'; import LDEmitter, { EventName } from './LDEmitter'; export * from '@launchdarkly/js-sdk-common'; - export * as platform from '@launchdarkly/js-sdk-common'; // To replace the exports from `export *` we need to name them. @@ -14,62 +13,60 @@ export * as platform from '@launchdarkly/js-sdk-common'; // These exports are explicit to override those from common. export type { - LDEvaluationDetail, - LDEvaluationDetailTyped, - LDClient, - LDOptions, ConnectionMode, - LDIdentifyOptions, - Hook, - HookMetadata, EvaluationSeriesContext, EvaluationSeriesData, + Hook, + HookMetadata, IdentifySeriesContext, IdentifySeriesData, IdentifySeriesResult, IdentifySeriesStatus, - TrackSeriesContext, - LDInspection, + LDClient, + LDClientIdentifyResult, + LDContext, + LDContextStrict, + LDEvaluationDetail, + LDEvaluationDetailTyped, + LDIdentifyError, + LDIdentifyOptions, LDIdentifyResult, + LDIdentifyShed, LDIdentifySuccess, - LDIdentifyError, LDIdentifyTimeout, - LDIdentifyShed, - LDClientIdentifyResult, + LDInspection, + LDOptions, LDPluginBase, - LDWaitForInitializationOptions, - LDWaitForInitializationResult, + LDStartOptions, LDWaitForInitializationComplete, LDWaitForInitializationFailed, + LDWaitForInitializationOptions, + LDWaitForInitializationResult, LDWaitForInitializationTimeout, - LDStartOptions, - LDContext, - LDContextStrict, + TrackSeriesContext, } from './api'; - -export type { DataManager, DataManagerFactory, ConnectionParams } from './DataManager'; -export type { FlagManager, LDDebugOverride } from './flag-manager/FlagManager'; -export { safeRegisterDebugOverridePlugins } from './plugins/safeRegisterDebugOverridePlugins'; export type { Configuration } from './configuration/Configuration'; export { default as validateOptions } from './configuration/validateOptions'; +export type { ConnectionParams, DataManager, DataManagerFactory } from './DataManager'; +export type { FlagManager, LDDebugOverride } from './flag-manager/FlagManager'; +export { safeRegisterDebugOverridePlugins } from './plugins/safeRegisterDebugOverridePlugins'; export type { LDEmitter }; -export type { ItemDescriptor } from './flag-manager/ItemDescriptor'; -export type { Flag } from './types'; +export { BaseDataManager } from './DataManager'; +export type { DataSourceEndpoints } from './datasource/Endpoints'; +export { browserFdv1Endpoints, fdv2Endpoints, mobileFdv1Endpoints } from './datasource/Endpoints'; export { readFlagsFromBootstrap } from './flag-manager/bootstrap'; - +export type { ItemDescriptor } from './flag-manager/ItemDescriptor'; export { DataSourcePaths } from './streaming'; -export { browserFdv1Endpoints, mobileFdv1Endpoints, fdv2Endpoints } from './datasource/Endpoints'; -export type { DataSourceEndpoints } from './datasource/Endpoints'; -export { BaseDataManager } from './DataManager'; +export type { Flag } from './types'; export { makeRequestor, Requestor }; export { + DataSourceState, DataSourceStatus, DataSourceStatusErrorInfo, LDClientImpl, LDClientInternalOptions, - DataSourceState, EventName as LDEmitterEventName, }; @@ -77,29 +74,29 @@ export { // When FDv2 becomes the default, FDv2ConnectionMode should replace ConnectionMode // in the api/ exports above. export type { - FDv2ConnectionMode, - EndpointConfig, + AutomaticModeSwitchingConfig, CacheDataSourceEntry, - PollingDataSourceEntry, - StreamingDataSourceEntry, - InitializerEntry, - SynchronizerEntry, + ConfiguredMode, DataSourceEntry, - ModeDefinition, + EndpointConfig, + FDv2ConnectionMode, + InitializerEntry, LDClientDataSystemOptions, - AutomaticModeSwitchingConfig, - ManualModeSwitching, LifecycleState, - ModeState, - ConfiguredMode, + ManualModeSwitching, + ModeDefinition, ModeResolution, ModeResolutionEntry, ModeResolutionTable, + ModeState, + PollingDataSourceEntry, + StreamingDataSourceEntry, + SynchronizerEntry, } from './api/datasource'; // FDv2 data source status manager. -export { createDataSourceStatusManager } from './datasource/DataSourceStatusManager'; export type { DataSourceStatusManager } from './datasource/DataSourceStatusManager'; +export { createDataSourceStatusManager } from './datasource/DataSourceStatusManager'; // FDv2 data system validators and platform defaults. export type { @@ -107,21 +104,21 @@ export type { PlatformDataSystemDefaults, } from './datasource/LDClientDataSystemOptions'; export { - dataSystemValidators, - resolveForegroundMode, BROWSER_DATA_SYSTEM_DEFAULTS, - MOBILE_DATA_SYSTEM_DEFAULTS, + dataSystemValidators, DESKTOP_DATA_SYSTEM_DEFAULTS, + MOBILE_DATA_SYSTEM_DEFAULTS, + resolveForegroundMode, } from './datasource/LDClientDataSystemOptions'; // FDv2 connection mode type system — internal implementation. export type { ModeTable } from './datasource/ConnectionModeConfig'; export { MODE_TABLE } from './datasource/ConnectionModeConfig'; export { - resolveConnectionMode, - MOBILE_TRANSITION_TABLE, BROWSER_TRANSITION_TABLE, DESKTOP_TRANSITION_TABLE, + MOBILE_TRANSITION_TABLE, + resolveConnectionMode, } from './datasource/ModeResolver'; // FDv2 source factory provider — converts declarative config to concrete factories. @@ -140,10 +137,10 @@ export { createFDv2DataManagerBase } from './datasource/FDv2DataManagerBase'; // State debounce manager. export type { - StateDebounceManager, - StateDebounceManagerConfig, NetworkState, PendingState, ReconciliationCallback, + StateDebounceManager, + StateDebounceManagerConfig, } from './datasource/StateDebounceManager'; export { createStateDebounceManager } from './datasource/StateDebounceManager'; diff --git a/packages/shared/sdk-client/src/polling/PollingProcessor.ts b/packages/shared/sdk-client/src/polling/PollingProcessor.ts index c55b02bbf9..723e16963a 100644 --- a/packages/shared/sdk-client/src/polling/PollingProcessor.ts +++ b/packages/shared/sdk-client/src/polling/PollingProcessor.ts @@ -14,7 +14,7 @@ import { Flags } from '../types'; export type PollingErrorHandler = (err: LDPollingError) => void; function reportClosed(logger?: LDLogger) { - logger?.debug(`Poll completed after the processor was closed. Skipping processing.`); + logger?.debug('Poll completed after the processor was closed. Skipping processing.'); } /** diff --git a/packages/shared/sdk-client/src/storage/freshness.ts b/packages/shared/sdk-client/src/storage/freshness.ts index 4e90c31f65..11daae844e 100644 --- a/packages/shared/sdk-client/src/storage/freshness.ts +++ b/packages/shared/sdk-client/src/storage/freshness.ts @@ -55,9 +55,9 @@ export async function readFreshness( if (currentHash === undefined || record.contextHash !== currentHash) { return undefined; } - return typeof record.timestamp === 'number' && !Number.isNaN(record.timestamp) - ? record.timestamp - : undefined; + return typeof record.timestamp === 'number' && !Number.isNaN(record.timestamp) ? + record.timestamp : + undefined; } catch (e: any) { logger?.warn(`Could not read freshness data from persistent storage: ${e.message}`); return undefined; diff --git a/packages/shared/sdk-client/src/streaming/StreamingProcessor.ts b/packages/shared/sdk-client/src/streaming/StreamingProcessor.ts index 4ae9fc41d4..f0d73a877b 100644 --- a/packages/shared/sdk-client/src/streaming/StreamingProcessor.ts +++ b/packages/shared/sdk-client/src/streaming/StreamingProcessor.ts @@ -64,9 +64,9 @@ class StreamingProcessor implements subsystem.LDStreamProcessor { if (_dataSourceConfig.useReport && !_requests.getEventSourceCapabilities().customMethod) { path = _dataSourceConfig.paths.pathPing(encoding, _plainContextString); } else { - path = _dataSourceConfig.useReport - ? _dataSourceConfig.paths.pathReport(encoding, _plainContextString) - : _dataSourceConfig.paths.pathGet(encoding, _plainContextString); + path = _dataSourceConfig.useReport ? + _dataSourceConfig.paths.pathReport(encoding, _plainContextString) : + _dataSourceConfig.paths.pathGet(encoding, _plainContextString); } const parameters: { key: string; value: string }[] = [ ...(_dataSourceConfig.queryParameters ?? []), diff --git a/packages/shared/sdk-client/src/streaming/index.ts b/packages/shared/sdk-client/src/streaming/index.ts index cb1074706e..f9d5440e6c 100644 --- a/packages/shared/sdk-client/src/streaming/index.ts +++ b/packages/shared/sdk-client/src/streaming/index.ts @@ -5,4 +5,4 @@ import { } from '../datasource/DataSourceConfig'; import StreamingProcessor from './StreamingProcessor'; -export { DataSourcePaths, PollingDataSourceConfig, StreamingProcessor, StreamingDataSourceConfig }; +export { DataSourcePaths, PollingDataSourceConfig, StreamingDataSourceConfig, StreamingProcessor }; diff --git a/packages/shared/sdk-server-edge/package.json b/packages/shared/sdk-server-edge/package.json index a7d1acfa63..3e96625ab8 100644 --- a/packages/shared/sdk-server-edge/package.json +++ b/packages/shared/sdk-server-edge/package.json @@ -30,31 +30,29 @@ "clean": "rimraf dist", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test && yarn doc" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test && yarn doc", + "lint:fix": "eslint . --ext .ts --fix" }, "dependencies": { "@launchdarkly/js-server-sdk-common": "2.18.5", "crypto-js": "^4.1.1" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "esbuild": "^0.17.17", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", "npm-dts": "^1.3.12", - "prettier": "^3.0.0", "rimraf": "^5.0.0", "ts-jest": "^29.1.0", "typedoc": "0.25.0", diff --git a/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts b/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts index 489177b06e..42944bc6a9 100644 --- a/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts +++ b/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts @@ -97,9 +97,9 @@ export class EdgeFeatureStore implements LDFeatureStore { } payload = - typeof providerData === 'string' - ? deserializePoll(providerData) - : reviveFullPayload(providerData); + typeof providerData === 'string' ? + deserializePoll(providerData) : + reviveFullPayload(providerData); if (!payload) { throw new Error(`Error deserializing ${this._rootKey}`); diff --git a/packages/shared/sdk-server-edge/src/api/index.ts b/packages/shared/sdk-server-edge/src/api/index.ts index 569e65c0c7..ecc8d8fe34 100644 --- a/packages/shared/sdk-server-edge/src/api/index.ts +++ b/packages/shared/sdk-server-edge/src/api/index.ts @@ -2,4 +2,4 @@ import Cache from './cache'; import LDClient from './LDClient'; export * from './EdgeFeatureStore'; -export { LDClient, Cache }; +export { Cache, LDClient }; diff --git a/packages/shared/sdk-server-edge/src/index.ts b/packages/shared/sdk-server-edge/src/index.ts index b539aaa499..c99c356382 100644 --- a/packages/shared/sdk-server-edge/src/index.ts +++ b/packages/shared/sdk-server-edge/src/index.ts @@ -12,7 +12,7 @@ import validateOptions, { LDOptions, LDOptionsInternal } from './utils/validateO export * from '@launchdarkly/js-server-sdk-common'; export { EdgeFeatureStore }; -export type { LDClient, LDOptions, EdgeProvider, Cache }; +export type { Cache, EdgeProvider, LDClient, LDOptions }; /** * Do not use this function directly. diff --git a/packages/shared/sdk-server-edge/src/platform/requests.ts b/packages/shared/sdk-server-edge/src/platform/requests.ts index 413bbb6b32..ae72c2fcf5 100644 --- a/packages/shared/sdk-server-edge/src/platform/requests.ts +++ b/packages/shared/sdk-server-edge/src/platform/requests.ts @@ -1,4 +1,3 @@ -import { NullEventSource } from '@launchdarkly/js-server-sdk-common'; import type { EventSource, EventSourceCapabilities, @@ -7,6 +6,7 @@ import type { Requests, Response, } from '@launchdarkly/js-server-sdk-common'; +import { NullEventSource } from '@launchdarkly/js-server-sdk-common'; export default class EdgeRequests implements Requests { fetch(url: string, options: Options = {}): Promise { diff --git a/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts b/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts index ab4a157cde..39ed7f10d0 100644 --- a/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts +++ b/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts @@ -45,7 +45,7 @@ const crypto: Crypto = { }, randomUUID(): string { // Not used for this test. - throw new Error(`Function not implemented.`); + throw new Error('Function not implemented.'); }, }; diff --git a/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts b/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts index e5ef9bc520..5e6db1ba20 100644 --- a/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts @@ -48,7 +48,7 @@ const crypto: Crypto = { }, randomUUID(): string { // Not used for this test. - throw new Error(`Function not implemented.`); + throw new Error('Function not implemented.'); }, }; diff --git a/packages/shared/sdk-server/__tests__/Migration.test.ts b/packages/shared/sdk-server/__tests__/Migration.test.ts index 06db9a688b..90f6ac7ed9 100644 --- a/packages/shared/sdk-server/__tests__/Migration.test.ts +++ b/packages/shared/sdk-server/__tests__/Migration.test.ts @@ -74,7 +74,7 @@ describe('given an LDClient with test data', () => { if (!actualNonAuth) { return { pass: false, - message: () => `Expected no authoritative result, but did not receive one.`, + message: () => 'Expected no authoritative result, but did not receive one.', }; } if (nonAuthoritative.origin !== actualNonAuth.origin) { diff --git a/packages/shared/sdk-server/__tests__/MigrationOpTracker.test.ts b/packages/shared/sdk-server/__tests__/MigrationOpTracker.test.ts index 36dfe31b21..879c2a1c5a 100644 --- a/packages/shared/sdk-server/__tests__/MigrationOpTracker.test.ts +++ b/packages/shared/sdk-server/__tests__/MigrationOpTracker.test.ts @@ -378,7 +378,7 @@ it.each([ [true, false, true, true], ])( 'does not generate an event if latency measurement without correct invoked measurement' + - ' invoke old: %p invoke new: %p measure old: %p measure new: %p', + ' invoke old: %p invoke new: %p measure old: %p measure new: %p', (invoke_old, invoke_new, measure_old, measure_new) => { const tracker = new MigrationOpTracker( 'flag', @@ -415,7 +415,7 @@ it.each([ [true, false, true, true], ])( 'does not generate an event error measurement without correct invoked measurement' + - ' invoke old: %p invoke new: %p measure old: %p measure new: %p', + ' invoke old: %p invoke new: %p measure old: %p measure new: %p', (invoke_old, invoke_new, measure_old, measure_new) => { const tracker = new MigrationOpTracker( 'flag', @@ -452,7 +452,7 @@ it.each([ [false, true, false], ])( 'does not generate an event if there is a consistency measurement but both origins were not invoked' + - ' invoke old: %p invoke new: %p consistent: %p', + ' invoke old: %p invoke new: %p consistent: %p', (invoke_old, invoke_new, consistent) => { const tracker = new MigrationOpTracker( 'flag', diff --git a/packages/shared/sdk-server/__tests__/data_sources/OneShotInitializerFDv2.test.ts b/packages/shared/sdk-server/__tests__/data_sources/OneShotInitializerFDv2.test.ts index f9b1c5fdca..91605b4cd2 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/OneShotInitializerFDv2.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/OneShotInitializerFDv2.test.ts @@ -63,11 +63,11 @@ describe('given a one shot initializer', () => { initMetadata: undefined, payload: { type: 'full', - state: `mockState`, + state: 'mockState', updates: [ { - kind: `flag`, - key: `flagA`, + kind: 'flag', + key: 'flagA', version: 123, object: { objectFieldA: 'objectValueA' }, }, diff --git a/packages/shared/sdk-server/__tests__/data_sources/PollingProcessorFDv2.test.ts b/packages/shared/sdk-server/__tests__/data_sources/PollingProcessorFDv2.test.ts index 7e931da98e..da12c97386 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/PollingProcessorFDv2.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/PollingProcessorFDv2.test.ts @@ -85,11 +85,11 @@ describe('given a polling processor', () => { }, payload: { type: 'full', - state: `mockState`, + state: 'mockState', updates: [ { - kind: `flag`, - key: `flagA`, + kind: 'flag', + key: 'flagA', version: 123, object: { objectFieldA: 'objectValueA' }, }, @@ -122,17 +122,17 @@ describe('given a polling processor', () => { }, payload: { type: 'full', - state: `FDv1Fallback`, + state: 'FDv1Fallback', updates: [ { - kind: `flag`, - key: `flagA`, + kind: 'flag', + key: 'flagA', version: 456, object: { version: 456 }, }, { - kind: `segment`, - key: `segmentA`, + kind: 'segment', + key: 'segmentA', version: 789, object: { version: 789 }, }, @@ -286,7 +286,7 @@ describe('given a polling processor with a short poll duration', () => { expect(mockStatusCallback).toHaveBeenNthCalledWith( 2, subsystem.DataSourceState.Interrupted, - new LDPollingError(DataSourceErrorKind.ErrorResponse, `Malformed data in polling response`), + new LDPollingError(DataSourceErrorKind.ErrorResponse, 'Malformed data in polling response'), ); expect(requestor.requestAllData.mock.calls.length).toBeGreaterThanOrEqual(2); @@ -312,9 +312,9 @@ describe('given a polling processor with a short poll duration', () => { subsystem.DataSourceState.Closed, new LDPollingError( DataSourceErrorKind.ErrorResponse, - status === 401 - ? `Received error ${status} (invalid SDK key) for polling request - giving up permanently` - : `Received error ${status} for polling request - giving up permanently`, + status === 401 ? + `Received error ${status} (invalid SDK key) for polling request - giving up permanently` : + `Received error ${status} for polling request - giving up permanently`, status as number, false, ), diff --git a/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessorFDv2.test.ts b/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessorFDv2.test.ts index 40d2f252b2..25e652fc9e 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessorFDv2.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessorFDv2.test.ts @@ -248,11 +248,11 @@ describe('given a stream processor with mock event source', () => { }, payload: { type: 'full', - state: `mockState`, + state: 'mockState', updates: [ { - kind: `flag`, - key: `flagA`, + kind: 'flag', + key: 'flagA', version: 123, object: { objectFieldA: 'objectValueA' }, }, diff --git a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.segments.test.ts b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.segments.test.ts index f4cf80cedb..a611dcc0f8 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.segments.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.segments.test.ts @@ -281,7 +281,7 @@ describe('when evaluating user equivalent contexts for segments', () => { }, randomUUID(): string { // Not used for this test. - throw new Error(`Function not implemented.`); + throw new Error('Function not implemented.'); }, }; diff --git a/packages/shared/sdk-server/package.json b/packages/shared/sdk-server/package.json index 084981176c..a171450386 100644 --- a/packages/shared/sdk-server/package.json +++ b/packages/shared/sdk-server/package.json @@ -23,7 +23,7 @@ "build": "npx tsc", "clean": "npx tsc --build --clean", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint --fix" + "lint:fix": "npx eslint . --ext .ts --fix" }, "license": "Apache-2.0", "dependencies": { @@ -31,20 +31,18 @@ "semver": "7.5.4" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.4.0", "@types/semver": "^7.3.13", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "jest-diff": "^28.1.1", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "ts-jest": "^29.0.5", "typedoc": "0.25.0", "typescript": "5.1.6" diff --git a/packages/shared/sdk-server/src/BigSegmentsManager.ts b/packages/shared/sdk-server/src/BigSegmentsManager.ts index e6c933bf32..0595008d0b 100644 --- a/packages/shared/sdk-server/src/BigSegmentsManager.ts +++ b/packages/shared/sdk-server/src/BigSegmentsManager.ts @@ -36,18 +36,18 @@ export default class BigSegmentsManager { ); this._staleTimeMs = - (TypeValidators.Number.is(config.staleAfter) && config.staleAfter > 0 - ? config.staleAfter - : DEFAULT_STALE_AFTER_SECONDS) * 1000; + (TypeValidators.Number.is(config.staleAfter) && config.staleAfter > 0 ? + config.staleAfter : + DEFAULT_STALE_AFTER_SECONDS) * 1000; const pollIntervalMs = - (TypeValidators.Number.is(config.statusPollInterval) && config.statusPollInterval > 0 - ? config.statusPollInterval - : DEFAULT_STATUS_POLL_INTERVAL_SECONDS) * 1000; + (TypeValidators.Number.is(config.statusPollInterval) && config.statusPollInterval > 0 ? + config.statusPollInterval : + DEFAULT_STATUS_POLL_INTERVAL_SECONDS) * 1000; - this._pollHandle = _store - ? setInterval(() => this._pollStoreAndUpdateStatus(), pollIntervalMs) - : null; + this._pollHandle = _store ? + setInterval(() => this._pollStoreAndUpdateStatus(), pollIntervalMs) : + null; if (_store) { this._cache = new LruCache({ diff --git a/packages/shared/sdk-server/src/LDClientImpl.ts b/packages/shared/sdk-server/src/LDClientImpl.ts index 0ea543efb9..738e3df541 100644 --- a/packages/shared/sdk-server/src/LDClientImpl.ts +++ b/packages/shared/sdk-server/src/LDClientImpl.ts @@ -116,18 +116,18 @@ function constructFDv1( dataSourceErrorHandler: (e: any) => void, hooks: Hook[], ): { - config: Configuration; - logger: LDLogger | undefined; - evaluator: Evaluator; - featureStore: LDFeatureStore; - updateProcessor: subsystem.LDStreamProcessor | undefined; - eventProcessor: subsystem.LDEventProcessor; - bigSegmentsManager: BigSegmentsManager; - hookRunner: HookRunner; - onError: (err: Error) => void; - onFailed: (err: Error) => void; - onReady: () => void; -} { + config: Configuration; + logger: LDLogger | undefined; + evaluator: Evaluator; + featureStore: LDFeatureStore; + updateProcessor: subsystem.LDStreamProcessor | undefined; + eventProcessor: subsystem.LDEventProcessor; + bigSegmentsManager: BigSegmentsManager; + hookRunner: HookRunner; + onError: (err: Error) => void; + onFailed: (err: Error) => void; + onReady: () => void; + } { const { onUpdate, hasEventListeners } = callbacks; const hookRunner = new HookRunner(config.logger, hooks); @@ -191,25 +191,25 @@ function constructFDv1( put: initSuccess, }); const makeDefaultProcessor = () => - config.stream - ? new StreamingProcessor( - clientContext, - '/all', - [], - listeners, - baseHeaders, - diagnosticsManager, - dataSourceErrorHandler, - config.streamInitialReconnectDelay, - ) - : new PollingProcessor( - new Requestor(config, platform.requests, baseHeaders), - config.pollInterval, - dataSourceUpdates, - config.logger, - initSuccess, - dataSourceErrorHandler, - ); + config.stream ? + new StreamingProcessor( + clientContext, + '/all', + [], + listeners, + baseHeaders, + diagnosticsManager, + dataSourceErrorHandler, + config.streamInitialReconnectDelay, + ) : + new PollingProcessor( + new Requestor(config, platform.requests, baseHeaders), + config.pollInterval, + dataSourceUpdates, + config.logger, + initSuccess, + dataSourceErrorHandler, + ); let updateProcessor: subsystem.LDStreamProcessor | undefined; if (!(config.offline || config.useLdd)) { @@ -245,19 +245,19 @@ function constructFDv2( initSuccess: () => void, hooks: Hook[], ): { - config: Configuration; - logger: LDLogger | undefined; - evaluator: Evaluator; - featureStore: LDTransactionalFeatureStore; - dataSource: subsystem.DataSource | undefined; - payloadListener: ((payload: any) => void) | undefined; - eventProcessor: subsystem.LDEventProcessor; - bigSegmentsManager: BigSegmentsManager; - hookRunner: HookRunner; - onError: (err: Error) => void; - onFailed: (err: Error) => void; - onReady: () => void; -} { + config: Configuration; + logger: LDLogger | undefined; + evaluator: Evaluator; + featureStore: LDTransactionalFeatureStore; + dataSource: subsystem.DataSource | undefined; + payloadListener: ((payload: any) => void) | undefined; + eventProcessor: subsystem.LDEventProcessor; + bigSegmentsManager: BigSegmentsManager; + hookRunner: HookRunner; + onError: (err: Error) => void; + onFailed: (err: Error) => void; + onReady: () => void; + } { const { onUpdate, hasEventListeners } = callbacks; const hookRunner = new HookRunner(config.logger, hooks); @@ -649,7 +649,7 @@ export default class LDClientImpl implements LDClient { ) { this._logger?.warn( 'The waitForInitialization function was called without a timeout specified.' + - ' In a future version a default timeout will be applied.', + ' In a future version a default timeout will be applied.', ); } if ( @@ -659,8 +659,8 @@ export default class LDClientImpl implements LDClient { ) { this._logger?.warn( 'The waitForInitialization function was called with a timeout greater than ' + - `${HIGH_TIMEOUT_THRESHOLD} seconds. We recommend a timeout of less than ` + - `${HIGH_TIMEOUT_THRESHOLD} seconds.`, + `${HIGH_TIMEOUT_THRESHOLD} seconds. We recommend a timeout of less than ` + + `${HIGH_TIMEOUT_THRESHOLD} seconds.`, ); } @@ -1069,12 +1069,12 @@ export default class LDClientImpl implements LDClient { if (storeInitialized) { this._logger?.warn( 'Called allFlagsState before client initialization; using last known' + - ' values from data store', + ' values from data store', ); } else { this._logger?.warn( 'Called allFlagsState before client initialization. Data store not available; ' + - 'returning empty state', + 'returning empty state', ); valid = false; } @@ -1262,14 +1262,14 @@ export default class LDClientImpl implements LDClient { if (storeInitialized) { this._logger?.warn( 'Variation called before LaunchDarkly client initialization completed' + - " (did you wait for the 'ready' event?) - using last known values from feature store", + " (did you wait for the 'ready' event?) - using last known values from feature store", ); this._variationInternal(flagKey, context, defaultValue, eventFactory, cb, typeChecker); return; } this._logger?.warn( 'Variation called before LaunchDarkly client initialization completed (did you wait for the' + - "'ready' event?) - using default value", + "'ready' event?) - using default value", ); cb(EvalResult.forError(ErrorKinds.ClientNotReady, undefined, defaultValue)); }); diff --git a/packages/shared/sdk-server/src/MigrationOpTracker.ts b/packages/shared/sdk-server/src/MigrationOpTracker.ts index c2fe22649c..9d06bbb38c 100644 --- a/packages/shared/sdk-server/src/MigrationOpTracker.ts +++ b/packages/shared/sdk-server/src/MigrationOpTracker.ts @@ -67,14 +67,14 @@ export default class MigrationOpTracker implements LDMigrationTracker { if (internal.shouldSample(this._checkRatio ?? 1)) { try { const res = check(); - this._consistencyCheck = res - ? LDConsistencyCheck.Consistent - : LDConsistencyCheck.Inconsistent; + this._consistencyCheck = res ? + LDConsistencyCheck.Consistent : + LDConsistencyCheck.Inconsistent; } catch (exception) { this._logger?.error( 'Exception when executing consistency check function for migration' + - ` '${this._flagKey}' the consistency check will not be included in the generated migration` + - ` op event. Exception: ${exception}`, + ` '${this._flagKey}' the consistency check will not be included in the generated migration` + + ` op event. Exception: ${exception}`, ); } } @@ -109,7 +109,7 @@ export default class MigrationOpTracker implements LDMigrationTracker { if (!this._wasInvoked.old && !this._wasInvoked.new) { this._logger?.error( 'The migration invoked neither the "old" or "new" implementation and' + - 'an event cannot be generated', + 'an event cannot be generated', ); return undefined; } diff --git a/packages/shared/sdk-server/src/api/LDMigration.ts b/packages/shared/sdk-server/src/api/LDMigration.ts index 7076786451..b17e4141b8 100644 --- a/packages/shared/sdk-server/src/api/LDMigration.ts +++ b/packages/shared/sdk-server/src/api/LDMigration.ts @@ -17,15 +17,15 @@ export type LDMigrationOrigin = 'old' | 'new'; */ export type LDMigrationResult = | { - success: true; - origin: LDMigrationOrigin; - result: TResult; - } + success: true; + origin: LDMigrationOrigin; + result: TResult; + } | { - success: false; - origin: LDMigrationOrigin; - error: any; - }; + success: false; + origin: LDMigrationOrigin; + error: any; + }; /** * Result of a migration read operation. diff --git a/packages/shared/sdk-server/src/api/data/index.ts b/packages/shared/sdk-server/src/api/data/index.ts index 0ce283a473..12d80f9f51 100644 --- a/packages/shared/sdk-server/src/api/data/index.ts +++ b/packages/shared/sdk-server/src/api/data/index.ts @@ -1,5 +1,5 @@ -export * from './LDFlagsStateOptions'; export * from './LDFlagsState'; -export * from './LDMigrationStage'; +export * from './LDFlagsStateOptions'; export * from './LDMigrationOpEvent'; +export * from './LDMigrationStage'; export * from './LDMigrationVariation'; diff --git a/packages/shared/sdk-server/src/api/index.ts b/packages/shared/sdk-server/src/api/index.ts index 2e656ad5a9..2350841cad 100644 --- a/packages/shared/sdk-server/src/api/index.ts +++ b/packages/shared/sdk-server/src/api/index.ts @@ -1,11 +1,11 @@ export * from './data'; -export * from './options'; +export * from './interfaces/DataKind'; export * from './LDClient'; export * from './LDMigration'; -export * from './interfaces/DataKind'; +export * from './LDWaitForInitializationOptions'; +export * from './options'; export * from './subsystems/LDFeatureStore'; export * from './subsystems/LDTransactionalFeatureStore'; -export * from './LDWaitForInitializationOptions'; // These are items that should be less frequently used, and therefore they // are namespaced to reduce clutter amongst the top level exports. diff --git a/packages/shared/sdk-server/src/api/interfaces/index.ts b/packages/shared/sdk-server/src/api/interfaces/index.ts index 0fb57aba18..3f933f85c8 100644 --- a/packages/shared/sdk-server/src/api/interfaces/index.ts +++ b/packages/shared/sdk-server/src/api/interfaces/index.ts @@ -2,10 +2,10 @@ export * from './BigSegmentStore'; export * from './BigSegmentStoreMembership'; export * from './BigSegmentStoreMetadata'; export * from './BigSegmentStoreStatus'; +export * from './BigSegmentStoreStatusProvider'; export * from './DataCollection'; export * from './DataKind'; export * from './FullDataSet'; export * from './KeyedItems'; -export * from './VersionedData'; -export * from './BigSegmentStoreStatusProvider'; export * from './persistent_store'; +export * from './VersionedData'; diff --git a/packages/shared/sdk-server/src/api/interfaces/persistent_store/index.ts b/packages/shared/sdk-server/src/api/interfaces/persistent_store/index.ts index ab1b5cb8a0..f8818d3677 100644 --- a/packages/shared/sdk-server/src/api/interfaces/persistent_store/index.ts +++ b/packages/shared/sdk-server/src/api/interfaces/persistent_store/index.ts @@ -6,9 +6,9 @@ import SerializedItemDescriptor from './SerializedItemDescriptor'; export { ItemDescriptor, + KeyedItem, + KindKeyedStore, PersistentDataStore, PersistentStoreDataKind, SerializedItemDescriptor, - KeyedItem, - KindKeyedStore, }; diff --git a/packages/shared/sdk-server/src/api/options/LDDataSystemOptions.ts b/packages/shared/sdk-server/src/api/options/LDDataSystemOptions.ts index 8f93eb3b79..44ddbaa0a7 100644 --- a/packages/shared/sdk-server/src/api/options/LDDataSystemOptions.ts +++ b/packages/shared/sdk-server/src/api/options/LDDataSystemOptions.ts @@ -123,8 +123,8 @@ export interface PollingDataSourceConfiguration { */ export interface StandardDataSourceOptions extends - Omit, - Omit { + Omit, + Omit { dataSourceOptionsType: 'standard'; } diff --git a/packages/shared/sdk-server/src/api/options/LDMigrationOptions.ts b/packages/shared/sdk-server/src/api/options/LDMigrationOptions.ts index 361469be10..78f2b33b2e 100644 --- a/packages/shared/sdk-server/src/api/options/LDMigrationOptions.ts +++ b/packages/shared/sdk-server/src/api/options/LDMigrationOptions.ts @@ -36,13 +36,13 @@ export enum LDExecution { */ export type LDMethodResult = | { - success: true; - result: TResult; - } + success: true; + result: TResult; + } | { - success: false; - error: any; - }; + success: false; + error: any; + }; /** * Configuration class for configuring serial execution of a migration. diff --git a/packages/shared/sdk-server/src/api/options/LDOptions.ts b/packages/shared/sdk-server/src/api/options/LDOptions.ts index 25196ad984..a150209410 100644 --- a/packages/shared/sdk-server/src/api/options/LDOptions.ts +++ b/packages/shared/sdk-server/src/api/options/LDOptions.ts @@ -129,11 +129,11 @@ export interface LDOptions { updateProcessor?: | object | (( - clientContext: LDClientContext, - dataSourceUpdates: LDDataSourceUpdates, - initSuccessHandler: VoidFunction, - errorHandler?: (e: Error) => void, - ) => subsystem.LDStreamProcessor); + clientContext: LDClientContext, + dataSourceUpdates: LDDataSourceUpdates, + initSuccessHandler: VoidFunction, + errorHandler?: (e: Error) => void, + ) => subsystem.LDStreamProcessor); /** * The interval in between flushes of the analytics events queue, in seconds. diff --git a/packages/shared/sdk-server/src/api/options/index.ts b/packages/shared/sdk-server/src/api/options/index.ts index 44b81cc99c..428a5dd75a 100644 --- a/packages/shared/sdk-server/src/api/options/index.ts +++ b/packages/shared/sdk-server/src/api/options/index.ts @@ -1,6 +1,6 @@ export * from './LDBigSegmentsOptions'; +export * from './LDDataSystemOptions'; +export * from './LDMigrationOptions'; export * from './LDOptions'; export * from './LDProxyOptions'; export * from './LDTLSOptions'; -export * from './LDMigrationOptions'; -export * from './LDDataSystemOptions'; diff --git a/packages/shared/sdk-server/src/data_sources/Requestor.ts b/packages/shared/sdk-server/src/data_sources/Requestor.ts index 8dc26bd001..1a6dfd0eb7 100644 --- a/packages/shared/sdk-server/src/data_sources/Requestor.ts +++ b/packages/shared/sdk-server/src/data_sources/Requestor.ts @@ -47,18 +47,18 @@ export default class Requestor implements LDFeatureRequestor { requestUrl: string, options: Options, ): Promise<{ - res: Response; - body: string; - }> { + res: Response; + body: string; + }> { const cacheEntry = this._eTagCache[requestUrl]; const cachedETag = cacheEntry?.etag; - const updatedOptions = cachedETag - ? { + const updatedOptions = cachedETag ? + { ...options, headers: { ...options.headers, 'if-none-match': cachedETag }, - } - : options; + } : + options; const res = await this._requests.fetch(requestUrl, updatedOptions); @@ -89,10 +89,10 @@ export default class Requestor implements LDFeatureRequestor { const { res, body } = await this._requestWithETagCache(uri, options); this._logger?.debug(`Requestor got (possibly cached) body: ${JSON.stringify(body)}`); - if (res.headers.get(`x-ld-fd-fallback`) === `true`) { + if (res.headers.get('x-ld-fd-fallback') === 'true') { const err = new LDFlagDeliveryFallbackError( DataSourceErrorKind.ErrorResponse, - `Response header indicates to fallback to FDv1.`, + 'Response header indicates to fallback to FDv1.', res.status, ); return cb(err, undefined, undefined); diff --git a/packages/shared/sdk-server/src/data_sources/StreamingProcessorFDv2.ts b/packages/shared/sdk-server/src/data_sources/StreamingProcessorFDv2.ts index 634edb4c16..1d49539587 100644 --- a/packages/shared/sdk-server/src/data_sources/StreamingProcessorFDv2.ts +++ b/packages/shared/sdk-server/src/data_sources/StreamingProcessorFDv2.ts @@ -81,10 +81,10 @@ export default class StreamingProcessorFDv2 implements subsystemCommon.DataSourc statusCallback: (status: subsystemCommon.DataSourceState, err?: any) => void, ) { // this is a short term error and will be removed once FDv2 adoption is sufficient. - if (err.headers?.[`x-ld-fd-fallback`] === `true`) { + if (err.headers?.['x-ld-fd-fallback'] === 'true') { const fallbackErr = new LDFlagDeliveryFallbackError( DataSourceErrorKind.ErrorResponse, - `Response header indicates to fallback to FDv1`, + 'Response header indicates to fallback to FDv1', err.status, ); statusCallback(subsystemCommon.DataSourceState.Closed, fallbackErr); @@ -117,9 +117,9 @@ export default class StreamingProcessorFDv2 implements subsystemCommon.DataSourc statusCallback(subsystemCommon.DataSourceState.Initializing); const selector = selectorGetter?.(); - const params = selector - ? [...this._parameters, { key: 'basis', value: selector }] // if selector exists add basis parameter - : this._parameters; // otherwise use params as is + const params = selector ? + [...this._parameters, { key: 'basis', value: selector }] : // if selector exists add basis parameter + this._parameters; // otherwise use params as is const uri = getStreamingUri(this._serviceEndpoints, this._streamUriPath, params); this._logger?.debug(`Streaming processor opening event source to uri: ${uri}`); diff --git a/packages/shared/sdk-server/src/data_sources/createPayloadListenerFDv2.ts b/packages/shared/sdk-server/src/data_sources/createPayloadListenerFDv2.ts index 58b09c5a35..2c556f7502 100644 --- a/packages/shared/sdk-server/src/data_sources/createPayloadListenerFDv2.ts +++ b/packages/shared/sdk-server/src/data_sources/createPayloadListenerFDv2.ts @@ -24,59 +24,59 @@ export const createPayloadListener = logger?: LDLogger, initializedCallback: VoidFunction = () => {}, ) => - (dataContainer: DataCallbackContainer) => { - const { initMetadata, payload } = dataContainer; - if (payload.type === 'full') { - logger?.debug('Initializing all data'); - } else if (payload.updates.length > 0) { - logger?.debug('Applying updates'); - } else { - logger?.debug('Payload had no updates, ignoring.'); - return; - } + (dataContainer: DataCallbackContainer) => { + const { initMetadata, payload } = dataContainer; + if (payload.type === 'full') { + logger?.debug('Initializing all data'); + } else if (payload.updates.length > 0) { + logger?.debug('Applying updates'); + } else { + logger?.debug('Payload had no updates, ignoring.'); + return; + } - // convert to LDFeatureStoreDataStorage structure - const converted: LDFeatureStoreDataStorage = {}; - payload.updates.forEach((it: internal.Update) => { - const namespace = namespaceForKind(it.kind); - if (converted[namespace]) { + // convert to LDFeatureStoreDataStorage structure + const converted: LDFeatureStoreDataStorage = {}; + payload.updates.forEach((it: internal.Update) => { + const namespace = namespaceForKind(it.kind); + if (converted[namespace]) { // entry for kind already exists, add key - converted[namespace][it.key] = { - version: it.version, - ...(it.deleted && { deleted: it.deleted }), - ...it.object, - }; - } else { - // entry for kind doesn't exist, add kind and key - converted[namespace] = { - [it.key]: { + converted[namespace][it.key] = { version: it.version, ...(it.deleted && { deleted: it.deleted }), ...it.object, - }, - }; - } + }; + } else { + // entry for kind doesn't exist, add kind and key + converted[namespace] = { + [it.key]: { + version: it.version, + ...(it.deleted && { deleted: it.deleted }), + ...it.object, + }, + }; + } - if (it.deleted) { - logger?.debug(`Deleting ${it.key} in ${it.kind}`); - } else { - logger?.debug(`Updating ${it.key} in ${it.kind}`); - } - }); + if (it.deleted) { + logger?.debug(`Deleting ${it.key} in ${it.kind}`); + } else { + logger?.debug(`Updating ${it.key} in ${it.kind}`); + } + }); - // TODO: SDK-1209 - SUpport initMetadata in FDv2 datasources - dataSourceUpdates.applyChanges( - payload.type === 'full', - converted, - () => { - if (payload.state !== '') { + // TODO: SDK-1209 - SUpport initMetadata in FDv2 datasources + dataSourceUpdates.applyChanges( + payload.type === 'full', + converted, + () => { + if (payload.state !== '') { // NOTE: The only condition that we will consider a valid basis // is when there is a valid selector. Currently, the only data source that does not have a // valid selector is the file data initializer, which will have a blank selector. - initializedCallback(); - } - }, - initMetadata, - payload.state, - ); - }; + initializedCallback(); + } + }, + initMetadata, + payload.state, + ); + }; diff --git a/packages/shared/sdk-server/src/diagnostics/createDiagnosticsInitConfig.ts b/packages/shared/sdk-server/src/diagnostics/createDiagnosticsInitConfig.ts index 03c8bb8d03..f207dd69e7 100644 --- a/packages/shared/sdk-server/src/diagnostics/createDiagnosticsInitConfig.ts +++ b/packages/shared/sdk-server/src/diagnostics/createDiagnosticsInitConfig.ts @@ -18,7 +18,7 @@ const createDiagnosticsInitConfig = ( if ( (isStandardOptions(config.dataSystem.dataSource) || isPollingOnlyOptions(config.dataSystem.dataSource)) && - config.dataSystem.dataSource.pollInterval + config.dataSystem.dataSource.pollInterval ) { pollingIntervalMillis = secondsToMillis(config.dataSystem.dataSource.pollInterval); } @@ -31,7 +31,7 @@ const createDiagnosticsInitConfig = ( if ( (isStandardOptions(config.dataSystem.dataSource) || isStreamingOnlyOptions(config.dataSystem.dataSource)) && - config.dataSystem.dataSource.streamInitialReconnectDelay + config.dataSystem.dataSource.streamInitialReconnectDelay ) { reconnectTimeMillis = secondsToMillis( config.dataSystem.dataSource.streamInitialReconnectDelay, diff --git a/packages/shared/sdk-server/src/evaluation/Evaluator.ts b/packages/shared/sdk-server/src/evaluation/Evaluator.ts index a5ecf7bca8..a27e3b8ccf 100644 --- a/packages/shared/sdk-server/src/evaluation/Evaluator.ts +++ b/packages/shared/sdk-server/src/evaluation/Evaluator.ts @@ -247,7 +247,7 @@ export default class Evaluator { prereqResult = EvalResult.forError( ErrorKinds.MalformedFlag, `Prerequisite of ${flag.key} causing a circular reference.` + - ' This is probably a temporary condition due to an incomplete update.', + ' This is probably a temporary condition due to an incomplete update.', ); iterCb(true); return; @@ -349,7 +349,7 @@ export default class Evaluator { errorResult = EvalResult.forError( ErrorKinds.MalformedFlag, `Segment rule referencing segment ${segment.key} caused a circular reference. ` + - 'This is probably a temporary condition due to an incomplete update', + 'This is probably a temporary condition due to an incomplete update', ); // There was an error, so stop checking further segments. iterCb(true); diff --git a/packages/shared/sdk-server/src/hooks/HookRunner.ts b/packages/shared/sdk-server/src/hooks/HookRunner.ts index 315970f1b4..8bdb208b67 100644 --- a/packages/shared/sdk-server/src/hooks/HookRunner.ts +++ b/packages/shared/sdk-server/src/hooks/HookRunner.ts @@ -85,7 +85,7 @@ export default class HookRunner { try { return hook?.getMetadata().name ?? UNKNOWN_HOOK_NAME; } catch { - this._logger?.error(`Exception thrown getting metadata for hook. Unable to get hook name.`); + this._logger?.error('Exception thrown getting metadata for hook. Unable to get hook name.'); return UNKNOWN_HOOK_NAME; } } @@ -129,9 +129,9 @@ export default class HookRunner { methodName: string, environmentId?: string, ): { - hooks: Hook[]; - hookContext: EvaluationSeriesContext; - } { + hooks: Hook[]; + hookContext: EvaluationSeriesContext; + } { // Copy the hooks to use a consistent set during evaluation. Hooks could be added and we want // to ensure all correct stages for any give hook execute. Not for instance the afterEvaluation // stage without beforeEvaluation having been called on that hook. diff --git a/packages/shared/sdk-server/src/index.ts b/packages/shared/sdk-server/src/index.ts index 63e0a22323..79a4a1d66d 100644 --- a/packages/shared/sdk-server/src/index.ts +++ b/packages/shared/sdk-server/src/index.ts @@ -2,19 +2,18 @@ import BigSegmentStoreStatusProviderImpl from './BigSegmentStatusProviderImpl'; import LDClientImpl from './LDClientImpl'; import { createMigration, LDMigrationError, LDMigrationSuccess } from './Migration'; -export * as integrations from './integrations'; -export * as platform from '@launchdarkly/js-sdk-common'; export * from './api'; -export * from './store'; export * from './events'; - -export * from '@launchdarkly/js-sdk-common'; +export * as integrations from './integrations'; export * as internalServer from './internal'; +export * from './store'; +export * as platform from '@launchdarkly/js-sdk-common'; +export * from '@launchdarkly/js-sdk-common'; export { - LDClientImpl, BigSegmentStoreStatusProviderImpl, + createMigration, + LDClientImpl, LDMigrationError, LDMigrationSuccess, - createMigration, }; diff --git a/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts b/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts index 60f49d4efd..3b623832e5 100644 --- a/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts +++ b/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts @@ -52,10 +52,10 @@ export default class FileDataSourceFactory { } getFactory(): ( - ldClientContext: LDClientContext, - featureStore: LDFeatureStore, - initSuccessHandler?: VoidFunction, - errorHandler?: FileDataSourceErrorHandler, + ldClientContext: LDClientContext, + featureStore: LDFeatureStore, + initSuccessHandler?: VoidFunction, + errorHandler?: FileDataSourceErrorHandler, ) => subsystem.LDStreamProcessor { return (ldClientContext, featureStore, initSuccessHandler, errorHandler) => this.create(ldClientContext, featureStore, initSuccessHandler, errorHandler); diff --git a/packages/shared/sdk-server/src/internal/index.ts b/packages/shared/sdk-server/src/internal/index.ts index 16b3b5d40a..e51666ce7f 100644 --- a/packages/shared/sdk-server/src/internal/index.ts +++ b/packages/shared/sdk-server/src/internal/index.ts @@ -1,5 +1,5 @@ -import TtlCache from '../cache/TtlCache'; import type { TtlCacheOptions } from '../cache/TtlCache'; +import TtlCache from '../cache/TtlCache'; export { TtlCache }; export type { TtlCacheOptions }; diff --git a/packages/shared/sdk-server/src/options/Configuration.ts b/packages/shared/sdk-server/src/options/Configuration.ts index aaec4dd3f0..6d45ae1b81 100644 --- a/packages/shared/sdk-server/src/options/Configuration.ts +++ b/packages/shared/sdk-server/src/options/Configuration.ts @@ -137,9 +137,9 @@ function validateTypesAndNames( options: Options, defaults: Options, ): { - errors: string[]; - validatedOptions: Options; -} { + errors: string[]; + validatedOptions: Options; + } { const errors: string[] = []; const validatedOptions: Options = { ...defaults }; Object.keys(options).forEach((optionName) => { diff --git a/packages/shared/sdk-server/src/store/VersionedDataKinds.ts b/packages/shared/sdk-server/src/store/VersionedDataKinds.ts index da841e6d7d..52d63b0e65 100644 --- a/packages/shared/sdk-server/src/store/VersionedDataKinds.ts +++ b/packages/shared/sdk-server/src/store/VersionedDataKinds.ts @@ -18,8 +18,8 @@ export default class VersionedDataKinds { }; static getKeyFromPath(kind: VersionedDataKind, path: string): string | undefined { - return path.startsWith(kind.streamApiPath) - ? path.substring(kind.streamApiPath.length) - : undefined; + return path.startsWith(kind.streamApiPath) ? + path.substring(kind.streamApiPath.length) : + undefined; } } diff --git a/packages/shared/sdk-server/src/store/index.ts b/packages/shared/sdk-server/src/store/index.ts index 16eb0244df..883e4ed213 100644 --- a/packages/shared/sdk-server/src/store/index.ts +++ b/packages/shared/sdk-server/src/store/index.ts @@ -7,8 +7,8 @@ import TransactionalFeatureStore from './TransactionalFeatureStore'; export { AsyncStoreFacade, AsyncTransactionalStoreFacade, - PersistentDataStoreWrapper, - TransactionalFeatureStore, deserializePoll, + PersistentDataStoreWrapper, reviveFullPayload, + TransactionalFeatureStore, }; diff --git a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBCore.test.ts b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBCore.test.ts index cf9857bd41..16722102f8 100644 --- a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBCore.test.ts +++ b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBCore.test.ts @@ -109,11 +109,11 @@ describe('given an empty store', () => { it('completely replaces previous data when calling init()', async () => { const flags = [ - { key: 'first', item: { version: 1, serializedItem: `{"version":1}`, deleted: false } }, - { key: 'second', item: { version: 1, serializedItem: `{"version":1}`, deleted: false } }, + { key: 'first', item: { version: 1, serializedItem: '{"version":1}', deleted: false } }, + { key: 'second', item: { version: 1, serializedItem: '{"version":1}', deleted: false } }, ]; const segments = [ - { key: 'first', item: { version: 2, serializedItem: `{"version":2}`, deleted: false } }, + { key: 'first', item: { version: 2, serializedItem: '{"version":2}', deleted: false } }, ]; await facade.init([ @@ -143,10 +143,10 @@ describe('given an empty store', () => { ]); const newFlags = [ - { key: 'first', item: { version: 2, serializedItem: `{"version":2}`, deleted: false } }, + { key: 'first', item: { version: 2, serializedItem: '{"version":2}', deleted: false } }, ]; const newSegments = [ - { key: 'first', item: { version: 3, serializedItem: `{"version":3}`, deleted: false } }, + { key: 'first', item: { version: 3, serializedItem: '{"version":3}', deleted: false } }, ]; await facade.init([ @@ -265,7 +265,7 @@ describe('given a store with basic data', () => { expect(result).toEqual({ version: 10, deleted: false, - serializedItem: `{"key":"foo","version":10}`, + serializedItem: '{"key":"foo","version":10}', }); }); @@ -328,7 +328,7 @@ describe('given a store with basic data', () => { }); it('it can calculate size', () => { - const stringPayload = `{"key":"foo","version":10}`; + const stringPayload = '{"key":"foo","version":10}'; expect( calculateSize({ diff --git a/packages/store/node-server-sdk-dynamodb/package.json b/packages/store/node-server-sdk-dynamodb/package.json index 7697ff5b67..6bd9367c6c 100644 --- a/packages/store/node-server-sdk-dynamodb/package.json +++ b/packages/store/node-server-sdk-dynamodb/package.json @@ -24,7 +24,7 @@ "test": "npx jest --ci --runInBand", "build": "npx tsc", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint --fix" + "lint:fix": "npx eslint . --ext .ts --fix" }, "peerDependencies": { "@aws-sdk/client-dynamodb": "^3.53.0", @@ -33,17 +33,15 @@ "devDependencies": { "@aws-sdk/client-dynamodb": "3.348.0", "@launchdarkly/node-server-sdk": "9.10.12", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "ts-jest": "^29.0.5", "typedoc": "0.25.0", "typescript": "5.1.6" diff --git a/packages/store/node-server-sdk-dynamodb/src/index.ts b/packages/store/node-server-sdk-dynamodb/src/index.ts index 0fe088d5db..95a374c3a0 100644 --- a/packages/store/node-server-sdk-dynamodb/src/index.ts +++ b/packages/store/node-server-sdk-dynamodb/src/index.ts @@ -1,7 +1,6 @@ // Exporting the factories without the 'Factory'. This keeps them in-line with // previous store versions. The differentiation between the factory and the store // is not critical for consuming the SDK. -export { default as DynamoDBFeatureStore } from './DynamoDBFeatureStoreFactory'; export { default as DynamoDBBigSegmentStore } from './DynamoDBBigSegmentStoreFactory'; - +export { default as DynamoDBFeatureStore } from './DynamoDBFeatureStoreFactory'; export { default as LDDynamoDBOptions } from './LDDynamoDBOptions'; diff --git a/packages/store/node-server-sdk-redis/__tests__/RedisCore.test.ts b/packages/store/node-server-sdk-redis/__tests__/RedisCore.test.ts index 4a8a940ba7..09a4923982 100644 --- a/packages/store/node-server-sdk-redis/__tests__/RedisCore.test.ts +++ b/packages/store/node-server-sdk-redis/__tests__/RedisCore.test.ts @@ -92,11 +92,11 @@ describe('given an empty store', () => { it('completely replaces previous data when calling init()', async () => { const flags = [ - { key: 'first', item: { version: 1, serializedItem: `{"version":1}`, deleted: false } }, - { key: 'second', item: { version: 1, serializedItem: `{"version":1}`, deleted: false } }, + { key: 'first', item: { version: 1, serializedItem: '{"version":1}', deleted: false } }, + { key: 'second', item: { version: 1, serializedItem: '{"version":1}', deleted: false } }, ]; const segments = [ - { key: 'first', item: { version: 2, serializedItem: `{"version":2}`, deleted: false } }, + { key: 'first', item: { version: 2, serializedItem: '{"version":2}', deleted: false } }, ]; await facade.init([ @@ -126,10 +126,10 @@ describe('given an empty store', () => { ]); const newFlags = [ - { key: 'first', item: { version: 2, serializedItem: `{"version":2}`, deleted: false } }, + { key: 'first', item: { version: 2, serializedItem: '{"version":2}', deleted: false } }, ]; const newSegments = [ - { key: 'first', item: { version: 3, serializedItem: `{"version":3}`, deleted: false } }, + { key: 'first', item: { version: 3, serializedItem: '{"version":3}', deleted: false } }, ]; await facade.init([ @@ -243,7 +243,7 @@ describe('given a store with basic data', () => { expect(result).toEqual({ version: 0, deleted: false, - serializedItem: `{"key":"foo","version":10}`, + serializedItem: '{"key":"foo","version":10}', }); }); diff --git a/packages/store/node-server-sdk-redis/package.json b/packages/store/node-server-sdk-redis/package.json index 4e9232edd1..53aaf285d0 100644 --- a/packages/store/node-server-sdk-redis/package.json +++ b/packages/store/node-server-sdk-redis/package.json @@ -24,7 +24,7 @@ "test": "npx jest --ci --runInBand", "build": "npx tsc", "lint": "npx eslint . --ext .ts", - "lint:fix": "yarn run lint --fix" + "lint:fix": "npx eslint . --ext .ts --fix" }, "dependencies": { "ioredis": "^5.3.2" @@ -34,17 +34,15 @@ }, "devDependencies": { "@launchdarkly/node-server-sdk": "9.10.12", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "ts-jest": "^29.0.5", "typedoc": "0.25.0", "typescript": "5.1.6" diff --git a/packages/store/node-server-sdk-redis/src/index.ts b/packages/store/node-server-sdk-redis/src/index.ts index beee85e311..6407977fb8 100644 --- a/packages/store/node-server-sdk-redis/src/index.ts +++ b/packages/store/node-server-sdk-redis/src/index.ts @@ -1,7 +1,6 @@ // Exporting the factories without the 'Factory'. This keeps them in-line with // previous store versions. The differentiation between the factory and the store // is not critical for consuming the SDK. -export { default as RedisFeatureStore } from './RedisFeatureStoreFactory'; -export { default as RedisBigSegmentStore } from './RedisBigSegmentStoreFactory'; - export { default as LDRedisOptions } from './LDRedisOptions'; +export { default as RedisBigSegmentStore } from './RedisBigSegmentStoreFactory'; +export { default as RedisFeatureStore } from './RedisFeatureStoreFactory'; diff --git a/packages/telemetry/node-server-sdk-otel/package.json b/packages/telemetry/node-server-sdk-otel/package.json index c210370c7b..c730794861 100644 --- a/packages/telemetry/node-server-sdk-otel/package.json +++ b/packages/telemetry/node-server-sdk-otel/package.json @@ -23,9 +23,9 @@ "test": "npx jest --ci", "build": "npx tsc", "clean": "npx tsc --build --clean", - "prettier": "prettier --write 'src/*.@(js|ts|tsx|json)'", - "check": "yarn && yarn prettier && yarn lint && tsc && yarn test", - "lint": "npx eslint . --ext .ts" + "check": "yarn && yarn lint:fix && yarn lint && tsc && yarn test", + "lint": "npx eslint . --ext .ts", + "lint:fix": "npx eslint . --ext .ts --fix" }, "license": "Apache-2.0", "peerDependencies": { @@ -37,6 +37,7 @@ "@opentelemetry/api": ">=1.3.0", "@opentelemetry/sdk-node": "0.49.1", "@opentelemetry/sdk-trace-node": "1.22.0", + "@stylistic/eslint-plugin": "^4.0.0", "@testing-library/dom": "^9.3.1", "@testing-library/jest-dom": "^5.16.5", "@types/jest": "^29.5.3", @@ -44,15 +45,13 @@ "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.6.1", "jest-diff": "^29.6.1", "jest-environment-jsdom": "^29.6.1", "launchdarkly-js-test-helpers": "^2.2.0", - "prettier": "^3.0.0", "ts-jest": "^29.1.1", "typedoc": "0.25.0", "typescript": "5.1.6" diff --git a/packages/tooling/contract-test-utils/package.json b/packages/tooling/contract-test-utils/package.json index 1d7d30a230..2662db9344 100644 --- a/packages/tooling/contract-test-utils/package.json +++ b/packages/tooling/contract-test-utils/package.json @@ -50,7 +50,7 @@ "build:client": "tsc -p tsconfig.client.json", "build:server": "tsc -p tsconfig.server.json", "lint": "eslint . --ext .ts", - "lint:fix": "yarn run lint --fix", + "lint:fix": "eslint . --ext .ts --fix", "clean": "rimraf dist" }, "dependencies": { @@ -62,6 +62,7 @@ "ws": "^8.18.0" }, "devDependencies": { + "@stylistic/eslint-plugin": "^4.0.0", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/node": "^18.11.9", @@ -69,11 +70,9 @@ "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", - "prettier": "^3.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "typescript": "^4.9.0" } } diff --git a/packages/tooling/contract-test-utils/src/adapter.ts b/packages/tooling/contract-test-utils/src/adapter.ts index a9e2bb59e1..94558531bc 100644 --- a/packages/tooling/contract-test-utils/src/adapter.ts +++ b/packages/tooling/contract-test-utils/src/adapter.ts @@ -1,2 +1,2 @@ -export { startAdapter } from './adapter/startAdapter.js'; export type { AdapterOptions } from './adapter/startAdapter.js'; +export { startAdapter } from './adapter/startAdapter.js'; diff --git a/packages/tooling/contract-test-utils/src/adapter/startAdapter.ts b/packages/tooling/contract-test-utils/src/adapter/startAdapter.ts index c56a47063f..9300f0487f 100644 --- a/packages/tooling/contract-test-utils/src/adapter/startAdapter.ts +++ b/packages/tooling/contract-test-utils/src/adapter/startAdapter.ts @@ -1,10 +1,10 @@ /* eslint-disable no-console */ +import http from 'node:http'; +import util from 'node:util'; import bodyParser from 'body-parser'; import cors from 'cors'; import { randomUUID } from 'crypto'; import express from 'express'; -import http from 'node:http'; -import util from 'node:util'; import { WebSocketServer } from 'ws'; export interface AdapterOptions { diff --git a/packages/tooling/contract-test-utils/src/bin/sdk-testharness-server.ts b/packages/tooling/contract-test-utils/src/bin/sdk-testharness-server.ts index 1f78ad67df..89d0cc5c4d 100644 --- a/packages/tooling/contract-test-utils/src/bin/sdk-testharness-server.ts +++ b/packages/tooling/contract-test-utils/src/bin/sdk-testharness-server.ts @@ -22,9 +22,9 @@ if (subcommand === 'adapter') { }); } else { console.error( - subcommand - ? `Unknown subcommand: ${subcommand}` - : 'Usage: sdk-testharness-server \n\nSubcommands:\n adapter Start the REST↔WebSocket adapter', + subcommand ? + `Unknown subcommand: ${subcommand}` : + 'Usage: sdk-testharness-server \n\nSubcommands:\n adapter Start the REST↔WebSocket adapter', ); process.exit(1); } diff --git a/packages/tooling/contract-test-utils/src/index.ts b/packages/tooling/contract-test-utils/src/index.ts index f227ed20f3..3b6b17c88c 100644 --- a/packages/tooling/contract-test-utils/src/index.ts +++ b/packages/tooling/contract-test-utils/src/index.ts @@ -1,5 +1,5 @@ // Universal exports (types use minimal compat types, no SDK dependency) -export * from './types/CommandParams.js'; -export * from './types/ConfigParams.js'; export { makeLogger } from './logging/makeLogger.js'; export { ClientPool } from './server-side/ClientPool.js'; +export * from './types/CommandParams.js'; +export * from './types/ConfigParams.js'; diff --git a/packages/tooling/jest/package.json b/packages/tooling/jest/package.json index bc90600b15..e0146a8200 100644 --- a/packages/tooling/jest/package.json +++ b/packages/tooling/jest/package.json @@ -36,23 +36,21 @@ "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", - "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test" + "check": "yarn lint:fix && yarn lint && yarn build && yarn test", + "lint:fix": "eslint . --ext .ts --fix" }, "devDependencies": { - "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@stylistic/eslint-plugin": "^4.0.0", "@types/jest": "^29.5.0", "@typescript-eslint/eslint-plugin": "^6.20.0", "@typescript-eslint/parser": "^6.20.0", "eslint": "^8.45.0", - "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", "eslint-plugin-jest": "^27.6.3", - "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-simple-import-sort": "^12.0.0", "jest": "^29.5.0", - "prettier": "^3.0.0", "react-test-renderer": "^18.3.1", "rimraf": "^5.0.1", "ts-jest": "^29.1.0",