Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
d7a8c51
build: Add CI configuration. Rename 'node' to 'server-node'.
kinyoklion Mar 6, 2023
968738d
chore: Use workflow branch.
kinyoklion Mar 6, 2023
aad1146
Add yarn 3 config.
kinyoklion Mar 6, 2023
1957cb4
chore: Update config for renamed node server. Update yarn support to …
kinyoklion Mar 6, 2023
01890a7
chore: Logger isn't a test, so we still need to exclude the __tests__…
kinyoklion Mar 6, 2023
4a50c89
chore: Consistent exclude. Update the names of workflow jobs.
kinyoklion Mar 6, 2023
18cf3fe
chore: Include jest config in each package.
kinyoklion Mar 6, 2023
117f3ab
fix: Add ignore in ApplicationTags.test.ts to allow testing an invali…
kinyoklion Mar 6, 2023
bd1c899
chore: Add ci option back to jest runners.
kinyoklion Mar 6, 2023
43d1abe
build: Add typedoc as dev dependency to each packge.
kinyoklion Mar 6, 2023
69b316b
fix: Parse may be undefined in serialization.test.ts.
kinyoklion Mar 6, 2023
7acb892
build: Correctly tag internals.
kinyoklion Mar 6, 2023
16d1add
fix: Update tests to work correctly with node 19.
kinyoklion Mar 6, 2023
cf4cc0a
chore: Increase timeout for file reload test.
kinyoklion Mar 6, 2023
911cf04
chore: Move timeout location because of jest bug.
kinyoklion Mar 6, 2023
8b87581
chore: Use different tmp to not interfere with jest haste.
kinyoklion Mar 6, 2023
c4ebef1
chore: Try checking for file before unlinking.
kinyoklion Mar 6, 2023
40cbc57
chore: Run node server tests in band.
kinyoklion Mar 6, 2023
e720b1d
chore: Try just removing one directory.
kinyoklion Mar 6, 2023
27349c1
chore: try different catch
kinyoklion Mar 6, 2023
ad2fae2
chore: Add delay to ensure timestamp changes for file data source.
kinyoklion Mar 6, 2023
1bb37a1
chore: Remove unused parameter. Add typings for fs.watch callback.
kinyoklion Mar 6, 2023
b808216
chore: Lint
kinyoklion Mar 6, 2023
e215c52
chore: Remove duplicate run.
kinyoklion Mar 6, 2023
3fcb23b
Add a name to the CI workflow.
kinyoklion Mar 6, 2023
535d480
chore: Add eslint deps to each package.json.
kinyoklion Mar 6, 2023
592fd52
chore: Fix lint errors.
kinyoklion Mar 6, 2023
4c821ff
chore: More lint fixes.
kinyoklion Mar 6, 2023
25932e6
build: Add initial contract test build.
kinyoklion Mar 6, 2023
bb1ff66
chore: Fixup contract tests workflow.
kinyoklion Mar 6, 2023
6689962
chore: Try simple contract test setup.
kinyoklion Mar 6, 2023
2ec0ab2
Setup yarn for contract tests.
kinyoklion Mar 6, 2023
7615baf
chore: Run contract tests as part of node server job.
kinyoklion Mar 6, 2023
9fd2cee
Steps
kinyoklion Mar 6, 2023
0580713
Try using composites.
kinyoklion Mar 6, 2023
56b132f
use differently
kinyoklion Mar 6, 2023
92650f3
Update with statement
kinyoklion Mar 6, 2023
2f49fe6
Actions.
kinyoklion Mar 6, 2023
447a0f1
Add shell to action.
kinyoklion Mar 6, 2023
818dfd4
appease path
kinyoklion Mar 6, 2023
334485f
Add name and add contract tests.
kinyoklion Mar 6, 2023
2776fee
Add contract test parameters.
kinyoklion Mar 6, 2023
03146cb
Correct comments.
kinyoklion Mar 6, 2023
06147bb
Move env up.
kinyoklion Mar 6, 2023
76f15f7
Add badges to readme.
kinyoklion Mar 7, 2023
7f617b6
Remove node 18.
kinyoklion Mar 7, 2023
e0bb5ff
Update .gitignore
kinyoklion Mar 8, 2023
b283c5d
chore: Change import style in FileDataSource tests.
kinyoklion Mar 8, 2023
6b6cf4a
chore: Add and run prettier.
kinyoklion Mar 8, 2023
b64282c
chore: Fix peer dep
kinyoklion Mar 8, 2023
705e3fb
chore: Update deps. Fix things broken by prettier.
kinyoklion Mar 8, 2023
b7184e9
chore: Add prettier deps to each package.
kinyoklion Mar 8, 2023
08ec806
chore: Packages after yarn install alphabatized.
kinyoklion Mar 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 5 additions & 9 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,14 @@ module.exports = {
env: {
node: true,
},
extends: [
'airbnb-base',
'airbnb-typescript/base'
],
extends: ['airbnb-base', 'airbnb-typescript/base', 'prettier'],
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.eslint.json'
project: './tsconfig.eslint.json',
},
plugins: [
'@typescript-eslint',
],
ignorePatterns: ["**/dist/**"],
plugins: ['@typescript-eslint', 'prettier'],
ignorePatterns: ['**/dist/**'],
rules: {
'prettier/prettier': ['error'],
},
};
27 changes: 27 additions & 0 deletions .github/workflows/common.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: shared/common

