diff --git a/.eslintrc.js b/.eslintrc.js index 5f6d01889d..bb50a6f605 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -15,7 +15,7 @@ module.exports = { 'import/no-extraneous-dependencies': [ 'error', { - devDependencies: ['**/jest*.ts', '**/*.test.ts'], + devDependencies: ['**/jest*.ts', '**/*.test.ts', '**/rollup.config.ts'], }, ], }, diff --git a/packages/sdk/cloudflare/example/package.json b/packages/sdk/cloudflare/example/package.json index 7d299d3218..eb3b255993 100644 --- a/packages/sdk/cloudflare/example/package.json +++ b/packages/sdk/cloudflare/example/package.json @@ -5,7 +5,7 @@ "module": "./dist/index.mjs", "packageManager": "yarn@3.4.1", "dependencies": { - "@launchdarkly/cloudflare-server-sdk": "^2.0.2" + "@launchdarkly/cloudflare-server-sdk": "^2.1.4" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230321.0", @@ -23,6 +23,6 @@ "build": "node build.js", "start": "wrangler dev", "deploy": "wrangler publish", - "test": "yarn build && node --experimental-vm-modules --no-warnings node_modules/jest/bin/jest.js" + "test": "yarn build && jest" } } diff --git a/packages/sdk/cloudflare/example/src/index.test.ts b/packages/sdk/cloudflare/example/src/index.test.ts index 2c11ecb3c8..0ada182361 100644 --- a/packages/sdk/cloudflare/example/src/index.test.ts +++ b/packages/sdk/cloudflare/example/src/index.test.ts @@ -1,15 +1,22 @@ import app from './index'; import testData from './testData.json'; -test('variation true', async () => { - // arrange - const env = getMiniflareBindings(); - const { LD_KV } = env; - await LD_KV.put('LD-Env-test-sdk-key', JSON.stringify(testData)); +describe('test', () => { + let env: Bindings; - // act - const res = await app.fetch(new Request('http://localhost'), env); + beforeEach(async () => { + env = getMiniflareBindings(); + const { LD_KV } = env; + await LD_KV.put('LD-Env-test-sdk-key', JSON.stringify(testData)); + }); - // assert - expect(await res.text()).toContain('testFlag1: true'); + test('variation true', async () => { + const res = await app.fetch(new Request('http://localhost/?email=truemail'), env); + expect(await res.text()).toContain('testFlag1: true'); + }); + + test('variation false', async () => { + const res = await app.fetch(new Request('http://localhost/?email=falsemail'), env); + expect(await res.text()).toContain('testFlag1: false'); + }); }); diff --git a/packages/sdk/cloudflare/example/src/index.ts b/packages/sdk/cloudflare/example/src/index.ts index 9658d32c07..11d785ed3b 100644 --- a/packages/sdk/cloudflare/example/src/index.ts +++ b/packages/sdk/cloudflare/example/src/index.ts @@ -4,7 +4,11 @@ export default { async fetch(request: Request, env: Bindings): Promise { const sdkKey = 'test-sdk-key'; const flagKey = 'testFlag1'; - const context = { kind: 'user', key: 'test-user-key-1', email: 'test@gmail.com' }; + const { searchParams } = new URL(request.url); + + // falsemail will return false, other emails return true + const email = searchParams.get('email') ?? 'test@anymail.com'; + const context = { kind: 'user', key: 'test-user-key-1', email }; // start using ld const client = initLD(sdkKey, env.LD_KV); diff --git a/packages/sdk/cloudflare/example/src/testData.json b/packages/sdk/cloudflare/example/src/testData.json index 495819a24d..d4fbacd7bb 100644 --- a/packages/sdk/cloudflare/example/src/testData.json +++ b/packages/sdk/cloudflare/example/src/testData.json @@ -14,7 +14,7 @@ "contextKind": "user", "attribute": "/email", "op": "contains", - "values": ["gmail"], + "values": ["falsemail"], "negate": false } ], diff --git a/packages/sdk/cloudflare/package.json b/packages/sdk/cloudflare/package.json index 2a68d0ae62..6e07ac1c49 100644 --- a/packages/sdk/cloudflare/package.json +++ b/packages/sdk/cloudflare/package.json @@ -17,34 +17,43 @@ ], "type": "module", "exports": { - "require": "./dist/cjs/src/index.js", - "import": "./dist/esm/src/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js" }, - "main": "./dist/cjs/src/index.js", - "types": "./dist/cjs/src/index.d.ts", + "main": "./dist/cjs/index.js", + "types": "./dist/index.d.ts", "files": [ "dist" ], "scripts": { - "build": "../../../scripts/build-package.sh", "clean": "rimraf dist", + "rb": "rollup -c --configPlugin typescript", + "rbw": "yarn rb --watch", + "build": "yarn clean && yarn rb", "tsw": "yarn tsc --watch", "start": "rimraf dist && yarn tsw", "lint": "eslint . --ext .ts", "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore", "test": "NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" jest --ci --runInBand", "coverage": "yarn test --coverage", - "check": "yarn prettier && yarn lint && yarn build && yarn test && yarn doc" + "check": "yarn prettier && yarn lint && yarn build && yarn test" }, "dependencies": { "@cloudflare/workers-types": "^4.20230321.0", - "@launchdarkly/js-server-sdk-common-edge": "1.0.13", "crypto-js": "^4.1.1" }, "devDependencies": { + "@launchdarkly/js-server-sdk-common-edge": "1.0.13", + "@rollup/plugin-commonjs": "^25.0.4", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.2.1", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/plugin-typescript": "^11.1.3", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/crypto-js": "^4.1.1", "@types/jest": "^29.5.0", + "@types/rollup-plugin-generate-package-json": "^3.2.3", "@typescript-eslint/eslint-plugin": "^6.1.0", "@typescript-eslint/parser": "^6.1.0", "eslint": "^8.45.0", @@ -57,9 +66,17 @@ "launchdarkly-js-test-helpers": "^2.2.0", "miniflare": "^2.13.0", "prettier": "^3.0.0", - "rimraf": "^5.0.0", + "rimraf": "^5.0.1", + "rollup": "^3.29.2", + "rollup-plugin-dts": "^6.0.2", + "rollup-plugin-esbuild": "^5.0.0", + "rollup-plugin-filesize": "^10.0.0", + "rollup-plugin-generate-package-json": "^3.2.0", "ts-jest": "^29.1.0", "typedoc": "0.25.0", "typescript": "5.1.6" - } + }, + "bundledDependencies": [ + "@launchdarkly/js-server-sdk-common-edge" + ] } diff --git a/packages/sdk/cloudflare/rollup.config.ts b/packages/sdk/cloudflare/rollup.config.ts new file mode 100644 index 0000000000..4947a117cc --- /dev/null +++ b/packages/sdk/cloudflare/rollup.config.ts @@ -0,0 +1,53 @@ +import commonjs from '@rollup/plugin-commonjs'; +import json from '@rollup/plugin-json'; +import resolve from '@rollup/plugin-node-resolve'; +import terser from '@rollup/plugin-terser'; +import dts from 'rollup-plugin-dts'; +import esbuild from 'rollup-plugin-esbuild'; +import filesize from 'rollup-plugin-filesize'; + +const inputPath = 'src/index.ts'; +const cjsPath = 'dist/cjs/index.js'; +const esmPath = 'dist/esm/index.js'; +const typingsPath = 'dist/index.d.ts'; + +const plugins = [resolve(), commonjs(), esbuild(), json(), terser(), filesize()]; + +// the second array item is a function to include all js-core packages in the bundle so they +// are not imported or required as separate npm packages +const external = [/node_modules/, (id: string) => !id.includes('js-core')]; + +export default [ + { + input: inputPath, + output: [ + { + file: cjsPath, + format: 'cjs', + sourcemap: true, + }, + ], + plugins, + external, + }, + { + input: inputPath, + output: [ + { + file: esmPath, + format: 'esm', + sourcemap: true, + }, + ], + plugins, + external, + }, + { + input: inputPath, + plugins: [dts(), json()], + output: { + file: typingsPath, + format: 'esm', + }, + }, +]; diff --git a/packages/sdk/cloudflare/src/index.test.ts b/packages/sdk/cloudflare/src/index.test.ts index baeed982fb..978d525d63 100644 --- a/packages/sdk/cloudflare/src/index.test.ts +++ b/packages/sdk/cloudflare/src/index.test.ts @@ -51,7 +51,7 @@ describe('init', () => { }); test('rule match', async () => { - const contextWithEmail = { ...context, email: 'test@gmail.com' }; + const contextWithEmail = { ...context, email: 'test@falsemail.com' }; const value = await ldClient.variation(flagKey1, contextWithEmail, false); const detail = await ldClient.variationDetail(flagKey1, contextWithEmail, false); diff --git a/packages/sdk/cloudflare/src/testData.json b/packages/sdk/cloudflare/src/testData.json index b9e5296c03..f4b0b3e3fb 100644 --- a/packages/sdk/cloudflare/src/testData.json +++ b/packages/sdk/cloudflare/src/testData.json @@ -14,7 +14,7 @@ "contextKind": "user", "attribute": "/email", "op": "contains", - "values": ["gmail"], + "values": ["falsemail"], "negate": false } ], diff --git a/packages/sdk/cloudflare/tsconfig.json b/packages/sdk/cloudflare/tsconfig.json index 3192817efa..cdc07991e6 100644 --- a/packages/sdk/cloudflare/tsconfig.json +++ b/packages/sdk/cloudflare/tsconfig.json @@ -3,9 +3,9 @@ // Uses "." so it can load package.json. "rootDir": ".", "outDir": "dist", - "target": "es2017", + "target": "ES2017", "lib": ["es6"], - "module": "commonjs", + "module": "ES6", "strict": true, "noImplicitOverride": true, "allowSyntheticDefaultImports": true, diff --git a/scripts/build-package.sh b/scripts/build-package.sh index 93e38fe009..0466d3697e 100755 --- a/scripts/build-package.sh +++ b/scripts/build-package.sh @@ -1,3 +1,4 @@ +#!/usr/bin/env bash # Run this script like: # ./scripts/build-package.sh @@ -23,7 +24,7 @@ ESM_PACKAGE_JSON=$( jq -n \ --arg type "module" \ '{ name: $name, version: $version, type: $type }' ) -tsc --module commonjs --outDir dist/cjs/ +tsc --module commonjs --outDir dist/cjs/ echo "$CJS_PACKAGE_JSON" > dist/cjs/package.json tsc --module es2022 --outDir dist/esm/