diff --git a/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--bug_report.md b/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--bug_report.md index 365110eb98..0949c8de54 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/akamai-base, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--feature_request.md b/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--feature_request.md index 1adbae2680..1a99cb976c 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-akamai-base--feature_request.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/akamai-base, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--bug_report.md b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--bug_report.md index c6b6452dd4..1a346ecd83 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/akamai-edgekv, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--feature_request.md b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--feature_request.md index dcf2fa6f11..338766e6e4 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgekv--feature_request.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/akamai-edgekv, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--bug_report.md b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--bug_report.md index cf2fd7b113..87e08002c8 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/akamai-edgeworker-sdk, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--feature_request.md b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--feature_request.md index f1ad98d737..ef6008bb8c 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-akamai-edgeworker-sdk--feature_request.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/akamai-edgeworker-sdk, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--bug_report.md b/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--bug_report.md index a57cb02d6f..07479a3952 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/cloudflare, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--feature_request.md b/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--feature_request.md index 8fd59b7c63..51c250794e 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-cloudflare--feature_request.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/cloudflare, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-server-node--bug_report.md b/.github/ISSUE_TEMPLATE/package-sdk-server-node--bug_report.md index 4dd575ff31..408e27b976 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-server-node--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-server-node--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/server-node, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-server-node--feature_request.md b/.github/ISSUE_TEMPLATE/package-sdk-server-node--feature_request.md index 72d295fdd4..92f418f707 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-server-node--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-server-node--feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for this project title: '' labels: 'package: sdk/server-node, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-vercel--bug_report.md b/.github/ISSUE_TEMPLATE/package-sdk-vercel--bug_report.md index 4bd2b579bf..8874fc6f1e 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-vercel--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-vercel--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/vercel, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-sdk-vercel--feature_request.md b/.github/ISSUE_TEMPLATE/package-sdk-vercel--feature_request.md index 03a8392e1d..f47e3ef940 100644 --- a/.github/ISSUE_TEMPLATE/package-sdk-vercel--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-sdk-vercel--feature_request.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: sdk/vercel, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-shared-common--bug_report.md b/.github/ISSUE_TEMPLATE/package-shared-common--bug_report.md index 8d440882eb..343c5305b6 100644 --- a/.github/ISSUE_TEMPLATE/package-shared-common--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-shared-common--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: shared/common, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-shared-common--feature_request.md b/.github/ISSUE_TEMPLATE/package-shared-common--feature_request.md index 3678548560..460246a5c7 100644 --- a/.github/ISSUE_TEMPLATE/package-shared-common--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-shared-common--feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for this project title: '' labels: 'package: shared/common, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-shared-sdk-server--bug_report.md b/.github/ISSUE_TEMPLATE/package-shared-sdk-server--bug_report.md index 476ef92325..652a36ed9f 100644 --- a/.github/ISSUE_TEMPLATE/package-shared-sdk-server--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-shared-sdk-server--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: shared/sdk-server, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-shared-sdk-server--feature_request.md b/.github/ISSUE_TEMPLATE/package-shared-sdk-server--feature_request.md index de6dc0a1cf..57884a1eb8 100644 --- a/.github/ISSUE_TEMPLATE/package-shared-sdk-server--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-shared-sdk-server--feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for this project title: '' labels: 'package: package-b, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--bug_report.md b/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--bug_report.md index 80dbd4d572..8e92f76c12 100644 --- a/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: shared/sdk-server-edge, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--feature_request.md b/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--feature_request.md index fe63140c63..b5f0a7af41 100644 --- a/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-shared-sdk-server-edge--feature_request.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: shared/sdk-server-edge, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--bug_report.md b/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--bug_report.md index 179eb988fd..fceb2c31bc 100644 --- a/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--bug_report.md +++ b/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve title: '' labels: 'package: store/node-server-sdk-redis, bug' assignees: '' - --- **Is this a support request?** @@ -34,4 +33,4 @@ For instance, Go 1.11 or Ruby 2.5.3. If you are using a language that requires a For instance, Ubuntu 16.04, Windows 10, or Android 4.0.3. If your code is running in a browser, please also include the browser type and version. **Additional context** -Add any other context about the problem here. \ No newline at end of file +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--feature_request.md b/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--feature_request.md index 7a82edb540..25a4c6b88d 100644 --- a/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--feature_request.md +++ b/.github/ISSUE_TEMPLATE/package-stores-node-server-sdk-redis--feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for this project title: '' labels: 'package: store/node-server-sdk-redis, feature' assignees: '' - --- **Is your feature request related to a problem? Please describe.** @@ -17,4 +16,4 @@ A clear and concise description of what you want to happen. A clear and concise description of any alternative solutions or features you've considered. **Additional context** -Add any other context about the feature request here. \ No newline at end of file +Add any other context about the feature request here. diff --git a/.github/workflows/manual-publish-docs.yml b/.github/workflows/manual-publish-docs.yml index d165b8b363..9380d4e17b 100644 --- a/.github/workflows/manual-publish-docs.yml +++ b/.github/workflows/manual-publish-docs.yml @@ -29,14 +29,14 @@ jobs: node-version: 16.x registry-url: 'https://registry.npmjs.org' - - name: "Setup Redis" + - name: 'Setup Redis' if: ${{ inputs.workspace_path == 'packages/store/node-server-sdk-redis' }} run: | sudo apt-get update sudo apt-get install redis-server sudo service redis-server start - - name: "Setup DynamoDB" + - name: 'Setup DynamoDB' if: ${{ inputs.workspace_path == 'packages/store/node-server-sdk-dynamodb' }} run: | sudo docker run -d -p 8000:8000 amazon/dynamodb-local diff --git a/.github/workflows/manual-publish.yml b/.github/workflows/manual-publish.yml index e2ed493e58..aa7f508c62 100644 --- a/.github/workflows/manual-publish.yml +++ b/.github/workflows/manual-publish.yml @@ -41,14 +41,14 @@ jobs: with: node-version: 16.x registry-url: 'https://registry.npmjs.org' - - name: "Setup Redis" + - name: 'Setup Redis' if: ${{ inputs.workspace_path == 'packages/store/node-server-sdk-redis' }} run: | sudo apt-get update sudo apt-get install redis-server sudo service redis-server start - - name: "Setup DynamoDB" + - name: 'Setup DynamoDB' if: ${{ inputs.workspace_path == 'packages/store/node-server-sdk-dynamodb' }} run: | sudo docker run -d -p 8000:8000 amazon/dynamodb-local diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 75277a19ef..b1b60e6317 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1 +1,13 @@ -{"packages/shared/common":"1.0.2","packages/shared/sdk-server":"1.0.6","packages/sdk/server-node":"8.1.0","packages/sdk/cloudflare":"2.0.7","packages/shared/sdk-server-edge":"1.0.6","packages/sdk/vercel":"1.0.1","packages/sdk/akamai-base":"1.0.0","packages/sdk/akamai-edgekv":"1.0.0","packages/shared/akamai-edgeworker-sdk":"0.2.5","packages/store/node-server-sdk-dynamodb":"5.0.4","packages/store/node-server-sdk-redis":"3.0.4"} +{ + "packages/shared/common": "1.0.2", + "packages/shared/sdk-server": "1.0.6", + "packages/sdk/server-node": "8.1.0", + "packages/sdk/cloudflare": "2.0.7", + "packages/shared/sdk-server-edge": "1.0.6", + "packages/sdk/vercel": "1.0.1", + "packages/sdk/akamai-base": "1.0.0", + "packages/sdk/akamai-edgekv": "1.0.0", + "packages/shared/akamai-edgeworker-sdk": "0.2.5", + "packages/store/node-server-sdk-dynamodb": "5.0.4", + "packages/store/node-server-sdk-redis": "3.0.4" +} diff --git a/README.md b/README.md index b5b438c67d..f069584734 100644 --- a/README.md +++ b/README.md @@ -5,13 +5,13 @@ This includes shared libraries, used by SDKs and other tools, as well as SDKs. ## Packages -| SDK packages | npm | issues | tests | -| ------------------------------------------------------------------------ | ------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------------------------------------- | -| [@launchdarkly/cloudflare-server-sdk](packages/sdk/cloudflare/README.md) | [![NPM][sdk-cloudflare-npm-badge]][sdk-cloudflare-npm-link] | [Cloudflare][package-sdk-cloudflare-issues] | [![Actions Status][sdk-cloudflare-ci-badge]][sdk-cloudflare-ci] | -| [@launchdarkly/node-server-sdk](packages/sdk/server-node/README.md) | [![NPM][sdk-server-node-npm-badge]][sdk-server-node-npm-link] | [Node.js Server][package-sdk-server-node-issues] | [![Actions Status][sdk-server-node-ci-badge]][sdk-server-node-ci] | -| [@launchdarkly/vercel-server-sdk](packages/sdk/vercel/README.md) | [![NPM][sdk-vercel-npm-badge]][sdk-vercel-npm-link] | [Vercel][package-sdk-vercel-issues] | [![Actions Status][sdk-vercel-ci-badge]][sdk-vercel-ci] | -| [@launchdarkly/akamai-server-base-sdk](packages/sdk/akamai-base/README.md) | [![NPM][sdk-akamai-base-npm-badge]][sdk-akamai-base-npm-link] | [Akamai Base][package-sdk-akamai-base-issues] | [![Actions Status][sdk-akamai-base-ci-badge]][sdk-akamai-base-ci] | -| [@launchdarkly/akamai-server-edgekv-sdk](packages/sdk/akamai-edgekv/README.md) | [![NPM][sdk-akamai-edgekv-npm-badge]][sdk-akamai-edgekv-npm-link] | [Akamai EdgeKV][package-sdk-akamai-edgekv-issues] | [![Actions Status][sdk-akamai-edgekv-ci-badge]][sdk-akamai-edgekv-ci] | +| SDK packages | npm | issues | tests | +| ------------------------------------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------- | --------------------------------------------------------------------- | +| [@launchdarkly/cloudflare-server-sdk](packages/sdk/cloudflare/README.md) | [![NPM][sdk-cloudflare-npm-badge]][sdk-cloudflare-npm-link] | [Cloudflare][package-sdk-cloudflare-issues] | [![Actions Status][sdk-cloudflare-ci-badge]][sdk-cloudflare-ci] | +| [@launchdarkly/node-server-sdk](packages/sdk/server-node/README.md) | [![NPM][sdk-server-node-npm-badge]][sdk-server-node-npm-link] | [Node.js Server][package-sdk-server-node-issues] | [![Actions Status][sdk-server-node-ci-badge]][sdk-server-node-ci] | +| [@launchdarkly/vercel-server-sdk](packages/sdk/vercel/README.md) | [![NPM][sdk-vercel-npm-badge]][sdk-vercel-npm-link] | [Vercel][package-sdk-vercel-issues] | [![Actions Status][sdk-vercel-ci-badge]][sdk-vercel-ci] | +| [@launchdarkly/akamai-server-base-sdk](packages/sdk/akamai-base/README.md) | [![NPM][sdk-akamai-base-npm-badge]][sdk-akamai-base-npm-link] | [Akamai Base][package-sdk-akamai-base-issues] | [![Actions Status][sdk-akamai-base-ci-badge]][sdk-akamai-base-ci] | +| [@launchdarkly/akamai-server-edgekv-sdk](packages/sdk/akamai-edgekv/README.md) | [![NPM][sdk-akamai-edgekv-npm-badge]][sdk-akamai-edgekv-npm-link] | [Akamai EdgeKV][package-sdk-akamai-edgekv-issues] | [![Actions Status][sdk-akamai-edgekv-ci-badge]][sdk-akamai-edgekv-ci] | | Shared packages | npm | issues | tests | | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------- | @@ -19,9 +19,9 @@ This includes shared libraries, used by SDKs and other tools, as well as SDKs. | [@launchdarkly/js-server-sdk-common](packages/shared/sdk-server/README.md) | [![NPM][js-server-sdk-common-npm-badge]][js-server-sdk-common-npm-link] | [Common Server][package-shared-sdk-server-issues] | [![Actions Status][shared-sdk-server-ci-badge]][shared-sdk-server-ci] | | [@launchdarkly/js-server-sdk-common-edge](packages/shared/sdk-server-edge/README.md) | [![NPM][js-server-sdk-common-edge-badge]][js-server-sdk-common-edge-link] | [Common Server Edge][package-shared-sdk-server-edge-issues] | [![Actions Status][shared-sdk-server-edge-ci-badge]][shared-sdk-server-edge-ci] | -| Store Packages | npm | issues | tests | -| ------------------------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------- | ------------------------------------------------------- | -| [@launchdarkly/node-server-sdk-redis](packages/store/node-server-sdk-redis/README.md) | [![NPM][node-redis-npm-badge]][node-redis-npm-link] | [Node Redis][node-redis-issues] | [![Actions Status][node-redis-ci-badge]][node-redis-ci] | +| Store Packages | npm | issues | tests | +| ------------------------------------------------------------------------------------------- | --------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------- | +| [@launchdarkly/node-server-sdk-redis](packages/store/node-server-sdk-redis/README.md) | [![NPM][node-redis-npm-badge]][node-redis-npm-link] | [Node Redis][node-redis-issues] | [![Actions Status][node-redis-ci-badge]][node-redis-ci] | | [@launchdarkly/node-server-sdk-dynamodb](packages/store/node-server-sdk-dynamodb/README.md) | [![NPM][node-dynamodb-npm-badge]][node-dynamodb-npm-link] | [Node DynamoDB][node-dynamodb-issues] | [![Actions Status][node-dynamodb-ci-badge]][node-dynamodb-ci] | ## Organization @@ -137,4 +137,4 @@ We encourage pull requests and other contributions from the community. Check out [node-dynamodb-ci]: https://github.com/launchdarkly/js-core/actions/workflows/node-dynamodb.yml [node-dynamodb-npm-badge]: https://img.shields.io/npm/v/@launchdarkly/node-server-sdk-dynamodb.svg?style=flat-square [node-dynamodb-npm-link]: https://www.npmjs.com/package/@launchdarkly/node-server-sdk-dynamodb -[node-dynamodb-issues]: https://github.com/launchdarkly/js-core/issues?q=is%3Aissue+is%3Aopen+label%3A%22package%3A+store%2Fnode-server-sdk-dynamodb%22+ \ No newline at end of file +[node-dynamodb-issues]: https://github.com/launchdarkly/js-core/issues?q=is%3Aissue+is%3Aopen+label%3A%22package%3A+store%2Fnode-server-sdk-dynamodb%22+ diff --git a/contract-tests/BigSegmentTestStore.js b/contract-tests/BigSegmentTestStore.js index 1467f02dd5..747f9a8870 100644 --- a/contract-tests/BigSegmentTestStore.js +++ b/contract-tests/BigSegmentTestStore.js @@ -16,14 +16,16 @@ export default class BigSegmentTestStore { } async getUserMembership(contextHash) { - const data = await got.post(`${this._callbackUri}/getMembership`, { - retry: { limit: 0 }, - json: { - contextHash - } - }).json(); + const data = await got + .post(`${this._callbackUri}/getMembership`, { + retry: { limit: 0 }, + json: { + contextHash, + }, + }) + .json(); return data?.values; } - close() { } + close() {} } diff --git a/contract-tests/index.js b/contract-tests/index.js index f2f44a86b1..ee27b7751b 100644 --- a/contract-tests/index.js +++ b/contract-tests/index.js @@ -1,8 +1,8 @@ -import express from 'express'; import bodyParser from 'body-parser'; +import express from 'express'; import { Log } from './log.js'; -import { newSdkClientEntity, badCommandError } from './sdkClientEntity.js'; +import { badCommandError, newSdkClientEntity } from './sdkClientEntity.js'; const app = express(); let server = null; @@ -27,7 +27,7 @@ app.get('/', (req, res) => { 'all-flags-with-reasons', 'tags', 'big-segments', - 'user-type' + 'user-type', ], }); }); diff --git a/contract-tests/sdkClientEntity.js b/contract-tests/sdkClientEntity.js index 04a2827fb3..c1095659ce 100644 --- a/contract-tests/sdkClientEntity.js +++ b/contract-tests/sdkClientEntity.js @@ -1,6 +1,6 @@ import ld from 'node-server-sdk'; -import BigSegmentTestStore from './BigSegmentTestStore.js'; +import BigSegmentTestStore from './BigSegmentTestStore.js'; import { Log, sdkLogger } from './log.js'; const badCommandError = new Error('unsupported command'); @@ -38,15 +38,17 @@ export function makeSdkConfig(options, tag) { if (options.bigSegments) { const bigSegmentsOptions = options.bigSegments; cf.bigSegments = { - store: () => - new BigSegmentTestStore(bigSegmentsOptions.callbackUri), + 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, }; } return cf; @@ -59,12 +61,12 @@ export async function newSdkClientEntity(options) { log.info('Creating client with configuration: ' + JSON.stringify(options.configuration)); const timeout = options.configuration.startWaitTimeMs !== null && - options.configuration.startWaitTimeMs !== undefined + options.configuration.startWaitTimeMs !== undefined ? options.configuration.startWaitTimeMs : 5000; const client = ld.init( options.configuration.credential || 'unknown-sdk-key', - makeSdkConfig(options.configuration, options.tag) + makeSdkConfig(options.configuration, options.tag), ); try { await Promise.race([ diff --git a/packages/sdk/akamai-base/README.md b/packages/sdk/akamai-base/README.md index be3c88f291..b68175a5cb 100644 --- a/packages/sdk/akamai-base/README.md +++ b/packages/sdk/akamai-base/README.md @@ -18,7 +18,6 @@ npm i @launchdarkly/akamai-server-base-sdk ## Quickstart - See the full [example app](https://github.com/launchdarkly/js-core/tree/main/packages/sdk/akamai-base/example). ## Developing this SDK @@ -53,4 +52,4 @@ yarn test [sdk-akamai-base-ghp-link]: https://launchdarkly.github.io/js-core/packages/sdk/akamai-base/docs/ [sdk-akamai-base-dm-badge]: https://img.shields.io/npm/dm/@launchdarkly/akamai-server-base-sdk.svg?style=flat-square [sdk-akamai-base-dt-badge]: https://img.shields.io/npm/dt/@launchdarkly/akamai-server-base-sdk.svg?style=flat-square -[package-sdk-akamai-base-issues]: https://github.com/launchdarkly/js-core/issues?q=is%3Aissue+is%3Aopen+label%3A%22package%3A+sdk%2Fakamai-base%22+ \ No newline at end of file +[package-sdk-akamai-base-issues]: https://github.com/launchdarkly/js-core/issues?q=is%3Aissue+is%3Aopen+label%3A%22package%3A+sdk%2Fakamai-base%22+ diff --git a/packages/sdk/akamai-base/example/ldClient.ts b/packages/sdk/akamai-base/example/ldClient.ts index f2c0d0c9dc..8beb003d91 100644 --- a/packages/sdk/akamai-base/example/ldClient.ts +++ b/packages/sdk/akamai-base/example/ldClient.ts @@ -50,7 +50,7 @@ class MyCustomStoreProvider implements EdgeProvider { export const evaluateFlagFromCustomFeatureStore = async ( flagKey: string, context: LDContext, - defaultValue: boolean + defaultValue: boolean, ) => { const client = init({ sdkKey: 'Your-launchdarkly-environment-client-id', diff --git a/packages/sdk/akamai-base/example/main.ts b/packages/sdk/akamai-base/example/main.ts index 122596ded1..51c665b318 100644 --- a/packages/sdk/akamai-base/example/main.ts +++ b/packages/sdk/akamai-base/example/main.ts @@ -1,5 +1,7 @@ import { logger } from 'log'; + import { LDMultiKindContext } from '@launchdarkly/akamai-server-base-sdk'; + import { evaluateFlagFromCustomFeatureStore } from './ldClient.js'; const createLDContext = (r: EW.IngressClientRequest): LDMultiKindContext => ({ @@ -17,13 +19,13 @@ export async function onClientRequest(request: EW.IngressClientRequest) { const showAds = await evaluateFlagFromCustomFeatureStore( 'enable-ads', createLDContext(request), - false + false, ); let response = createResponse('Ads are hidden with flag initialized from custom feature store'); if (showAds) { response = createResponse( - 'Showing random advertisements with flag initialized from custom feature store' + 'Showing random advertisements with flag initialized from custom feature store', ); } @@ -35,7 +37,7 @@ export async function onClientRequest(request: EW.IngressClientRequest) { export function onClientResponse( request: EW.EgressClientRequest, - response: EW.EgressClientResponse + response: EW.EgressClientResponse, ) { // Outputs a message to the X-Akamai-EdgeWorker-onClientResponse-Log header. logger.log('Adding a header in ClientResponse'); diff --git a/packages/sdk/akamai-base/example/rollup.config.js b/packages/sdk/akamai-base/example/rollup.config.js index fb03098a34..5b86ee5257 100644 --- a/packages/sdk/akamai-base/example/rollup.config.js +++ b/packages/sdk/akamai-base/example/rollup.config.js @@ -1,6 +1,6 @@ -import typescript from '@rollup/plugin-typescript'; -import resolve from '@rollup/plugin-node-resolve'; import common from '@rollup/plugin-commonjs'; +import resolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; import copy from 'rollup-plugin-copy'; const OUT_DIR = 'dist/ew'; diff --git a/packages/sdk/akamai-base/rollup.config.js b/packages/sdk/akamai-base/rollup.config.js index 691de8b9de..8fd36d9b67 100644 --- a/packages/sdk/akamai-base/rollup.config.js +++ b/packages/sdk/akamai-base/rollup.config.js @@ -1,7 +1,7 @@ -import typescript from '@rollup/plugin-typescript'; -import resolve from '@rollup/plugin-node-resolve'; import common from '@rollup/plugin-commonjs'; +import resolve from '@rollup/plugin-node-resolve'; import terser from '@rollup/plugin-terser'; +import typescript from '@rollup/plugin-typescript'; import generatePackageJson from 'rollup-plugin-generate-package-json'; const getSharedConfig = (format, file) => ({ diff --git a/packages/sdk/akamai-base/src/index.ts b/packages/sdk/akamai-base/src/index.ts index 6e3d1484b5..407f5c97d4 100644 --- a/packages/sdk/akamai-base/src/index.ts +++ b/packages/sdk/akamai-base/src/index.ts @@ -8,12 +8,11 @@ * * @packageDocumentation */ - import { + EdgeProvider, init as initEdge, LDClient, LDOptions, - EdgeProvider, } from '@launchdarkly/akamai-edgeworker-sdk-common'; export * from '@launchdarkly/akamai-edgeworker-sdk-common'; diff --git a/packages/sdk/akamai-base/tsconfig.json b/packages/sdk/akamai-base/tsconfig.json index 83340c5954..aa1b75233a 100644 --- a/packages/sdk/akamai-base/tsconfig.json +++ b/packages/sdk/akamai-base/tsconfig.json @@ -20,4 +20,4 @@ "skipLibCheck": true }, "exclude": ["**/*.test.ts", "dist", "node_modules", "__tests__", "example"] -} \ No newline at end of file +} diff --git a/packages/sdk/akamai-edgekv/README.md b/packages/sdk/akamai-edgekv/README.md index 51e80381ae..d9f2660028 100644 --- a/packages/sdk/akamai-edgekv/README.md +++ b/packages/sdk/akamai-edgekv/README.md @@ -18,7 +18,6 @@ npm i @launchdarkly/akamai-server-edgekv-sdk ## Quickstart - See the full [example app](https://github.com/launchdarkly/js-core/tree/main/packages/sdk/akamai-edgekv/example). ## Developing this SDK @@ -53,4 +52,4 @@ yarn test [sdk-akamai-edgekv-ghp-link]: https://launchdarkly.github.io/js-core/packages/sdk/akamai-edgekv/docs/ [sdk-akamai-edgekv-dm-badge]: https://img.shields.io/npm/dm/@launchdarkly/akamai-server-edgekv-sdk.svg?style=flat-square [sdk-akamai-edgekv-dt-badge]: https://img.shields.io/npm/dt/@launchdarkly/akamai-server-edgekv-sdk.svg?style=flat-square -[package-sdk-akamai-edgekv-issues]: https://github.com/launchdarkly/js-core/issues?q=is%3Aissue+is%3Aopen+label%3A%22package%3A+sdk%2Fakamai-edgekv%22+ \ No newline at end of file +[package-sdk-akamai-edgekv-issues]: https://github.com/launchdarkly/js-core/issues?q=is%3Aissue+is%3Aopen+label%3A%22package%3A+sdk%2Fakamai-edgekv%22+ diff --git a/packages/sdk/akamai-edgekv/example/ldClient.ts b/packages/sdk/akamai-edgekv/example/ldClient.ts index aee031816b..d9ff58f6ee 100644 --- a/packages/sdk/akamai-edgekv/example/ldClient.ts +++ b/packages/sdk/akamai-edgekv/example/ldClient.ts @@ -5,7 +5,7 @@ export type { LDContext, LDMultiKindContext }; export const evaluateFlagWithEdgeKV = async ( flagKey: string, context: LDContext, - defaultValue: boolean + defaultValue: boolean, ) => { const client = init({ sdkKey: 'your-launchdarkly-client-id', diff --git a/packages/sdk/akamai-edgekv/example/main.ts b/packages/sdk/akamai-edgekv/example/main.ts index c8ac5a432b..6f418c9921 100644 --- a/packages/sdk/akamai-edgekv/example/main.ts +++ b/packages/sdk/akamai-edgekv/example/main.ts @@ -1,5 +1,7 @@ import { logger } from 'log'; + import { LDMultiKindContext } from '@launchdarkly/akamai-server-edgekv-sdk'; + import { evaluateFlagWithEdgeKV } from './ldClient'; const createLDContext = (r: EW.IngressClientRequest): LDMultiKindContext => ({ @@ -29,7 +31,7 @@ export async function onClientRequest(request: EW.IngressClientRequest) { export function onClientResponse( request: EW.EgressClientRequest, - response: EW.EgressClientResponse + response: EW.EgressClientResponse, ) { // Outputs a message to the X-Akamai-EdgeWorker-onClientResponse-Log header. logger.log('Adding a header in ClientResponse'); diff --git a/packages/sdk/akamai-edgekv/example/rollup.config.js b/packages/sdk/akamai-edgekv/example/rollup.config.js index a8d8780d1d..8cf96f97b9 100644 --- a/packages/sdk/akamai-edgekv/example/rollup.config.js +++ b/packages/sdk/akamai-edgekv/example/rollup.config.js @@ -1,6 +1,6 @@ -import typescript from '@rollup/plugin-typescript'; -import resolve from '@rollup/plugin-node-resolve'; import common from '@rollup/plugin-commonjs'; +import resolve from '@rollup/plugin-node-resolve'; +import typescript from '@rollup/plugin-typescript'; import copy from 'rollup-plugin-copy'; const OUT_DIR = 'dist/ew'; diff --git a/packages/sdk/akamai-edgekv/rollup.config.js b/packages/sdk/akamai-edgekv/rollup.config.js index 2449f16fbf..65708f69d9 100644 --- a/packages/sdk/akamai-edgekv/rollup.config.js +++ b/packages/sdk/akamai-edgekv/rollup.config.js @@ -1,7 +1,7 @@ -import typescript from '@rollup/plugin-typescript'; -import resolve from '@rollup/plugin-node-resolve'; import common from '@rollup/plugin-commonjs'; +import resolve from '@rollup/plugin-node-resolve'; import terser from '@rollup/plugin-terser'; +import typescript from '@rollup/plugin-typescript'; import generatePackageJson from 'rollup-plugin-generate-package-json'; const getSharedConfig = (format, file) => ({ diff --git a/packages/sdk/akamai-edgekv/src/__tests__/edgekv/edgeKVProvider.test.ts b/packages/sdk/akamai-edgekv/src/__tests__/edgekv/edgeKVProvider.test.ts index a7fcb570b1..13d61d3d82 100644 --- a/packages/sdk/akamai-edgekv/src/__tests__/edgekv/edgeKVProvider.test.ts +++ b/packages/sdk/akamai-edgekv/src/__tests__/edgekv/edgeKVProvider.test.ts @@ -1,5 +1,5 @@ -import EdgeKVProvider from '../../edgekv/edgeKVProvider'; import { EdgeKV } from '../../edgekv/edgekv'; +import EdgeKVProvider from '../../edgekv/edgeKVProvider'; jest.mock('../../edgekv/edgekv', () => ({ EdgeKV: jest.fn(), diff --git a/packages/sdk/akamai-edgekv/src/__tests__/index.test.ts b/packages/sdk/akamai-edgekv/src/__tests__/index.test.ts index e27fd3aeb1..778a37e2a9 100644 --- a/packages/sdk/akamai-edgekv/src/__tests__/index.test.ts +++ b/packages/sdk/akamai-edgekv/src/__tests__/index.test.ts @@ -1,6 +1,6 @@ +import EdgeKVProvider from '../edgekv/edgeKVProvider'; import { init as initWithEdgeKV, LDClient, LDContext } from '../index'; import * as testData from './testData.json'; -import EdgeKVProvider from '../edgekv/edgeKVProvider'; jest.mock('../edgekv/edgekv', () => ({ EdgeKV: jest.fn(), diff --git a/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts b/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts index 64a3fc9a00..97c8806f01 100644 --- a/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts +++ b/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts @@ -1,4 +1,5 @@ import { EdgeProvider } from '@launchdarkly/akamai-edgeworker-sdk-common'; + import { EdgeKV } from './edgekv'; type EdgeKVProviderParams = { diff --git a/packages/sdk/akamai-edgekv/src/index.ts b/packages/sdk/akamai-edgekv/src/index.ts index cffb6c8525..d5780ba399 100644 --- a/packages/sdk/akamai-edgekv/src/index.ts +++ b/packages/sdk/akamai-edgekv/src/index.ts @@ -8,8 +8,8 @@ * * @packageDocumentation */ - import { init as initEdge, LDClient, LDOptions } from '@launchdarkly/akamai-edgeworker-sdk-common'; + import EdgeKVProvider from './edgekv/edgeKVProvider'; export * from '@launchdarkly/akamai-edgeworker-sdk-common'; diff --git a/packages/sdk/cloudflare/example/build.js b/packages/sdk/cloudflare/example/build.js index ca9306529f..c89a3442e0 100644 --- a/packages/sdk/cloudflare/example/build.js +++ b/packages/sdk/cloudflare/example/build.js @@ -1,6 +1,6 @@ +import { build } from 'esbuild'; import path from 'path'; import { fileURLToPath } from 'url'; -import { build } from 'esbuild'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/packages/sdk/cloudflare/src/index.test.ts b/packages/sdk/cloudflare/src/index.test.ts index 67de658100..baeed982fb 100644 --- a/packages/sdk/cloudflare/src/index.test.ts +++ b/packages/sdk/cloudflare/src/index.test.ts @@ -1,6 +1,8 @@ import type { KVNamespace } from '@cloudflare/workers-types'; -import { LDClient, LDContext } from '@launchdarkly/js-server-sdk-common-edge'; import { Miniflare } from 'miniflare'; + +import { LDClient, LDContext } from '@launchdarkly/js-server-sdk-common-edge'; + import { init } from './index'; import * as allFlagsSegments from './testData.json'; diff --git a/packages/sdk/cloudflare/src/index.ts b/packages/sdk/cloudflare/src/index.ts index c60b5f87f4..7aa051b975 100644 --- a/packages/sdk/cloudflare/src/index.ts +++ b/packages/sdk/cloudflare/src/index.ts @@ -9,6 +9,7 @@ * @packageDocumentation */ import type { KVNamespace } from '@cloudflare/workers-types'; + import { BasicLogger, EdgeFeatureStore, @@ -16,6 +17,7 @@ import { LDClient, LDOptions, } from '@launchdarkly/js-server-sdk-common-edge'; + import createPlatformInfo from './createPlatformInfo'; export * from '@launchdarkly/js-server-sdk-common-edge'; diff --git a/packages/sdk/server-node/README.md b/packages/sdk/server-node/README.md index 9d5cafc56a..76a95331fe 100644 --- a/packages/sdk/server-node/README.md +++ b/packages/sdk/server-node/README.md @@ -52,8 +52,6 @@ We encourage pull requests and other contributions from the community. Check out [sdk-server-node-ci-badge]: https://github.com/launchdarkly/js-core/actions/workflows/server-node.yml/badge.svg [sdk-server-node-ci]: https://github.com/launchdarkly/js-core/actions/workflows/server-node.yml - [sdk-server-node-npm-badge]: https://img.shields.io/npm/v/@launchdarkly/node-server-sdk.svg?style=flat-square [sdk-server-node-npm-link]: https://www.npmjs.com/package/@launchdarkly/node-server-sdk - -[sdk-server-node-docs-link]: https://launchdarkly.github.io/js-core/packages/sdk/server-node/docs/ \ No newline at end of file +[sdk-server-node-docs-link]: https://launchdarkly.github.io/js-core/packages/sdk/server-node/docs/ diff --git a/packages/sdk/server-node/__tests__/LDClientNode.bigSegments.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.bigSegments.test.ts index 96d7e0e78c..63a939e256 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.bigSegments.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.bigSegments.test.ts @@ -4,6 +4,7 @@ import { LDBigSegmentsOptions, LDLogger, } from '@launchdarkly/js-server-sdk-common'; + import { basicLogger } from '../src'; import { LDClient } from '../src/api/LDClient'; import LDClientNode from '../src/LDClientNode'; @@ -64,7 +65,7 @@ describe('given test data with big segments', () => { expect(status2!.stale).toEqual(false); expect(status2!.available).toEqual(true); done(); - } + }, ); }); @@ -152,7 +153,7 @@ describe('given test data with big segments', () => { expect(status.available).toEqual(false); done(); } - } + }, ); }); diff --git a/packages/sdk/server-node/__tests__/LDClientNode.bucketing.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.bucketing.test.ts index d4d0fbbe9d..4dbfaa9555 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.bucketing.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.bucketing.test.ts @@ -2,9 +2,9 @@ * The common SDK has a number of bucketing tests, but it doesn't have a real hashing algorithm. * These tests exercise the hashing from the node platform. */ - import { integrations } from '@launchdarkly/js-server-sdk-common'; import { TestData } from '@launchdarkly/js-server-sdk-common/dist/integrations'; + import { LDClient } from '../src'; import LDClientNode from '../src/LDClientNode'; diff --git a/packages/sdk/server-node/__tests__/LDClientNode.fileDataSource.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.fileDataSource.test.ts index 8456314179..d85dc1d35f 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.fileDataSource.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.fileDataSource.test.ts @@ -1,5 +1,7 @@ -import { integrations } from '@launchdarkly/js-server-sdk-common'; import { mkdir, rm, stat, writeFile } from 'node:fs/promises'; + +import { integrations } from '@launchdarkly/js-server-sdk-common'; + import LDClientNode from '../src/LDClientNode'; const flag1Key = 'flag1'; diff --git a/packages/sdk/server-node/__tests__/LDClientNode.listeners.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.listeners.test.ts index 505e2a1b72..5c3f51c06f 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.listeners.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.listeners.test.ts @@ -1,4 +1,5 @@ import { integrations } from '@launchdarkly/js-server-sdk-common'; + import { LDClient } from '../src'; import LDClientNode from '../src/LDClientNode'; diff --git a/packages/sdk/server-node/__tests__/LDClientNode.proxy.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.proxy.test.ts index bc96284321..b3865b6c33 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.proxy.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.proxy.test.ts @@ -4,8 +4,8 @@ import { TestHttpHandlers, TestHttpServer, } from 'launchdarkly-js-test-helpers'; -import { basicLogger, LDLogger } from '../src'; +import { basicLogger, LDLogger } from '../src'; import LDClientNode from '../src/LDClientNode'; const sdkKey = 'sdkKey'; diff --git a/packages/sdk/server-node/__tests__/LDClientNode.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.test.ts index 4e38418850..1e0dd0b525 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.test.ts @@ -1,4 +1,5 @@ import { LDContext } from '@launchdarkly/js-server-sdk-common'; + import { init } from '../src'; it('fires ready event in offline mode', (done) => { diff --git a/packages/sdk/server-node/__tests__/LDClientNode.tls.test.ts b/packages/sdk/server-node/__tests__/LDClientNode.tls.test.ts index ad6e830200..ba675a5523 100644 --- a/packages/sdk/server-node/__tests__/LDClientNode.tls.test.ts +++ b/packages/sdk/server-node/__tests__/LDClientNode.tls.test.ts @@ -5,8 +5,8 @@ import { TestHttpHandlers, TestHttpServer, } from 'launchdarkly-js-test-helpers'; -import { basicLogger, LDClient, LDLogger } from '../src'; +import { basicLogger, LDClient, LDLogger } from '../src'; import LDClientNode from '../src/LDClientNode'; describe('When using a TLS connection', () => { diff --git a/packages/sdk/server-node/__tests__/platform/HeaderWrapper.test.ts b/packages/sdk/server-node/__tests__/platform/HeaderWrapper.test.ts index 8ee72a167b..4bedc445df 100644 --- a/packages/sdk/server-node/__tests__/platform/HeaderWrapper.test.ts +++ b/packages/sdk/server-node/__tests__/platform/HeaderWrapper.test.ts @@ -1,6 +1,7 @@ /* eslint-disable no-restricted-syntax */ // The header interface uses generators, so we are using restricted-syntax. import * as http from 'http'; + import HeaderWrapper from '../../src/platform/HeaderWrapper'; describe('given header values', () => { diff --git a/packages/sdk/server-node/__tests__/platform/NodeInfo.test.ts b/packages/sdk/server-node/__tests__/platform/NodeInfo.test.ts index cb4fa61fb3..4a7e5bd346 100644 --- a/packages/sdk/server-node/__tests__/platform/NodeInfo.test.ts +++ b/packages/sdk/server-node/__tests__/platform/NodeInfo.test.ts @@ -1,4 +1,5 @@ import * as os from 'os'; + import NodeInfo from '../../src/platform/NodeInfo'; describe('given an information instance', () => { diff --git a/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts b/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts index 73161eeca2..d7ea0ff6c2 100644 --- a/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts +++ b/packages/sdk/server-node/__tests__/platform/NodeRequests.test.ts @@ -54,7 +54,7 @@ describe('given a default instance of NodeRequests', () => { async () => new Promise((resolveClose) => { server.close(resolveClose); - }) + }), ); const requests = new NodeRequests(); diff --git a/packages/sdk/server-node/src/BigSegmentsStoreStatusProviderNode.ts b/packages/sdk/server-node/src/BigSegmentsStoreStatusProviderNode.ts index d94ed9dcb8..52e1c3acfd 100644 --- a/packages/sdk/server-node/src/BigSegmentsStoreStatusProviderNode.ts +++ b/packages/sdk/server-node/src/BigSegmentsStoreStatusProviderNode.ts @@ -1,5 +1,7 @@ -import { BigSegmentStoreStatusProviderImpl, interfaces } from '@launchdarkly/js-server-sdk-common'; import { EventEmitter } from 'events'; + +import { BigSegmentStoreStatusProviderImpl, interfaces } from '@launchdarkly/js-server-sdk-common'; + import { Emits } from './Emits'; /** diff --git a/packages/sdk/server-node/src/LDClientNode.ts b/packages/sdk/server-node/src/LDClientNode.ts index e37a075221..e5cf466562 100644 --- a/packages/sdk/server-node/src/LDClientNode.ts +++ b/packages/sdk/server-node/src/LDClientNode.ts @@ -1,17 +1,18 @@ // eslint-disable-next-line max-classes-per-file +import { EventEmitter } from 'events'; +import { format } from 'util'; + import { + BasicLogger, LDClientImpl, LDOptions, - BasicLogger, SafeLogger, } from '@launchdarkly/js-server-sdk-common'; -import { EventEmitter } from 'events'; -import { format } from 'util'; -import NodePlatform from './platform/NodePlatform'; -import { Emits } from './Emits'; -import BigSegmentStoreStatusProviderNode from './BigSegmentsStoreStatusProviderNode'; import { BigSegmentStoreStatusProvider } from './api'; +import BigSegmentStoreStatusProviderNode from './BigSegmentsStoreStatusProviderNode'; +import { Emits } from './Emits'; +import NodePlatform from './platform/NodePlatform'; class ClientEmitter extends EventEmitter {} @@ -59,14 +60,14 @@ class LDClientNode extends LDClientImpl { .eventNames() .some( (name) => - name === 'update' || (typeof name === 'string' && name.startsWith('update:')) + name === 'update' || (typeof name === 'string' && name.startsWith('update:')), ), - } + }, ); this.emitter = emitter; this.bigSegmentStoreStatusProvider = new BigSegmentStoreStatusProviderNode( - this.bigSegmentStatusProviderInternal + this.bigSegmentStatusProviderInternal, ) as BigSegmentStoreStatusProvider; } } diff --git a/packages/sdk/server-node/src/api/LDClient.ts b/packages/sdk/server-node/src/api/LDClient.ts index d7654265ef..a2db766275 100644 --- a/packages/sdk/server-node/src/api/LDClient.ts +++ b/packages/sdk/server-node/src/api/LDClient.ts @@ -1,5 +1,7 @@ -import { LDClient as LDClientCommon } from '@launchdarkly/js-server-sdk-common'; import { EventEmitter } from 'events'; + +import { LDClient as LDClientCommon } from '@launchdarkly/js-server-sdk-common'; + import { BigSegmentStoreStatusProvider } from './interfaces'; /** diff --git a/packages/sdk/server-node/src/api/interfaces/BigSegmentStatusProvider.ts b/packages/sdk/server-node/src/api/interfaces/BigSegmentStatusProvider.ts index 541914feb5..7605df5511 100644 --- a/packages/sdk/server-node/src/api/interfaces/BigSegmentStatusProvider.ts +++ b/packages/sdk/server-node/src/api/interfaces/BigSegmentStatusProvider.ts @@ -1,4 +1,5 @@ import { EventEmitter } from 'events'; + import { interfaces } from '@launchdarkly/js-server-sdk-common'; /** diff --git a/packages/sdk/server-node/src/index.ts b/packages/sdk/server-node/src/index.ts index 0270cf0685..d6e713d3d6 100644 --- a/packages/sdk/server-node/src/index.ts +++ b/packages/sdk/server-node/src/index.ts @@ -14,8 +14,9 @@ import { LDLogger, LDOptions, } from '@launchdarkly/js-server-sdk-common'; -import LDClientImpl from './LDClientNode'; + import { LDClient } from './api/LDClient'; +import LDClientImpl from './LDClientNode'; export * from '@launchdarkly/js-server-sdk-common'; diff --git a/packages/sdk/server-node/src/platform/HeaderWrapper.ts b/packages/sdk/server-node/src/platform/HeaderWrapper.ts index 5e39d89bb4..fc84250fcc 100644 --- a/packages/sdk/server-node/src/platform/HeaderWrapper.ts +++ b/packages/sdk/server-node/src/platform/HeaderWrapper.ts @@ -1,6 +1,7 @@ -import { platform } from '@launchdarkly/js-server-sdk-common'; import * as http from 'http'; +import { platform } from '@launchdarkly/js-server-sdk-common'; + /** * Wraps the headers to match those used by fetch APIs. * @internal diff --git a/packages/sdk/server-node/src/platform/NodeCrypto.ts b/packages/sdk/server-node/src/platform/NodeCrypto.ts index 3f28241987..fbf029dc72 100644 --- a/packages/sdk/server-node/src/platform/NodeCrypto.ts +++ b/packages/sdk/server-node/src/platform/NodeCrypto.ts @@ -1,8 +1,8 @@ /* eslint-disable class-methods-use-this */ -import { platform } from '@launchdarkly/js-server-sdk-common'; - import { createHash, createHmac, randomUUID } from 'crypto'; +import { platform } from '@launchdarkly/js-server-sdk-common'; + export default class NodeCrypto implements platform.Crypto { createHash(algorithm: string): platform.Hasher { return createHash(algorithm); diff --git a/packages/sdk/server-node/src/platform/NodeFilesystem.ts b/packages/sdk/server-node/src/platform/NodeFilesystem.ts index 3b7552c0bf..e1c7cb9656 100644 --- a/packages/sdk/server-node/src/platform/NodeFilesystem.ts +++ b/packages/sdk/server-node/src/platform/NodeFilesystem.ts @@ -1,7 +1,8 @@ /* eslint-disable class-methods-use-this */ -import { platform } from '@launchdarkly/js-server-sdk-common'; import * as fs from 'fs'; +import { platform } from '@launchdarkly/js-server-sdk-common'; + const fsPromises = fs.promises; export default class NodeFilesystem implements platform.Filesystem { @@ -16,7 +17,7 @@ export default class NodeFilesystem implements platform.Filesystem { watch( path: string, - callback: (eventType: string, filename: string) => void + callback: (eventType: string, filename: string) => void, ): platform.WatchHandle { return fs.watch(path, { persistent: false }, (eventType) => { callback(eventType, path); diff --git a/packages/sdk/server-node/src/platform/NodeInfo.ts b/packages/sdk/server-node/src/platform/NodeInfo.ts index f0fa67537d..5c2a2f9853 100644 --- a/packages/sdk/server-node/src/platform/NodeInfo.ts +++ b/packages/sdk/server-node/src/platform/NodeInfo.ts @@ -1,8 +1,8 @@ /* eslint-disable class-methods-use-this */ -import { platform } from '@launchdarkly/js-server-sdk-common'; - import * as os from 'os'; +import { platform } from '@launchdarkly/js-server-sdk-common'; + import * as packageJson from '../../package.json'; function processPlatformName(name: string): string { diff --git a/packages/sdk/server-node/src/platform/NodePlatform.ts b/packages/sdk/server-node/src/platform/NodePlatform.ts index 62a49ae8c2..0ebdec4839 100644 --- a/packages/sdk/server-node/src/platform/NodePlatform.ts +++ b/packages/sdk/server-node/src/platform/NodePlatform.ts @@ -1,4 +1,5 @@ import { LDOptions, platform } from '@launchdarkly/js-server-sdk-common'; + import NodeCrypto from './NodeCrypto'; import NodeFilesystem from './NodeFilesystem'; import NodeInfo from './NodeInfo'; diff --git a/packages/sdk/server-node/src/platform/NodeRequests.ts b/packages/sdk/server-node/src/platform/NodeRequests.ts index 6a89330388..24f79b0cbf 100644 --- a/packages/sdk/server-node/src/platform/NodeRequests.ts +++ b/packages/sdk/server-node/src/platform/NodeRequests.ts @@ -1,19 +1,18 @@ +import * as http from 'http'; +import * as https from 'https'; import * as createHttpsProxyAgent from 'https-proxy-agent'; import { HttpsProxyAgentOptions } from 'https-proxy-agent'; +// No types for the event source. +// @ts-ignore +import { EventSource as LDEventSource } from 'launchdarkly-eventsource'; import { - platform, - LDTLSOptions, - LDProxyOptions, LDLogger, + LDProxyOptions, + LDTLSOptions, + platform, } from '@launchdarkly/js-server-sdk-common'; -import * as http from 'http'; -import * as https from 'https'; - -// No types for the event source. -// @ts-ignore -import { EventSource as LDEventSource } from 'launchdarkly-eventsource'; import NodeResponse from './NodeResponse'; function processTlsOptions(tlsOptions: LDTLSOptions): https.AgentOptions { @@ -46,7 +45,7 @@ function processTlsOptions(tlsOptions: LDTLSOptions): https.AgentOptions { function processProxyOptions( proxyOptions: LDProxyOptions, - additional: https.AgentOptions = {} + additional: https.AgentOptions = {}, ): https.Agent | http.Agent { const protocol = proxyOptions.scheme?.startsWith('https') ? 'https:' : 'http'; const parsedOptions: HttpsProxyAgentOptions & { [index: string]: any } = { @@ -74,7 +73,7 @@ function processProxyOptions( function createAgent( tlsOptions?: LDTLSOptions, proxyOptions?: LDProxyOptions, - logger?: LDLogger + logger?: LDLogger, ): https.Agent | http.Agent | undefined { if (!proxyOptions?.auth?.startsWith('https') && tlsOptions) { logger?.warn('Proxy configured with TLS options, but is not using an https auth.'); @@ -120,7 +119,7 @@ export default class NodeRequests implements platform.Requests { method: options.method, agent: this.agent, }, - (res) => resolve(new NodeResponse(res)) + (res) => resolve(new NodeResponse(res)), ); if (options.body) { @@ -137,7 +136,7 @@ export default class NodeRequests implements platform.Requests { createEventSource( url: string, - eventSourceInitDict: platform.EventSourceInitDict + eventSourceInitDict: platform.EventSourceInitDict, ): platform.EventSource { const expandedOptions = { ...eventSourceInitDict, diff --git a/packages/sdk/server-node/src/platform/NodeResponse.ts b/packages/sdk/server-node/src/platform/NodeResponse.ts index 957bd49ce3..7cbc0e573c 100644 --- a/packages/sdk/server-node/src/platform/NodeResponse.ts +++ b/packages/sdk/server-node/src/platform/NodeResponse.ts @@ -1,5 +1,7 @@ -import { platform } from '@launchdarkly/js-server-sdk-common'; import * as http from 'http'; + +import { platform } from '@launchdarkly/js-server-sdk-common'; + import HeaderWrapper from './HeaderWrapper'; export default class NodeResponse implements platform.Response { diff --git a/packages/sdk/vercel/README.md b/packages/sdk/vercel/README.md index a2ca6fbf7e..afd10117ff 100644 --- a/packages/sdk/vercel/README.md +++ b/packages/sdk/vercel/README.md @@ -31,9 +31,10 @@ yarn add -D @launchdarkly/vercel-server-sdk Initialize the ldClient with the [Vercel Edge SDK](https://vercel.com/docs/concepts/edge-network/edge-config/edge-config-sdk) and your LaunchDarkly [client-side ID](https://docs.launchdarkly.com/sdk/concepts/client-side-server-side#client-side-id): ```typescript -import { init } from '@launchdarkly/vercel-server-sdk'; import { createClient } from '@vercel/edge-config'; +import { init } from '@launchdarkly/vercel-server-sdk'; + const edgeClient = createClient(process.env.EDGE_CONFIG); const ldClient = init('YOUR CLIENT-SIDE ID', edgeClient); diff --git a/packages/sdk/vercel/examples/complete/app/layout.tsx b/packages/sdk/vercel/examples/complete/app/layout.tsx index 613257dbfd..f5450d26ed 100644 --- a/packages/sdk/vercel/examples/complete/app/layout.tsx +++ b/packages/sdk/vercel/examples/complete/app/layout.tsx @@ -1,10 +1,11 @@ -import 'tailwindcss/tailwind.css'; +import LaunchDarklyProvider from 'components/launchdarklyProvider'; import Nav from 'components/nav'; -import { ReactElement } from 'react'; +import { ldEdgeClient } from 'lib/ldEdgeClient'; import { headers } from 'next/headers'; +import { ReactElement } from 'react'; +import 'tailwindcss/tailwind.css'; + import { LDMultiKindContext } from '@launchdarkly/vercel-server-sdk'; -import LaunchDarklyProvider from 'components/launchdarklyProvider'; -import { ldEdgeClient } from 'lib/ldEdgeClient'; // Specify the `edge` runtime to use the LaunchDarkly Edge SDK in layouts export const runtime = 'edge'; diff --git a/packages/sdk/vercel/examples/complete/app/page.tsx b/packages/sdk/vercel/examples/complete/app/page.tsx index 77de0e1f98..05a7b63fd4 100644 --- a/packages/sdk/vercel/examples/complete/app/page.tsx +++ b/packages/sdk/vercel/examples/complete/app/page.tsx @@ -1,9 +1,9 @@ 'use client'; -import { FC } from 'react'; -import Image from 'next/image'; import { LDFlagSet } from 'launchdarkly-js-client-sdk'; import { useFlags, useLDClient } from 'launchdarkly-react-client-sdk'; +import Image from 'next/image'; +import { FC } from 'react'; type ProductCardProps = { src: string; diff --git a/packages/sdk/vercel/examples/complete/lib/ldEdgeClient.ts b/packages/sdk/vercel/examples/complete/lib/ldEdgeClient.ts index 8423906924..5a198f9290 100644 --- a/packages/sdk/vercel/examples/complete/lib/ldEdgeClient.ts +++ b/packages/sdk/vercel/examples/complete/lib/ldEdgeClient.ts @@ -1,6 +1,7 @@ -import { init } from '@launchdarkly/vercel-server-sdk'; import { createClient } from '@vercel/edge-config'; +import { init } from '@launchdarkly/vercel-server-sdk'; + const edgeConfigClient = createClient(process.env.EDGE_CONFIG); if (!edgeConfigClient) { throw new Error('Edge Config client could not be initialized'); diff --git a/packages/sdk/vercel/examples/complete/middleware.ts b/packages/sdk/vercel/examples/complete/middleware.ts index b1cce31961..807bd86e8a 100644 --- a/packages/sdk/vercel/examples/complete/middleware.ts +++ b/packages/sdk/vercel/examples/complete/middleware.ts @@ -1,7 +1,8 @@ -import { NextFetchEvent, NextRequest, NextResponse } from 'next/server'; import { parseConnectionString } from '@vercel/edge-config'; -import { LDMultiKindContext } from '@launchdarkly/vercel-server-sdk'; import { ldEdgeClient } from 'lib/ldEdgeClient'; +import { NextFetchEvent, NextRequest, NextResponse } from 'next/server'; + +import { LDMultiKindContext } from '@launchdarkly/vercel-server-sdk'; export const config = { matcher: ['/', '/closed', '/favicon.ico'], @@ -38,12 +39,12 @@ export async function middleware(req: NextRequest, context: NextFetchEvent) { const hotDogFaviconEnabled = await client.variation( 'enable-hot-dog-favicon', flagContext, - false + false, ); return hotDogFaviconEnabled ? NextResponse.rewrite(new URL('/hot-dog.ico', request.url)) - : NextResponse.next() + : NextResponse.next(); } const storeClosed = await client.variation('store-closed', flagContext, false); diff --git a/packages/sdk/vercel/examples/route-handler/src/app/api/hello/route.ts b/packages/sdk/vercel/examples/route-handler/src/app/api/hello/route.ts index 9008ea7a82..c62c0649ab 100644 --- a/packages/sdk/vercel/examples/route-handler/src/app/api/hello/route.ts +++ b/packages/sdk/vercel/examples/route-handler/src/app/api/hello/route.ts @@ -1,5 +1,6 @@ -import { NextResponse } from 'next/server'; import { createClient } from '@vercel/edge-config'; +import { NextResponse } from 'next/server'; + import { init as initLD } from '@launchdarkly/vercel-server-sdk'; export const runtime = 'edge'; @@ -11,7 +12,7 @@ export async function GET() { { error: 'LD_CLIENT_SIDE_ID environment variable is missing.', }, - { status: 500 } + { status: 500 }, ); } const flagKey = 'test-flag'; diff --git a/packages/sdk/vercel/examples/route-handler/src/app/layout.tsx b/packages/sdk/vercel/examples/route-handler/src/app/layout.tsx index 04c1f6fa55..cdb9cfa156 100644 --- a/packages/sdk/vercel/examples/route-handler/src/app/layout.tsx +++ b/packages/sdk/vercel/examples/route-handler/src/app/layout.tsx @@ -1,6 +1,7 @@ -import './globals.css'; import { Inter } from 'next/font/google'; +import './globals.css'; + const inter = Inter({ subsets: ['latin'] }); export const metadata = { diff --git a/packages/sdk/vercel/examples/route-handler/src/app/page.tsx b/packages/sdk/vercel/examples/route-handler/src/app/page.tsx index 29f446819e..8129fed23a 100644 --- a/packages/sdk/vercel/examples/route-handler/src/app/page.tsx +++ b/packages/sdk/vercel/examples/route-handler/src/app/page.tsx @@ -1,5 +1,5 @@ -import Image from 'next/image'; import { Inter } from 'next/font/google'; +import Image from 'next/image'; const inter = Inter({ subsets: ['latin'] }); diff --git a/packages/sdk/vercel/src/index.test.ts b/packages/sdk/vercel/src/index.test.ts index 342b25a3b8..5c631f7f00 100644 --- a/packages/sdk/vercel/src/index.test.ts +++ b/packages/sdk/vercel/src/index.test.ts @@ -1,7 +1,8 @@ import { LDClient, LDContext } from '@launchdarkly/js-server-sdk-common-edge'; + import { init } from './index'; -import * as testData from './utils/testData.json'; import mockEdgeConfigClient from './utils/mockEdgeConfigClient'; +import * as testData from './utils/testData.json'; const sdkKey = 'test-sdk-key'; const flagKey1 = 'testFlag1'; diff --git a/packages/sdk/vercel/src/index.ts b/packages/sdk/vercel/src/index.ts index 80733540bc..fafb432bed 100644 --- a/packages/sdk/vercel/src/index.ts +++ b/packages/sdk/vercel/src/index.ts @@ -9,6 +9,7 @@ * @packageDocumentation */ import type { EdgeConfigClient } from '@vercel/edge-config'; + import { BasicLogger, EdgeFeatureStore, @@ -17,6 +18,7 @@ import { LDClient, LDOptions, } from '@launchdarkly/js-server-sdk-common-edge'; + import createPlatformInfo from './createPlatformInfo'; export * from '@launchdarkly/js-server-sdk-common-edge'; diff --git a/packages/sdk/vercel/tsconfig.json b/packages/sdk/vercel/tsconfig.json index 603d370bc8..2635087a0d 100644 --- a/packages/sdk/vercel/tsconfig.json +++ b/packages/sdk/vercel/tsconfig.json @@ -4,9 +4,7 @@ "rootDir": ".", "outDir": "dist", "target": "es6", - "lib": [ - "es6" - ], + "lib": ["es6"], "module": "commonjs", "strict": true, "noImplicitOverride": true, @@ -17,17 +15,8 @@ "resolveJsonModule": true, "stripInternal": true, "moduleResolution": "node", - "types": [ - "jest", - "node" - ], + "types": ["jest", "node"], "skipLibCheck": true }, - "exclude": [ - "**/*.test.ts", - "dist", - "node_modules", - "__tests__", - "examples" - ] -} \ No newline at end of file + "exclude": ["**/*.test.ts", "dist", "node_modules", "__tests__", "examples"] +} diff --git a/packages/shared/akamai-edgeworker-sdk/README.md b/packages/shared/akamai-edgeworker-sdk/README.md index 4ab936c153..542e0fbb57 100644 --- a/packages/shared/akamai-edgeworker-sdk/README.md +++ b/packages/shared/akamai-edgeworker-sdk/README.md @@ -4,7 +4,6 @@ This project contains Typescript classes and interfaces that are applicable to Akamai's edge SDKs. - ## Contributing See [Contributing](../CONTRIBUTING.md). diff --git a/packages/shared/akamai-edgeworker-sdk/src/__tests__/featureStore/index.test.ts b/packages/shared/akamai-edgeworker-sdk/src/__tests__/featureStore/index.test.ts index 51122b3eb1..e692e3b719 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/__tests__/featureStore/index.test.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/__tests__/featureStore/index.test.ts @@ -1,6 +1,6 @@ import { AsyncStoreFacade, LDFeatureStore } from '@launchdarkly/js-server-sdk-common'; -import { EdgeFeatureStore, EdgeProvider } from '../../featureStore'; +import { EdgeFeatureStore, EdgeProvider } from '../../featureStore'; import * as testData from '../testData.json'; describe('EdgeFeatureStore', () => { diff --git a/packages/shared/akamai-edgeworker-sdk/src/__tests__/index.test.ts b/packages/shared/akamai-edgeworker-sdk/src/__tests__/index.test.ts index b806a95113..aa8f16fe9b 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/__tests__/index.test.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/__tests__/index.test.ts @@ -1,5 +1,4 @@ -import { EdgeProvider, LDLogger, LDMultiKindContext, LDSingleKindContext, init } from '../..'; - +import { EdgeProvider, init, LDLogger, LDMultiKindContext, LDSingleKindContext } from '../..'; import * as testData from './testData.json'; const createClient = (sdkKey: string, mockLogger: LDLogger, mockEdgeProvider: EdgeProvider) => diff --git a/packages/shared/akamai-edgeworker-sdk/src/__tests__/platform/requests.test.ts b/packages/shared/akamai-edgeworker-sdk/src/__tests__/platform/requests.test.ts index 95e94a8a49..e96e1ecb33 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/__tests__/platform/requests.test.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/__tests__/platform/requests.test.ts @@ -1,4 +1,5 @@ import { EventSourceInitDict } from '@launchdarkly/js-server-sdk-common'; + import EdgeRequests from '../../platform/requests'; const TEXT_RESPONSE = ''; diff --git a/packages/shared/akamai-edgeworker-sdk/src/__tests__/utils/validateOptions.test.ts b/packages/shared/akamai-edgeworker-sdk/src/__tests__/utils/validateOptions.test.ts index 575ee47bf1..22615875c9 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/__tests__/utils/validateOptions.test.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/__tests__/utils/validateOptions.test.ts @@ -1,6 +1,7 @@ import { BasicLogger } from '@launchdarkly/js-server-sdk-common'; -import { LDOptionsInternal, validateOptions } from '../../utils/validateOptions'; + import { EdgeFeatureStore } from '../../featureStore'; +import { LDOptionsInternal, validateOptions } from '../../utils/validateOptions'; const SDK_KEY = 'test-key'; diff --git a/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts b/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts index 736f7a905b..9870deab69 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/api/LDClient.ts @@ -1,17 +1,18 @@ // eslint-disable-next-line max-classes-per-file import { - LDClient as LDClientType, LDClientImpl, - LDOptions, + LDClient as LDClientType, LDContext, - LDFlagValue, LDEvaluationDetail, - LDFlagsStateOptions, LDFlagsState, + LDFlagsStateOptions, + LDFlagValue, + LDOptions, } from '@launchdarkly/js-server-sdk-common'; + +import CacheableStoreProvider from '../featureStore/cacheableStoreProvider'; import EdgePlatform from '../platform'; import { createCallbacks, createOptions } from '../utils'; -import CacheableStoreProvider from '../featureStore/cacheableStoreProvider'; export interface CustomLDOptions extends LDOptions {} @@ -26,7 +27,7 @@ class LDClient extends LDClientImpl { sdkKey: string, platform: EdgePlatform, options: LDOptions, - storeProvider: CacheableStoreProvider + storeProvider: CacheableStoreProvider, ) { super(sdkKey, platform, createOptions(options), createCallbacks()); this.cacheableStoreProvider = storeProvider; @@ -42,7 +43,7 @@ class LDClient extends LDClientImpl { key: string, context: LDContext, defaultValue: LDFlagValue, - callback?: (err: any, res: LDFlagValue) => void + callback?: (err: any, res: LDFlagValue) => void, ): Promise { await this.cacheableStoreProvider.prefetchPayloadFromOriginStore(); return super.variation(key, context, defaultValue, callback); @@ -52,7 +53,7 @@ class LDClient extends LDClientImpl { key: string, context: LDContext, defaultValue: LDFlagValue, - callback?: (err: any, res: LDEvaluationDetail) => void + callback?: (err: any, res: LDEvaluationDetail) => void, ): Promise { await this.cacheableStoreProvider.prefetchPayloadFromOriginStore(); return super.variationDetail(key, context, defaultValue, callback); @@ -61,7 +62,7 @@ class LDClient extends LDClientImpl { override async allFlagsState( context: LDContext, options?: LDFlagsStateOptions, - callback?: (err: Error | null, res: LDFlagsState) => void + callback?: (err: Error | null, res: LDFlagsState) => void, ): Promise { await this.cacheableStoreProvider.prefetchPayloadFromOriginStore(); return super.allFlagsState(context, options, callback); diff --git a/packages/shared/akamai-edgeworker-sdk/src/featureStore/cacheableStoreProvider.ts b/packages/shared/akamai-edgeworker-sdk/src/featureStore/cacheableStoreProvider.ts index fbeea61164..7dc345cecd 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/featureStore/cacheableStoreProvider.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/featureStore/cacheableStoreProvider.ts @@ -7,7 +7,10 @@ import { EdgeProvider } from '.'; export default class CacheableStoreProvider implements EdgeProvider { cache: string | null | undefined; - constructor(private readonly edgeProvider: EdgeProvider, private readonly rootKey: string) {} + constructor( + private readonly edgeProvider: EdgeProvider, + private readonly rootKey: string, + ) {} /** * Get data from the edge provider feature store. diff --git a/packages/shared/akamai-edgeworker-sdk/src/featureStore/index.ts b/packages/shared/akamai-edgeworker-sdk/src/featureStore/index.ts index ede6219a3d..aea71e5728 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/featureStore/index.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/featureStore/index.ts @@ -1,10 +1,10 @@ import type { DataKind, - LDLogger, LDFeatureStore, LDFeatureStoreDataStorage, LDFeatureStoreItem, LDFeatureStoreKindData, + LDLogger, } from '@launchdarkly/js-server-sdk-common'; import { deserializePoll, noop } from '@launchdarkly/js-server-sdk-common'; @@ -26,7 +26,7 @@ export class EdgeFeatureStore implements LDFeatureStore { private readonly edgeProvider: EdgeProvider, private readonly sdkKey: string, private readonly description: string, - private logger: LDLogger + private logger: LDLogger, ) { this.rootKey = buildRootKey(this.sdkKey); } @@ -34,7 +34,7 @@ export class EdgeFeatureStore implements LDFeatureStore { async get( kind: DataKind, dataKey: string, - callback: (res: LDFeatureStoreItem | null) => void + callback: (res: LDFeatureStoreItem | null) => void, ): Promise { const { namespace } = kind; const kindKey = namespace === 'features' ? 'flags' : namespace; diff --git a/packages/shared/akamai-edgeworker-sdk/src/index.ts b/packages/shared/akamai-edgeworker-sdk/src/index.ts index 5d1fcfaceb..fb0713ee74 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/index.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/index.ts @@ -1,10 +1,11 @@ import { BasicLogger, LDOptions as LDOptionsCommon } from '@launchdarkly/js-server-sdk-common'; -import { validateOptions } from './utils'; + import LDClient from './api/LDClient'; +import { buildRootKey, EdgeFeatureStore, EdgeProvider } from './featureStore'; +import CacheableStoreProvider from './featureStore/cacheableStoreProvider'; import EdgePlatform from './platform'; import createPlatformInfo from './platform/info'; -import { EdgeProvider, buildRootKey, EdgeFeatureStore } from './featureStore'; -import CacheableStoreProvider from './featureStore/cacheableStoreProvider'; +import { validateOptions } from './utils'; /** * The Launchdarkly Edge SDKs configuration options. Only logger is officially @@ -38,7 +39,7 @@ export const init = (params: BaseSDKParams): LDClient => { const cachableStoreProvider = new CacheableStoreProvider( featureStoreProvider, - buildRootKey(sdkKey) + buildRootKey(sdkKey), ); const featureStore = new EdgeFeatureStore(cachableStoreProvider, sdkKey, 'Akamai', logger); diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHasher.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHasher.ts index 89a32b6877..8d5cab22a8 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHasher.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHasher.ts @@ -1,7 +1,9 @@ -import { Hasher as LDHasher } from '@launchdarkly/js-server-sdk-common'; import { algo as CryptoAlgo } from 'crypto-js'; import Base64 from 'crypto-js/enc-base64'; import Hex from 'crypto-js/enc-hex'; + +import { Hasher as LDHasher } from '@launchdarkly/js-server-sdk-common'; + import { SupportedHashAlgorithm, SupportedOutputEncoding } from './types'; export default class CryptoJSHasher implements LDHasher { diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHmac.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHmac.ts index b47eadebc3..050a84bdeb 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHmac.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/cryptoJSHmac.ts @@ -1,5 +1,7 @@ import { algo as CryptoAlgo } from 'crypto-js'; + import { Hmac as LDHmac } from '@launchdarkly/js-server-sdk-common'; + import { SupportedHashAlgorithm, SupportedOutputEncoding } from './types'; export default class CryptoJSHmac implements LDHmac { diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/index.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/index.ts index 252b9dd18a..045959475c 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/index.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/crypto/index.ts @@ -1,6 +1,8 @@ // @ts-ignore. // this crypto is provided by Akamai's platform at runtime import { crypto as AkamaiCrypto } from 'crypto'; + import type { Crypto, Hasher, Hmac } from '@launchdarkly/js-server-sdk-common'; + import CryptoJSHasher from './cryptoJSHasher'; import CryptoJSHmac from './cryptoJSHmac'; import { SupportedHashAlgorithm } from './types'; diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/index.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/index.ts index 1581069995..9210f6b024 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/index.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/index.ts @@ -1,4 +1,5 @@ import type { Crypto, Info, Platform, Requests } from '@launchdarkly/js-server-sdk-common'; + import EdgeCrypto from './crypto'; import EdgeRequests from './requests'; diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/info/index.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/info/index.ts index c85d25e0ea..12f8bae029 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/info/index.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/info/index.ts @@ -1,7 +1,11 @@ import type { Info, PlatformData, SdkData } from '@launchdarkly/js-server-sdk-common'; class AkamaiPlatformInfo implements Info { - constructor(private platformName: string, private sdkName: string, private sdkVersion: string) {} + constructor( + private platformName: string, + private sdkName: string, + private sdkVersion: string, + ) {} platformData(): PlatformData { return { diff --git a/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts b/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts index c1991e50e0..cc7926dabd 100644 --- a/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts +++ b/packages/shared/akamai-edgeworker-sdk/src/platform/requests.ts @@ -4,8 +4,8 @@ import type { EventSource, EventSourceInitDict, Options, - Response, Requests, + Response, } from '@launchdarkly/js-server-sdk-common'; class NoopResponse implements Response { diff --git a/packages/shared/common/README.md b/packages/shared/common/README.md index dca27a2bec..b17cb69e9d 100644 --- a/packages/shared/common/README.md +++ b/packages/shared/common/README.md @@ -1,7 +1,7 @@ # LaunchDarkly SDK JavaScript Common Code [![NPM][common-npm-badge]][common-npm-link] -[![Actions Status][shared-common-ci-badge]][shared-common-ci] +[![Actions Status][shared-common-ci-badge]][shared-common-ci] [![Documentation](https://img.shields.io/static/v1?label=GitHub+Pages&message=API+reference&color=00add8)](https://launchdarkly.github.io/js-core/packages/shared/common/docs/) This project contains Typescript classes and interfaces that are applicable to client-side and server-side JavaScript SDKs. @@ -28,6 +28,5 @@ See [Contributing](../CONTRIBUTING.md). [shared-common-ci-badge]: https://github.com/launchdarkly/js-core/actions/workflows/common.yml/badge.svg [shared-common-ci]: https://github.com/launchdarkly/js-core/actions/workflows/common.yml - [common-npm-badge]: https://img.shields.io/npm/v/@launchdarkly/js-sdk-common.svg?style=flat-square [common-npm-link]: https://www.npmjs.com/package/@launchdarkly/js-sdk-common diff --git a/packages/shared/common/__tests__/AttributeReference.test.ts b/packages/shared/common/__tests__/AttributeReference.test.ts index 4a287c1d7f..6f0bdbf175 100644 --- a/packages/shared/common/__tests__/AttributeReference.test.ts +++ b/packages/shared/common/__tests__/AttributeReference.test.ts @@ -30,8 +30,8 @@ describe.each([ '/~3': true, '': true, _meta: {}, - }) - ) + }), + ), ).toBeUndefined(); }); }); @@ -77,6 +77,6 @@ describe.each([ it('should not allow indexing an array', () => { expect( - new AttributeReference('/foo/0').get(AsContextCommon({ foo: ['bar', 'baz'] })) + new AttributeReference('/foo/0').get(AsContextCommon({ foo: ['bar', 'baz'] })), ).toBeUndefined(); }); diff --git a/packages/shared/common/__tests__/Context.test.ts b/packages/shared/common/__tests__/Context.test.ts index 359c96df5e..bca00e69bc 100644 --- a/packages/shared/common/__tests__/Context.test.ts +++ b/packages/shared/common/__tests__/Context.test.ts @@ -77,7 +77,7 @@ describe.each([ expect(context?.valueForKind(new AttributeReference('anonymous'), 'user')).toBeTruthy(); expect(context?.isMultiKind).toBeFalsy(); expect(context?.privateAttributes('user')?.[0].redactionName).toEqual( - new AttributeReference('/~1dog~0~0~1~1').redactionName + new AttributeReference('/~1dog~0~0~1~1').redactionName, ); }); @@ -116,7 +116,7 @@ describe('given a valid legacy user without custom attributes', () => { expect(context?.valueForKind(new AttributeReference('anonymous'), 'user')).toBeTruthy(); expect(context?.isMultiKind).toBeFalsy(); expect(context?.privateAttributes('user')?.[0].redactionName).toEqual( - new AttributeReference('/~1dog~0~0~1~1').redactionName + new AttributeReference('/~1dog~0~0~1~1').redactionName, ); }); }); diff --git a/packages/shared/common/__tests__/ContextFilter.test.ts b/packages/shared/common/__tests__/ContextFilter.test.ts index 644c262f6f..3f1d7c0b1e 100644 --- a/packages/shared/common/__tests__/ContextFilter.test.ts +++ b/packages/shared/common/__tests__/ContextFilter.test.ts @@ -176,14 +176,14 @@ describe('when handling legacy user contexts', () => { it('converts fields to string types when needed', () => { const uf = new ContextFilter(false, []); expect(uf.filter(userWithNonStringsInStringRequiredFields)).toEqual( - userWithStringFieldsConverted + userWithStringFieldsConverted, ); }); it('it handles legacy names which had a preceding slash', () => { const uf = new ContextFilter(false, []); expect(uf.filter(userWithPrivateFieldsWithAPrecedingSlash)).toEqual( - userWithPrivateFieldsWithAPrecedingSlashFiltered + userWithPrivateFieldsWithAPrecedingSlashFiltered, ); }); @@ -203,7 +203,7 @@ describe('when handling legacy user contexts', () => { country: value, })!; expect(cf.filter(nullUndefinedUser)).toEqual({ key: 'userKey', kind: 'user' }); - } + }, ); }); diff --git a/packages/shared/common/__tests__/internal/events/EventProcessor.test.ts b/packages/shared/common/__tests__/internal/events/EventProcessor.test.ts index 8e5d173b35..fc507d2491 100644 --- a/packages/shared/common/__tests__/internal/events/EventProcessor.test.ts +++ b/packages/shared/common/__tests__/internal/events/EventProcessor.test.ts @@ -1,14 +1,10 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ + /* eslint-disable class-methods-use-this */ + /* eslint-disable max-classes-per-file */ import { AsyncQueue } from 'launchdarkly-js-test-helpers'; -import { - LDContextDeduplicator, - LDDeliveryStatus, - LDEventSender, - LDEventSenderResult, - LDEventType, -} from '../../../src/api/subsystem'; + import { ClientContext, Context, @@ -23,6 +19,13 @@ import { SdkData, ServiceEndpoints, } from '../../../src'; +import { + LDContextDeduplicator, + LDDeliveryStatus, + LDEventSender, + LDEventSenderResult, + LDEventType, +} from '../../../src/api/subsystem'; import { EventProcessor, InputIdentifyEvent } from '../../../src/internal'; import { EventProcessorOptions } from '../../../src/internal/events/EventProcessor'; @@ -65,7 +68,7 @@ function makeFeatureEvent( key: string = 'flagkey', variation: number = 1, def: string = 'default', - value: string = 'value' + value: string = 'value', ): any { return { kind: debug ? 'debug' : 'feature', @@ -197,7 +200,7 @@ describe('given an event processor', () => { eventProcessorConfig, new ClientContext('sdk-key', basicConfiguration, platform), eventSender, - contextDeduplicator + contextDeduplicator, ); }); @@ -247,8 +250,8 @@ describe('given an event processor', () => { name: 9, anonymous: false, custom: { age: 99 }, - } as any) - ) + } as any), + ), ); await eventProcessor.flush(); @@ -704,7 +707,7 @@ describe('given an event processor', () => { newConfig, new ClientContext('sdk-key', basicConfiguration, platform), eventSender, - contextDeduplicator + contextDeduplicator, ); eventProcessor.sendEvent(new InputIdentifyEvent(Context.fromLDContext(user))); diff --git a/packages/shared/common/__tests__/logging/SafeLogger.test.ts b/packages/shared/common/__tests__/logging/SafeLogger.test.ts index 1c49a46ccc..a4c7047fb1 100644 --- a/packages/shared/common/__tests__/logging/SafeLogger.test.ts +++ b/packages/shared/common/__tests__/logging/SafeLogger.test.ts @@ -27,7 +27,7 @@ describe('given a logger that throws in logs', () => { destination: (...args: any) => { strings.push(args.join(' ')); }, - }) + }), ); it('uses the fallback logger', () => { diff --git a/packages/shared/common/__tests__/options/ApplicationTags.test.ts b/packages/shared/common/__tests__/options/ApplicationTags.test.ts index 06deb94d47..357568ebfb 100644 --- a/packages/shared/common/__tests__/options/ApplicationTags.test.ts +++ b/packages/shared/common/__tests__/options/ApplicationTags.test.ts @@ -73,7 +73,7 @@ describe.each([ }); if (expected.length) { throw new Error( - `Did not find expected messages: ${expected.map((item) => item.matches.toString())}` + `Did not find expected messages: ${expected.map((item) => item.matches.toString())}`, ); } } diff --git a/packages/shared/common/__tests__/validators.test.ts b/packages/shared/common/__tests__/validators.test.ts index 998226c598..0cb5dee4de 100644 --- a/packages/shared/common/__tests__/validators.test.ts +++ b/packages/shared/common/__tests__/validators.test.ts @@ -53,7 +53,7 @@ describe.each([ expect(validator.is(invalidValue)).toBeFalsy(); }); }); - } + }, ); describe.each([ @@ -81,7 +81,7 @@ describe.each([ expect(validator.is(invalidValue)).toBeFalsy(); }); }); - } + }, ); describe('given a regex validator', () => { diff --git a/packages/shared/common/src/Context.ts b/packages/shared/common/src/Context.ts index 677bff4a31..f71d4a1487 100644 --- a/packages/shared/common/src/Context.ts +++ b/packages/shared/common/src/Context.ts @@ -1,6 +1,6 @@ /* eslint-disable no-underscore-dangle */ // eslint-disable-next-line max-classes-per-file -import { LDSingleKindContext, LDMultiKindContext, LDUser, LDContextCommon } from './api/context'; +import { LDContextCommon, LDMultiKindContext, LDSingleKindContext, LDUser } from './api/context'; import { LDContext } from './api/context/LDContext'; import AttributeReference from './AttributeReference'; import { TypeValidators } from './validators'; @@ -87,7 +87,7 @@ function isLegacyUser(context: LDContext): context is LDUser { * that as well. */ function isContextCommon( - kindOrContext: 'multi' | LDContextCommon + kindOrContext: 'multi' | LDContextCommon, ): kindOrContext is LDContextCommon { return kindOrContext && TypeValidators.Object.is(kindOrContext); } @@ -112,11 +112,11 @@ function validKey(key: string) { function processPrivateAttributes( privateAttributes?: string[], - literals: boolean = false + literals: boolean = false, ): AttributeReference[] { if (privateAttributes) { return privateAttributes.map( - (privateAttribute) => new AttributeReference(privateAttribute, literals) + (privateAttribute) => new AttributeReference(privateAttribute, literals), ); } return []; @@ -226,7 +226,7 @@ export default class Context { private static getValueFromContext( reference: AttributeReference, - context?: LDContextCommon + context?: LDContextCommon, ): any { if (!context || !reference.isValid) { return undefined; @@ -255,7 +255,7 @@ export default class Context { if (!kinds.length) { return Context.contextForError( 'multi', - 'A multi-kind context must contain at least one kind' + 'A multi-kind context must contain at least one kind', ); } @@ -433,7 +433,7 @@ export default class Context { acc[kind] = context.key; return acc; }, - {} + {}, ); } return { [this.kind]: this.context!.key }; diff --git a/packages/shared/common/src/ContextFilter.ts b/packages/shared/common/src/ContextFilter.ts index 41fd75a53c..4cba50d478 100644 --- a/packages/shared/common/src/ContextFilter.ts +++ b/packages/shared/common/src/ContextFilter.ts @@ -1,4 +1,5 @@ // _meta is part of the specification. + /* eslint-disable no-underscore-dangle */ import { LDContextCommon } from './api'; import AttributeReference from './AttributeReference'; @@ -6,7 +7,7 @@ import Context from './Context'; // These attributes cannot be removed via a private attribute. const protectedAttributes = ['key', 'kind', '_meta', 'anonymous'].map( - (str) => new AttributeReference(str, true) + (str) => new AttributeReference(str, true), ); // Attributes that should be stringified for legacy users. @@ -42,7 +43,7 @@ function cloneWithRedactions(target: LDContextCommon, references: AttributeRefer source: target, parent: cloned, visited: [target], - })) + })), ); while (stack.length) { @@ -78,7 +79,7 @@ function cloneWithRedactions(target: LDContextCommon, references: AttributeRefer source: value, parent: item.parent[item.key], visited: [...item.visited, value], - })) + })), ); } } else { @@ -94,7 +95,7 @@ function cloneWithRedactions(target: LDContextCommon, references: AttributeRefer export default class ContextFilter { constructor( private readonly allAttributesPrivate: boolean, - private readonly privateAttributes: AttributeReference[] + private readonly privateAttributes: AttributeReference[], ) {} filter(context: Context): any { @@ -122,7 +123,7 @@ export default class ContextFilter { private filterSingleKind(context: Context, single: LDContextCommon, kind: string): any { const { cloned, excluded } = cloneWithRedactions( single, - this.getAttributesToFilter(context, single, kind) + this.getAttributesToFilter(context, single, kind), ); if (context.legacy) { diff --git a/packages/shared/common/src/api/options/index.ts b/packages/shared/common/src/api/options/index.ts index a1af1b2922..86d15d471c 100644 --- a/packages/shared/common/src/api/options/index.ts +++ b/packages/shared/common/src/api/options/index.ts @@ -1,4 +1,5 @@ // Lint issue is because there is 1 item currently. We do not want to default export it. + /* eslint-disable import/prefer-default-export */ import { LDClientContext } from './LDClientContext'; diff --git a/packages/shared/common/src/api/platform/Requests.ts b/packages/shared/common/src/api/platform/Requests.ts index f29abab165..c413192581 100644 --- a/packages/shared/common/src/api/platform/Requests.ts +++ b/packages/shared/common/src/api/platform/Requests.ts @@ -1,7 +1,6 @@ // The interfaces in this file are intended to be as close as possible to the // interfaces used for the `fetch` Web API. Doing so should allow implementations // which are more easily portable. - import { EventSource, EventSourceInitDict } from './EventSource'; // These are not full specifications of the interface, but instead subsets diff --git a/packages/shared/common/src/api/subsystem/index.ts b/packages/shared/common/src/api/subsystem/index.ts index 05781aacf8..70a1777e92 100644 --- a/packages/shared/common/src/api/subsystem/index.ts +++ b/packages/shared/common/src/api/subsystem/index.ts @@ -1,6 +1,6 @@ -import LDEventProcessor from './LDEventProcessor'; import LDContextDeduplicator from './LDContextDeduplicator'; -import LDEventSender, { LDDeliveryStatus, LDEventType, LDEventSenderResult } from './LDEventSender'; +import LDEventProcessor from './LDEventProcessor'; +import LDEventSender, { LDDeliveryStatus, LDEventSenderResult, LDEventType } from './LDEventSender'; export { LDEventProcessor, diff --git a/packages/shared/common/src/internal/events/EventProcessor.ts b/packages/shared/common/src/internal/events/EventProcessor.ts index 531a4a9c0c..ade263dcc0 100644 --- a/packages/shared/common/src/internal/events/EventProcessor.ts +++ b/packages/shared/common/src/internal/events/EventProcessor.ts @@ -71,7 +71,7 @@ interface LDDiagnosticsManager { createStatsEventAndReset( droppedEvents: number, deduplicatedUsers: number, - eventsInLastBatch: number + eventsInLastBatch: number, ): DiagnosticEvent; } @@ -111,14 +111,14 @@ export default class EventProcessor implements LDEventProcessor { clientContext: ClientContext, private readonly eventSender: LDEventSender, private readonly contextDeduplicator: LDContextDeduplicator, - private readonly diagnosticsManager?: LDDiagnosticsManager + private readonly diagnosticsManager?: LDDiagnosticsManager, ) { this.capacity = config.eventsCapacity; this.logger = clientContext.basicConfiguration.logger; this.contextFilter = new ContextFilter( config.allAttributesPrivate, - config.privateAttributes.map((ref) => new AttributeReference(ref)) + config.privateAttributes.map((ref) => new AttributeReference(ref)), ); if (this.contextDeduplicator.flushInterval !== undefined) { @@ -143,7 +143,7 @@ export default class EventProcessor implements LDEventProcessor { const statsEvent = this.diagnosticsManager!.createStatsEventAndReset( this.droppedEvents, this.deduplicatedUsers, - this.eventsInLastBatch + this.eventsInLastBatch, ); this.droppedEvents = 0; @@ -294,7 +294,7 @@ export default class EventProcessor implements LDEventProcessor { if (!this.exceededCapacity) { this.exceededCapacity = true; this.logger?.warn( - 'Exceeded event queue capacity. Increase capacity to avoid dropping events.' + 'Exceeded event queue capacity. Increase capacity to avoid dropping events.', ); } this.droppedEvents += 1; diff --git a/packages/shared/common/src/internal/events/EventSummarizer.ts b/packages/shared/common/src/internal/events/EventSummarizer.ts index 77ca7ce5e8..e50a48e052 100644 --- a/packages/shared/common/src/internal/events/EventSummarizer.ts +++ b/packages/shared/common/src/internal/events/EventSummarizer.ts @@ -71,7 +71,7 @@ export default class EventSummarizer { event.value, event.default, event.version, - event.variation + event.variation, ); } @@ -113,7 +113,7 @@ export default class EventSummarizer { return acc; }, - {} + {}, ); return { diff --git a/packages/shared/common/src/internal/events/InputCustomEvent.ts b/packages/shared/common/src/internal/events/InputCustomEvent.ts index 40a1fc6d6c..c3e33b7d68 100644 --- a/packages/shared/common/src/internal/events/InputCustomEvent.ts +++ b/packages/shared/common/src/internal/events/InputCustomEvent.ts @@ -11,7 +11,7 @@ export default class InputCustomEvent { context: Context, public readonly key: string, public readonly data?: any, - public readonly metricValue?: number + public readonly metricValue?: number, ) { this.creationDate = Date.now(); this.context = context; diff --git a/packages/shared/common/src/internal/events/InputEvalEvent.ts b/packages/shared/common/src/internal/events/InputEvalEvent.ts index 9d9f196635..50dcd9e9de 100644 --- a/packages/shared/common/src/internal/events/InputEvalEvent.ts +++ b/packages/shared/common/src/internal/events/InputEvalEvent.ts @@ -1,4 +1,4 @@ -import { LDEvaluationReason, LDEvaluationDetail } from '../../api/data'; +import { LDEvaluationDetail, LDEvaluationReason } from '../../api/data'; import Context from '../../Context'; export default class InputEvalEvent { @@ -35,7 +35,7 @@ export default class InputEvalEvent { trackEvents?: boolean, prereqOf?: string, reason?: LDEvaluationReason, - debugEventsUntilDate?: number + debugEventsUntilDate?: number, ) { this.creationDate = Date.now(); this.context = context; diff --git a/packages/shared/common/src/internal/events/InputEventBase.ts b/packages/shared/common/src/internal/events/InputEventBase.ts index 9b4fbb24ee..75568963f4 100644 --- a/packages/shared/common/src/internal/events/InputEventBase.ts +++ b/packages/shared/common/src/internal/events/InputEventBase.ts @@ -4,6 +4,6 @@ export default class InputEventBase { constructor( public readonly kind: string, public readonly creationDate: number, - public readonly context: Context + public readonly context: Context, ) {} } diff --git a/packages/shared/common/src/internal/events/SummaryCounter.ts b/packages/shared/common/src/internal/events/SummaryCounter.ts index 0cb36cc413..acff9df2e3 100644 --- a/packages/shared/common/src/internal/events/SummaryCounter.ts +++ b/packages/shared/common/src/internal/events/SummaryCounter.ts @@ -10,7 +10,7 @@ export default class SummaryCounter { public value: any, defValue: any, public version?: number, - public variation?: number + public variation?: number, ) { this.default = defValue; } diff --git a/packages/shared/common/src/internal/events/index.ts b/packages/shared/common/src/internal/events/index.ts index d33ff3f095..7b32527fb5 100644 --- a/packages/shared/common/src/internal/events/index.ts +++ b/packages/shared/common/src/internal/events/index.ts @@ -1,7 +1,7 @@ +import EventProcessor from './EventProcessor'; import InputCustomEvent from './InputCustomEvent'; import InputEvalEvent from './InputEvalEvent'; import InputEvent from './InputEvent'; import InputIdentifyEvent from './InputIdentifyEvent'; -import EventProcessor from './EventProcessor'; export { InputCustomEvent, InputEvalEvent, InputEvent, InputIdentifyEvent, EventProcessor }; diff --git a/packages/shared/common/src/options/ClientContext.ts b/packages/shared/common/src/options/ClientContext.ts index df45d54cbd..57ca9ff582 100644 --- a/packages/shared/common/src/options/ClientContext.ts +++ b/packages/shared/common/src/options/ClientContext.ts @@ -1,4 +1,4 @@ -import { LDLogger, LDClientContext, Platform } from '../api'; +import { LDClientContext, LDLogger, Platform } from '../api'; import ServiceEndpoints from './ServiceEndpoints'; /** @@ -38,7 +38,7 @@ export default class ClientContext implements LDClientContext { offline: boolean; serviceEndpoints: ServiceEndpoints; }, - public readonly platform: Platform + public readonly platform: Platform, ) { this.basicConfiguration = { logger: configuration.logger, diff --git a/packages/shared/common/src/options/index.ts b/packages/shared/common/src/options/index.ts index 0ab15cc29d..17d7859e3a 100644 --- a/packages/shared/common/src/options/index.ts +++ b/packages/shared/common/src/options/index.ts @@ -1,6 +1,6 @@ import ApplicationTags from './ApplicationTags'; +import ClientContext from './ClientContext'; import OptionMessages from './OptionMessages'; import ServiceEndpoints from './ServiceEndpoints'; -import ClientContext from './ClientContext'; export { ApplicationTags, OptionMessages, ServiceEndpoints, ClientContext }; diff --git a/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.test.ts b/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.test.ts index 226724d2f6..4b8acf6f13 100644 --- a/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.test.ts +++ b/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.test.ts @@ -1,8 +1,8 @@ import { AsyncStoreFacade, LDFeatureStore } from '@launchdarkly/js-server-sdk-common'; -import { EdgeFeatureStore } from './EdgeFeatureStore'; import mockEdgeProvider from '../utils/mockEdgeProvider'; import * as testData from '../utils/testData.json'; +import { EdgeFeatureStore } from './EdgeFeatureStore'; describe('EdgeFeatureStore', () => { const sdkKey = 'sdkKey'; diff --git a/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts b/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts index ea20675261..d2054d01cd 100644 --- a/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts +++ b/packages/shared/sdk-server-edge/src/api/EdgeFeatureStore.ts @@ -1,10 +1,10 @@ import type { DataKind, - LDLogger, LDFeatureStore, LDFeatureStoreDataStorage, LDFeatureStoreItem, LDFeatureStoreKindData, + LDLogger, } from '@launchdarkly/js-server-sdk-common'; import { deserializePoll, noop } from '@launchdarkly/js-server-sdk-common'; @@ -19,7 +19,7 @@ export class EdgeFeatureStore implements LDFeatureStore { private readonly edgeProvider: EdgeProvider, private readonly sdkKey: string, private readonly description: string, - private logger: LDLogger + private logger: LDLogger, ) { this.rootKey = `LD-Env-${sdkKey}`; } @@ -27,7 +27,7 @@ export class EdgeFeatureStore implements LDFeatureStore { async get( kind: DataKind, dataKey: string, - callback: (res: LDFeatureStoreItem | null) => void + callback: (res: LDFeatureStoreItem | null) => void, ): Promise { const { namespace } = kind; const kindKey = namespace === 'features' ? 'flags' : namespace; diff --git a/packages/shared/sdk-server-edge/src/api/LDClient.ts b/packages/shared/sdk-server-edge/src/api/LDClient.ts index 7e6baebec8..d2b4e821ba 100644 --- a/packages/shared/sdk-server-edge/src/api/LDClient.ts +++ b/packages/shared/sdk-server-edge/src/api/LDClient.ts @@ -1,8 +1,10 @@ import { EventEmitter } from 'node:events'; + import { Info, LDClientImpl, LDOptions } from '@launchdarkly/js-server-sdk-common'; -import createOptions from './createOptions'; -import createCallbacks from './createCallbacks'; + import EdgePlatform from '../platform'; +import createCallbacks from './createCallbacks'; +import createOptions from './createOptions'; /** * The LaunchDarkly SDK edge client object. diff --git a/packages/shared/sdk-server-edge/src/api/createCallbacks.test.ts b/packages/shared/sdk-server-edge/src/api/createCallbacks.test.ts index a64eea2940..01f98a586e 100644 --- a/packages/shared/sdk-server-edge/src/api/createCallbacks.test.ts +++ b/packages/shared/sdk-server-edge/src/api/createCallbacks.test.ts @@ -1,5 +1,7 @@ import { EventEmitter } from 'node:events'; + import { noop } from '@launchdarkly/js-server-sdk-common'; + import createCallbacks from './createCallbacks'; describe('createCallbacks', () => { diff --git a/packages/shared/sdk-server-edge/src/api/createCallbacks.ts b/packages/shared/sdk-server-edge/src/api/createCallbacks.ts index dfb369295c..2c481dc302 100644 --- a/packages/shared/sdk-server-edge/src/api/createCallbacks.ts +++ b/packages/shared/sdk-server-edge/src/api/createCallbacks.ts @@ -1,4 +1,5 @@ import { EventEmitter } from 'node:events'; + import { noop } from '@launchdarkly/js-server-sdk-common'; const createCallbacks = (emitter: EventEmitter) => ({ diff --git a/packages/shared/sdk-server-edge/src/api/createOptions.test.ts b/packages/shared/sdk-server-edge/src/api/createOptions.test.ts index b0464dcf04..4c5d4962b5 100644 --- a/packages/shared/sdk-server-edge/src/api/createOptions.test.ts +++ b/packages/shared/sdk-server-edge/src/api/createOptions.test.ts @@ -1,4 +1,5 @@ import { BasicLogger } from '@launchdarkly/js-server-sdk-common'; + import createOptions, { defaultOptions } from './createOptions'; describe('createOptions', () => { diff --git a/packages/shared/sdk-server-edge/src/index.ts b/packages/shared/sdk-server-edge/src/index.ts index 4c34d385e4..60d9785e80 100644 --- a/packages/shared/sdk-server-edge/src/index.ts +++ b/packages/shared/sdk-server-edge/src/index.ts @@ -6,7 +6,8 @@ * */ import type { Info } from '@launchdarkly/js-server-sdk-common'; -import { LDClient, EdgeFeatureStore, EdgeProvider } from './api'; + +import { EdgeFeatureStore, EdgeProvider, LDClient } from './api'; import validateOptions, { LDOptions, LDOptionsInternal } from './utils/validateOptions'; export * from '@launchdarkly/js-server-sdk-common'; diff --git a/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHasher.ts b/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHasher.ts index fcf1724e63..b8596649e0 100644 --- a/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHasher.ts +++ b/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHasher.ts @@ -1,5 +1,7 @@ import CryptoJS from 'crypto-js'; + import { Hasher as LDHasher } from '@launchdarkly/js-server-sdk-common'; + import { SupportedHashAlgorithm, SupportedOutputEncoding } from './types'; export default class CryptoJSHasher implements LDHasher { diff --git a/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHmac.ts b/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHmac.ts index e67b0f0498..38f7ea2590 100644 --- a/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHmac.ts +++ b/packages/shared/sdk-server-edge/src/platform/crypto/cryptoJSHmac.ts @@ -1,5 +1,7 @@ import CryptoJS from 'crypto-js'; + import { Hmac as LDHmac } from '@launchdarkly/js-server-sdk-common'; + import { SupportedHashAlgorithm, SupportedOutputEncoding } from './types'; export default class CryptoJSHmac implements LDHmac { diff --git a/packages/shared/sdk-server-edge/src/platform/crypto/index.ts b/packages/shared/sdk-server-edge/src/platform/crypto/index.ts index 62f9dc03fc..7a25f59036 100644 --- a/packages/shared/sdk-server-edge/src/platform/crypto/index.ts +++ b/packages/shared/sdk-server-edge/src/platform/crypto/index.ts @@ -1,4 +1,5 @@ import type { Crypto, Hasher, Hmac } from '@launchdarkly/js-server-sdk-common'; + import CryptoJSHasher from './cryptoJSHasher'; import CryptoJSHmac from './cryptoJSHmac'; import { SupportedHashAlgorithm } from './types'; diff --git a/packages/shared/sdk-server-edge/src/platform/index.ts b/packages/shared/sdk-server-edge/src/platform/index.ts index 1581069995..9210f6b024 100644 --- a/packages/shared/sdk-server-edge/src/platform/index.ts +++ b/packages/shared/sdk-server-edge/src/platform/index.ts @@ -1,4 +1,5 @@ import type { Crypto, Info, Platform, Requests } from '@launchdarkly/js-server-sdk-common'; + import EdgeCrypto from './crypto'; import EdgeRequests from './requests'; diff --git a/packages/shared/sdk-server-edge/src/platform/requests.ts b/packages/shared/sdk-server-edge/src/platform/requests.ts index d61e9e4230..2bc8010dc5 100644 --- a/packages/shared/sdk-server-edge/src/platform/requests.ts +++ b/packages/shared/sdk-server-edge/src/platform/requests.ts @@ -3,8 +3,8 @@ import type { EventSource, EventSourceInitDict, Options, - Response, Requests, + Response, } from '@launchdarkly/js-server-sdk-common'; export default class EdgeRequests implements Requests { diff --git a/packages/shared/sdk-server-edge/src/utils/validateOptions.test.ts b/packages/shared/sdk-server-edge/src/utils/validateOptions.test.ts index 0a10d21dec..4836160eec 100644 --- a/packages/shared/sdk-server-edge/src/utils/validateOptions.test.ts +++ b/packages/shared/sdk-server-edge/src/utils/validateOptions.test.ts @@ -1,6 +1,7 @@ import { BasicLogger } from '@launchdarkly/js-server-sdk-common'; -import validateOptions from './validateOptions'; + import mockFeatureStore from './mockFeatureStore'; +import validateOptions from './validateOptions'; describe('validateOptions', () => { test('throws without SDK key', () => { @@ -27,7 +28,7 @@ describe('validateOptions', () => { featureStore: mockFeatureStore, logger: BasicLogger.get(), sendEvents: false, - }) + }), ).toBeTruthy(); }); diff --git a/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts b/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts index be30b893ff..12fd303b7c 100644 --- a/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts +++ b/packages/shared/sdk-server/__tests__/BigSegmentsManager.test.ts @@ -1,4 +1,5 @@ import { Crypto, Hasher, Hmac } from '@launchdarkly/js-sdk-common'; + import { BigSegmentStore, BigSegmentStoreMembership, @@ -134,7 +135,7 @@ describe('given a store with a user cache size of 2', () => { userCacheSize: 2, }, new TestLogger(), - crypto + crypto, ); }); @@ -219,7 +220,7 @@ describe('given a store with a short poll interval.', () => { statusPollInterval: 0.01, }, new TestLogger(), - crypto + crypto, ); let count = 0; diff --git a/packages/shared/sdk-server/__tests__/LDClient.allFlags.test.ts b/packages/shared/sdk-server/__tests__/LDClient.allFlags.test.ts index 8a489e3b84..5861068c2a 100644 --- a/packages/shared/sdk-server/__tests__/LDClient.allFlags.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClient.allFlags.test.ts @@ -22,7 +22,7 @@ describe('given an LDClient with test data', () => { sendEvents: false, logger, }, - makeCallbacks(true) + makeCallbacks(true), ); await client.waitForInitialization(); @@ -289,7 +289,7 @@ describe('given an offline client', () => { sendEvents: false, logger, }, - makeCallbacks(true) + makeCallbacks(true), ); }); diff --git a/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts b/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts index c37f6dd2d0..ad4ea1b07a 100644 --- a/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClient.evaluation.test.ts @@ -24,7 +24,7 @@ describe('given an LDClient with test data', () => { updateProcessor: td.getFactory(), sendEvents: false, }, - makeCallbacks(true) + makeCallbacks(true), ); await client.waitForInitialization(); @@ -156,7 +156,7 @@ describe('given an offline client', () => { sendEvents: false, logger, }, - makeCallbacks(true) + makeCallbacks(true), ); }); @@ -220,7 +220,7 @@ describe('given a client and store that are uninitialized', () => { sendEvents: false, featureStore: store, }, - makeCallbacks(true) + makeCallbacks(true), ); }); @@ -269,7 +269,7 @@ describe('given a client that is un-initialized and store that is initialized', sendEvents: false, featureStore: store, }, - makeCallbacks(true) + makeCallbacks(true), ); }); diff --git a/packages/shared/sdk-server/__tests__/LDClient.events.test.ts b/packages/shared/sdk-server/__tests__/LDClient.events.test.ts index b8454a433a..393387ae5d 100644 --- a/packages/shared/sdk-server/__tests__/LDClient.events.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClient.events.test.ts @@ -1,4 +1,5 @@ import { Context, internal } from '@launchdarkly/js-sdk-common'; + import { LDClientImpl } from '../src'; import TestData from '../src/integrations/test_data/TestData'; import basicPlatform from './evaluation/mocks/platform'; @@ -28,7 +29,7 @@ describe('given a client with mock event processor', () => { { updateProcessor: td.getFactory(), }, - makeCallbacks(false) + makeCallbacks(false), ); await client.waitForInitialization(); }); diff --git a/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts b/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts index bc4dda0ab3..d50c92f31e 100644 --- a/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClientImpl.bigSegments.test.ts @@ -1,4 +1,5 @@ import { Crypto, Hasher, Hmac } from '@launchdarkly/js-sdk-common'; + import { BigSegmentStore } from '../src/api/interfaces'; import { LDBigSegmentsOptions } from '../src/api/options/LDBigSegmentsOptions'; import makeBigSegmentRef from '../src/evaluation/makeBigSegmentRef'; @@ -81,7 +82,7 @@ describe('given test data with big segments', () => { sendEvents: false, bigSegments: bigSegmentsConfig, }, - makeCallbacks(true) + makeCallbacks(true), ); await client.waitForInitialization(); @@ -120,7 +121,7 @@ describe('given test data with big segments', () => { sendEvents: false, bigSegments: bigSegmentsConfig, }, - makeCallbacks(true) + makeCallbacks(true), ); await client.waitForInitialization(); @@ -159,7 +160,7 @@ describe('given test data with big segments', () => { sendEvents: false, bigSegments: bigSegmentsConfig, }, - makeCallbacks(true) + makeCallbacks(true), ); await client.waitForInitialization(); @@ -185,7 +186,7 @@ describe('given test data with big segments', () => { updateProcessor: td.getFactory(), sendEvents: false, }, - makeCallbacks(true) + makeCallbacks(true), ); await client.waitForInitialization(); diff --git a/packages/shared/sdk-server/__tests__/LDClientImpl.listeners.test.ts b/packages/shared/sdk-server/__tests__/LDClientImpl.listeners.test.ts index 64d1b44e53..6d97ccc4db 100644 --- a/packages/shared/sdk-server/__tests__/LDClientImpl.listeners.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClientImpl.listeners.test.ts @@ -1,4 +1,5 @@ import { AsyncQueue } from 'launchdarkly-js-test-helpers'; + import { AttributeReference, LDClientImpl } from '../src'; import { Op } from '../src/evaluation/data/Clause'; import TestData from '../src/integrations/test_data/TestData'; @@ -23,7 +24,7 @@ describe('given an LDClient with test data', () => { sendEvents: false, logger: new TestLogger(), }, - { ...makeCallbacks(true), onUpdate: (key: string) => queue.add(key) } + { ...makeCallbacks(true), onUpdate: (key: string) => queue.add(key) }, ); }); diff --git a/packages/shared/sdk-server/__tests__/LDClientImpl.test.ts b/packages/shared/sdk-server/__tests__/LDClientImpl.test.ts index 000bd1940d..60fc3ce30b 100644 --- a/packages/shared/sdk-server/__tests__/LDClientImpl.test.ts +++ b/packages/shared/sdk-server/__tests__/LDClientImpl.test.ts @@ -9,7 +9,7 @@ it('fires ready event in offline mode', (done) => { 'sdk-key', basicPlatform, { offline: true }, - { ...makeCallbacks(false), onReady: () => done() } + { ...makeCallbacks(false), onReady: () => done() }, ); client.close(); }); @@ -29,7 +29,7 @@ it('fires the failed event if initialization fails', (done) => { close: () => {}, }, }, - { ...makeCallbacks(false), onFailed: () => done() } + { ...makeCallbacks(false), onFailed: () => done() }, ); client.close(); @@ -46,7 +46,7 @@ it('isOffline returns true in offline mode', (done) => { expect(client.isOffline()).toEqual(true); done(); }, - } + }, ); client.close(); @@ -71,7 +71,7 @@ describe('when waiting for initialization', () => { sendEvents: false, logger: new TestLogger(), }, - makeCallbacks(false) + makeCallbacks(false), ); }); @@ -103,7 +103,7 @@ it('does not crash when closing an offline client', () => { 'sdk-key', basicPlatform, { offline: true }, - makeCallbacks(false) + makeCallbacks(false), ); expect(() => client.close()).not.toThrow(); @@ -126,7 +126,7 @@ it('the wait for initialization promise is rejected if initialization fails', (d }, sendEvents: false, }, - makeCallbacks(false) + makeCallbacks(false), ); client.waitForInitialization().catch(() => done()); diff --git a/packages/shared/sdk-server/__tests__/Logger.ts b/packages/shared/sdk-server/__tests__/Logger.ts index c4c480c01e..6f7e2ff5f9 100644 --- a/packages/shared/sdk-server/__tests__/Logger.ts +++ b/packages/shared/sdk-server/__tests__/Logger.ts @@ -71,21 +71,21 @@ export default class TestLogger implements LDLogger { expectedMessages.forEach((expectedMessage) => { const received = this.messages[expectedMessage.level]; const index = received.findIndex((receivedMessage) => - receivedMessage.match(expectedMessage.matches) + receivedMessage.match(expectedMessage.matches), ); if (index < 0) { throw new Error( `Did not find expected message: ${JSON.stringify( expectedMessage, - replacer - )} received: ${JSON.stringify(this.messages)}` + replacer, + )} received: ${JSON.stringify(this.messages)}`, ); } else if (matched[expectedMessage.level].indexOf(index) >= 0) { throw new Error( `Did not find expected message: ${JSON.stringify( expectedMessage, - replacer - )} received: ${JSON.stringify(this.messages)}` + replacer, + )} received: ${JSON.stringify(this.messages)}`, ); } else { matched[expectedMessage.level].push(index); diff --git a/packages/shared/sdk-server/__tests__/data_sources/DataSourceUpdates.test.ts b/packages/shared/sdk-server/__tests__/data_sources/DataSourceUpdates.test.ts index 6cdc655a9a..ff474c5f77 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/DataSourceUpdates.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/DataSourceUpdates.test.ts @@ -1,4 +1,5 @@ import { AsyncQueue } from 'launchdarkly-js-test-helpers'; + import { LDFeatureStore } from '../../src/api/subsystems'; import promisify from '../../src/async/promisify'; import DataSourceUpdates from '../../src/data_sources/DataSourceUpdates'; @@ -19,7 +20,7 @@ describe.each([true, false])( updates = new DataSourceUpdates( store, () => listen, - (key) => queue.add(key) + (key) => queue.add(key), ); }); @@ -35,7 +36,7 @@ describe.each([true, false])( }, () => { cb(undefined); - } + }, ); }); @@ -101,7 +102,7 @@ describe.each([true, false])( }, () => { cb(undefined); - } + }, ); }); @@ -146,7 +147,7 @@ describe.each([true, false])( }, () => { cb(undefined); - } + }, ); }); @@ -163,7 +164,7 @@ describe.each([true, false])( updates.upsert( VersionedDataKinds.Features, { key: 'd', version: 2, prerequisites: [{ key: 'e' }] }, - () => cb(undefined) + () => cb(undefined), ); }); @@ -185,5 +186,5 @@ describe.each([true, false])( } expect(queue.isEmpty()).toBeTruthy(); }); - } + }, ); diff --git a/packages/shared/sdk-server/__tests__/data_sources/FileDataSource.test.ts b/packages/shared/sdk-server/__tests__/data_sources/FileDataSource.test.ts index 3f0de0466a..2a2f376ea7 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/FileDataSource.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/FileDataSource.test.ts @@ -1,4 +1,5 @@ -import { Context, ClientContext, Filesystem, WatchHandle } from '@launchdarkly/js-sdk-common'; +import { ClientContext, Context, Filesystem, WatchHandle } from '@launchdarkly/js-sdk-common'; + import promisify from '../../src/async/promisify'; import { Flag } from '../../src/evaluation/data/Flag'; import { Segment } from '../../src/evaluation/data/Segment'; @@ -147,9 +148,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); expect(await asyncFeatureStore.initialized()).toBeFalsy(); @@ -174,9 +175,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -204,9 +205,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async (err) => { @@ -233,9 +234,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async (err) => { @@ -265,9 +266,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -299,9 +300,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async (err) => { @@ -328,9 +329,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -354,9 +355,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -371,7 +372,7 @@ describe('given a mock filesystem and memory feature store', () => { const flag = await asyncFeatureStore.get(VersionedDataKinds.Features, flag2Key); const res = await evaluator.evaluate( flag as Flag, - Context.fromLDContext({ key: 'userkey' })! + Context.fromLDContext({ key: 'userkey' })!, ); expect(res.detail.value).toEqual(flag2Value); done(); @@ -392,9 +393,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -409,7 +410,7 @@ describe('given a mock filesystem and memory feature store', () => { const flag = await asyncFeatureStore.get(VersionedDataKinds.Features, flag1Key); const res = await evaluator.evaluate( flag as Flag, - Context.fromLDContext({ key: 'userkey' })! + Context.fromLDContext({ key: 'userkey' })!, ); expect(res.detail.value).toEqual('on'); done(); @@ -433,9 +434,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -467,9 +468,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -515,9 +516,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -566,9 +567,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); fds.start(async () => { @@ -610,9 +611,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); const err = await promisify((cb) => { @@ -620,13 +621,13 @@ describe('given a mock filesystem and memory feature store', () => { }); expect((err as any).message).toEqual( - `Attempted to parse yaml file (yamlfile.${ext}) without parser.` + `Attempted to parse yaml file (yamlfile.${ext}) without parser.`, ); expect(await asyncFeatureStore.initialized()).toBeFalsy(); expect(await asyncFeatureStore.all(VersionedDataKinds.Features)).toEqual({}); expect(await asyncFeatureStore.all(VersionedDataKinds.Segments)).toEqual({}); - } + }, ); it.each([['yml'], ['yaml']])('uses the yaml parser when specified %s', async (ext) => { @@ -647,9 +648,9 @@ describe('given a mock filesystem and memory feature store', () => { featureStore, logger, }), - { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem } + { ...basicPlatform, fileSystem: filesystem as unknown as Filesystem }, ), - featureStore + featureStore, ); const err = await promisify((cb) => { diff --git a/packages/shared/sdk-server/__tests__/data_sources/PollingProcessor.test.ts b/packages/shared/sdk-server/__tests__/data_sources/PollingProcessor.test.ts index 7e0454e140..b1361307f4 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/PollingProcessor.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/PollingProcessor.test.ts @@ -1,4 +1,5 @@ import { ClientContext } from '@launchdarkly/js-sdk-common'; + import { LDFeatureStore } from '../../src/api/subsystems'; import promisify from '../../src/async/promisify'; import PollingProcessor from '../../src/data_sources/PollingProcessor'; @@ -34,7 +35,7 @@ describe('given an event processor', () => { processor = new PollingProcessor( config, requestor as unknown as Requestor, - config.featureStoreFactory(new ClientContext('', config, basicPlatform)) + config.featureStoreFactory(new ClientContext('', config, basicPlatform)), ); }); @@ -95,7 +96,7 @@ describe('given a polling processor with a short poll duration', () => { processor = new PollingProcessor( config, requestor as unknown as Requestor, - config.featureStoreFactory(new ClientContext('', config, basicPlatform)) + config.featureStoreFactory(new ClientContext('', config, basicPlatform)), ); }); @@ -122,8 +123,8 @@ describe('given a polling processor with a short poll duration', () => { { status, }, - undefined - ) + undefined, + ), ); processor.start((e) => { expect(e).toBeUndefined(); @@ -136,7 +137,7 @@ describe('given a polling processor with a short poll duration', () => { expect(testLogger.getCount(LogLevel.Warn)).toBeGreaterThan(2); (done as jest.DoneCallback)(); }, 300); - } + }, ); it('continues polling after receiving invalid JSON', (done) => { @@ -161,8 +162,8 @@ describe('given a polling processor with a short poll duration', () => { { status, }, - undefined - ) + undefined, + ), ); processor.start((e) => { expect(e).toBeDefined(); @@ -174,6 +175,6 @@ describe('given a polling processor with a short poll duration', () => { expect(testLogger.getCount(LogLevel.Error)).toBe(1); (done as jest.DoneCallback)(); }, 300); - } + }, ); }); diff --git a/packages/shared/sdk-server/__tests__/data_sources/Requestor.test.ts b/packages/shared/sdk-server/__tests__/data_sources/Requestor.test.ts index 01cb44534f..0077d8caaa 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/Requestor.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/Requestor.test.ts @@ -1,12 +1,13 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { - Requests, - Response, - Headers, - EventSourceInitDict, EventSource, + EventSourceInitDict, + Headers, Options, + Requests, + Response, } from '@launchdarkly/js-sdk-common'; + import promisify from '../../src/async/promisify'; import Requestor from '../../src/data_sources/Requestor'; import Configuration from '../../src/options/Configuration'; diff --git a/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessor.test.ts b/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessor.test.ts index 5207e8a6af..ecceb74ad1 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessor.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/StreamingProcessor.test.ts @@ -8,17 +8,18 @@ import { Response, SdkData, } from '@launchdarkly/js-sdk-common'; + import promisify from '../../src/async/promisify'; import defaultHeaders from '../../src/data_sources/defaultHeaders'; import StreamingProcessor from '../../src/data_sources/StreamingProcessor'; import DiagnosticsManager from '../../src/events/DiagnosticsManager'; +import NullEventSource from '../../src/events/NullEventSource'; import Configuration from '../../src/options/Configuration'; import AsyncStoreFacade from '../../src/store/AsyncStoreFacade'; import InMemoryFeatureStore from '../../src/store/InMemoryFeatureStore'; import VersionedDataKinds from '../../src/store/VersionedDataKinds'; import basicPlatform from '../evaluation/mocks/platform'; import TestLogger, { LogLevel } from '../Logger'; -import NullEventSource from '../../src/events/NullEventSource'; const sdkKey = 'my-sdk-key'; @@ -79,7 +80,7 @@ describe('given a stream processor with mock event source', () => { requests, info, featureStore, - diagnosticsManager + diagnosticsManager, ); }); diff --git a/packages/shared/sdk-server/__tests__/data_sources/defaultHeaders.test.ts b/packages/shared/sdk-server/__tests__/data_sources/defaultHeaders.test.ts index 7aff7f046d..e347615406 100644 --- a/packages/shared/sdk-server/__tests__/data_sources/defaultHeaders.test.ts +++ b/packages/shared/sdk-server/__tests__/data_sources/defaultHeaders.test.ts @@ -1,4 +1,5 @@ import { Info, PlatformData, SdkData } from '@launchdarkly/js-sdk-common'; + import defaultHeaders from '../../src/data_sources/defaultHeaders'; import Configuration from '../../src/options/Configuration'; diff --git a/packages/shared/sdk-server/__tests__/evaluation/Bucketer.test.ts b/packages/shared/sdk-server/__tests__/evaluation/Bucketer.test.ts index d176ac40f0..cae445c2bb 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Bucketer.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Bucketer.test.ts @@ -2,8 +2,8 @@ // We cannot fully validate bucketing in the common tests. Platform implementations // should contain a consistency test. // Testing here can only validate we are providing correct inputs to the hashing algorithm. - import { AttributeReference, Context, LDContext } from '@launchdarkly/js-sdk-common'; + import Bucketer from '../../src/evaluation/Bucketer'; import { crypto, hasher } from './mocks/hasher'; @@ -15,7 +15,7 @@ describe.each< salt: string, kindForRollout: string | undefined, seed: number | undefined, - expected: string + expected: string, ] >([ [{ key: 'is-key' }, 'flag-key', 'key', 'salty', undefined, undefined, 'flag-key.salty.is-key'], @@ -72,7 +72,7 @@ describe.each< attrRef, salt, kindForRollout, - seed + seed, ); // The hasher always returns the same value. This just checks that it converts it to a number @@ -111,7 +111,7 @@ describe.each([ attrRef, 'salty', 'org', - undefined + undefined, ); expect(bucket).toEqual(0); expect(hadContext).toEqual(kind === 'org'); diff --git a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.bucketing.test.ts b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.bucketing.test.ts index 5abab846ed..325330c97c 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.bucketing.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.bucketing.test.ts @@ -1,4 +1,5 @@ import { Context } from '@launchdarkly/js-sdk-common'; + import { Flag } from '../../src/evaluation/data/Flag'; import { Rollout } from '../../src/evaluation/data/Rollout'; import Evaluator from '../../src/evaluation/Evaluator'; diff --git a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.clause.test.ts b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.clause.test.ts index 0e3e51a87f..30e202d8d3 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.clause.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.clause.test.ts @@ -1,12 +1,13 @@ import { AttributeReference, Context, LDContext } from '@launchdarkly/js-sdk-common'; + import { Clause } from '../../src/evaluation/data/Clause'; import { Flag } from '../../src/evaluation/data/Flag'; import { FlagRule } from '../../src/evaluation/data/FlagRule'; import Evaluator from '../../src/evaluation/Evaluator'; import { makeBooleanFlagWithOneClause, - makeClauseThatMatchesUser, makeBooleanFlagWithRules, + makeClauseThatMatchesUser, } from './flags'; import noQueries from './mocks/noQueries'; import basicPlatform from './mocks/platform'; @@ -90,7 +91,7 @@ describe('given user clauses and contexts', () => { const context = Context.fromLDContext(user); const res = await evaluator.evaluate(flag, context!); expect(res.detail.value).toBe(true); - } + }, ); it.each([ @@ -466,5 +467,5 @@ describe.each([ const res2 = await evaluator.evaluate(flag, contextWArray); expect(res2.detail.value).toBe(true); }); - } + }, ); diff --git a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.rules.test.ts b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.rules.test.ts index 94691404e5..69ccd82878 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.rules.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.rules.test.ts @@ -1,7 +1,7 @@ // Tests of flag evaluation at the rule level. Clause-level behavior is covered // in detail in Evaluator.clause.tests and (TODO: File for segments). - import { AttributeReference, Context, LDContext } from '@launchdarkly/js-sdk-common'; + import { Clause } from '../../src/evaluation/data/Clause'; import { Flag } from '../../src/evaluation/data/Flag'; import { FlagRule } from '../../src/evaluation/data/FlagRule'; @@ -44,7 +44,7 @@ describe('when evaluating user equivalent contexts', () => { variationIndex: 2, reason: { kind: 'RULE_MATCH', ruleIndex: 1, ruleId: 'id1' }, }); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -60,7 +60,7 @@ describe('when evaluating user equivalent contexts', () => { variationIndex: null, reason: { kind: 'ERROR', errorKind: 'MALFORMED_FLAG' }, }); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -76,7 +76,7 @@ describe('when evaluating user equivalent contexts', () => { variationIndex: null, reason: { kind: 'ERROR', errorKind: 'MALFORMED_FLAG' }, }); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -92,7 +92,7 @@ describe('when evaluating user equivalent contexts', () => { variationIndex: null, reason: { kind: 'ERROR', errorKind: 'MALFORMED_FLAG' }, }); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -108,7 +108,7 @@ describe('when evaluating user equivalent contexts', () => { variationIndex: null, reason: { kind: 'ERROR', errorKind: 'MALFORMED_FLAG' }, }); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -133,7 +133,7 @@ describe('when evaluating user equivalent contexts', () => { const res = await evaluator.evaluate(flag, Context.fromLDContext(userToTest)); expect(res.isError).toBeFalsy(); expect(res.detail.value).toEqual(false); - } + }, ); }); @@ -178,6 +178,6 @@ describe('when evaluating non-user contexts', () => { variationIndex: 2, reason: { kind: 'RULE_MATCH', ruleIndex: 1, ruleId: 'id1' }, }); - } + }, ); }); 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 5f90f6b72d..5f94defa9a 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.segments.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.segments.test.ts @@ -1,4 +1,5 @@ /* eslint-disable class-methods-use-this */ + /* eslint-disable @typescript-eslint/no-unused-vars */ import { AttributeReference, @@ -8,6 +9,7 @@ import { Hmac, LDContext, } from '@launchdarkly/js-sdk-common'; + import { BigSegmentStoreMembership } from '../../src/api/interfaces'; import { Flag } from '../../src/evaluation/data/Flag'; import { Segment } from '../../src/evaluation/data/Segment'; @@ -29,7 +31,7 @@ class TestQueries implements Queries { private readonly data: { flags?: Flag[]; segments?: Segment[]; - } + }, ) {} async getFlag(key: string): Promise { @@ -41,7 +43,7 @@ class TestQueries implements Queries { } getBigSegmentsMembership( - userKey: string + userKey: string, ): Promise<[BigSegmentStoreMembership | null, string] | undefined> { throw new Error('Method not implemented.'); } @@ -62,7 +64,7 @@ describe('when evaluating user equivalent contexts for segments', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(true); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -77,7 +79,7 @@ describe('when evaluating user equivalent contexts for segments', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(false); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -92,7 +94,7 @@ describe('when evaluating user equivalent contexts for segments', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(false); - } + }, ); it('does not match segment with unknown user', async () => { @@ -121,7 +123,7 @@ describe('when evaluating user equivalent contexts for segments', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(true); - } + }, ); it.each([basicUser, basicSingleKindUser, basicMultiKindUser])( @@ -142,7 +144,7 @@ describe('when evaluating user equivalent contexts for segments', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(true); - } + }, ); it('handles an invalid reference for bucketBy', async () => { @@ -185,7 +187,7 @@ describe('when evaluating user equivalent contexts for segments', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(false); - } + }, ); it('matches segment with multiple matching clauses', async () => { @@ -294,7 +296,7 @@ describe('when evaluating user equivalent contexts for segments', () => { bucketingPlatform, new TestQueries({ segments: [segment1, segment2], - }) + }), ); const flag1 = makeFlagWithSegmentMatch(segment1); const flag2 = makeFlagWithSegmentMatch(segment2); @@ -324,7 +326,7 @@ describe('Evaluator - segment match for non-user contexts', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(true); - } + }, ); it.each([singleKind, multiKind])('matches nested segments', async (context) => { @@ -353,7 +355,7 @@ describe('Evaluator - segment match for non-user contexts', () => { }; const evaluator = new Evaluator( basicPlatform, - new TestQueries({ segments: [segment1, segment2] }) + new TestQueries({ segments: [segment1, segment2] }), ); const flag = makeFlagWithSegmentMatch(segment2); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); @@ -418,7 +420,7 @@ describe('Evaluator - segment match for non-user contexts', () => { }; const evaluator = new Evaluator( basicPlatform, - new TestQueries({ segments: [segment1, segment2] }) + new TestQueries({ segments: [segment1, segment2] }), ); const flag = makeFlagWithSegmentMatch(segment2); const res = await evaluator.evaluate(flag, Context.fromLDContext(singleKind)); @@ -437,7 +439,7 @@ describe('Evaluator - segment match for non-user contexts', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(false); - } + }, ); it.each([singleKind, multiKind])( @@ -452,7 +454,7 @@ describe('Evaluator - segment match for non-user contexts', () => { const flag = makeFlagWithSegmentMatch(segment); const res = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(res.detail.value).toBe(false); - } + }, ); it.each([singleKind, multiKind])('does not match segment for wrong kind', async (context) => { diff --git a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.test.ts b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.test.ts index 2ac7631268..3a39e66e57 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/Evaluator.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/Evaluator.test.ts @@ -1,10 +1,11 @@ import { Context, LDContext } from '@launchdarkly/js-sdk-common'; + import { Flag } from '../../src/evaluation/data/Flag'; import EvalResult from '../../src/evaluation/EvalResult'; import Evaluator from '../../src/evaluation/Evaluator'; import Reasons from '../../src/evaluation/Reasons'; -import basicPlatform from './mocks/platform'; import noQueries from './mocks/noQueries'; +import basicPlatform from './mocks/platform'; const offBaseFlag = { key: 'feature0', @@ -37,9 +38,9 @@ describe.each<[Flag, LDContext, EvalResult | undefined]>([ // @ts-ignore context.kind } targets: ${flag.targets?.map( - (t) => `${t.values}, ${t.variation}` + (t) => `${t.values}, ${t.variation}`, )} context targets: ${flag.contextTargets?.map( - (t) => `${t.contextKind}: ${t.values}, ${t.variation}` + (t) => `${t.contextKind}: ${t.values}, ${t.variation}`, )}`, async () => { const result = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(result?.isError).toEqual(expected?.isError); @@ -140,9 +141,9 @@ describe.each<[Flag, LDContext, EvalResult | undefined]>([ // @ts-ignore context.kind } targets: ${flag.targets?.map( - (t) => `${t.values}, ${t.variation}` + (t) => `${t.values}, ${t.variation}`, )} context targets: ${flag.contextTargets?.map( - (t) => `${t.contextKind}: ${t.values}, ${t.variation}` + (t) => `${t.contextKind}: ${t.values}, ${t.variation}`, )}`, async () => { const result = await evaluator.evaluate(flag, Context.fromLDContext(context)); expect(result?.isError).toEqual(expected?.isError); diff --git a/packages/shared/sdk-server/__tests__/evaluation/evalTargets.test.ts b/packages/shared/sdk-server/__tests__/evaluation/evalTargets.test.ts index 5bbf7a394a..8efd34b9ab 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/evalTargets.test.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/evalTargets.test.ts @@ -1,4 +1,5 @@ import { Context, LDContext } from '@launchdarkly/js-sdk-common'; + import { Flag } from '../../src/evaluation/data/Flag'; import EvalResult from '../../src/evaluation/EvalResult'; import evalTargets from '../../src/evaluation/evalTargets'; @@ -164,9 +165,9 @@ describe.each<[Flag, LDContext, EvalResult | undefined]>([ // @ts-ignore context.kind } targets: ${flag.targets?.map( - (t) => `${t.values}, ${t.variation}` + (t) => `${t.values}, ${t.variation}`, )} context targets: ${flag.contextTargets?.map( - (t) => `${t.contextKind}: ${t.values}, ${t.variation}` + (t) => `${t.contextKind}: ${t.values}, ${t.variation}`, )}`, () => { const result = evalTargets(flag, Context.fromLDContext(context)); expect(result?.isError).toEqual(expected?.isError); diff --git a/packages/shared/sdk-server/__tests__/evaluation/flags.ts b/packages/shared/sdk-server/__tests__/evaluation/flags.ts index 4d666a7b0c..f1e33267fb 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/flags.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/flags.ts @@ -1,4 +1,5 @@ import { AttributeReference, LDContext } from '@launchdarkly/js-sdk-common'; + import { Clause } from '../../src/evaluation/data/Clause'; import { Flag } from '../../src/evaluation/data/Flag'; import { FlagRule } from '../../src/evaluation/data/FlagRule'; diff --git a/packages/shared/sdk-server/__tests__/evaluation/mocks/hasher.ts b/packages/shared/sdk-server/__tests__/evaluation/mocks/hasher.ts index 6fe6aab5ef..bed0871a29 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/mocks/hasher.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/mocks/hasher.ts @@ -1,5 +1,4 @@ // Mock hashing implementation. - import { Crypto, Hasher, Hmac } from '@launchdarkly/js-sdk-common'; export const hasher: Hasher = { diff --git a/packages/shared/sdk-server/__tests__/evaluation/mocks/platform.ts b/packages/shared/sdk-server/__tests__/evaluation/mocks/platform.ts index ade0509e56..a4ddab9b8d 100644 --- a/packages/shared/sdk-server/__tests__/evaluation/mocks/platform.ts +++ b/packages/shared/sdk-server/__tests__/evaluation/mocks/platform.ts @@ -9,6 +9,7 @@ import { Response, SdkData, } from '@launchdarkly/js-sdk-common'; + import { crypto } from './hasher'; const info: Info = { diff --git a/packages/shared/sdk-server/__tests__/events/ContextDeduplicator.test.ts b/packages/shared/sdk-server/__tests__/events/ContextDeduplicator.test.ts index db8106be68..afaaa5735e 100644 --- a/packages/shared/sdk-server/__tests__/events/ContextDeduplicator.test.ts +++ b/packages/shared/sdk-server/__tests__/events/ContextDeduplicator.test.ts @@ -1,4 +1,5 @@ import { Context } from '@launchdarkly/js-sdk-common'; + import ContextDeduplicator from '../../src/events/ContextDeduplicator'; it('when contexts are processed to the capacity', () => { diff --git a/packages/shared/sdk-server/__tests__/events/DiagnosticsManager.test.ts b/packages/shared/sdk-server/__tests__/events/DiagnosticsManager.test.ts index 2e6b9dbdec..127cd9f5db 100644 --- a/packages/shared/sdk-server/__tests__/events/DiagnosticsManager.test.ts +++ b/packages/shared/sdk-server/__tests__/events/DiagnosticsManager.test.ts @@ -10,6 +10,7 @@ import { Response, SdkData, } from '@launchdarkly/js-sdk-common'; + import { DataKind } from '../../src/api/interfaces'; import { LDFeatureStore, @@ -82,7 +83,7 @@ describe('given a diagnostics manager', () => { 'my-sdk-key', new Configuration({}), basicPlatform, - new InMemoryFeatureStore() + new InMemoryFeatureStore(), ); }); @@ -100,7 +101,7 @@ describe('given a diagnostics manager', () => { 'my-sdk-key', new Configuration({}), basicPlatform, - new InMemoryFeatureStore() + new InMemoryFeatureStore(), ); const { id } = manager.createInitEvent(); @@ -275,7 +276,7 @@ describe.each([ new Configuration(configIn), basicPlatform, // @ts-ignore - configIn.featureStore ?? new InMemoryFeatureStore() + configIn.featureStore ?? new InMemoryFeatureStore(), ); }); @@ -300,7 +301,7 @@ describe.each([true, false])('Given proxy and proxy auth=%p', (auth) => { 'my-sdk-key', new Configuration({}), basicPlatform, - new InMemoryFeatureStore() + new InMemoryFeatureStore(), ); }); diff --git a/packages/shared/sdk-server/__tests__/events/EventProcessor.test.ts b/packages/shared/sdk-server/__tests__/events/EventProcessor.test.ts index 27396f7a4f..443654344a 100644 --- a/packages/shared/sdk-server/__tests__/events/EventProcessor.test.ts +++ b/packages/shared/sdk-server/__tests__/events/EventProcessor.test.ts @@ -1,26 +1,27 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { + ClientContext, + Context, EventSource, EventSourceInitDict, + Hasher, Headers, + Hmac, Info, + internal, Options, PlatformData, Requests, Response, SdkData, - ClientContext, - Context, - internal, - Hmac, - Hasher, } from '@launchdarkly/js-sdk-common'; + +import ContextDeduplicator from '../../src/events/ContextDeduplicator'; import DiagnosticsManager from '../../src/events/DiagnosticsManager'; +import EventSender from '../../src/events/EventSender'; import Configuration from '../../src/options/Configuration'; import InMemoryFeatureStore from '../../src/store/InMemoryFeatureStore'; import basicPlatform from '../evaluation/mocks/platform'; -import ContextDeduplicator from '../../src/events/ContextDeduplicator'; -import EventSender from '../../src/events/EventSender'; const SDK_KEY = 'sdk-key'; @@ -181,7 +182,7 @@ describe('given an event processor with diagnostics manager', () => { requests, crypto, }, - store + store, ); const clientContext = new ClientContext(SDK_KEY, testConfig, { @@ -195,7 +196,7 @@ describe('given an event processor with diagnostics manager', () => { clientContext, new EventSender(config, clientContext), new ContextDeduplicator(config), - diagnosticsManager + diagnosticsManager, ); }); @@ -314,11 +315,11 @@ describe('given an event processor with diagnostics manager', () => { expect.objectContaining({ kind: 'identify', creationDate: 1000 }), expect.objectContaining({ kind: 'identify', creationDate: 1001 }), expect.objectContaining({ kind: 'identify', creationDate: 1002 }), - ]) + ]), ); const diagnosticMessage = requestState.requestsMade.find( - (msg, idx) => idx !== 0 && msg.url.endsWith('/diagnostic') + (msg, idx) => idx !== 0 && msg.url.endsWith('/diagnostic'), ); expect(diagnosticMessage).toBeDefined(); const diagnosticMessageData = JSON.parse(diagnosticMessage!.options.body!); @@ -332,7 +333,7 @@ describe('given an event processor with diagnostics manager', () => { droppedEvents: 1, deduplicatedUsers: 0, eventsInLastBatch: 3, - }) + }), ); }); @@ -361,11 +362,11 @@ describe('given an event processor with diagnostics manager', () => { expect.arrayContaining([ expect.objectContaining({ kind: 'custom', creationDate: 1000 }), expect.objectContaining({ kind: 'custom', creationDate: 1001 }), - ]) + ]), ); const diagnosticMessage = requestState.requestsMade.find( - (msg, idx) => idx !== 0 && msg.url.endsWith('/diagnostic') + (msg, idx) => idx !== 0 && msg.url.endsWith('/diagnostic'), ); expect(diagnosticMessage).toBeDefined(); const diagnosticMessageData = JSON.parse(diagnosticMessage!.options.body!); @@ -379,7 +380,7 @@ describe('given an event processor with diagnostics manager', () => { droppedEvents: 0, deduplicatedUsers: 1, eventsInLastBatch: 3, - }) + }), ); }); }); diff --git a/packages/shared/sdk-server/__tests__/events/EventSender.test.ts b/packages/shared/sdk-server/__tests__/events/EventSender.test.ts index ddf64dd419..670fd63648 100644 --- a/packages/shared/sdk-server/__tests__/events/EventSender.test.ts +++ b/packages/shared/sdk-server/__tests__/events/EventSender.test.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ +import { AsyncQueue } from 'launchdarkly-js-test-helpers'; + import { ClientContext, EventSource, @@ -12,7 +14,7 @@ import { SdkData, } from '@launchdarkly/js-sdk-common'; import { LDDeliveryStatus, LDEventType } from '@launchdarkly/js-sdk-common/dist/api/subsystem'; -import { AsyncQueue } from 'launchdarkly-js-test-helpers'; + import EventSender from '../../src/events/EventSender'; import Configuration from '../../src/options/Configuration'; import basicPlatform from '../evaluation/mocks/platform'; @@ -96,7 +98,7 @@ describe('given an event sender', () => { const config = new Configuration({}); eventSender = new EventSender( config, - new ClientContext('sdk-key', config, { ...basicPlatform, requests, info }) + new ClientContext('sdk-key', config, { ...basicPlatform, requests, info }), ); }); @@ -143,7 +145,7 @@ describe('given an event sender', () => { await eventSender.sendEventData(LDEventType.AnalyticsEvents, { something: true }); const req2 = await queue.take(); expect(req1.options!.headers!['x-launchdarkly-payload-id']).not.toEqual( - req2.options!.headers!['x-launchdarkly-payload-id'] + req2.options!.headers!['x-launchdarkly-payload-id'], ); }); diff --git a/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts b/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts index 36eae45713..4ba82b6999 100644 --- a/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts +++ b/packages/shared/sdk-server/__tests__/integrations/test_data/TestData.test.ts @@ -1,4 +1,5 @@ import { ClientContext } from '@launchdarkly/js-sdk-common'; + import { AttributeReference } from '../../../src'; import { Flag } from '../../../src/evaluation/data/Flag'; import { FlagRule } from '../../../src/evaluation/data/FlagRule'; @@ -27,7 +28,7 @@ it('initializes the data store with flags configured the data store is created', const store = new InMemoryFeatureStore(); const processor = td.getFactory()( new ClientContext('', new Configuration({}), basicPlatform), - store + store, ); processor.start(); @@ -43,7 +44,7 @@ it('updates the data store when update is called', async () => { const store = new InMemoryFeatureStore(); const processor = td.getFactory()( new ClientContext('', new Configuration({}), basicPlatform), - store + store, ); processor.start(); @@ -63,7 +64,7 @@ it('can include pre-configured items', async () => { const store = new InMemoryFeatureStore(); const processor = td.getFactory()( new ClientContext('', new Configuration({}), basicPlatform), - store + store, ); processor.start(); @@ -109,7 +110,7 @@ it.each([true, false])('does not update the store after stop/close is called', a const store = new InMemoryFeatureStore(); const processor = td.getFactory()( new ClientContext('', new Configuration({}), basicPlatform), - store + store, ); processor.start(); @@ -137,7 +138,7 @@ it('can update a flag that already exists in the store', async () => { const processor = td.getFactory()( new ClientContext('', new Configuration({}), basicPlatform), - store + store, ); processor.start(); diff --git a/packages/shared/sdk-server/__tests__/options/Configuration.test.ts b/packages/shared/sdk-server/__tests__/options/Configuration.test.ts index 00c0049ef9..1764f85dc9 100644 --- a/packages/shared/sdk-server/__tests__/options/Configuration.test.ts +++ b/packages/shared/sdk-server/__tests__/options/Configuration.test.ts @@ -105,7 +105,7 @@ describe('when setting different options', () => { it('produces no logs when setting all URLs.', () => { // @ts-ignore const config = new Configuration( - withLogger({ eventsUri: 'cats', baseUri: 'cats', streamUri: 'cats' }) + withLogger({ eventsUri: 'cats', baseUri: 'cats', streamUri: 'cats' }), ); expect(config.serviceEndpoints.events).toEqual('cats'); expect(config.serviceEndpoints.streaming).toEqual('cats'); @@ -116,7 +116,7 @@ describe('when setting different options', () => { it('Does not log a warning for the events URI if sendEvents is false..', () => { // @ts-ignore const config = new Configuration( - withLogger({ sendEvents: false, baseUri: 'cats', streamUri: 'cats' }) + withLogger({ sendEvents: false, baseUri: 'cats', streamUri: 'cats' }), ); expect(config.serviceEndpoints.streaming).toEqual('cats'); expect(config.serviceEndpoints.polling).toEqual('cats'); @@ -126,7 +126,7 @@ describe('when setting different options', () => { it('Does log a warning for the events URI if sendEvents is true..', () => { // @ts-ignore const config = new Configuration( - withLogger({ sendEvents: true, baseUri: 'cats', streamUri: 'cats' }) + withLogger({ sendEvents: true, baseUri: 'cats', streamUri: 'cats' }), ); expect(config.serviceEndpoints.streaming).toEqual('cats'); expect(config.serviceEndpoints.polling).toEqual('cats'); diff --git a/packages/shared/sdk-server/__tests__/store/PersistentStoreWrapper.test.ts b/packages/shared/sdk-server/__tests__/store/PersistentStoreWrapper.test.ts index 521a6979ca..efdc3d132a 100644 --- a/packages/shared/sdk-server/__tests__/store/PersistentStoreWrapper.test.ts +++ b/packages/shared/sdk-server/__tests__/store/PersistentStoreWrapper.test.ts @@ -33,7 +33,7 @@ class MockPersistentStore implements PersistentDataStore { get( kind: PersistentStoreDataKind, key: string, - callback: (descriptor: SerializedItemDescriptor | undefined) => void + callback: (descriptor: SerializedItemDescriptor | undefined) => void, ): void { const itemsForKind = this.allData?.find((kvp) => kvp.key.namespace === kind.namespace)?.item; callback(itemsForKind?.find((kvp) => kvp.key === key)?.item ?? undefined); @@ -41,7 +41,7 @@ class MockPersistentStore implements PersistentDataStore { getAll( kind: PersistentStoreDataKind, - callback: (descriptors: KeyedItem[] | undefined) => void + callback: (descriptors: KeyedItem[] | undefined) => void, ): void { callback(this.allData?.find((kvp) => kvp.key.namespace === kind.namespace)?.item); } @@ -52,8 +52,8 @@ class MockPersistentStore implements PersistentDataStore { descriptor: SerializedItemDescriptor, callback: ( err?: Error | undefined, - updatedDescriptor?: SerializedItemDescriptor | undefined - ) => void + updatedDescriptor?: SerializedItemDescriptor | undefined, + ) => void, ): void { const itemsForKind = this.allData?.find((kvp) => kvp.key.namespace === kind.namespace)?.item; const slot = itemsForKind?.find((kvp) => kvp.key === key); @@ -123,7 +123,7 @@ describe.each(['caching', 'non-caching'])( await asyncWrapper.initialized(); expect(spy).toHaveBeenCalledTimes(1); - } + }, ); itif(!isCaching)( @@ -135,7 +135,7 @@ describe.each(['caching', 'non-caching'])( await asyncWrapper.initialized(); expect(spy).toHaveBeenCalledTimes(3); - } + }, ); it('becomes initialized if the underlying store is initialized', async () => { @@ -159,7 +159,7 @@ describe.each(['caching', 'non-caching'])( await asyncWrapper.initialized(); expect(spy).toHaveBeenCalledTimes(2); - } + }, ); it('if the ttl for initialization has passed, but initialization was complete, it will not check the store.', async () => { @@ -499,5 +499,5 @@ describe.each(['caching', 'non-caching'])( const allValues = await asyncWrapper.all(VersionedDataKinds.Features); expect(allValues).toEqual({}); }); - } + }, ); diff --git a/packages/shared/sdk-server/src/BigSegmentStatusProviderImpl.ts b/packages/shared/sdk-server/src/BigSegmentStatusProviderImpl.ts index 531eb86925..07ae740d6b 100644 --- a/packages/shared/sdk-server/src/BigSegmentStatusProviderImpl.ts +++ b/packages/shared/sdk-server/src/BigSegmentStatusProviderImpl.ts @@ -1,5 +1,5 @@ /* eslint-disable class-methods-use-this */ -import { BigSegmentStoreStatusProvider, BigSegmentStoreStatus } from './api/interfaces'; +import { BigSegmentStoreStatus, BigSegmentStoreStatusProvider } from './api/interfaces'; /** * @ignore diff --git a/packages/shared/sdk-server/src/BigSegmentsManager.ts b/packages/shared/sdk-server/src/BigSegmentsManager.ts index 58342806ea..10cedd57bd 100644 --- a/packages/shared/sdk-server/src/BigSegmentsManager.ts +++ b/packages/shared/sdk-server/src/BigSegmentsManager.ts @@ -1,4 +1,5 @@ -import { LDLogger, TypeValidators, Crypto } from '@launchdarkly/js-sdk-common'; +import { Crypto, LDLogger, TypeValidators } from '@launchdarkly/js-sdk-common'; + import { LDBigSegmentsOptions } from './api'; import { BigSegmentStore, BigSegmentStoreMembership } from './api/interfaces'; import BigSegmentStoreStatusProviderImpl from './BigSegmentStatusProviderImpl'; @@ -28,10 +29,10 @@ export default class BigSegmentsManager { // it in the options at this stage. config: Omit, private readonly logger: LDLogger | undefined, - private readonly crypto: Crypto + private readonly crypto: Crypto, ) { this.statusProvider = new BigSegmentStoreStatusProviderImpl(async () => - this.pollStoreAndUpdateStatus() + this.pollStoreAndUpdateStatus(), ); this.staleTimeMs = @@ -67,7 +68,7 @@ export default class BigSegmentsManager { } public async getUserMembership( - userKey: string + userKey: string, ): Promise<[BigSegmentStoreMembership | null, string] | undefined> { if (!this.store) { return undefined; @@ -133,7 +134,7 @@ export default class BigSegmentsManager { this.logger?.debug( 'Big Segment store status changed from %s to %s', JSON.stringify(lastStatus), - JSON.stringify(newStatus) + JSON.stringify(newStatus), ); this.statusProvider.setStatus(newStatus); this.statusProvider.notify(); diff --git a/packages/shared/sdk-server/src/FlagsStateBuilder.ts b/packages/shared/sdk-server/src/FlagsStateBuilder.ts index 6c5425ad5d..86bbc23bb5 100644 --- a/packages/shared/sdk-server/src/FlagsStateBuilder.ts +++ b/packages/shared/sdk-server/src/FlagsStateBuilder.ts @@ -1,6 +1,7 @@ import { LDEvaluationReason, LDFlagSet } from '@launchdarkly/js-sdk-common'; -import { Flag } from './evaluation/data/Flag'; + import { LDFlagsState } from './api/data/LDFlagsState'; +import { Flag } from './evaluation/data/Flag'; interface FlagMeta { variation?: number; @@ -16,7 +17,10 @@ export default class FlagsStateBuilder { private flagMetadata: Record = {}; - constructor(private valid: boolean, private withReasons: boolean) {} + constructor( + private valid: boolean, + private withReasons: boolean, + ) {} addFlag( flag: Flag, @@ -25,7 +29,7 @@ export default class FlagsStateBuilder { reason: LDEvaluationReason, trackEvents: boolean, trackReason: boolean, - detailsOnlyIfTracked: boolean + detailsOnlyIfTracked: boolean, ) { this.flagValues[flag.key] = value; const meta: FlagMeta = {}; diff --git a/packages/shared/sdk-server/src/LDClientImpl.ts b/packages/shared/sdk-server/src/LDClientImpl.ts index 2367dc0e33..94b9b53de4 100644 --- a/packages/shared/sdk-server/src/LDClientImpl.ts +++ b/packages/shared/sdk-server/src/LDClientImpl.ts @@ -1,16 +1,18 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ + /* eslint-disable class-methods-use-this */ import { + ClientContext, Context, + internal, LDContext, - LDLogger, LDEvaluationDetail, - ClientContext, + LDLogger, Platform, subsystem, - internal, } from '@launchdarkly/js-sdk-common'; -import { LDClient, LDFlagsStateOptions, LDOptions, LDStreamProcessor, LDFlagsState } from './api'; + +import { LDClient, LDFlagsState, LDFlagsStateOptions, LDOptions, LDStreamProcessor } from './api'; import { BigSegmentStoreMembership } from './api/interfaces'; import BigSegmentsManager from './BigSegmentsManager'; import BigSegmentStoreStatusProvider from './BigSegmentStatusProviderImpl'; @@ -107,7 +109,7 @@ export default class LDClientImpl implements LDClient { private sdkKey: string, private platform: Platform, options: LDOptions, - callbacks: LDClientCallbacks + callbacks: LDClientCallbacks, ) { this.onError = callbacks.onError; this.onFailed = callbacks.onFailed; @@ -137,12 +139,12 @@ export default class LDClientImpl implements LDClient { this.platform.requests, this.platform.info, dataSourceUpdates, - this.diagnosticsManager + this.diagnosticsManager, ) : new PollingProcessor( config, new Requestor(sdkKey, config, this.platform.info, this.platform.requests), - dataSourceUpdates + dataSourceUpdates, ); if (config.offline || config.useLdd) { @@ -160,7 +162,7 @@ export default class LDClientImpl implements LDClient { clientContext, new EventSender(config, clientContext), new ContextDeduplicator(config), - this.diagnosticsManager + this.diagnosticsManager, ); } @@ -172,7 +174,7 @@ export default class LDClientImpl implements LDClient { config.bigSegments?.store?.(clientContext), config.bigSegments ?? {}, config.logger, - this.platform.crypto + this.platform.crypto, ); this.bigSegmentsManager = manager; this.bigSegmentStatusProviderInternal = manager.statusProvider as BigSegmentStoreStatusProvider; @@ -185,7 +187,7 @@ export default class LDClientImpl implements LDClient { return ((await asyncFacade.get(VersionedDataKinds.Segments, key)) as Segment) ?? undefined; }, getBigSegmentsMembership( - userKey: string + userKey: string, ): Promise<[BigSegmentStoreMembership | null, string] | undefined> { return manager.getUserMembership(userKey); }, @@ -234,7 +236,7 @@ export default class LDClientImpl implements LDClient { key: string, context: LDContext, defaultValue: any, - callback?: (err: any, res: any) => void + callback?: (err: any, res: any) => void, ): Promise { const res = await this.evaluateIfPossible(key, context, defaultValue, this.eventFactoryDefault); if (!callback) { @@ -248,13 +250,13 @@ export default class LDClientImpl implements LDClient { key: string, context: LDContext, defaultValue: any, - callback?: (err: any, res: LDEvaluationDetail) => void + callback?: (err: any, res: LDEvaluationDetail) => void, ): Promise { const res = await this.evaluateIfPossible( key, context, defaultValue, - this.eventFactoryWithReasons + this.eventFactoryWithReasons, ); callback?.(null, res.detail); return res.detail; @@ -263,7 +265,7 @@ export default class LDClientImpl implements LDClient { async allFlagsState( context: LDContext, options?: LDFlagsStateOptions, - callback?: (err: Error | null, res: LDFlagsState) => void + callback?: (err: Error | null, res: LDFlagsState) => void, ): Promise { if (this.config.offline) { this.logger?.info('allFlagsState() called in offline mode. Returning empty state.'); @@ -284,12 +286,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; } @@ -309,8 +311,8 @@ export default class LDClientImpl implements LDClient { if (res.isError) { this.onError( new Error( - `Error for feature flag "${flag.key}" while evaluating all flags: ${res.message}` - ) + `Error for feature flag "${flag.key}" while evaluating all flags: ${res.message}`, + ), ); } const requireExperimentData = isExperiment(flag, res.detail.reason); @@ -321,7 +323,7 @@ export default class LDClientImpl implements LDClient { res.detail.reason, flag.trackEvents || requireExperimentData, requireExperimentData, - detailsOnlyIfTracked + detailsOnlyIfTracked, ); return true; @@ -361,7 +363,7 @@ export default class LDClientImpl implements LDClient { return; } this.eventProcessor.sendEvent( - this.eventFactoryDefault.customEvent(key, checkedContext!, data, metricValue) + this.eventFactoryDefault.customEvent(key, checkedContext!, data, metricValue), ); } @@ -387,7 +389,7 @@ export default class LDClientImpl implements LDClient { flagKey: string, context: LDContext, defaultValue: any, - eventFactory: EventFactory + eventFactory: EventFactory, ): Promise { if (this.config.offline) { this.logger?.info('Variation called in offline mode. Returning default value.'); @@ -396,7 +398,9 @@ export default class LDClientImpl implements LDClient { const evalContext = Context.fromLDContext(context); if (!evalContext.valid) { this.onError( - new LDClientError(`${evalContext.message ?? 'Context not valid;'} returning default value.`) + new LDClientError( + `${evalContext.message ?? 'Context not valid;'} returning default value.`, + ), ); return EvalResult.forError(ErrorKinds.UserNotSpecified, undefined, defaultValue); } @@ -407,7 +411,7 @@ export default class LDClientImpl implements LDClient { this.onError(error); const result = EvalResult.forError(ErrorKinds.FlagNotFound, undefined, defaultValue); this.eventProcessor.sendEvent( - this.eventFactoryDefault.unknownFlagEvent(flagKey, evalContext, result.detail) + this.eventFactoryDefault.unknownFlagEvent(flagKey, evalContext, result.detail), ); return result; } @@ -420,7 +424,7 @@ export default class LDClientImpl implements LDClient { this.eventProcessor.sendEvent(event); }); this.eventProcessor.sendEvent( - eventFactory.evalEvent(flag, evalContext, evalRes.detail, defaultValue) + eventFactory.evalEvent(flag, evalContext, evalRes.detail, defaultValue), ); return evalRes; } @@ -429,20 +433,20 @@ export default class LDClientImpl implements LDClient { flagKey: string, context: LDContext, defaultValue: any, - eventFactory: EventFactory + eventFactory: EventFactory, ): Promise { if (!this.initialized()) { const storeInitialized = await this.featureStore.initialized(); 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", ); return this.variationInternal(flagKey, context, defaultValue, eventFactory); } 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", ); return EvalResult.forError(ErrorKinds.ClientNotReady, undefined, defaultValue); } diff --git a/packages/shared/sdk-server/src/api/LDClient.ts b/packages/shared/sdk-server/src/api/LDClient.ts index e36e5843f6..daf526334d 100644 --- a/packages/shared/sdk-server/src/api/LDClient.ts +++ b/packages/shared/sdk-server/src/api/LDClient.ts @@ -1,6 +1,7 @@ import { LDContext, LDEvaluationDetail, LDFlagValue } from '@launchdarkly/js-sdk-common'; -import { LDFlagsStateOptions } from './data/LDFlagsStateOptions'; + import { LDFlagsState } from './data/LDFlagsState'; +import { LDFlagsStateOptions } from './data/LDFlagsStateOptions'; /** * The LaunchDarkly SDK client object. @@ -88,7 +89,7 @@ export interface LDClient { key: string, context: LDContext, defaultValue: LDFlagValue, - callback?: (err: any, res: LDFlagValue) => void + callback?: (err: any, res: LDFlagValue) => void, ): Promise; /** @@ -116,7 +117,7 @@ export interface LDClient { key: string, context: LDContext, defaultValue: LDFlagValue, - callback?: (err: any, res: LDEvaluationDetail) => void + callback?: (err: any, res: LDEvaluationDetail) => void, ): Promise; /** @@ -142,7 +143,7 @@ export interface LDClient { allFlagsState( context: LDContext, options?: LDFlagsStateOptions, - callback?: (err: Error | null, res: LDFlagsState | null) => void + callback?: (err: Error | null, res: LDFlagsState | null) => void, ): Promise; /** diff --git a/packages/shared/sdk-server/src/api/interfaces/persistent_store/PersistentDataStore.ts b/packages/shared/sdk-server/src/api/interfaces/persistent_store/PersistentDataStore.ts index 5d6421a303..0a43ca8ec0 100644 --- a/packages/shared/sdk-server/src/api/interfaces/persistent_store/PersistentDataStore.ts +++ b/packages/shared/sdk-server/src/api/interfaces/persistent_store/PersistentDataStore.ts @@ -70,7 +70,7 @@ export default interface PersistentDataStore { get( kind: PersistentStoreDataKind, key: string, - callback: (descriptor: SerializedItemDescriptor | undefined) => void + callback: (descriptor: SerializedItemDescriptor | undefined) => void, ): void; /** @@ -85,7 +85,7 @@ export default interface PersistentDataStore { */ getAll( kind: PersistentStoreDataKind, - callback: (descriptors: KeyedItem[] | undefined) => void + callback: (descriptors: KeyedItem[] | undefined) => void, ): void; /** @@ -115,7 +115,7 @@ export default interface PersistentDataStore { kind: PersistentStoreDataKind, key: string, descriptor: SerializedItemDescriptor, - callback: (err?: Error, updatedDescriptor?: SerializedItemDescriptor) => void + callback: (err?: Error, updatedDescriptor?: SerializedItemDescriptor) => void, ): void; /** 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 f86340793f..ab1b5cb8a0 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 @@ -1,7 +1,6 @@ import ItemDescriptor from './ItemDescriptor'; import KeyedItem from './KeyedItem'; import PersistentDataStore, { KindKeyedStore } from './PersistentDataStore'; - import PersistentStoreDataKind from './PersistentStoreDataKind'; import SerializedItemDescriptor from './SerializedItemDescriptor'; diff --git a/packages/shared/sdk-server/src/api/options/LDBigSegmentsOptions.ts b/packages/shared/sdk-server/src/api/options/LDBigSegmentsOptions.ts index dd22416b26..2755bc9342 100644 --- a/packages/shared/sdk-server/src/api/options/LDBigSegmentsOptions.ts +++ b/packages/shared/sdk-server/src/api/options/LDBigSegmentsOptions.ts @@ -1,4 +1,5 @@ import { LDClientContext } from '@launchdarkly/js-sdk-common'; + import { BigSegmentStore } from '../interfaces'; /** diff --git a/packages/shared/sdk-server/src/api/options/LDOptions.ts b/packages/shared/sdk-server/src/api/options/LDOptions.ts index 852d13a5b0..a9c77c2b58 100644 --- a/packages/shared/sdk-server/src/api/options/LDOptions.ts +++ b/packages/shared/sdk-server/src/api/options/LDOptions.ts @@ -1,4 +1,5 @@ -import { LDLogger, LDClientContext } from '@launchdarkly/js-sdk-common'; +import { LDClientContext, LDLogger } from '@launchdarkly/js-sdk-common'; + import { LDDataSourceUpdates, LDStreamProcessor } from '../subsystems'; import { LDFeatureStore } from '../subsystems/LDFeatureStore'; import { LDBigSegmentsOptions } from './LDBigSegmentsOptions'; @@ -91,7 +92,7 @@ export interface LDOptions { | object | (( clientContext: LDClientContext, - dataSourceUpdates: LDDataSourceUpdates + dataSourceUpdates: LDDataSourceUpdates, ) => LDStreamProcessor); /** diff --git a/packages/shared/sdk-server/src/data_sources/DataSourceUpdates.ts b/packages/shared/sdk-server/src/data_sources/DataSourceUpdates.ts index 1f3535f45a..3ba9a0e484 100644 --- a/packages/shared/sdk-server/src/data_sources/DataSourceUpdates.ts +++ b/packages/shared/sdk-server/src/data_sources/DataSourceUpdates.ts @@ -23,7 +23,7 @@ interface TypeWithRuleClauses { // The shape of rules are different between flags and segments, but // both have clauses of the same shape. clauses?: Clause[]; - } + }, ]; } @@ -63,7 +63,7 @@ export default class DataSourceUpdates implements LDDataSourceUpdates { constructor( private readonly featureStore: LDFeatureStore, private readonly hasEventListeners: () => boolean, - private readonly onChange: (key: string) => void + private readonly onChange: (key: string) => void, ) {} init(allData: LDFeatureStoreDataStorage, callback: () => void): void { @@ -78,7 +78,7 @@ export default class DataSourceUpdates implements LDDataSourceUpdates { this.dependencyTracker.updateDependenciesFrom( namespace, key, - computeDependencies(namespace, item) + computeDependencies(namespace, item), ); }); }); @@ -95,7 +95,7 @@ export default class DataSourceUpdates implements LDDataSourceUpdates { key, oldDataForKind && oldDataForKind[key], newDataForKind && newDataForKind[key], - updatedItems + updatedItems, ); }); }); @@ -129,7 +129,7 @@ export default class DataSourceUpdates implements LDDataSourceUpdates { this.dependencyTracker.updateDependenciesFrom( kind.namespace, key, - computeDependencies(kind.namespace, data) + computeDependencies(kind.namespace, data), ); if (checkForChanges) { const updatedItems = new NamespacedDataSet(); @@ -151,7 +151,7 @@ export default class DataSourceUpdates implements LDDataSourceUpdates { key: string, oldValue: LDFeatureStoreItem | null | undefined, newValue: LDFeatureStoreItem, - toDataSet: NamespacedDataSet + toDataSet: NamespacedDataSet, ) { if (newValue && oldValue && newValue.version <= oldValue.version) { return; diff --git a/packages/shared/sdk-server/src/data_sources/DependencyTracker.ts b/packages/shared/sdk-server/src/data_sources/DependencyTracker.ts index 400e7f94c9..0904150dcb 100644 --- a/packages/shared/sdk-server/src/data_sources/DependencyTracker.ts +++ b/packages/shared/sdk-server/src/data_sources/DependencyTracker.ts @@ -11,7 +11,7 @@ export default class DependencyTracker { updateDependenciesFrom( namespace: string, key: string, - newDependencySet: NamespacedDataSet + newDependencySet: NamespacedDataSet, ) { const oldDependencySet = this.dependenciesFrom.get(namespace, key); oldDependencySet?.enumerate((depNs, depKey) => { @@ -33,7 +33,7 @@ export default class DependencyTracker { updateModifiedItems( inDependencySet: NamespacedDataSet, modifiedNamespace: string, - modifiedKey: string + modifiedKey: string, ) { if (!inDependencySet.get(modifiedNamespace, modifiedKey)) { inDependencySet.set(modifiedNamespace, modifiedKey, true); diff --git a/packages/shared/sdk-server/src/data_sources/FileDataSource.ts b/packages/shared/sdk-server/src/data_sources/FileDataSource.ts index 6a6bb28e83..c40209e0b8 100644 --- a/packages/shared/sdk-server/src/data_sources/FileDataSource.ts +++ b/packages/shared/sdk-server/src/data_sources/FileDataSource.ts @@ -1,4 +1,5 @@ -import { LDLogger, Filesystem } from '@launchdarkly/js-sdk-common'; +import { Filesystem, LDLogger } from '@launchdarkly/js-sdk-common'; + import { LDStreamProcessor } from '../api'; import { FileDataSourceOptions } from '../api/integrations'; import { DataKind } from '../api/interfaces'; @@ -37,7 +38,7 @@ export default class FileDataSource implements LDStreamProcessor { constructor( options: FileDataSourceOptions, filesystem: Filesystem, - private readonly featureStore: LDFeatureStore + private readonly featureStore: LDFeatureStore, ) { this.fileLoader = new FileLoader( filesystem, @@ -53,7 +54,7 @@ export default class FileDataSource implements LDStreamProcessor { this.initCallback?.(err); this.logger?.error(`Error processing files: ${err}`); } - } + }, ); this.logger = options.logger; diff --git a/packages/shared/sdk-server/src/data_sources/FileLoader.ts b/packages/shared/sdk-server/src/data_sources/FileLoader.ts index 1e7d784a5a..d7762b146c 100644 --- a/packages/shared/sdk-server/src/data_sources/FileLoader.ts +++ b/packages/shared/sdk-server/src/data_sources/FileLoader.ts @@ -25,7 +25,7 @@ export default class FileLoader { private readonly filesystem: Filesystem, private readonly paths: string[], private readonly watch: boolean, - private readonly callback: (results: { path: string; data: string }[]) => void + private readonly callback: (results: { path: string; data: string }[]) => void, ) {} /** @@ -80,8 +80,8 @@ export default class FileLoader { acc.push({ path, data }); return acc; }, - [] - ) + [], + ), ); }, 10); // The 10ms delay above is arbitrary - we just don't want to have the number be zero, diff --git a/packages/shared/sdk-server/src/data_sources/NullUpdateProcessor.ts b/packages/shared/sdk-server/src/data_sources/NullUpdateProcessor.ts index 63ec92f62f..849535fb41 100644 --- a/packages/shared/sdk-server/src/data_sources/NullUpdateProcessor.ts +++ b/packages/shared/sdk-server/src/data_sources/NullUpdateProcessor.ts @@ -1,7 +1,10 @@ // This is an empty implementation, so it doesn't use this, and it has empty methods, and it // has unused variables. + /* eslint-disable class-methods-use-this */ + /* eslint-disable @typescript-eslint/no-empty-function */ + /* eslint-disable @typescript-eslint/no-unused-vars */ import { LDStreamProcessor } from '../api'; diff --git a/packages/shared/sdk-server/src/data_sources/PollingProcessor.ts b/packages/shared/sdk-server/src/data_sources/PollingProcessor.ts index ea9ed98c51..a7af081a40 100644 --- a/packages/shared/sdk-server/src/data_sources/PollingProcessor.ts +++ b/packages/shared/sdk-server/src/data_sources/PollingProcessor.ts @@ -1,4 +1,5 @@ import { LDLogger } from '@launchdarkly/js-sdk-common'; + import { LDStreamProcessor } from '../api'; import { LDDataSourceUpdates } from '../api/subsystems'; import { isHttpRecoverable, LDPollingError } from '../errors'; @@ -23,7 +24,7 @@ export default class PollingProcessor implements LDStreamProcessor { constructor( config: Configuration, private readonly requestor: Requestor, - private readonly featureStore: LDDataSourceUpdates + private readonly featureStore: LDDataSourceUpdates, ) { this.logger = config.logger; this.pollInterval = config.pollInterval; diff --git a/packages/shared/sdk-server/src/data_sources/Requestor.ts b/packages/shared/sdk-server/src/data_sources/Requestor.ts index 8ecf10cd75..b0bd20f808 100644 --- a/packages/shared/sdk-server/src/data_sources/Requestor.ts +++ b/packages/shared/sdk-server/src/data_sources/Requestor.ts @@ -1,4 +1,5 @@ import { Info, Options, Requests, Response } from '@launchdarkly/js-sdk-common'; + import { LDFeatureRequestor } from '../api/subsystems'; import { LDStreamingError } from '../errors'; import Configuration from '../options/Configuration'; @@ -24,7 +25,7 @@ export default class Requestor implements LDFeatureRequestor { sdkKey: string, config: Configuration, info: Info, - private readonly requests: Requests + private readonly requests: Requests, ) { this.headers = defaultHeaders(sdkKey, config, info); this.uri = `${config.serviceEndpoints.polling}/sdk/latest-all`; @@ -36,7 +37,7 @@ export default class Requestor implements LDFeatureRequestor { */ private async requestWithETagCache( requestUrl: string, - options: Options + options: Options, ): Promise<{ res: Response; body: string; diff --git a/packages/shared/sdk-server/src/data_sources/StreamingProcessor.ts b/packages/shared/sdk-server/src/data_sources/StreamingProcessor.ts index 8697467069..411657aff9 100644 --- a/packages/shared/sdk-server/src/data_sources/StreamingProcessor.ts +++ b/packages/shared/sdk-server/src/data_sources/StreamingProcessor.ts @@ -1,4 +1,5 @@ -import { LDLogger, EventSource, Info, Requests } from '@launchdarkly/js-sdk-common'; +import { EventSource, Info, LDLogger, Requests } from '@launchdarkly/js-sdk-common'; + import { LDStreamProcessor } from '../api'; import { LDDataSourceUpdates } from '../api/subsystems'; import { isHttpRecoverable, LDStreamingError } from '../errors'; @@ -42,7 +43,7 @@ export default class StreamingProcessor implements LDStreamProcessor { requests: Requests, info: Info, private readonly featureStore: LDDataSourceUpdates, - private readonly diagnosticsManager?: DiagnosticsManager + private readonly diagnosticsManager?: DiagnosticsManager, ) { this.headers = defaultHeaders(sdkKey, config, info); this.logger = config.logger; @@ -61,7 +62,7 @@ export default class StreamingProcessor implements LDStreamProcessor { this.diagnosticsManager.recordStreamInit( this.connectionAttemptStartTime, !success, - Date.now() - this.connectionAttemptStartTime + Date.now() - this.connectionAttemptStartTime, ); } @@ -177,7 +178,7 @@ export default class StreamingProcessor implements LDStreamProcessor { version: parsed.version, deleted: true, }, - () => {} + () => {}, ); } } diff --git a/packages/shared/sdk-server/src/data_sources/defaultHeaders.ts b/packages/shared/sdk-server/src/data_sources/defaultHeaders.ts index 3ca12c26b0..9f17672fe5 100644 --- a/packages/shared/sdk-server/src/data_sources/defaultHeaders.ts +++ b/packages/shared/sdk-server/src/data_sources/defaultHeaders.ts @@ -7,7 +7,7 @@ export interface DefaultHeaderOptions { export default function defaultHeaders( sdkKey: string, config: DefaultHeaderOptions, - info: Info + info: Info, ): { [key: string]: string } { const sdkData = info.sdkData(); const headers: { [key: string]: string } = { diff --git a/packages/shared/sdk-server/src/data_sources/httpErrorMessage.ts b/packages/shared/sdk-server/src/data_sources/httpErrorMessage.ts index 98e115d89b..4555072bca 100644 --- a/packages/shared/sdk-server/src/data_sources/httpErrorMessage.ts +++ b/packages/shared/sdk-server/src/data_sources/httpErrorMessage.ts @@ -4,7 +4,7 @@ export default function httpErrorMessage( message: string; }, context: string, - retryMessage?: string + retryMessage?: string, ): string { let desc; if (err.status) { diff --git a/packages/shared/sdk-server/src/evaluation/Bucketer.ts b/packages/shared/sdk-server/src/evaluation/Bucketer.ts index e8fb627117..1d10fba2b7 100644 --- a/packages/shared/sdk-server/src/evaluation/Bucketer.ts +++ b/packages/shared/sdk-server/src/evaluation/Bucketer.ts @@ -49,7 +49,7 @@ export default class Bucketer { attr: AttributeReference, salt: string, kindForRollout: string = 'user', - seed?: number + seed?: number, ): [number, boolean] { const value = context.valueForKind(attr, kindForRollout); const bucketableValue = valueForBucketing(value); diff --git a/packages/shared/sdk-server/src/evaluation/EvalResult.ts b/packages/shared/sdk-server/src/evaluation/EvalResult.ts index 70a9966ba3..01a712cd95 100644 --- a/packages/shared/sdk-server/src/evaluation/EvalResult.ts +++ b/packages/shared/sdk-server/src/evaluation/EvalResult.ts @@ -1,4 +1,5 @@ -import { LDEvaluationDetail, LDEvaluationReason, internal } from '@launchdarkly/js-sdk-common'; +import { internal, LDEvaluationDetail, LDEvaluationReason } from '@launchdarkly/js-sdk-common'; + import ErrorKinds from './ErrorKinds'; import Reasons from './Reasons'; @@ -14,7 +15,7 @@ export default class EvalResult { protected constructor( public readonly isError: boolean, public readonly detail: LDEvaluationDetail, - public readonly message?: string + public readonly message?: string, ) { this.isError = isError; this.detail = detail; @@ -37,7 +38,7 @@ export default class EvalResult { variationIndex: null, reason: { kind: 'ERROR', errorKind }, }, - message + message, ); } diff --git a/packages/shared/sdk-server/src/evaluation/Evaluator.ts b/packages/shared/sdk-server/src/evaluation/Evaluator.ts index 2020784b10..55b563b27c 100644 --- a/packages/shared/sdk-server/src/evaluation/Evaluator.ts +++ b/packages/shared/sdk-server/src/evaluation/Evaluator.ts @@ -1,25 +1,27 @@ /* eslint-disable class-methods-use-this */ + /* eslint-disable max-classes-per-file */ -import { Context, LDEvaluationReason, Platform, internal } from '@launchdarkly/js-sdk-common'; -import { Flag } from './data/Flag'; -import EvalResult from './EvalResult'; -import { getBucketBy, getOffVariation, getVariation } from './variations'; -import { Queries } from './Queries'; -import Reasons from './Reasons'; -import ErrorKinds from './ErrorKinds'; -import evalTargets from './evalTargets'; +import { Context, internal, LDEvaluationReason, Platform } from '@launchdarkly/js-sdk-common'; + +import { BigSegmentStoreMembership } from '../api/interfaces'; +import EventFactory from '../events/EventFactory'; +import Bucketer from './Bucketer'; import { allSeriesAsync, firstSeriesAsync } from './collection'; +import { Clause } from './data/Clause'; +import { Flag } from './data/Flag'; import { FlagRule } from './data/FlagRule'; -import Bucketer from './Bucketer'; -import { VariationOrRollout } from './data/VariationOrRollout'; -import matchClauseWithoutSegmentOperations from './matchClause'; import { Segment } from './data/Segment'; -import matchSegmentTargets from './matchSegmentTargets'; import { SegmentRule } from './data/SegmentRule'; -import { Clause } from './data/Clause'; -import EventFactory from '../events/EventFactory'; -import { BigSegmentStoreMembership } from '../api/interfaces'; +import { VariationOrRollout } from './data/VariationOrRollout'; +import ErrorKinds from './ErrorKinds'; +import EvalResult from './EvalResult'; +import evalTargets from './evalTargets'; import makeBigSegmentRef from './makeBigSegmentRef'; +import matchClauseWithoutSegmentOperations from './matchClause'; +import matchSegmentTargets from './matchSegmentTargets'; +import { Queries } from './Queries'; +import Reasons from './Reasons'; +import { getBucketBy, getOffVariation, getVariation } from './variations'; type BigSegmentStoreStatusString = 'HEALTHY' | 'STALE' | 'STORE_ERROR' | 'NOT_CONFIGURED'; @@ -43,7 +45,7 @@ function getBigSegmentsStatusPriority(status?: BigSegmentStoreStatusString) { */ function computeUpdatedBigSegmentsStatus( old?: BigSegmentStoreStatusString, - latest?: BigSegmentStoreStatusString + latest?: BigSegmentStoreStatusString, ): BigSegmentStoreStatusString | undefined { if ( old !== undefined && @@ -124,7 +126,7 @@ export default class Evaluator { // eslint-disable-next-line @typescript-eslint/no-unused-vars state: EvalState, visitedFlags: string[], - eventFactory?: EventFactory + eventFactory?: EventFactory, ): Promise { if (!flag.on) { return getOffVariation(flag, Reasons.Off); @@ -135,7 +137,7 @@ export default class Evaluator { context, state, visitedFlags, - eventFactory + eventFactory, ); // If there is a prereq result, then prereqs have failed, or there was // an error. @@ -170,7 +172,7 @@ export default class Evaluator { context: Context, state: EvalState, visitedFlags: string[], - eventFactory?: EventFactory + eventFactory?: EventFactory, ): Promise { let prereqResult: EvalResult | undefined; @@ -185,7 +187,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.', ); return false; } @@ -202,7 +204,7 @@ export default class Evaluator { context, state, updatedVisitedFlags, - eventFactory + eventFactory, ); // eslint-disable-next-line no-param-reassign @@ -210,7 +212,7 @@ export default class Evaluator { if (eventFactory) { state.events.push( - eventFactory.evalEvent(prereqFlag, context, evalResult.detail, null, flag) + eventFactory.evalEvent(prereqFlag, context, evalResult.detail, null, flag), ); } @@ -246,7 +248,7 @@ export default class Evaluator { private async evaluateRules( flag: Flag, context: Context, - state: EvalState + state: EvalState, ): Promise { let ruleResult: EvalResult | undefined; @@ -262,7 +264,7 @@ export default class Evaluator { clause: Clause, context: Context, segmentsVisited: string[], - state: EvalState + state: EvalState, ): Promise { let errorResult: EvalResult | undefined; if (clause.op === 'segmentMatch') { @@ -273,7 +275,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. return true; @@ -299,7 +301,7 @@ export default class Evaluator { // This is after segment matching, which does not use the reference. if (!clause.attributeReference.isValid) { return new MatchError( - EvalResult.forError(ErrorKinds.MalformedFlag, 'Invalid attribute reference in clause') + EvalResult.forError(ErrorKinds.MalformedFlag, 'Invalid attribute reference in clause'), ); } @@ -320,7 +322,7 @@ export default class Evaluator { ruleIndex: number, context: Context, state: EvalState, - segmentsVisited: string[] + segmentsVisited: string[], ): Promise { if (!rule.clauses) { return undefined; @@ -346,7 +348,7 @@ export default class Evaluator { varOrRollout: VariationOrRollout, context: Context, flag: Flag, - reason: LDEvaluationReason + reason: LDEvaluationReason, ): EvalResult { if (varOrRollout === undefined) { // By spec this field should be defined, but better to be overly cautious. @@ -369,7 +371,7 @@ export default class Evaluator { if (!bucketBy.isValid) { return EvalResult.forError( ErrorKinds.MalformedFlag, - 'Invalid attribute reference for bucketBy in rollout' + 'Invalid attribute reference for bucketBy in rollout', ); } @@ -379,7 +381,7 @@ export default class Evaluator { bucketBy, flag.salt || '', rollout.contextKind, - rollout.seed + rollout.seed, ); const updatedReason = { ...reason }; @@ -412,7 +414,7 @@ export default class Evaluator { } return EvalResult.forError( ErrorKinds.MalformedFlag, - 'Variation/rollout object with no variation or rollout' + 'Variation/rollout object with no variation or rollout', ); } @@ -421,7 +423,7 @@ export default class Evaluator { rule: SegmentRule, context: Context, state: EvalState, - segmentsVisited: string[] + segmentsVisited: string[], ): Promise { let errorResult: EvalResult | undefined; const match = await allSeriesAsync(rule.clauses, async (clause) => { @@ -441,7 +443,7 @@ export default class Evaluator { const bucketBy = getBucketBy(false, rule.bucketByAttributeReference); if (!bucketBy.isValid) { return new MatchError( - EvalResult.forError(ErrorKinds.MalformedFlag, 'Invalid attribute reference in clause') + EvalResult.forError(ErrorKinds.MalformedFlag, 'Invalid attribute reference in clause'), ); } @@ -450,7 +452,7 @@ export default class Evaluator { segment.key, bucketBy, segment.salt || '', - rule.rolloutContextKind + rule.rolloutContextKind, ); return new Match(bucket < rule.weight / 100000.0); } @@ -463,7 +465,7 @@ export default class Evaluator { segment: Segment, context: Context, state: EvalState, - segmentsVisited: string[] + segmentsVisited: string[], ): Promise { if (!segment.unbounded) { const includeExclude = matchSegmentTargets(segment, context); @@ -479,7 +481,7 @@ export default class Evaluator { rule, context, state, - segmentsVisited + segmentsVisited, ); evalResult = res.result; return res.error || res.isMatch; @@ -497,7 +499,7 @@ export default class Evaluator { // eslint-disable-next-line @typescript-eslint/no-unused-vars state: EvalState, // eslint-disable-next-line @typescript-eslint/no-unused-vars - segmentsVisited: string[] + segmentsVisited: string[], ): Promise { if (!segment.unbounded) { return this.simpleSegmentMatchContext(segment, context, state, segmentsVisited); @@ -518,7 +520,7 @@ export default class Evaluator { // eslint-disable-next-line no-param-reassign state.bigSegmentsStatus = computeUpdatedBigSegmentsStatus( state.bigSegmentsStatus, - 'NOT_CONFIGURED' + 'NOT_CONFIGURED', ); return new Match(false); } @@ -533,7 +535,7 @@ export default class Evaluator { state.bigSegmentsMembership[keyForBigSegment], segment, context, - state + state, ); } @@ -548,13 +550,13 @@ export default class Evaluator { // eslint-disable-next-line no-param-reassign state.bigSegmentsStatus = computeUpdatedBigSegmentsStatus( state.bigSegmentsStatus, - status as BigSegmentStoreStatusString + status as BigSegmentStoreStatusString, ); } else { // eslint-disable-next-line no-param-reassign state.bigSegmentsStatus = computeUpdatedBigSegmentsStatus( state.bigSegmentsStatus, - 'NOT_CONFIGURED' + 'NOT_CONFIGURED', ); } /* eslint-enable no-param-reassign */ @@ -562,7 +564,7 @@ export default class Evaluator { state.bigSegmentsMembership[keyForBigSegment], segment, context, - state + state, ); } @@ -570,7 +572,7 @@ export default class Evaluator { membership: BigSegmentStoreMembership | null, segment: Segment, context: Context, - state: EvalState + state: EvalState, ): Promise { const segmentRef = makeBigSegmentRef(segment); const included = membership?.[segmentRef]; diff --git a/packages/shared/sdk-server/src/evaluation/Operations.ts b/packages/shared/sdk-server/src/evaluation/Operations.ts index edc60a88e3..58361c9f00 100644 --- a/packages/shared/sdk-server/src/evaluation/Operations.ts +++ b/packages/shared/sdk-server/src/evaluation/Operations.ts @@ -1,6 +1,7 @@ -import { TypeValidator, TypeValidators } from '@launchdarkly/js-sdk-common'; import { parse, SemVer } from 'semver'; +import { TypeValidator, TypeValidators } from '@launchdarkly/js-sdk-common'; + const VERSION_COMPONENTS_REGEX = /^\d+(\.\d+)?(\.\d+)?/; function parseSemver(input: any): SemVer | null { @@ -50,7 +51,7 @@ function semVerOperator(fn: OperatorFn): OperatorFn { function makeOperator( fn: OperatorFn, validator: TypeValidator, - converter?: (val: any) => T + converter?: (val: any) => T, ): OperatorFn { return (a: any, b: any) => { if (validator.is(a) && validator.is(b)) { @@ -90,7 +91,7 @@ const operators: OperatorsInterface = { startsWith: makeOperator((a, b) => a.startsWith(b), TypeValidators.String), matches: makeOperator( (value, pattern) => safeRegexMatch(pattern, value), - TypeValidators.String + TypeValidators.String, ), contains: makeOperator((a, b) => a.indexOf(b) > -1, TypeValidators.String), lessThan: makeOperator((a, b) => a < b, TypeValidators.Number), diff --git a/packages/shared/sdk-server/src/evaluation/Queries.ts b/packages/shared/sdk-server/src/evaluation/Queries.ts index 0a5e0f08d7..4bcd2677d1 100644 --- a/packages/shared/sdk-server/src/evaluation/Queries.ts +++ b/packages/shared/sdk-server/src/evaluation/Queries.ts @@ -12,6 +12,6 @@ export interface Queries { getFlag(key: string): Promise; getSegment(key: string): Promise; getBigSegmentsMembership( - userKey: string + userKey: string, ): Promise<[BigSegmentStoreMembership | null, string] | undefined>; } diff --git a/packages/shared/sdk-server/src/evaluation/collection.ts b/packages/shared/sdk-server/src/evaluation/collection.ts index 541c9df2d9..997e8a986d 100644 --- a/packages/shared/sdk-server/src/evaluation/collection.ts +++ b/packages/shared/sdk-server/src/evaluation/collection.ts @@ -8,7 +8,7 @@ */ export function firstResult( collection: T[] | undefined, - operator: (val: T, index: number) => U | undefined + operator: (val: T, index: number) => U | undefined, ): U | undefined { let res; collection?.some((item, index) => { @@ -21,7 +21,7 @@ export function firstResult( async function seriesAsync( collection: T[] | undefined, check: (val: T, index: number) => Promise, - all: boolean + all: boolean, ) { if (!collection) { return false; @@ -56,7 +56,7 @@ async function seriesAsync( */ export async function allSeriesAsync( collection: T[] | undefined, - check: (val: T, index: number) => Promise + check: (val: T, index: number) => Promise, ): Promise { return seriesAsync(collection, check, true); } @@ -70,7 +70,7 @@ export async function allSeriesAsync( */ export async function firstSeriesAsync( collection: T[] | undefined, - check: (val: T, index: number) => Promise + check: (val: T, index: number) => Promise, ): Promise { return seriesAsync(collection, check, false); } diff --git a/packages/shared/sdk-server/src/evaluation/data/Flag.ts b/packages/shared/sdk-server/src/evaluation/data/Flag.ts index 3dacc0dc75..c5d03cb9f3 100644 --- a/packages/shared/sdk-server/src/evaluation/data/Flag.ts +++ b/packages/shared/sdk-server/src/evaluation/data/Flag.ts @@ -1,9 +1,9 @@ import { ClientSideAvailability } from './ClientSideAvailability'; -import { Prerequisite } from './Prerequisite'; import { FlagRule } from './FlagRule'; +import { Prerequisite } from './Prerequisite'; +import { Rollout } from './Rollout'; import { Target } from './Target'; import { Versioned } from './Versioned'; -import { Rollout } from './Rollout'; interface VariationOrRollout { variation?: number; diff --git a/packages/shared/sdk-server/src/evaluation/data/Rollout.ts b/packages/shared/sdk-server/src/evaluation/data/Rollout.ts index 2bd6207be5..e47f85b253 100644 --- a/packages/shared/sdk-server/src/evaluation/data/Rollout.ts +++ b/packages/shared/sdk-server/src/evaluation/data/Rollout.ts @@ -1,4 +1,5 @@ import { AttributeReference } from '@launchdarkly/js-sdk-common'; + import { WeightedVariation } from './WeightedVariation'; type RolloutKind = 'rollout' | 'experiment'; diff --git a/packages/shared/sdk-server/src/evaluation/data/Segment.ts b/packages/shared/sdk-server/src/evaluation/data/Segment.ts index f96292f413..6c07e4f02b 100644 --- a/packages/shared/sdk-server/src/evaluation/data/Segment.ts +++ b/packages/shared/sdk-server/src/evaluation/data/Segment.ts @@ -1,7 +1,8 @@ import { AttributeReference } from '@launchdarkly/js-sdk-common'; + +import { SegmentRule } from './SegmentRule'; import { SegmentTarget } from './SegmentTarget'; import { Versioned } from './Versioned'; -import { SegmentRule } from './SegmentRule'; export interface Segment extends Versioned { included?: string[]; diff --git a/packages/shared/sdk-server/src/evaluation/data/SegmentRule.ts b/packages/shared/sdk-server/src/evaluation/data/SegmentRule.ts index 88a99953ab..f5be930382 100644 --- a/packages/shared/sdk-server/src/evaluation/data/SegmentRule.ts +++ b/packages/shared/sdk-server/src/evaluation/data/SegmentRule.ts @@ -1,4 +1,5 @@ import { AttributeReference } from '@launchdarkly/js-sdk-common'; + import { Clause } from './Clause'; export interface SegmentRule { diff --git a/packages/shared/sdk-server/src/evaluation/evalTargets.ts b/packages/shared/sdk-server/src/evaluation/evalTargets.ts index 5c2ec0a9b5..9f489593da 100644 --- a/packages/shared/sdk-server/src/evaluation/evalTargets.ts +++ b/packages/shared/sdk-server/src/evaluation/evalTargets.ts @@ -1,10 +1,11 @@ import { Context } from '@launchdarkly/js-sdk-common'; + +import { firstResult } from './collection'; import { Flag } from './data/Flag'; import { Target } from './data/Target'; import EvalResult from './EvalResult'; -import { getVariation } from './variations'; import Reasons from './Reasons'; -import { firstResult } from './collection'; +import { getVariation } from './variations'; function evalTarget(flag: Flag, target: Target, context: Context): EvalResult | undefined { const contextKey = context.key(target.contextKind); diff --git a/packages/shared/sdk-server/src/evaluation/matchClause.ts b/packages/shared/sdk-server/src/evaluation/matchClause.ts index a7f2f0e2cd..c6d28eed99 100644 --- a/packages/shared/sdk-server/src/evaluation/matchClause.ts +++ b/packages/shared/sdk-server/src/evaluation/matchClause.ts @@ -1,6 +1,7 @@ import { Context } from '@launchdarkly/js-sdk-common'; -import Operators from './Operations'; + import { Clause } from './data/Clause'; +import Operators from './Operations'; function maybeNegate(clause: Clause, value: boolean): boolean { if (clause.negate) { @@ -23,7 +24,7 @@ function matchAny(op: string, value: any, values: any[]) { */ export default function matchClauseWithoutSegmentOperations( clause: Clause, - context: Context + context: Context, ): boolean { const contextValue = context.valueForKind(clause.attributeReference, clause.contextKind); if (contextValue === null || contextValue === undefined) { @@ -32,7 +33,7 @@ export default function matchClauseWithoutSegmentOperations( if (Array.isArray(contextValue)) { return maybeNegate( clause, - contextValue.some((value) => matchAny(clause.op, value, clause.values)) + contextValue.some((value) => matchAny(clause.op, value, clause.values)), ); } return maybeNegate(clause, matchAny(clause.op, contextValue, clause.values)); diff --git a/packages/shared/sdk-server/src/evaluation/matchSegmentTargets.ts b/packages/shared/sdk-server/src/evaluation/matchSegmentTargets.ts index 39f10c87c3..3e730eb971 100644 --- a/packages/shared/sdk-server/src/evaluation/matchSegmentTargets.ts +++ b/packages/shared/sdk-server/src/evaluation/matchSegmentTargets.ts @@ -1,11 +1,12 @@ import { Context } from '@launchdarkly/js-sdk-common'; + import { Segment } from './data/Segment'; import { SegmentTarget } from './data/SegmentTarget'; function segmentSearch( context: Context, contextTargets?: SegmentTarget[], - userTargets?: string[] + userTargets?: string[], ): boolean { if (contextTargets) { for (let targetIndex = 0; targetIndex < contextTargets.length; targetIndex += 1) { @@ -30,7 +31,7 @@ function segmentSearch( export default function matchSegmentTargets( segment: Segment, - context: Context + context: Context, ): boolean | undefined { const included = segmentSearch(context, segment.includedContexts, segment.included); if (included) { diff --git a/packages/shared/sdk-server/src/evaluation/variations.ts b/packages/shared/sdk-server/src/evaluation/variations.ts index e6899a11e9..7c048a2b29 100644 --- a/packages/shared/sdk-server/src/evaluation/variations.ts +++ b/packages/shared/sdk-server/src/evaluation/variations.ts @@ -1,8 +1,9 @@ import { AttributeReference, - TypeValidators, LDEvaluationReason, + TypeValidators, } from '@launchdarkly/js-sdk-common'; + import { Flag } from './data/Flag'; import ErrorKinds from './ErrorKinds'; import EvalResult from './EvalResult'; @@ -46,7 +47,7 @@ export function getOffVariation(flag: Flag, reason: LDEvaluationReason): EvalRes export function getBucketBy( isExperiment: boolean, - bucketByAttributeReference: AttributeReference | undefined + bucketByAttributeReference: AttributeReference | undefined, ) { return (isExperiment ? undefined : bucketByAttributeReference) ?? KEY_ATTR_REF; } diff --git a/packages/shared/sdk-server/src/events/ContextDeduplicator.ts b/packages/shared/sdk-server/src/events/ContextDeduplicator.ts index cf9a560a93..4792d7f141 100644 --- a/packages/shared/sdk-server/src/events/ContextDeduplicator.ts +++ b/packages/shared/sdk-server/src/events/ContextDeduplicator.ts @@ -1,4 +1,5 @@ import { Context, subsystem } from '@launchdarkly/js-sdk-common'; + import LruCache from '../cache/LruCache'; export interface ContextDeduplicatorOptions { diff --git a/packages/shared/sdk-server/src/events/DiagnosticsManager.ts b/packages/shared/sdk-server/src/events/DiagnosticsManager.ts index 1b9c41f7b2..e9fb1a8061 100644 --- a/packages/shared/sdk-server/src/events/DiagnosticsManager.ts +++ b/packages/shared/sdk-server/src/events/DiagnosticsManager.ts @@ -1,4 +1,5 @@ import { Platform } from '@launchdarkly/js-sdk-common'; + import { LDFeatureStore } from '../api/subsystems'; import Configuration, { defaultValues } from '../options/Configuration'; @@ -97,7 +98,7 @@ export default class DiagnosticsManager { sdkKey: string, private readonly config: Configuration, private readonly platform: Platform, - private readonly featureStore: LDFeatureStore + private readonly featureStore: LDFeatureStore, ) { this.startTime = Date.now(); this.dataSinceDate = this.startTime; @@ -177,7 +178,7 @@ export default class DiagnosticsManager { createStatsEventAndReset( droppedEvents: number, deduplicatedUsers: number, - eventsInLastBatch: number + eventsInLastBatch: number, ): DiagnosticStatsEvent { const currentTime = Date.now(); const evt: DiagnosticStatsEvent = { diff --git a/packages/shared/sdk-server/src/events/EventFactory.ts b/packages/shared/sdk-server/src/events/EventFactory.ts index 24d6fb7296..76411dd48b 100644 --- a/packages/shared/sdk-server/src/events/EventFactory.ts +++ b/packages/shared/sdk-server/src/events/EventFactory.ts @@ -1,4 +1,5 @@ -import { Context, LDEvaluationDetail, internal } from '@launchdarkly/js-sdk-common'; +import { Context, internal, LDEvaluationDetail } from '@launchdarkly/js-sdk-common'; + import { Flag } from '../evaluation/data/Flag'; import isExperiment from './isExperiment'; @@ -13,7 +14,7 @@ export default class EventFactory { context: Context, detail: LDEvaluationDetail, defaultVal: any, - prereqOfFlag?: Flag + prereqOfFlag?: Flag, ): internal.InputEvalEvent { const addExperimentData = isExperiment(flag, detail.reason); return new internal.InputEvalEvent( @@ -28,7 +29,7 @@ export default class EventFactory { flag.trackEvents || addExperimentData, prereqOfFlag?.key, this.withReasons || addExperimentData ? detail.reason : undefined, - flag.debugEventsUntilDate + flag.debugEventsUntilDate, ); } diff --git a/packages/shared/sdk-server/src/events/EventSender.ts b/packages/shared/sdk-server/src/events/EventSender.ts index f0586076fc..e405a62546 100644 --- a/packages/shared/sdk-server/src/events/EventSender.ts +++ b/packages/shared/sdk-server/src/events/EventSender.ts @@ -5,9 +5,10 @@ import { Requests, subsystem, } from '@launchdarkly/js-sdk-common'; + import defaultHeaders from '../data_sources/defaultHeaders'; import httpErrorMessage from '../data_sources/httpErrorMessage'; -import { LDUnexpectedResponseError, isHttpRecoverable } from '../errors'; +import { isHttpRecoverable, LDUnexpectedResponseError } from '../errors'; export interface EventSenderOptions { tags: ApplicationTags; @@ -31,7 +32,7 @@ export default class EventSender implements subsystem.LDEventSender { ...defaultHeaders( clientContext.basicConfiguration.sdkKey, config, - clientContext.platform.info + clientContext.platform.info, ), }; @@ -48,7 +49,7 @@ export default class EventSender implements subsystem.LDEventSender { events: any, uri: string, payloadId: string | undefined, - canRetry: boolean + canRetry: boolean, ): Promise { const tryRes: subsystem.LDEventSenderResult = { status: subsystem.LDDeliveryStatus.Succeeded, @@ -83,8 +84,8 @@ export default class EventSender implements subsystem.LDEventSender { error = new LDUnexpectedResponseError( httpErrorMessage( { status: res.status, message: 'some events were dropped' }, - 'event posting' - ) + 'event posting', + ), ); if (!isHttpRecoverable(res.status)) { @@ -110,7 +111,7 @@ export default class EventSender implements subsystem.LDEventSender { async sendEventData( type: subsystem.LDEventType, - data: any + data: any, ): Promise { const payloadId = type === subsystem.LDEventType.AnalyticsEvents ? this.crypto.randomUUID() : undefined; diff --git a/packages/shared/sdk-server/src/events/NullEventProcessor.ts b/packages/shared/sdk-server/src/events/NullEventProcessor.ts index af25621c92..2dd4ae313e 100644 --- a/packages/shared/sdk-server/src/events/NullEventProcessor.ts +++ b/packages/shared/sdk-server/src/events/NullEventProcessor.ts @@ -1,7 +1,10 @@ // This is an empty implementation, so it doesn't use this, and it has empty methods, and it // has unused variables. + /* eslint-disable class-methods-use-this */ + /* eslint-disable @typescript-eslint/no-empty-function */ + /* eslint-disable @typescript-eslint/no-unused-vars */ import { internal, subsystem } from '@launchdarkly/js-sdk-common'; diff --git a/packages/shared/sdk-server/src/events/isExperiment.ts b/packages/shared/sdk-server/src/events/isExperiment.ts index aa132a0777..734efc713a 100644 --- a/packages/shared/sdk-server/src/events/isExperiment.ts +++ b/packages/shared/sdk-server/src/events/isExperiment.ts @@ -1,4 +1,5 @@ import { LDEvaluationReason } from '@launchdarkly/js-sdk-common'; + import { Flag } from '../evaluation/data/Flag'; /** diff --git a/packages/shared/sdk-server/src/index.ts b/packages/shared/sdk-server/src/index.ts index b538e7a8cb..96acd80a43 100644 --- a/packages/shared/sdk-server/src/index.ts +++ b/packages/shared/sdk-server/src/index.ts @@ -1,5 +1,5 @@ -import LDClientImpl from './LDClientImpl'; import BigSegmentStoreStatusProviderImpl from './BigSegmentStatusProviderImpl'; +import LDClientImpl from './LDClientImpl'; export * as integrations from './integrations'; export * as platform from '@launchdarkly/js-sdk-common'; diff --git a/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts b/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts index 590477ba37..896542c9b7 100644 --- a/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts +++ b/packages/shared/sdk-server/src/integrations/FileDataSourceFactory.ts @@ -1,4 +1,5 @@ -import { LDLogger, LDClientContext } from '@launchdarkly/js-sdk-common'; +import { LDClientContext, LDLogger } from '@launchdarkly/js-sdk-common'; + import { FileDataSourceOptions } from '../api/integrations'; import { LDFeatureStore, LDStreamProcessor } from '../api/subsystems'; import FileDataSource from '../data_sources/FileDataSource'; @@ -41,7 +42,7 @@ export default class FileDataSourceFactory { getFactory(): ( ldClientContext: LDClientContext, - featureStore: LDFeatureStore + featureStore: LDFeatureStore, ) => LDStreamProcessor { return (ldClientContext, featureStore) => this.create(ldClientContext, featureStore); } diff --git a/packages/shared/sdk-server/src/integrations/test_data/TestData.ts b/packages/shared/sdk-server/src/integrations/test_data/TestData.ts index 0c7b49ce33..1dc2614888 100644 --- a/packages/shared/sdk-server/src/integrations/test_data/TestData.ts +++ b/packages/shared/sdk-server/src/integrations/test_data/TestData.ts @@ -1,4 +1,5 @@ import { LDClientContext } from '@launchdarkly/js-sdk-common'; + import { LDStreamProcessor } from '../../api'; import { LDFeatureStore } from '../../api/subsystems'; import { Flag } from '../../evaluation/data/Flag'; @@ -56,14 +57,14 @@ export default class TestData { */ getFactory(): ( clientContext: LDClientContext, - featureStore: LDFeatureStore + featureStore: LDFeatureStore, ) => LDStreamProcessor { // Provides an arrow function to prevent needed to bind the method to // maintain `this`. return ( /* eslint-disable-next-line @typescript-eslint/no-unused-vars */ clientContext: LDClientContext, - featureStore: LDFeatureStore + featureStore: LDFeatureStore, ) => { const newSource = new TestDataSource( new AsyncStoreFacade(featureStore), @@ -72,7 +73,7 @@ export default class TestData { this.currentSegments, (tds) => { this.dataSources.splice(this.dataSources.indexOf(tds)); - } + }, ); this.dataSources.push(newSource); @@ -132,7 +133,7 @@ export default class TestData { this.flagBuilders[flagKey] = flagBuilder.clone(); return Promise.all( - this.dataSources.map((impl) => impl.upsert(VersionedDataKinds.Features, newFlag)) + this.dataSources.map((impl) => impl.upsert(VersionedDataKinds.Features, newFlag)), ); } @@ -164,7 +165,7 @@ export default class TestData { this.currentFlags[flagConfig.key] = newItem; return Promise.all( - this.dataSources.map((impl) => impl.upsert(VersionedDataKinds.Features, newItem)) + this.dataSources.map((impl) => impl.upsert(VersionedDataKinds.Features, newItem)), ); } @@ -196,7 +197,7 @@ export default class TestData { this.currentSegments[segmentConfig.key] = newItem; return Promise.all( - this.dataSources.map((impl) => impl.upsert(VersionedDataKinds.Segments, newItem)) + this.dataSources.map((impl) => impl.upsert(VersionedDataKinds.Segments, newItem)), ); } } diff --git a/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts b/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts index b07600b293..8485cc7847 100644 --- a/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts +++ b/packages/shared/sdk-server/src/integrations/test_data/TestDataFlagBuilder.ts @@ -1,9 +1,10 @@ import { TypeValidators } from '@launchdarkly/js-sdk-common'; + import { Flag } from '../../evaluation/data/Flag'; import { Target } from '../../evaluation/data/Target'; import { - TRUE_VARIATION_INDEX, FALSE_VARIATION_INDEX, + TRUE_VARIATION_INDEX, variationForBoolean, } from './booleanVariation'; import TestDataRuleBuilder from './TestDataRuleBuilder'; @@ -31,7 +32,10 @@ export default class TestDataFlagBuilder { /** * @internal */ - constructor(private readonly key: string, data?: BuilderData) { + constructor( + private readonly key: string, + data?: BuilderData, + ) { if (data) { // Not the fastest way to deep copy, but this is a testing mechanism. this.data = { @@ -236,13 +240,13 @@ export default class TestDataFlagBuilder { variationForContext( contextKind: string, contextKey: string, - variation: number | boolean + variation: number | boolean, ): TestDataFlagBuilder { if (TypeValidators.Boolean.is(variation)) { return this.booleanFlag().variationForContext( contextKind, contextKey, - variationForBoolean(variation) + variationForBoolean(variation), ); } @@ -400,14 +404,14 @@ export default class TestDataFlagBuilder { variation: parseInt(variation, 10), }); }); - } + }, ); baseFlagObject.contextTargets = contextTargets; } if (this.data.rules) { baseFlagObject.rules = this.data.rules.map((rule, i) => - (rule as TestDataRuleBuilder).build(String(i)) + (rule as TestDataRuleBuilder).build(String(i)), ); } diff --git a/packages/shared/sdk-server/src/integrations/test_data/TestDataRuleBuilder.ts b/packages/shared/sdk-server/src/integrations/test_data/TestDataRuleBuilder.ts index 881239258f..a134231de7 100644 --- a/packages/shared/sdk-server/src/integrations/test_data/TestDataRuleBuilder.ts +++ b/packages/shared/sdk-server/src/integrations/test_data/TestDataRuleBuilder.ts @@ -1,6 +1,7 @@ import { AttributeReference, TypeValidators } from '@launchdarkly/js-sdk-common'; -import { variationForBoolean } from './booleanVariation'; + import { Clause } from '../../evaluation/data/Clause'; +import { variationForBoolean } from './booleanVariation'; /** * A builder for feature flag rules to be used with {@link TestDataFlagBuilder}. @@ -30,7 +31,7 @@ export default class TestDataRuleBuilder { booleanFlag: () => BuilderType; }, clauses?: Clause[], - variation?: number + variation?: number, ) { if (clauses) { this.clauses = [...clauses]; diff --git a/packages/shared/sdk-server/src/integrations/test_data/TestDataSource.ts b/packages/shared/sdk-server/src/integrations/test_data/TestDataSource.ts index a17bdeca5b..6f44bfba94 100644 --- a/packages/shared/sdk-server/src/integrations/test_data/TestDataSource.ts +++ b/packages/shared/sdk-server/src/integrations/test_data/TestDataSource.ts @@ -14,7 +14,7 @@ export default class TestDataSource implements LDStreamProcessor { private readonly featureStore: AsyncStoreFacade, private readonly flags: Record, private readonly segments: Record, - private readonly onStop: (tfs: TestDataSource) => void + private readonly onStop: (tfs: TestDataSource) => void, ) {} async start(fn?: ((err?: any) => void) | undefined) { diff --git a/packages/shared/sdk-server/src/options/Configuration.ts b/packages/shared/sdk-server/src/options/Configuration.ts index a60f8989cc..35e4f0af0a 100644 --- a/packages/shared/sdk-server/src/options/Configuration.ts +++ b/packages/shared/sdk-server/src/options/Configuration.ts @@ -1,13 +1,14 @@ import { + ApplicationTags, + LDClientContext, LDLogger, NumberWithMinimum, - TypeValidator, - TypeValidators, - ApplicationTags, OptionMessages, - LDClientContext, ServiceEndpoints, + TypeValidator, + TypeValidators, } from '@launchdarkly/js-sdk-common'; + import { LDBigSegmentsOptions, LDOptions, @@ -108,7 +109,7 @@ function validateTypesAndNames(options: LDOptions): { validatedOptions[optionName] = min; } else { errors.push( - OptionMessages.wrongOptionType(optionName, validator.getType(), typeof optionValue) + OptionMessages.wrongOptionType(optionName, validator.getType(), typeof optionValue), ); validatedOptions[optionName] = defaultValues[optionName]; } @@ -203,7 +204,7 @@ export default class Configuration { public readonly updateProcessorFactory?: ( clientContext: LDClientContext, - dataSourceUpdates: LDDataSourceUpdates + dataSourceUpdates: LDDataSourceUpdates, ) => LDStreamProcessor; public readonly bigSegments?: LDBigSegmentsOptions; @@ -226,7 +227,7 @@ export default class Configuration { this.serviceEndpoints = new ServiceEndpoints( validatedOptions.streamUri, validatedOptions.baseUri, - validatedOptions.eventsUri + validatedOptions.eventsUri, ); this.eventsCapacity = validatedOptions.capacity; this.timeout = validatedOptions.timeout; diff --git a/packages/shared/sdk-server/src/options/ValidatedOptions.ts b/packages/shared/sdk-server/src/options/ValidatedOptions.ts index 24d6973821..894898b814 100644 --- a/packages/shared/sdk-server/src/options/ValidatedOptions.ts +++ b/packages/shared/sdk-server/src/options/ValidatedOptions.ts @@ -1,4 +1,5 @@ import { LDLogger } from '@launchdarkly/js-sdk-common'; + import { LDBigSegmentsOptions, LDOptions, diff --git a/packages/shared/sdk-server/src/store/InMemoryFeatureStore.ts b/packages/shared/sdk-server/src/store/InMemoryFeatureStore.ts index c00ff5af13..6464a87cb7 100644 --- a/packages/shared/sdk-server/src/store/InMemoryFeatureStore.ts +++ b/packages/shared/sdk-server/src/store/InMemoryFeatureStore.ts @@ -1,10 +1,10 @@ import { DataKind } from '../api/interfaces'; import { - LDFeatureStoreDataStorage, - LDKeyedFeatureStoreItem, LDFeatureStore, - LDFeatureStoreKindData, + LDFeatureStoreDataStorage, LDFeatureStoreItem, + LDFeatureStoreKindData, + LDKeyedFeatureStoreItem, } from '../api/subsystems'; export default class InMemoryFeatureStore implements LDFeatureStore { diff --git a/packages/shared/sdk-server/src/store/PersistentDataStoreWrapper.ts b/packages/shared/sdk-server/src/store/PersistentDataStoreWrapper.ts index 1bac5f0f75..1995486dcd 100644 --- a/packages/shared/sdk-server/src/store/PersistentDataStoreWrapper.ts +++ b/packages/shared/sdk-server/src/store/PersistentDataStoreWrapper.ts @@ -56,7 +56,7 @@ function deletedDescriptor(version: number): ItemDescriptor { */ function deserialize( kind: PersistentStoreDataKind, - descriptor: SerializedItemDescriptor + descriptor: SerializedItemDescriptor, ): ItemDescriptor { if (descriptor.deleted || !descriptor.serializedItem) { return deletedDescriptor(descriptor.version); @@ -105,7 +105,10 @@ export default class PersistentDataStoreWrapper implements LDFeatureStore { */ private queue: UpdateQueue = new UpdateQueue(); - constructor(private readonly core: PersistentDataStore, ttl: number) { + constructor( + private readonly core: PersistentDataStore, + ttl: number, + ) { if (ttl) { this.itemCache = new TtlCache({ ttl, @@ -239,7 +242,7 @@ export default class PersistentDataStoreWrapper implements LDFeatureStore { } } cb(); - } + }, ); }, callback); } diff --git a/packages/shared/sdk-server/src/store/serialization.ts b/packages/shared/sdk-server/src/store/serialization.ts index 945f3b00c3..0807fb087a 100644 --- a/packages/shared/sdk-server/src/store/serialization.ts +++ b/packages/shared/sdk-server/src/store/serialization.ts @@ -1,12 +1,14 @@ // The deserialization will be updating parameter values, so we don't need this // warning in this file. + /* eslint-disable no-param-reassign */ import { AttributeReference } from '@launchdarkly/js-sdk-common'; + +import { VersionedData } from '../api/interfaces'; import { Flag } from '../evaluation/data/Flag'; +import { Rollout } from '../evaluation/data/Rollout'; import { Segment } from '../evaluation/data/Segment'; -import { VersionedData } from '../api/interfaces'; import VersionedDataKinds, { VersionedDataKind } from './VersionedDataKinds'; -import { Rollout } from '../evaluation/data/Rollout'; /** * @internal @@ -70,7 +72,7 @@ function processRollout(rollout?: Rollout) { if (rollout && rollout.bucketBy) { rollout.bucketByAttributeReference = new AttributeReference( rollout.bucketBy, - !rollout.contextKind + !rollout.contextKind, ); } } @@ -108,7 +110,7 @@ export function processSegment(segment: Segment) { // So use the rolloutContextKind to indicate if this is new or old data. rule.bucketByAttributeReference = new AttributeReference( rule.bucketBy, - !rule.rolloutContextKind + !rule.rolloutContextKind, ); } rule?.clauses?.forEach((clause) => { diff --git a/packages/shared/sdk-server/src/store/sortDataSet.ts b/packages/shared/sdk-server/src/store/sortDataSet.ts index 27df9155c6..3812faa2d6 100644 --- a/packages/shared/sdk-server/src/store/sortDataSet.ts +++ b/packages/shared/sdk-server/src/store/sortDataSet.ts @@ -1,10 +1,10 @@ -import { Flag } from '../evaluation/data/Flag'; -import { PersistentStoreDataKindInternal, persistentStoreKinds } from './persistentStoreKinds'; -import { LDFeatureStoreDataStorage, LDFeatureStoreKindData } from '../api/subsystems'; import KeyedItem from '../api/interfaces/persistent_store/KeyedItem'; +import { KindKeyedStore } from '../api/interfaces/persistent_store/PersistentDataStore'; import PersistentStoreDataKind from '../api/interfaces/persistent_store/PersistentStoreDataKind'; import SerializedItemDescriptor from '../api/interfaces/persistent_store/SerializedItemDescriptor'; -import { KindKeyedStore } from '../api/interfaces/persistent_store/PersistentDataStore'; +import { LDFeatureStoreDataStorage, LDFeatureStoreKindData } from '../api/subsystems'; +import { Flag } from '../evaluation/data/Flag'; +import { PersistentStoreDataKindInternal, persistentStoreKinds } from './persistentStoreKinds'; function getDependencyKeys(flag: Flag): string[] { if (!flag.prerequisites || !flag.prerequisites.length) { @@ -19,7 +19,7 @@ function getDependencyKeys(flag: Flag): string[] { */ function topologicalSort( kind: PersistentStoreDataKindInternal, - itemsMap: LDFeatureStoreKindData + itemsMap: LDFeatureStoreKindData, ): KeyedItem[] { const sortedItems: KeyedItem[] = []; const unvisitedItems: Set = new Set(Object.keys(itemsMap)); @@ -67,7 +67,7 @@ function topologicalSort( * if there are no flags. */ export default function sortDataSet( - dataMap: LDFeatureStoreDataStorage + dataMap: LDFeatureStoreDataStorage, ): KindKeyedStore { // We use a different type for collecting the results so that we have access // to the serialization methods and priorities. diff --git a/packages/store/node-server-sdk-dynamodb/README.md b/packages/store/node-server-sdk-dynamodb/README.md index ac6d1b5a62..1fe7e98717 100644 --- a/packages/store/node-server-sdk-dynamodb/README.md +++ b/packages/store/node-server-sdk-dynamodb/README.md @@ -5,7 +5,7 @@ [![Documentation](https://img.shields.io/static/v1?label=GitHub+Pages&message=API+reference&color=00add8)](https://launchdarkly.github.io/js-core/packages/store/node-server-sdk-dynamodb/docs/) This library provides a DynamoDB-backed persistence mechanism (feature store) for the [LaunchDarkly Node.js SDK](https://github.com/launchdarkly/js-core/packages/sdk/server-node), replacing the default in-memory feature store. It uses the AWS SDK for Node.js. -The minimum version of the LaunchDarkly Server-Side SDK for Node for use with this library is 8.0.0. +The minimum version of the LaunchDarkly Server-Side SDK for Node for use with this library is 8.0.0. ## LaunchDarkly overview @@ -59,7 +59,9 @@ const store = DynamoDBFeatureStoreFactory('YOUR TABLE NAME', { clientOptions: dy Alternatively, if you already have a fully configured DynamoDB client object, you can tell LaunchDarkly to use that: ```typescript -const store = DynamoDBFeatureStoreFactory('YOUR TABLE NAME', { dynamoDBClient: myDynamoDBClientInstance }); +const store = DynamoDBFeatureStoreFactory('YOUR TABLE NAME', { + dynamoDBClient: myDynamoDBClientInstance, +}); ``` 6. If you are running a [LaunchDarkly Relay Proxy](https://github.com/launchdarkly/ld-relay) instance, or any other process that will pre-populate the DynamoDB table with feature flags from LaunchDarkly, you can use [daemon mode](https://github.com/launchdarkly/ld-relay#daemon-mode), so that the SDK retrieves flag data only from DynamoDB and does not communicate directly with LaunchDarkly. This is controlled by the SDK's `useLdd` option: @@ -103,6 +105,5 @@ We encourage pull requests and other contributions from the community. Check out [node-dynamodb-ci-badge]: https://github.com/launchdarkly/js-core/actions/workflows/node-dynamodb.yml/badge.svg [node-dynamodb-ci]: https://github.com/launchdarkly/js-core/actions/workflows/node-dynamodb.yml - [node-dynamodb-npm-badge]: https://img.shields.io/npm/v/@launchdarkly/node-server-sdk-dynamodb.svg?style=flat-square [node-dynamodb-npm-link]: https://www.npmjs.com/package/@launchdarkly/node-server-sdk-dynamodb diff --git a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBBigSegmentStore.test.ts b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBBigSegmentStore.test.ts index 90b06d115b..4cc6c30b83 100644 --- a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBBigSegmentStore.test.ts +++ b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBBigSegmentStore.test.ts @@ -1,16 +1,18 @@ import { DynamoDBClient, PutItemCommand, UpdateItemCommand } from '@aws-sdk/client-dynamodb'; + import { interfaces } from '@launchdarkly/node-server-sdk'; + import DynamoDBBigSegmentStore, { - KEY_METADATA, - KEY_USER_DATA, ATTR_EXCLUDED, ATTR_INCLUDED, ATTR_SYNC_ON, + KEY_METADATA, + KEY_USER_DATA, } from '../src/DynamoDBBigSegmentStore'; -import clearPrefix from './clearPrefix'; -import setupTable from './setupTable'; import LDDynamoDBOptions from '../src/LDDynamoDBOptions'; import { numberValue, stringValue } from '../src/Value'; +import clearPrefix from './clearPrefix'; +import setupTable from './setupTable'; const FAKE_HASH = 'userhash'; @@ -26,7 +28,7 @@ const DEFAULT_CLIENT_OPTIONS: LDDynamoDBOptions = { async function setMetadata( prefix: string | undefined, - metadata: interfaces.BigSegmentStoreMetadata + metadata: interfaces.BigSegmentStoreMetadata, ): Promise { const client = new DynamoDBClient(DEFAULT_CLIENT_OPTIONS.clientOptions!); const key = prefix ? `${prefix}:${KEY_METADATA}` : KEY_METADATA; @@ -38,7 +40,7 @@ async function setMetadata( key: stringValue(key), [ATTR_SYNC_ON]: numberValue(metadata.lastUpToDate!), }, - }) + }), ); client.destroy(); } @@ -47,7 +49,7 @@ async function setSegments( prefix: string | undefined, userHashKey: string, included: string[], - excluded: string[] + excluded: string[], ): Promise { const client = new DynamoDBClient(DEFAULT_CLIENT_OPTIONS.clientOptions!); const key = prefix ? `${prefix}:${KEY_USER_DATA}` : KEY_USER_DATA; @@ -64,7 +66,7 @@ async function setSegments( ExpressionAttributeValues: { ':value': { SS: values }, }, - }) + }), ); } 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 53b8091a51..e6a7f8c012 100644 --- a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBCore.test.ts +++ b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBCore.test.ts @@ -1,8 +1,9 @@ import { interfaces } from '@launchdarkly/node-server-sdk'; -import DynamoDBCore, { calculateSize } from '../src/DynamoDBCore'; + import DynamoDBClientState from '../src/DynamoDBClientState'; -import clearPrefix from './clearPrefix'; +import DynamoDBCore, { calculateSize } from '../src/DynamoDBCore'; import LDDynamoDBOptions from '../src/LDDynamoDBOptions'; +import clearPrefix from './clearPrefix'; import setupTable from './setupTable'; const DEFAULT_TABLE_NAME = 'test-table'; @@ -45,13 +46,13 @@ class AsyncCoreFacade { get( kind: interfaces.PersistentStoreDataKind, - key: string + key: string, ): Promise { return promisify((cb) => this.core.get(kind, key, cb)); } getAll( - kind: interfaces.PersistentStoreDataKind + kind: interfaces.PersistentStoreDataKind, ): Promise[] | undefined> { return promisify((cb) => this.core.getAll(kind, cb)); } @@ -59,7 +60,7 @@ class AsyncCoreFacade { upsert( kind: interfaces.PersistentStoreDataKind, key: string, - descriptor: interfaces.SerializedItemDescriptor + descriptor: interfaces.SerializedItemDescriptor, ): Promise { return new Promise((resolve) => { this.core.upsert(kind, key, descriptor, (err, updatedDescriptor) => { @@ -91,7 +92,7 @@ describe('given an empty store', () => { core = new DynamoDBCore( DEFAULT_TABLE_NAME, new DynamoDBClientState(DEFAULT_CLIENT_OPTIONS), - undefined + undefined, ); facade = new AsyncCoreFacade(core); }); @@ -183,7 +184,7 @@ describe('given a store with basic data', () => { core = new DynamoDBCore( DEFAULT_TABLE_NAME, new DynamoDBClientState(DEFAULT_CLIENT_OPTIONS), - undefined + undefined, ); const flags = [ { @@ -235,7 +236,7 @@ describe('given a store with basic data', () => { key: 'bar', item: { version: 10, serializedItem: JSON.stringify(feature2), deleted: false }, }, - ]) + ]), ); }); @@ -287,19 +288,19 @@ it('it can calculate size', () => { expect( calculateSize({ test: { S: stringPayload }, - }) + }), ).toEqual(100 + 'test'.length + stringPayload.length); expect( calculateSize({ test: { N: '14' }, - }) + }), ).toEqual(100 + 'test'.length + 2); expect( calculateSize({ test: { BOOL: true }, - }) + }), ).toEqual(100 + 'test'.length + 1); expect( @@ -307,6 +308,6 @@ it('it can calculate size', () => { bool: { BOOL: true }, string: { S: stringPayload }, number: { N: '14' }, - }) + }), ).toEqual(100 + 'test'.length + 'string'.length + 'number'.length + stringPayload.length + 2 + 1); }); diff --git a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBStore.test.ts b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBStore.test.ts index 0fc022a46a..61f9092255 100644 --- a/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBStore.test.ts +++ b/packages/store/node-server-sdk-dynamodb/__tests__/DynamoDBStore.test.ts @@ -1,8 +1,9 @@ import { AsyncStoreFacade } from '@launchdarkly/node-server-sdk'; + import DynamoDBFeatureStore from '../src/DynamoDBFeatureStore'; +import LDDynamoDBOptions from '../src/LDDynamoDBOptions'; import clearPrefix from './clearPrefix'; import setupTable from './setupTable'; -import LDDynamoDBOptions from '../src/LDDynamoDBOptions'; const dataKind = { features: { namespace: 'features' }, @@ -30,7 +31,7 @@ describe.each([ store = new DynamoDBFeatureStore( table, { ...DEFAULT_CLIENT_OPTIONS, prefix: prefixParam }, - undefined + undefined, ); facade = new AsyncStoreFacade(store); }); @@ -92,7 +93,7 @@ describe.each([ store = new DynamoDBFeatureStore( table, { ...DEFAULT_CLIENT_OPTIONS, prefix: prefixParam }, - undefined + undefined, ); facade = new AsyncStoreFacade(store); await facade.init({ diff --git a/packages/store/node-server-sdk-dynamodb/__tests__/clearPrefix.ts b/packages/store/node-server-sdk-dynamodb/__tests__/clearPrefix.ts index 535451f18b..6a3e51e95a 100644 --- a/packages/store/node-server-sdk-dynamodb/__tests__/clearPrefix.ts +++ b/packages/store/node-server-sdk-dynamodb/__tests__/clearPrefix.ts @@ -1,4 +1,5 @@ import { DynamoDBClient, paginateScan, WriteRequest } from '@aws-sdk/client-dynamodb'; + import DynamoDBClientState from '../src/DynamoDBClientState'; export default async function clearPrefix(table: string, prefix?: string) { @@ -20,7 +21,7 @@ export default async function clearPrefix(table: string, prefix?: string) { { client }, { TableName: table, - } + }, )) { page?.Items?.forEach((item) => { if (item?.namespace?.S?.startsWith(actualPrefix)) { diff --git a/packages/store/node-server-sdk-dynamodb/__tests__/setupTable.ts b/packages/store/node-server-sdk-dynamodb/__tests__/setupTable.ts index 2329e2c890..676cc3fea2 100644 --- a/packages/store/node-server-sdk-dynamodb/__tests__/setupTable.ts +++ b/packages/store/node-server-sdk-dynamodb/__tests__/setupTable.ts @@ -18,7 +18,7 @@ export default async function setupTable(tableName: string, options: DynamoDBCli ReadCapacityUnits: 10, WriteCapacityUnits: 10, }, - }) + }), ); } catch (err) { // Table probably existed. diff --git a/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStore.ts b/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStore.ts index 5eed69b5e5..bac777d651 100644 --- a/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStore.ts +++ b/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStore.ts @@ -1,6 +1,7 @@ -import { LDLogger, interfaces } from '@launchdarkly/node-server-sdk'; -import LDDynamoDBOptions from './LDDynamoDBOptions'; +import { interfaces, LDLogger } from '@launchdarkly/node-server-sdk'; + import DynamoDBClientState from './DynamoDBClientState'; +import LDDynamoDBOptions from './LDDynamoDBOptions'; import { stringValue } from './Value'; /** @@ -42,7 +43,7 @@ export default class DynamoDBBigSegmentStore implements interfaces.BigSegmentSto constructor( private readonly tableName: string, options?: LDDynamoDBOptions, - private readonly logger?: LDLogger + private readonly logger?: LDLogger, ) { this.state = new DynamoDBClientState(options); } @@ -63,7 +64,7 @@ export default class DynamoDBBigSegmentStore implements interfaces.BigSegmentSto } async getUserMembership( - userHash: string + userHash: string, ): Promise { const data = await this.state.get(this.tableName, { namespace: stringValue(this.state.prefixedKey(KEY_USER_DATA)), diff --git a/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStoreFactory.ts b/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStoreFactory.ts index b4493514e9..e15154ffd1 100644 --- a/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStoreFactory.ts +++ b/packages/store/node-server-sdk-dynamodb/src/DynamoDBBigSegmentStoreFactory.ts @@ -1,6 +1,7 @@ -import { LDOptions, interfaces } from '@launchdarkly/node-server-sdk'; -import LDDynamoDBOptions from './LDDynamoDBOptions'; +import { interfaces, LDOptions } from '@launchdarkly/node-server-sdk'; + import DynamoDBBigSegmentStore from './DynamoDBBigSegmentStore'; +import LDDynamoDBOptions from './LDDynamoDBOptions'; /** * Configures a big segment store factory backed by a DynamoDB instance. @@ -16,7 +17,7 @@ import DynamoDBBigSegmentStore from './DynamoDBBigSegmentStore'; */ export default function DynamoDBBigSegmentStoreFactory( tableName: string, - options?: LDDynamoDBOptions + options?: LDDynamoDBOptions, ): (config: LDOptions) => interfaces.BigSegmentStore { return (config: LDOptions) => new DynamoDBBigSegmentStore(tableName, options, config.logger); } diff --git a/packages/store/node-server-sdk-dynamodb/src/DynamoDBClientState.ts b/packages/store/node-server-sdk-dynamodb/src/DynamoDBClientState.ts index 57d2af34ef..47d0f5a3c8 100644 --- a/packages/store/node-server-sdk-dynamodb/src/DynamoDBClientState.ts +++ b/packages/store/node-server-sdk-dynamodb/src/DynamoDBClientState.ts @@ -4,12 +4,13 @@ import { ConditionalCheckFailedException, DynamoDBClient, GetItemCommand, + paginateQuery, PutItemCommand, PutItemCommandInput, QueryCommandInput, WriteRequest, - paginateQuery, } from '@aws-sdk/client-dynamodb'; + import LDDynamoDBOptions from './LDDynamoDBOptions'; // Unlike some other database integrations where the key prefix is mandatory and has @@ -85,21 +86,21 @@ export default class DynamoDBClientState { this.client.send( new BatchWriteItemCommand({ RequestItems: { [table]: batch }, - }) - ) - ) + }), + ), + ), ); } async get( table: string, - key: Record + key: Record, ): Promise | undefined> { const res = await this.client.send( new GetItemCommand({ TableName: table, Key: key, - }) + }), ); return res.Item; diff --git a/packages/store/node-server-sdk-dynamodb/src/DynamoDBCore.ts b/packages/store/node-server-sdk-dynamodb/src/DynamoDBCore.ts index b18c39a67f..c4983e94cd 100644 --- a/packages/store/node-server-sdk-dynamodb/src/DynamoDBCore.ts +++ b/packages/store/node-server-sdk-dynamodb/src/DynamoDBCore.ts @@ -1,7 +1,9 @@ -import { LDLogger, interfaces } from '@launchdarkly/node-server-sdk'; import { AttributeValue, QueryCommandInput, WriteRequest } from '@aws-sdk/client-dynamodb'; + +import { interfaces, LDLogger } from '@launchdarkly/node-server-sdk'; + import DynamoDBClientState from './DynamoDBClientState'; -import { stringValue, numberValue, boolValue } from './Value'; +import { boolValue, numberValue, stringValue } from './Value'; // We won't try to store items whose total size exceeds this. The DynamoDB documentation says // only "400KB", which probably means 400*1024, but to avoid any chance of trying to store a @@ -62,7 +64,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { constructor( private readonly tableName: string, private readonly state: DynamoDBClientState, - private readonly logger?: LDLogger + private readonly logger?: LDLogger, ) {} private initializedToken() { @@ -76,7 +78,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { * @returns A list of all data with matching namespaces. */ private async readExistingItems( - allData: interfaces.KindKeyedStore + allData: interfaces.KindKeyedStore, ) { const promises = allData.map((kind) => { const { namespace } = kind.key; @@ -95,7 +97,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { */ private marshalItem( kind: interfaces.PersistentStoreDataKind, - item: interfaces.KeyedItem + item: interfaces.KeyedItem, ): Record { const dbItem: Record = { namespace: stringValue(this.state.prefixedKey(kind.namespace)), @@ -109,7 +111,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { } private unmarshalItem( - dbItem: Record + dbItem: Record, ): interfaces.SerializedItemDescriptor { return { // Version should exist. @@ -122,7 +124,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { async init( allData: interfaces.KindKeyedStore, - callback: () => void + callback: () => void, ) { const items = await this.readExistingItems(allData); @@ -172,7 +174,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { async get( kind: interfaces.PersistentStoreDataKind, key: string, - callback: (descriptor: interfaces.SerializedItemDescriptor | undefined) => void + callback: (descriptor: interfaces.SerializedItemDescriptor | undefined) => void, ) { const read = await this.state.get(this.tableName, { namespace: stringValue(this.state.prefixedKey(kind.namespace)), @@ -188,8 +190,8 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { async getAll( kind: interfaces.PersistentStoreDataKind, callback: ( - descriptors: interfaces.KeyedItem[] | undefined - ) => void + descriptors: interfaces.KeyedItem[] | undefined, + ) => void, ) { const params = this.queryParamsForNamespace(kind.namespace); const results = await this.state.query(params); @@ -202,8 +204,8 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { descriptor: interfaces.SerializedItemDescriptor, callback: ( err?: Error | undefined, - updatedDescriptor?: interfaces.SerializedItemDescriptor | undefined - ) => void + updatedDescriptor?: interfaces.SerializedItemDescriptor | undefined, + ) => void, ) { const params = this.makeVersionedPutRequest(kind, { key, item: descriptor }); if (!this.checkSizeLimit(params.Item)) { @@ -259,7 +261,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { private makeVersionedPutRequest( kind: interfaces.PersistentStoreDataKind, - item: interfaces.KeyedItem + item: interfaces.KeyedItem, ) { return { TableName: this.tableName, @@ -276,7 +278,7 @@ export default class DynamoDBCore implements interfaces.PersistentDataStore { return true; } this.logger?.error( - `The item "${item.key.S}" in "${item.namespace.S}" was too large to store in DynamoDB and was dropped` + `The item "${item.key.S}" in "${item.namespace.S}" was too large to store in DynamoDB and was dropped`, ); return false; } diff --git a/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStore.ts b/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStore.ts index 220f7a1c68..f41ea37c93 100644 --- a/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStore.ts +++ b/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStore.ts @@ -8,9 +8,10 @@ import { LDLogger, PersistentDataStoreWrapper, } from '@launchdarkly/node-server-sdk'; -import LDDynamoDBOptions from './LDDynamoDBOptions'; -import DynamoDBCore from './DynamoDBCore'; + import DynamoDBClientState from './DynamoDBClientState'; +import DynamoDBCore from './DynamoDBCore'; +import LDDynamoDBOptions from './LDDynamoDBOptions'; import TtlFromOptions from './TtlFromOptions'; /** @@ -22,14 +23,14 @@ export default class DynamoDBFeatureStore implements LDFeatureStore { constructor(tableName: string, options?: LDDynamoDBOptions, logger?: LDLogger) { this.wrapper = new PersistentDataStoreWrapper( new DynamoDBCore(tableName, new DynamoDBClientState(options), logger), - TtlFromOptions(options) + TtlFromOptions(options), ); } get( kind: interfaces.DataKind, key: string, - callback: (res: LDFeatureStoreItem | null) => void + callback: (res: LDFeatureStoreItem | null) => void, ): void { this.wrapper.get(kind, key, callback); } diff --git a/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStoreFactory.ts b/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStoreFactory.ts index 1c4868bd59..ef09a37b6e 100644 --- a/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStoreFactory.ts +++ b/packages/store/node-server-sdk-dynamodb/src/DynamoDBFeatureStoreFactory.ts @@ -1,4 +1,5 @@ import { LDClientContext } from '@launchdarkly/node-server-sdk'; + import DynamoDBFeatureStore from './DynamoDBFeatureStore'; import LDDynamoDBOptions from './LDDynamoDBOptions'; @@ -17,7 +18,7 @@ import LDDynamoDBOptions from './LDDynamoDBOptions'; */ export default function DynamoDBFeatureStoreFactory( tableName: string, - options?: LDDynamoDBOptions + options?: LDDynamoDBOptions, ) { return (config: LDClientContext) => new DynamoDBFeatureStore(tableName, options, config.basicConfiguration.logger); diff --git a/packages/store/node-server-sdk-dynamodb/src/LDDynamoDBOptions.ts b/packages/store/node-server-sdk-dynamodb/src/LDDynamoDBOptions.ts index bcd78d4c66..a3313f2a75 100644 --- a/packages/store/node-server-sdk-dynamodb/src/LDDynamoDBOptions.ts +++ b/packages/store/node-server-sdk-dynamodb/src/LDDynamoDBOptions.ts @@ -1,6 +1,7 @@ -import { LDLogger } from '@launchdarkly/node-server-sdk'; import { DynamoDBClient, DynamoDBClientConfig } from '@aws-sdk/client-dynamodb'; +import { LDLogger } from '@launchdarkly/node-server-sdk'; + /** * Options for configuring {@link DynamoDBFeatureStoreFactory} or {@link DynamoDBBigSegmentStoreFactory}. */ diff --git a/packages/store/node-server-sdk-redis/README.md b/packages/store/node-server-sdk-redis/README.md index cd568404e2..3064596d75 100644 --- a/packages/store/node-server-sdk-redis/README.md +++ b/packages/store/node-server-sdk-redis/README.md @@ -6,7 +6,7 @@ This library provides a Redis-backed persistence mechanism (feature store) for the [LaunchDarkly Node.js SDK](https://github.com/launchdarkly/js-core/packages/sdk/server-node), replacing the default in-memory feature store. The underlying Redis client implementation is [ioredis](https://github.com/luin/ioredis). -The minimum version of the LaunchDarkly Server-Side SDK for Node for use with this library is 8.0.0. +The minimum version of the LaunchDarkly Server-Side SDK for Node for use with this library is 8.0.0. ## LaunchDarkly overview @@ -82,6 +82,5 @@ We encourage pull requests and other contributions from the community. Check out [node-redis-ci-badge]: https://github.com/launchdarkly/js-core/actions/workflows/node-redis.yml/badge.svg [node-redis-ci]: https://github.com/launchdarkly/js-core/actions/workflows/node-redis.yml - [node-redis-npm-badge]: https://img.shields.io/npm/v/@launchdarkly/node-server-sdk-redis.svg?style=flat-square [node-redis-npm-link]: https://www.npmjs.com/package/@launchdarkly/node-server-sdk-redis diff --git a/packages/store/node-server-sdk-redis/__tests__/RedisBigSegmentStore.test.ts b/packages/store/node-server-sdk-redis/__tests__/RedisBigSegmentStore.test.ts index aea4fe5e02..71889defa2 100644 --- a/packages/store/node-server-sdk-redis/__tests__/RedisBigSegmentStore.test.ts +++ b/packages/store/node-server-sdk-redis/__tests__/RedisBigSegmentStore.test.ts @@ -1,9 +1,11 @@ import Redis from 'ioredis'; + import { interfaces } from '@launchdarkly/node-server-sdk'; + import RedisBigSegmentStore, { KEY_LAST_SYNCHRONIZED, - KEY_USER_INCLUDE, KEY_USER_EXCLUDE, + KEY_USER_INCLUDE, } from '../src/RedisBigSegmentStore'; import clearPrefix from './clearPrefix'; @@ -11,12 +13,12 @@ const FAKE_HASH = 'userhash'; async function setMetadata( prefix: string, - metadata: interfaces.BigSegmentStoreMetadata + metadata: interfaces.BigSegmentStoreMetadata, ): Promise { const client = new Redis(); await client.set( `${prefix}:${KEY_LAST_SYNCHRONIZED}`, - metadata.lastUpToDate ? metadata.lastUpToDate.toString() : '' + metadata.lastUpToDate ? metadata.lastUpToDate.toString() : '', ); await client.quit(); } @@ -25,7 +27,7 @@ async function setSegments( prefix: string, userHashKey: string, included: string[], - excluded: string[] + excluded: string[], ): Promise { const client = new Redis(); 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 4c8ad71539..fffb1151d8 100644 --- a/packages/store/node-server-sdk-redis/__tests__/RedisCore.test.ts +++ b/packages/store/node-server-sdk-redis/__tests__/RedisCore.test.ts @@ -1,6 +1,7 @@ import { interfaces } from '@launchdarkly/node-server-sdk'; -import RedisCore from '../src/RedisCore'; + import RedisClientState from '../src/RedisClientState'; +import RedisCore from '../src/RedisCore'; import clearPrefix from './clearPrefix'; const featuresKind = { namespace: 'features', deserialize: (data: string) => JSON.parse(data) }; @@ -33,13 +34,13 @@ class AsyncCoreFacade { get( kind: interfaces.PersistentStoreDataKind, - key: string + key: string, ): Promise { return promisify((cb) => this.core.get(kind, key, cb)); } getAll( - kind: interfaces.PersistentStoreDataKind + kind: interfaces.PersistentStoreDataKind, ): Promise[] | undefined> { return promisify((cb) => this.core.getAll(kind, cb)); } @@ -47,7 +48,7 @@ class AsyncCoreFacade { upsert( kind: interfaces.PersistentStoreDataKind, key: string, - descriptor: interfaces.SerializedItemDescriptor + descriptor: interfaces.SerializedItemDescriptor, ): Promise { return new Promise((resolve) => { this.core.upsert(kind, key, descriptor, (err, updatedDescriptor) => { diff --git a/packages/store/node-server-sdk-redis/__tests__/RedisFeatureStore.test.ts b/packages/store/node-server-sdk-redis/__tests__/RedisFeatureStore.test.ts index 313230737f..7cf4600cd3 100644 --- a/packages/store/node-server-sdk-redis/__tests__/RedisFeatureStore.test.ts +++ b/packages/store/node-server-sdk-redis/__tests__/RedisFeatureStore.test.ts @@ -1,4 +1,5 @@ import { AsyncStoreFacade } from '@launchdarkly/node-server-sdk'; + import RedisFeatureStore from '../src/RedisFeatureStore'; import clearPrefix from './clearPrefix'; diff --git a/packages/store/node-server-sdk-redis/architecture.md b/packages/store/node-server-sdk-redis/architecture.md index d3ad77504e..b9a7d6ebf1 100644 --- a/packages/store/node-server-sdk-redis/architecture.md +++ b/packages/store/node-server-sdk-redis/architecture.md @@ -17,8 +17,8 @@ RedisCore: Implements persistent data store operations using Redis. RedisClientState: Manages the Redis connection and exposes the Redis client to the RedisCore/RedisBigSegmentStore. - ## Architecture Diagram + ```mermaid classDiagram RedisFeatureStore --|> LDFeatureStore : Implements diff --git a/packages/store/node-server-sdk-redis/src/LDRedisOptions.ts b/packages/store/node-server-sdk-redis/src/LDRedisOptions.ts index e85fb841cc..585c469d14 100644 --- a/packages/store/node-server-sdk-redis/src/LDRedisOptions.ts +++ b/packages/store/node-server-sdk-redis/src/LDRedisOptions.ts @@ -1,4 +1,4 @@ -import { RedisOptions, Redis } from 'ioredis'; +import { Redis, RedisOptions } from 'ioredis'; /** * The standard options supported for the LaunchDarkly Redis integration. diff --git a/packages/store/node-server-sdk-redis/src/RedisBigSegmentStore.ts b/packages/store/node-server-sdk-redis/src/RedisBigSegmentStore.ts index 14208e5d3f..7e51fd7012 100644 --- a/packages/store/node-server-sdk-redis/src/RedisBigSegmentStore.ts +++ b/packages/store/node-server-sdk-redis/src/RedisBigSegmentStore.ts @@ -1,4 +1,5 @@ -import { LDLogger, interfaces } from '@launchdarkly/node-server-sdk'; +import { interfaces, LDLogger } from '@launchdarkly/node-server-sdk'; + import LDRedisOptions from './LDRedisOptions'; import RedisClientState from './RedisClientState'; @@ -23,7 +24,10 @@ export default class RedisBigSegmentStore implements interfaces.BigSegmentStore // Logger is not currently used, but is included to reduce the chance of a // compatibility break to add a log. // eslint-disable-next-line @typescript-eslint/no-unused-vars - constructor(options?: LDRedisOptions, private readonly logger?: LDLogger) { + constructor( + options?: LDRedisOptions, + private readonly logger?: LDLogger, + ) { this.state = new RedisClientState(options); } @@ -38,7 +42,7 @@ export default class RedisBigSegmentStore implements interfaces.BigSegmentStore } async getUserMembership( - userHash: string + userHash: string, ): Promise { const includedRefs = await this.state .getClient() diff --git a/packages/store/node-server-sdk-redis/src/RedisBigSegmentStoreFactory.ts b/packages/store/node-server-sdk-redis/src/RedisBigSegmentStoreFactory.ts index 3bb12c5c7b..44e1d6a500 100644 --- a/packages/store/node-server-sdk-redis/src/RedisBigSegmentStoreFactory.ts +++ b/packages/store/node-server-sdk-redis/src/RedisBigSegmentStoreFactory.ts @@ -1,4 +1,5 @@ -import { LDOptions, interfaces } from '@launchdarkly/node-server-sdk'; +import { interfaces, LDOptions } from '@launchdarkly/node-server-sdk'; + import LDRedisOptions from './LDRedisOptions'; import RedisBigSegmentStore from './RedisBigSegmentStore'; @@ -14,7 +15,7 @@ import RedisBigSegmentStore from './RedisBigSegmentStore'; * @returns A function which creates big segment stores based on the provided config. */ export default function RedisBigSegmentStoreFactory( - options?: LDRedisOptions + options?: LDRedisOptions, ): (config: LDOptions) => interfaces.BigSegmentStore { return (config: LDOptions) => new RedisBigSegmentStore(options, config.logger); } diff --git a/packages/store/node-server-sdk-redis/src/RedisClientState.ts b/packages/store/node-server-sdk-redis/src/RedisClientState.ts index 9a7d12421d..34332f203a 100644 --- a/packages/store/node-server-sdk-redis/src/RedisClientState.ts +++ b/packages/store/node-server-sdk-redis/src/RedisClientState.ts @@ -1,5 +1,7 @@ -import { LDLogger } from '@launchdarkly/node-server-sdk'; import { Redis } from 'ioredis'; + +import { LDLogger } from '@launchdarkly/node-server-sdk'; + import LDRedisOptions from './LDRedisOptions'; const DEFAULT_PREFIX = 'launchdarkly'; @@ -31,7 +33,10 @@ export default class RedisClientState { * @param owned Is this client owned by the store integration, or was it * provided externally. */ - constructor(options?: LDRedisOptions, private readonly logger?: LDLogger) { + constructor( + options?: LDRedisOptions, + private readonly logger?: LDLogger, + ) { if (options?.client) { this.client = options.client; this.owned = false; @@ -59,7 +64,7 @@ export default class RedisClientState { client.on('reconnecting', (delay: number) => { this.attempt += 1; logger?.info( - `Attempting to reconnect to redis (attempt # ${this.attempt}, delay: ${delay}ms)` + `Attempting to reconnect to redis (attempt # ${this.attempt}, delay: ${delay}ms)`, ); }); diff --git a/packages/store/node-server-sdk-redis/src/RedisCore.ts b/packages/store/node-server-sdk-redis/src/RedisCore.ts index e5f9d62868..1c3c30944e 100644 --- a/packages/store/node-server-sdk-redis/src/RedisCore.ts +++ b/packages/store/node-server-sdk-redis/src/RedisCore.ts @@ -1,4 +1,5 @@ -import { LDLogger, interfaces } from '@launchdarkly/node-server-sdk'; +import { interfaces, LDLogger } from '@launchdarkly/node-server-sdk'; + import RedisClientState from './RedisClientState'; /** @@ -25,13 +26,16 @@ import RedisClientState from './RedisClientState'; export default class RedisCore implements interfaces.PersistentDataStore { private initedKey: string; - constructor(private readonly state: RedisClientState, private readonly logger?: LDLogger) { + constructor( + private readonly state: RedisClientState, + private readonly logger?: LDLogger, + ) { this.initedKey = this.state.prefixedKey('$inited'); } init( allData: interfaces.KindKeyedStore, - callback: () => void + callback: () => void, ): void { const multi = this.state.getClient().multi(); allData.forEach((keyedItems) => { @@ -69,7 +73,7 @@ export default class RedisCore implements interfaces.PersistentDataStore { get( kind: interfaces.PersistentStoreDataKind, key: string, - callback: (descriptor: interfaces.SerializedItemDescriptor | undefined) => void + callback: (descriptor: interfaces.SerializedItemDescriptor | undefined) => void, ): void { if (!this.state.isConnected() && !this.state.isInitialConnection()) { this.logger?.warn(`Attempted to fetch key '${key}' while Redis connection is down`); @@ -98,8 +102,8 @@ export default class RedisCore implements interfaces.PersistentDataStore { getAll( kind: interfaces.PersistentStoreDataKind, callback: ( - descriptors: interfaces.KeyedItem[] | undefined - ) => void + descriptors: interfaces.KeyedItem[] | undefined, + ) => void, ): void { if (!this.state.isConnected() && !this.state.isInitialConnection()) { this.logger?.warn('Attempted to fetch all keys while Redis connection is down'); @@ -131,8 +135,8 @@ export default class RedisCore implements interfaces.PersistentDataStore { descriptor: interfaces.SerializedItemDescriptor, callback: ( err?: Error | undefined, - updatedDescriptor?: interfaces.SerializedItemDescriptor | undefined - ) => void + updatedDescriptor?: interfaces.SerializedItemDescriptor | undefined, + ) => void, ): void { // The persistent store wrapper manages interactions with a queue, so we can use watch like // this without concerns for overlapping transactions. @@ -161,7 +165,7 @@ export default class RedisCore implements interfaces.PersistentDataStore { multi.hset( this.state.prefixedKey(kind.namespace), key, - JSON.stringify({ version: descriptor.version, deleted: true }) + JSON.stringify({ version: descriptor.version, deleted: true }), ); } else if (descriptor.serializedItem) { multi.hset(this.state.prefixedKey(kind.namespace), key, descriptor.serializedItem); diff --git a/packages/store/node-server-sdk-redis/src/RedisFeatureStore.ts b/packages/store/node-server-sdk-redis/src/RedisFeatureStore.ts index 1b05c677e4..450328e617 100644 --- a/packages/store/node-server-sdk-redis/src/RedisFeatureStore.ts +++ b/packages/store/node-server-sdk-redis/src/RedisFeatureStore.ts @@ -8,9 +8,10 @@ import { LDLogger, PersistentDataStoreWrapper, } from '@launchdarkly/node-server-sdk'; + import LDRedisOptions from './LDRedisOptions'; -import RedisCore from './RedisCore'; import RedisClientState from './RedisClientState'; +import RedisCore from './RedisCore'; import TtlFromOptions from './TtlFromOptions'; /** @@ -19,17 +20,20 @@ import TtlFromOptions from './TtlFromOptions'; export default class RedisFeatureStore implements LDFeatureStore { private wrapper: PersistentDataStoreWrapper; - constructor(options?: LDRedisOptions, private readonly logger?: LDLogger) { + constructor( + options?: LDRedisOptions, + private readonly logger?: LDLogger, + ) { this.wrapper = new PersistentDataStoreWrapper( new RedisCore(new RedisClientState(options, logger), logger), - TtlFromOptions(options) + TtlFromOptions(options), ); } get( kind: interfaces.DataKind, key: string, - callback: (res: LDFeatureStoreItem | null) => void + callback: (res: LDFeatureStoreItem | null) => void, ): void { this.wrapper.get(kind, key, callback); } diff --git a/packages/store/node-server-sdk-redis/src/RedisFeatureStoreFactory.ts b/packages/store/node-server-sdk-redis/src/RedisFeatureStoreFactory.ts index 212bd53782..bcfee4bd3b 100644 --- a/packages/store/node-server-sdk-redis/src/RedisFeatureStoreFactory.ts +++ b/packages/store/node-server-sdk-redis/src/RedisFeatureStoreFactory.ts @@ -1,6 +1,7 @@ import { LDClientContext } from '@launchdarkly/node-server-sdk'; -import RedisFeatureStore from './RedisFeatureStore'; + import LDRedisOptions from './LDRedisOptions'; +import RedisFeatureStore from './RedisFeatureStore'; /** * Configures a feature store backed by a Redis instance. diff --git a/release-please-config.json b/release-please-config.json index 5d3c981ab6..639bc3262d 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -6,29 +6,20 @@ "packages/shared/akamai-edgeworker-sdk": { "bump-minor-pre-major": true }, - "packages/sdk/server-node": { - }, + "packages/sdk/server-node": {}, "packages/sdk/cloudflare": {}, "packages/sdk/vercel": { - "extra-files": [ - "src/createPlatformInfo.ts" - ], + "extra-files": ["src/createPlatformInfo.ts"], "release-as": "1.0.0" }, "packages/sdk/akamai-base": { - "extra-files": [ - "src/index.ts" - ] + "extra-files": ["src/index.ts"] }, "packages/sdk/akamai-edgekv": { - "extra-files": [ - "src/index.ts" - ] - }, - "packages/store/node-server-sdk-dynamodb": { + "extra-files": ["src/index.ts"] }, - "packages/store/node-server-sdk-redis": { - } + "packages/store/node-server-sdk-dynamodb": {}, + "packages/store/node-server-sdk-redis": {} }, "plugins": ["node-workspace"] }