diff --git a/.github/renovate.json5 b/.github/renovate.json5 index f898df460c..ae7c2b023c 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -139,6 +139,7 @@ "@babel/core", "@babel/preset-env", "@bitwarden/sdk-internal", + "@bitwarden/commercial-sdk-internal", "@electron/fuses", "@electron/notarize", "@electron/rebuild", diff --git a/.github/workflows/build-browser.yml b/.github/workflows/build-browser.yml index 5980ef507c..1c805e8efb 100644 --- a/.github/workflows/build-browser.yml +++ b/.github/workflows/build-browser.yml @@ -219,12 +219,14 @@ jobs: archive_name_prefix: "" npm_command_prefix: "dist:" readable: "open source license" + type: "oss" - build_prefix: "bit-" artifact_prefix: "bit-" source_archive_name_prefix: "bit-" archive_name_prefix: "bit-" npm_command_prefix: "dist:bit:" readable: "commercial license" + type: "commercial" browser: - name: "chrome" npm_command_suffix: "chrome" @@ -279,6 +281,11 @@ jobs: run: npm ci working-directory: browser-source/ + - name: Remove commercial packages + if: ${{ matrix.license_type.type == 'oss' }} + run: rm -rf node_modules/@bitwarden/commercial-sdk-internal + working-directory: browser-source/ + - name: Download SDK artifacts if: ${{ inputs.sdk_branch != '' }} uses: bitwarden/gh-actions/download-artifacts@main @@ -350,11 +357,13 @@ jobs: archive_name_prefix: "" npm_command_prefix: "dist:" readable: "open source license" + type: "oss" - build_prefix: "bit-" artifact_prefix: "bit-" archive_name_prefix: "bit-" npm_command_prefix: "dist:bit:" readable: "commercial license" + type: "commercial" env: _BUILD_NUMBER: ${{ needs.setup.outputs.adj_build_number }} _NODE_VERSION: ${{ needs.setup.outputs.node_version }} @@ -461,6 +470,11 @@ jobs: run: npm ci working-directory: ./ + - name: Remove commercial packages + if: ${{ matrix.license_type.type == 'oss' }} + run: rm -rf node_modules/@bitwarden/commercial-sdk-internal + working-directory: ./ + - name: Download SDK Artifacts if: ${{ inputs.sdk_branch != '' }} uses: bitwarden/gh-actions/download-artifacts@main diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 1f7b35f330..c2abbdf5e5 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -98,8 +98,8 @@ jobs: ] license_type: [ - { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, - { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } + { type: "oss", build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, + { type: "commercial", build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } ] runs-on: ${{ matrix.os.distro }} needs: setup @@ -140,6 +140,11 @@ jobs: run: npm ci working-directory: ./ + - name: Remove commercial packages + if: ${{ matrix.license_type.type == 'oss' }} + run: rm -rf node_modules/@bitwarden/commercial-sdk-internal + working-directory: ./ + - name: Download SDK Artifacts if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main @@ -291,8 +296,8 @@ jobs: matrix: license_type: [ - { build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, - { build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } + { type: "oss", build_prefix: "oss", artifact_prefix: "-oss", readable: "open source license" }, + { type: "commercial", build_prefix: "bit", artifact_prefix: "", readable: "commercial license" } ] runs-on: windows-2022 permissions: @@ -410,6 +415,11 @@ jobs: run: npm ci working-directory: ./ + - name: Remove commercial packages + if: ${{ matrix.license_type.type == 'oss' }} + run: Remove-Item -Recurse -Force -ErrorAction SilentlyContinue "node_modules/@bitwarden/commercial-sdk-internal" + working-directory: ./ + - name: Download SDK Artifacts if: ${{ inputs.sdk_branch != '' && needs.setup.outputs.has_secrets == 'true' }} uses: bitwarden/gh-actions/download-artifacts@main diff --git a/.github/workflows/build-web.yml b/.github/workflows/build-web.yml index ee7444f13a..0ea3ad7af7 100644 --- a/.github/workflows/build-web.yml +++ b/.github/workflows/build-web.yml @@ -99,34 +99,43 @@ jobs: matrix: include: - artifact_name: selfhosted-open-source + license_type: "oss" image_name: web-oss npm_command: dist:oss:selfhost - artifact_name: cloud-COMMERCIAL + license_type: "commercial" image_name: web-cloud npm_command: dist:bit:cloud - artifact_name: selfhosted-COMMERCIAL + license_type: "commercial" image_name: web npm_command: dist:bit:selfhost - artifact_name: selfhosted-DEV + license_type: "commercial" image_name: web npm_command: build:bit:selfhost:dev git_metadata: true - artifact_name: cloud-QA + license_type: "commercial" image_name: web-qa-cloud npm_command: build:bit:qa git_metadata: true - artifact_name: ee + license_type: "commercial" image_name: web-ee npm_command: build:bit:ee git_metadata: true - artifact_name: cloud-euprd + license_type: "commercial" image_name: web-euprd npm_command: build:bit:euprd - artifact_name: cloud-euqa + license_type: "commercial" image_name: web-euqa npm_command: build:bit:euqa git_metadata: true - artifact_name: cloud-usdev + license_type: "commercial" image_name: web-usdev npm_command: build:bit:usdev git_metadata: true @@ -269,6 +278,7 @@ jobs: build-args: | NODE_VERSION=${{ env._NODE_VERSION }} NPM_COMMAND=${{ matrix.npm_command }} + LICENSE_TYPE=${{ matrix.license_type }} context: . file: apps/web/Dockerfile load: true diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index bc78462fdb..2178633929 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -75,6 +75,9 @@ jobs: - name: Lint unowned dependencies run: npm run lint:dep-ownership + - name: Lint sdk-internal versions + run: npm run lint:sdk-internal-versions + - name: Run linter run: npm run lint diff --git a/.npmrc b/.npmrc index 421cf18217..38a7eb153c 100644 --- a/.npmrc +++ b/.npmrc @@ -1,4 +1,4 @@ save-exact=true # Increase available heap size to avoid running out of memory when compiling. # This applies to all npm scripts in this repository. -node-options=--max-old-space-size=8192 \ No newline at end of file +node-options=--max-old-space-size=8192 diff --git a/apps/browser/webpack.base.js b/apps/browser/webpack.base.js index 734a46ac18..4bc2a90c4f 100644 --- a/apps/browser/webpack.base.js +++ b/apps/browser/webpack.base.js @@ -36,7 +36,8 @@ const DEFAULT_PARAMS = { * outputPath?: string; * mode?: string; * env?: string; - * additionalEntries?: { [outputPath: string]: string } + * additionalEntries?: { [outputPath: string]: string }; + * importAliases?: import("webpack").ResolveOptions["alias"]; * }} params - The input parameters for building the config. */ module.exports.buildConfig = function buildConfig(params) { @@ -362,6 +363,7 @@ module.exports.buildConfig = function buildConfig(params) { path: require.resolve("path-browserify"), }, cache: true, + alias: params.importAliases, }, output: { filename: "[name].js", @@ -482,6 +484,7 @@ module.exports.buildConfig = function buildConfig(params) { path: require.resolve("path-browserify"), }, cache: true, + alias: params.importAliases, }, dependencies: ["main"], plugins: [...requiredPlugins, new AngularCheckPlugin()], diff --git a/apps/cli/webpack.base.js b/apps/cli/webpack.base.js index 01d5fc5b17..532b0a747a 100644 --- a/apps/cli/webpack.base.js +++ b/apps/cli/webpack.base.js @@ -31,6 +31,7 @@ const DEFAULT_PARAMS = { * localesPath?: string; * externalsModulesDir?: string; * watch?: boolean; + * importAliases?: import("webpack").ResolveOptions["alias"]; * }} params */ module.exports.buildConfig = function buildConfig(params) { @@ -95,6 +96,7 @@ module.exports.buildConfig = function buildConfig(params) { symlinks: false, modules: params.modulesPath, plugins: [new TsconfigPathsPlugin({ configFile: params.tsConfig })], + alias: params.importAliases, }, output: { filename: "[name].js", diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index 6017d60df5..6d27e12537 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -9,6 +9,12 @@ COPY package*.json ./ COPY . . RUN npm ci +# Remove commercial packages if LICENSE_TYPE is not 'commercial' +ARG LICENSE_TYPE=oss +RUN if [ "${LICENSE_TYPE}" != "commercial" ] ; then \ + rm -rf node_modules/@bitwarden/commercial-sdk-internal ; \ + fi + WORKDIR /source/apps/web ARG NPM_COMMAND=dist:bit:selfhost RUN npm run ${NPM_COMMAND} diff --git a/apps/web/webpack.base.js b/apps/web/webpack.base.js index 56fd6c7faf..f1e627a58a 100644 --- a/apps/web/webpack.base.js +++ b/apps/web/webpack.base.js @@ -36,6 +36,7 @@ const DEFAULT_PARAMS = { * outputPath?: string; * mode?: string; * env?: string; + * importAliases?: import("webpack").ResolveOptions["alias"]; * }} params */ module.exports.buildConfig = function buildConfig(params) { @@ -460,6 +461,7 @@ module.exports.buildConfig = function buildConfig(params) { process: false, path: require.resolve("path-browserify"), }, + alias: params.importAliases, }, output: { filename: "[name].[contenthash].js", diff --git a/bitwarden_license/bit-browser/webpack.config.js b/bitwarden_license/bit-browser/webpack.config.js index 1c6ab51549..a0b1870721 100644 --- a/bitwarden_license/bit-browser/webpack.config.js +++ b/bitwarden_license/bit-browser/webpack.config.js @@ -36,6 +36,12 @@ module.exports = (webpackConfig, context) => { : context.options.outputPath, mode: mode, env: ENV, + importAliases: [ + { + name: "@bitwarden/sdk-internal", + alias: "@bitwarden/commercial-sdk-internal", + }, + ], }); } else { // npm build configuration @@ -49,6 +55,12 @@ module.exports = (webpackConfig, context) => { entry: path.resolve(__dirname, "src/platform/background.ts"), }, tsConfig: path.resolve(__dirname, "tsconfig.json"), + importAliases: [ + { + name: "@bitwarden/sdk-internal", + alias: "@bitwarden/commercial-sdk-internal", + }, + ], }); } }; diff --git a/bitwarden_license/bit-cli/webpack.config.js b/bitwarden_license/bit-cli/webpack.config.js index f746da4076..6d31d0b5e9 100644 --- a/bitwarden_license/bit-cli/webpack.config.js +++ b/bitwarden_license/bit-cli/webpack.config.js @@ -24,6 +24,12 @@ module.exports = (webpackConfig, context) => { localesPath: "apps/cli/src/locales", externalsModulesDir: "node_modules", watch: context.options.watch || false, + importAliases: [ + { + name: "@bitwarden/sdk-internal", + alias: "@bitwarden/commercial-sdk-internal", + }, + ], }); } else { // npm build configuration @@ -43,6 +49,12 @@ module.exports = (webpackConfig, context) => { modulesPath: [path.resolve("../../node_modules")], localesPath: "../../apps/cli/src/locales", externalsModulesDir: "../../node_modules", + importAliases: [ + { + name: "@bitwarden/sdk-internal", + alias: "@bitwarden/commercial-sdk-internal", + }, + ], }); } }; diff --git a/bitwarden_license/bit-web/webpack.config.js b/bitwarden_license/bit-web/webpack.config.js index 6ac1efdc19..6433eee59f 100644 --- a/bitwarden_license/bit-web/webpack.config.js +++ b/bitwarden_license/bit-web/webpack.config.js @@ -17,6 +17,12 @@ module.exports = (webpackConfig, context) => { context.context && context.context.root ? path.resolve(context.context.root, context.options.outputPath) : context.options.outputPath, + importAliases: [ + { + name: "@bitwarden/sdk-internal", + alias: "@bitwarden/commercial-sdk-internal", + }, + ], }); } else { return buildConfig({ @@ -26,6 +32,12 @@ module.exports = (webpackConfig, context) => { entryModule: "bitwarden_license/bit-web/src/app/app.module#AppModule", }, tsConfig: path.resolve(__dirname, "tsconfig.build.json"), + importAliases: [ + { + name: "@bitwarden/sdk-internal", + alias: "@bitwarden/commercial-sdk-internal", + }, + ], }); } }; diff --git a/package-lock.json b/package-lock.json index 8ce60e0826..747576d4ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@angular/platform-browser": "19.2.14", "@angular/platform-browser-dynamic": "19.2.14", "@angular/router": "19.2.14", + "@bitwarden/commercial-sdk-internal": "0.2.0-main.357", "@bitwarden/sdk-internal": "0.2.0-main.357", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", @@ -4605,6 +4606,27 @@ "resolved": "libs/client-type", "link": true }, + "node_modules/@bitwarden/commercial-sdk-internal": { + "version": "0.2.0-main.357", + "resolved": "https://registry.npmjs.org/@bitwarden/commercial-sdk-internal/-/commercial-sdk-internal-0.2.0-main.357.tgz", + "integrity": "sha512-eIArJelJKwG+aEGbtdhc5dKRBFopmyGJl+ClUQGJUFHzfrPGDcaSI04a/sSUK0NtbaxQOsf8qSvk+iKvISkKmw==", + "license": "BITWARDEN SOFTWARE DEVELOPMENT KIT LICENSE AGREEMENT", + "dependencies": { + "type-fest": "^4.41.0" + } + }, + "node_modules/@bitwarden/commercial-sdk-internal/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@bitwarden/common": { "resolved": "libs/common", "link": true diff --git a/package.json b/package.json index 89e127488b..c241e07e2e 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "test:types": "node ./scripts/test-types.js", "test:locales": "tsc --project ./scripts/tsconfig.json && node ./scripts/dist/test-locales.js", "lint:dep-ownership": "tsc --project ./scripts/tsconfig.json && node ./scripts/dist/dep-ownership.js", + "lint:sdk-internal-versions": "tsc --project ./scripts/tsconfig.json && node ./scripts/dist/sdk-internal-versions.js", "docs:json": "compodoc -p ./tsconfig.json -e json -d . --disableRoutesGraph", "storybook": "ng run components:storybook", "build-storybook": "ng run components:build-storybook", @@ -160,6 +161,7 @@ "@angular/platform-browser-dynamic": "19.2.14", "@angular/router": "19.2.14", "@bitwarden/sdk-internal": "0.2.0-main.357", + "@bitwarden/commercial-sdk-internal": "0.2.0-main.357", "@electron/fuses": "1.8.0", "@emotion/css": "11.13.5", "@koa/multer": "4.0.0", diff --git a/scripts/sdk-internal-versions.ts b/scripts/sdk-internal-versions.ts new file mode 100644 index 0000000000..c442772e55 --- /dev/null +++ b/scripts/sdk-internal-versions.ts @@ -0,0 +1,22 @@ +/* eslint-disable no-console */ + +/// Ensure that `sdk-internal` and `commercial-sdk-internal` dependencies have matching versions. + +import fs from "fs"; +import path from "path"; + +const packageJson = JSON.parse( + fs.readFileSync(path.join(__dirname, "..", "..", "package.json"), "utf8"), +); + +const sdkInternal = packageJson.dependencies["@bitwarden/sdk-internal"]; +const commercialSdkInternal = packageJson.dependencies["@bitwarden/commercial-sdk-internal"]; + +if (sdkInternal !== commercialSdkInternal) { + console.error( + `Version mismatch between @bitwarden/sdk-internal (${sdkInternal}) and @bitwarden/commercial-sdk-internal (${commercialSdkInternal}), must be an exact match.`, + ); + process.exit(1); +} + +console.log(`All dependencies have matching versions: ${sdkInternal}`);