on:
push:
branches: [main]
paths-ignore:
- '**.md' #Do not need to run CI for markdown changes.
pull_request:
branches: [main]
paths-ignore:
- '**.md'

jobs:
build-test-common:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
registry-url: 'https://registry.npmjs.org'
- id: shared
name: Shared CI Steps
uses: ./actions/ci
with:
workspace_name: '@launchdarkly/js-sdk-common'
workspace_path: packages/shared/common
17 changes: 17 additions & 0 deletions .github/workflows/lint-pr-title.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: Lint PR title

on:
pull_request_target:
types:
- opened
- edited
- synchronize

jobs:
main:
name: Verify the PR title matches conventional commit spec.
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27 changes: 27 additions & 0 deletions .github/workflows/sdk-server.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: shared/sdk-server

on:
push:
branches: [main]
paths-ignore:
- '**.md' #Do not need to run CI for markdown changes.
pull_request:
branches: [main]
paths-ignore:
- '**.md'

jobs:
build-test-sdk-server:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 16
registry-url: 'https://registry.npmjs.org'
- id: shared
name: Shared CI Steps
uses: ./actions/ci
with:
workspace_name: '@launchdarkly/js-server-sdk-common'
workspace_path: packages/shared/sdk-server
38 changes: 38 additions & 0 deletions .github/workflows/server-node.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: sdk/server-node

on:
push:
branches: [main]
paths-ignore:
- '**.md' #Do not need to run CI for markdown changes.
pull_request:
branches: [main]
paths-ignore:
- '**.md'

jobs:
build-test-server-node:
runs-on: ubuntu-latest

strategy:
matrix:
# Node versions to run on.
version: [16, 19]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want 18 instead of 19 here? Odd releases don't go to active LTS and maintenance. Unless your intent is precisely this to try the most cutting edge, latest node release?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, just the oldest and the newest it will claim to support at the moment. I may automate this as well. Technically 14 is supported until next month from node, but I don't want to support it and then immediately remove it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok


env:
TEST_HARNESS_PARAMS: '--skip-from=./contract-tests/testharness-suppressions.txt'

steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.version }}
registry-url: 'https://registry.npmjs.org'
- id: shared
name: Shared CI Steps
uses: ./actions/ci
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These actions are just local, but you can share them like you can share repositories. You would just put launchdarkly/whatever/actions/ci here and it would use a repo.

with:
workspace_name: '@launchdarkly/node-server-sdk'
workspace_path: packages/sdk/server-node
- name: Contract Tests
run: yarn run contract-tests
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the simplest way to run the contract tests, but not the way with the best output. On circleci we run a job for the service parallel to the test service. That makes the output nice, but sharing networking between jobs is a big problem on github actions. The jobs are different VMs or containers depending. Maybe something we could figure out in the future.

