diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..3d629b9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,35 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + test: + name: test and build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + + - name: Install + run: npm ci + + - name: Unit tests + run: npm test + + - name: Build the CDN bundle + run: npm run build + + - name: Check bundle size + run: | + SIZE=$(wc -c < dist/wproofreader-learnosity.min.js) + echo "Bundle size: ${SIZE} bytes" + if [ "$SIZE" -gt 10240 ]; then + echo "::warning::CDN bundle exceeds 10 KB soft ceiling (${SIZE} bytes)" + fi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3bdd52e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +.DS_Store diff --git a/CHANGELOG.md b/CHANGELOG.md index dc746c0..0916901 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to `@webspellchecker/wproofreader-learnosity`. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). +## [1.2.0] + +### Features + +- **Two install paths.** Existing ESM via npm, plus a new IIFE bundle (`dist/wproofreader-learnosity.min.js`) served from jsDelivr, exposing `window.LearnosityWProofreader.init` for host apps that load the connector via a ` + +``` + +The bundle exposes a single global, `window.LearnosityWProofreader`, with the same `init` method. About 5 KB minified, no runtime dependencies. jsDelivr serves from npm, so the pinned URL above resolves once the package is published. + ## Quickstart ```js diff --git a/package-lock.json b/package-lock.json index f389af7..c43eb28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,467 @@ { "name": "@webspellchecker/wproofreader-learnosity", - "version": "1.1.0", - "lockfileVersion": 1 + "version": "1.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@webspellchecker/wproofreader-learnosity", + "version": "1.2.0", + "license": "Apache-2.0", + "devDependencies": { + "esbuild": "^0.23.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + } + } } diff --git a/package.json b/package.json index b1e3213..c17b8c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@webspellchecker/wproofreader-learnosity", - "version": "1.1.0", + "version": "1.2.0", "description": "WProofreader for Learnosity. Spelling, grammar and style assistance inside Learnosity rich-text widgets.", "type": "module", "main": "src/index.js", @@ -13,12 +13,18 @@ }, "files": [ "src/", + "dist/", "README.md", "LICENSE", "CHANGELOG.md" ], "scripts": { - "test": "node --test tests/" + "test": "node --test tests/*.test.js", + "build": "esbuild src/index.js --bundle --format=iife --global-name=LearnosityWProofreader '--footer:js=LearnosityWProofreader=LearnosityWProofreader.default;' --minify --outfile=dist/wproofreader-learnosity.min.js", + "prepack": "npm run build" + }, + "devDependencies": { + "esbuild": "^0.23.0" }, "keywords": [ "learnosity", diff --git a/tests/unit.test.js b/tests/unit.test.js index 6095860..ddf8920 100644 --- a/tests/unit.test.js +++ b/tests/unit.test.js @@ -5,7 +5,19 @@ */ import { test } from 'node:test'; import assert from 'node:assert/strict'; -import LearnosityWProofreader from '../src/index.js'; + +/* + * The connector keeps module-level state (`initialized`, `currentConnectorConfig`) + * so that init() is idempotent in production. That same state would leak + * between tests if we imported the module once at the top. Instead each test + * imports a fresh copy via a cache-busting query string, so every test sees a + * brand-new module instance with `initialized = false`. Idempotence is still + * covered: the dedicated test calls `init()` twice on the same fresh import. + */ +async function freshConnector() { + const mod = await import('../src/index.js?bust=' + Math.random()); + return mod.default; +} /* * Mock the bits of the browser environment the connector needs. We only @@ -46,16 +58,18 @@ function uninstallFakeBrowser() { delete globalThis.MutationObserver; } -test('init() with no wproofreader.serviceId and no wproofreader.serviceHost is a silent no-op', (t) => { +test('init() with no wproofreader.serviceId and no wproofreader.serviceHost is a silent no-op', async (t) => { const win = installFakeBrowser(); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({}); assert.equal(win.WEBSPELLCHECKER_CONFIG, undefined); }); -test('init() with only wproofreader.serviceHost activates self-hosted path', (t) => { +test('init() with only wproofreader.serviceHost activates self-hosted path', async (t) => { const win = installFakeBrowser(); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceProtocol: 'https', @@ -71,53 +85,60 @@ test('init() with only wproofreader.serviceHost activates self-hosted path', (t) assert.equal(win.WEBSPELLCHECKER_CONFIG.serviceId, undefined); }); -test('init() with wproofreader.serviceId writes the Cloud config', (t) => { +test('init() with wproofreader.serviceId writes the Cloud config', async (t) => { const win = installFakeBrowser(); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc-123' } }); assert.equal(win.WEBSPELLCHECKER_CONFIG.serviceId, 'svc-123'); assert.equal(win.WEBSPELLCHECKER_CONFIG.enableGrammar, true); assert.equal(win.WEBSPELLCHECKER_CONFIG.autocorrect, true); }); -test('explicit wproofreader.lang overrides defaultLang', (t) => { +test('explicit wproofreader.lang overrides defaultLang', async (t) => { const win = installFakeBrowser({ htmlLang: 'fr-FR' }); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc', lang: 'de_DE' } }); assert.equal(win.WEBSPELLCHECKER_CONFIG.lang, 'de_DE'); }); -test('lang defaults to with hyphen normalised', (t) => { +test('lang defaults to with hyphen normalised', async (t) => { const win = installFakeBrowser({ htmlLang: 'fr-FR' }); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc' } }); assert.equal(win.WEBSPELLCHECKER_CONFIG.lang, 'fr_FR'); }); -test('lang falls back to en_US for a bare un-regioned ', (t) => { +test('lang falls back to en_US for a bare un-regioned ', async (t) => { const win = installFakeBrowser({ htmlLang: 'en' }); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc' } }); assert.equal(win.WEBSPELLCHECKER_CONFIG.lang, 'en_US'); }); -test('lang falls back to en_US when is absent', (t) => { +test('lang falls back to en_US when is absent', async (t) => { const win = installFakeBrowser({ htmlLang: '' }); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc' } }); assert.equal(win.WEBSPELLCHECKER_CONFIG.lang, 'en_US'); }); -test('unknown WProofreader options pass through to the global config', (t) => { +test('unknown WProofreader options pass through to the global config', async (t) => { const win = installFakeBrowser(); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc', someFutureWProofreaderOption: 'x' } }); assert.equal(win.WEBSPELLCHECKER_CONFIG.someFutureWProofreaderOption, 'x'); }); -test('connector-only options do not leak into WProofreader config', (t) => { +test('connector-only options do not leak into WProofreader config', async (t) => { const win = installFakeBrowser(); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'svc' }, surfaces: ['questions', 'items', 'author'], @@ -131,9 +152,10 @@ test('connector-only options do not leak into WProofreader config', (t) => { assert.equal(win.WEBSPELLCHECKER_CONFIG.bundleUrl, undefined); }); -test('init() is idempotent: second call updates the existing WProofreader config in place', (t) => { +test('init() is idempotent: second call updates the existing WProofreader config in place', async (t) => { const win = installFakeBrowser(); t.after(uninstallFakeBrowser); + const LearnosityWProofreader = await freshConnector(); LearnosityWProofreader.init({ wproofreader: { serviceId: 'first' } }); const firstRef = win.WEBSPELLCHECKER_CONFIG; LearnosityWProofreader.init({ wproofreader: { serviceId: 'second', lang: 'fr_FR' } });