13 changes: 11 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ dist/
node_modules/
**/*.tsbuildinfo
coverage/
tmp/
**/docs
**/tmp_test/
docs/
.pnp.*
.yarn/*
.dev*
.vscode/launch.json
.idea
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions
yarn-error.log
4 changes: 4 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"printWidth": 100
}
28 changes: 28 additions & 0 deletions .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs

Large diffs are not rendered by default.

873 changes: 873 additions & 0 deletions .yarn/releases/yarn-3.4.1.cjs

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
nodeLinker: node-modules
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this makes it easier to keep things node friendly.


plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: '@yarnpkg/plugin-workspace-tools'

yarnPath: .yarn/releases/yarn-3.4.1.cjs
43 changes: 25 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ This includes shared libraries, used by SDKs and other tools, as well as SDKs.

## Packages

| SDK Packages | npm | issues | tests
| ---------------------------------------------------------------------------| -----------------------------| -------------------------------- | -------------------------------
| [@launchdarkly/node-server-sdk](packages/sdk/node/README.md) | [![NPM Package][TODO]][TODO] | [![Client Issues][TODO]][TODO] | [![Actions Status][TODO]][TODO]
| SDK Packages | npm | issues | tests |
| ------------------------------------------------------------ | ---------------------------- | ------------------------------ | ----------------------------------------------------------------------- |
| [@launchdarkly/node-server-sdk](packages/sdk/node/README.md) | [![NPM Package][TODO]][TODO] | [![Client Issues][TODO]][TODO] | [![Actions Status][sdk-server-node-ci-badge]][sdk-server-node-ci-badge] |

| Shared Packages | npm | issues | tests
| ---------------------------------------------------------------------------| -----------------------------| -------------------------------- | -------------------------------
| [@launchdarkly/js-sdk-common](packages/shared/common/README.md) | [![NPM Package][TODO]][TODO] | [![Common][TODO]][TODO] | [![Actions Status][TODO]][TODO]
| [@launchdarkly/js-server-sdk-common](packages/shared/sdk-server/README.md) | [![NPM Package][TODO]][TODO] | [![Common Server][TODO]][TODO] | [![Actions Status][TODO]][TODO]
| Shared Packages | npm | issues | tests |
| -------------------------------------------------------------------------- | ---------------------------- | ------------------------------ | --------------------------------------------------------------------- |
| [@launchdarkly/js-sdk-common](packages/shared/common/README.md) | [![NPM Package][TODO]][TODO] | [![Common][TODO]][TODO] | [![Actions Status][shared-common-ci-badge]][shared-common-ci] |
| [@launchdarkly/js-server-sdk-common](packages/shared/sdk-server/README.md) | [![NPM Package][TODO]][TODO] | [![Common Server][TODO]][TODO] | [![Actions Status][shared-sdk-server-ci-badge]][shared-sdk-server-ci] |

## Organization

Expand All @@ -38,14 +38,21 @@ We encourage pull requests and other contributions from the community. Check out

## About LaunchDarkly

* LaunchDarkly is a continuous delivery platform that provides feature flags as a service and allows developers to iterate quickly and safely. We allow you to easily flag your features and manage them from the LaunchDarkly dashboard. With LaunchDarkly, you can:
* Roll out a new feature to a subset of your users (like a group of users who opt-in to a beta tester group), gathering feedback and bug reports from real-world use cases.
* Gradually roll out a feature to an increasing percentage of users, and track the effect that the feature has on key metrics (for instance, how likely is a user to complete a purchase if they have feature A versus feature B?).
* Turn off a feature that you realize is causing performance problems in production, without needing to re-deploy, or even restart the application with a changed configuration file.
* Grant access to certain features based on user attributes, like payment plan (eg: users on the ‘gold’ plan get access to more features than users in the ‘silver’ plan). Disable parts of your application to facilitate maintenance, without taking everything offline.
* LaunchDarkly provides feature flag SDKs for a wide variety of languages and technologies. Check out [our documentation](https://docs.launchdarkly.com/sdk) for a complete list.
* Explore LaunchDarkly
* [launchdarkly.com](https://www.launchdarkly.com/ "LaunchDarkly Main Website") for more information
* [docs.launchdarkly.com](https://docs.launchdarkly.com/ "LaunchDarkly Documentation") for our documentation and SDK reference guides
* [apidocs.launchdarkly.com](https://apidocs.launchdarkly.com/ "LaunchDarkly API Documentation") for our API documentation
* [blog.launchdarkly.com](https://blog.launchdarkly.com/ "LaunchDarkly Blog Documentation") for the latest product updates
- LaunchDarkly is a continuous delivery platform that provides feature flags as a service and allows developers to iterate quickly and safely. We allow you to easily flag your features and manage them from the LaunchDarkly dashboard. With LaunchDarkly, you can:
- Roll out a new feature to a subset of your users (like a group of users who opt-in to a beta tester group), gathering feedback and bug reports from real-world use cases.
- Gradually roll out a feature to an increasing percentage of users, and track the effect that the feature has on key metrics (for instance, how likely is a user to complete a purchase if they have feature A versus feature B?).
- Turn off a feature that you realize is causing performance problems in production, without needing to re-deploy, or even restart the application with a changed configuration file.
- Grant access to certain features based on user attributes, like payment plan (eg: users on the ‘gold’ plan get access to more features than users in the ‘silver’ plan). Disable parts of your application to facilitate maintenance, without taking everything offline.
- LaunchDarkly provides feature flag SDKs for a wide variety of languages and technologies. Check out [our documentation](https://docs.launchdarkly.com/sdk) for a complete list.
- Explore LaunchDarkly
- [launchdarkly.com](https://www.launchdarkly.com/ 'LaunchDarkly Main Website') for more information
- [docs.launchdarkly.com](https://docs.launchdarkly.com/ 'LaunchDarkly Documentation') for our documentation and SDK reference guides
- [apidocs.launchdarkly.com](https://apidocs.launchdarkly.com/ 'LaunchDarkly API Documentation') for our API documentation
- [blog.launchdarkly.com](https://blog.launchdarkly.com/ 'LaunchDarkly Blog Documentation') for the latest product updates

[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
[shared-sdk-server-ci-badge]: https://github.com/launchdarkly/js-core/actions/workflows/sdk-server.yml/badge.svg
[shared-sdk-server-ci]: https://github.com/launchdarkly/js-core/actions/workflows/sdk-server.yml
[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
43 changes: 43 additions & 0 deletions actions/ci/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# This is a composite to allow sharing these steps into other workflows.
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, this lets us re-use these steps easily in different workflows. The output is not as nice as a shared workflow, but this made it easy for node server to run a matrix, and also run contract tests afterward.

With a shared workflow you cannot really deviate, you use it or you don't and you cannot run steps after.

So this worked out better functionally.

# It isn't a shared workflow, because then it isn't convenient to add
# additional package specific steps.
name: Shared CI Workflow
inputs:
# Some commands work on the package name (yarn commands), other require the path (typedoc),
# so we supply both.
workspace_name:
required: true
type: string
workspace_path:
required: true
type: string

runs:
using: composite
steps:
- name: Setup Yarn
shell: bash
run: yarn set version 3.4.1

- name: Install Dependencies
shell: bash
# Install only the dependencies requires for the specific workspace.
run: yarn workspaces focus ${{ inputs.workspace_name }}

- name: Build
shell: bash
# This will build the package and its dependencies.
run: yarn workspaces foreach -ptR --from '${{ inputs.workspace_name }}' run build

- name: Lint
shell: bash
run: yarn workspace ${{ inputs.workspace_name }} lint

- name: Test
shell: bash
# Run just the tests for the targeted package.
run: yarn workspace ${{ inputs.workspace_name }} test

- name: Build Docs
shell: bash
run: ./scripts/build-doc.sh ${{ inputs.workspace_path }}
6 changes: 3 additions & 3 deletions contract-tests/log.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ function Log(tag) {
console.log(new Date().toISOString() + ` [${tag}] ${level}: ${message}`);
}
return {
info: message => doLog('info', message),
error: message => doLog('error', message),
info: (message) => doLog('info', message),
error: (message) => doLog('error', message),
};
}

function sdkLogger(tag) {
return ld.basicLogger({
level: 'debug',
destination: line => {
destination: (line) => {
console.log(new Date().toISOString() + ` [${tag}.sdk] ${line}`);
},
});
Expand Down
2 changes: 1 addition & 1 deletion contract-tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"node-server-sdk": "file:../packages/sdk/node"
"node-server-sdk": "file:../packages/sdk/server-node"
}
}
15 changes: 10 additions & 5 deletions contract-tests/sdkClientEntity.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@ function makeSdkConfig(options, tag) {
const cf = {
logger: sdkLogger(tag),
};
const maybeTime = seconds => (seconds === undefined || seconds === null ? undefined : seconds / 1000);
const maybeTime = (seconds) =>
seconds === undefined || seconds === null ? undefined : seconds / 1000;
if (options.streaming) {
cf.streamUri = options.streaming.baseUri;
cf.streamInitialReconnectDelay = maybeTime(options.streaming.initialRetryDelayMs);
}
if(options.polling) {
if (options.polling) {
cf.stream = false;
cf.baseUri = options.polling.baseUri;
cf.pollInterface = options.polling.pollIntervalMs / 1000;
Expand Down Expand Up @@ -41,15 +42,19 @@ 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 !== null &&
options.configuration.startWaitTimeMs !== undefined
? options.configuration.startWaitTimeMs
: 5000;
const client = ld.init(
options.configuration.credential || 'unknown-sdk-key',
makeSdkConfig(options.configuration, options.tag)
);
try {
await Promise.race([client.waitForInitialization(), new Promise(resolve => setTimeout(resolve, timeout))]);
await Promise.race([
client.waitForInitialization(),
new Promise((resolve) => setTimeout(resolve, timeout)),
]);
} catch (_) {
// if waitForInitialization() rejects, the client failed to initialize, see next line
}
Expand All @@ -63,7 +68,7 @@ async function newSdkClientEntity(options) {
log.info('Test ended');
};

c.doCommand = async params => {
c.doCommand = async (params) => {
log.info('Received command: ' + params.command);
switch (params.command) {
case 'evaluate': {
Expand Down
12 changes: 6 additions & 6 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
module.exports = {
transform: {'^.+\\.ts?$': 'ts-jest'},
testMatch: ["**/__tests__/**/*test.ts?(x)"],
transform: { '^.+\\.ts?$': 'ts-jest' },
testMatch: ['**/__tests__/**/*test.ts?(x)'],
testEnvironment: 'node',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
collectCoverageFrom: [
"packages/sdk/node/src/**/*.ts",
"packages/shared/common/src/**/*.ts",
"packages/shared/sdk-server/src/**/*.ts"
]
'packages/sdk/server-node/src/**/*.ts',
'packages/shared/common/src/**/*.ts',
'packages/shared/sdk-server/src/**/*.ts',
],
};
16 changes: 11 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"workspaces": [
"packages/shared/common",
"packages/shared/sdk-server",
"packages/sdk/node"
"packages/sdk/server-node"
],
"private": true,
"scripts": {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we also add a yarn all command to install all workspaces and prettier as well? You can steal the prettier config from the docs repo.

    "all": "yarn workspaces focus -A",
    "prettier": "prettier --write \"**/*.{js,ts,tsx,json,yaml,yml,md}\" --loglevel warn",

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For "all" is there a reason to use a focus all versus just running yarn which will also install all projects (and also make a lockfile, which is different).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't know a plain yarn will install all workspaces. All good, please ignore "all"

Expand All @@ -13,19 +13,25 @@
"build:doc": "./scripts/build-doc.sh $1",
"lint": "npx eslint . --ext .ts",
"lint:fix": "yarn run lint -- --fix",
"test": "jest",
"test": "npx jest",
"coverage": "npm run test -- --coverage",
"contract-test-service": "npm --prefix contract-tests install && npm --prefix contract-tests start",
"contract-test-harness": "curl -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/master/downloader/run.sh \\ | VERSION=v2 PARAMS=\"-url http://localhost:8000 -debug -stop-service-at-end $TEST_HARNESS_PARAMS\" sh",
"contract-tests": "npm run contract-test-service & npm run contract-test-harness"
"contract-tests": "npm run contract-test-service & npm run contract-test-harness",
"prettier": "npx prettier --write \"**/*.{js,ts,tsx,json,yaml,yml,md}\" --loglevel warn"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.22.0",
"@typescript-eslint/parser": "^5.22.0",
"eslint": "^8.14.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-airbnb-typescript": "^17.0.0",
"eslint-config-prettier": "^8.7.0",
"eslint-plugin-import": "^2.26.0",
"typedoc": "0.23.26"
}
"eslint-plugin-prettier": "^4.2.1",
"prettier": "^2.8.4",
"typedoc": "0.23.26",
"typescript": "^4.6.3"
},
"packageManager": "yarn@3.4.1"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

}
Loading