From 0cca470e253c5394d95eb6e88a1fab002bf038ba Mon Sep 17 00:00:00 2001 From: Etienne Rossignon Date: Wed, 10 Jun 2026 10:23:28 +0200 Subject: [PATCH 1/3] chore: version packages 0.2.0 --- .changeset/config.json | 9 ++- .github/workflows/ci.yml | 63 +++++++----------- .github/workflows/release.yml | 11 +++ .gitignore | Bin 81 -> 68 bytes .husky/pre-push | 2 + packages/app/CHANGELOG.md | 22 ++++++ packages/app/package.json | 2 +- packages/app/src/banner.ts | 14 ++-- packages/app/src/cli.ts | 8 +-- packages/app/src/config.ts | 4 +- packages/app/src/server.ts | 9 +-- packages/core/CHANGELOG.md | 15 +++++ packages/core/package.json | 25 ++++++- packages/demo-embedded/CHANGELOG.md | 23 +++++++ packages/demo-embedded/package.json | 2 +- packages/demo-embedded/src/index.ts | 2 +- packages/opcua-connector/CHANGELOG.md | 20 ++++++ packages/opcua-connector/package.json | 25 ++++++- .../pseudo-session-connector/CHANGELOG.md | 20 ++++++ .../pseudo-session-connector/package.json | 23 ++++++- packages/rest-server/CHANGELOG.md | 20 ++++++ packages/rest-server/package.json | 24 ++++++- 22 files changed, 261 insertions(+), 82 deletions(-) create mode 100644 .husky/pre-push create mode 100644 packages/app/CHANGELOG.md create mode 100644 packages/core/CHANGELOG.md create mode 100644 packages/demo-embedded/CHANGELOG.md create mode 100644 packages/opcua-connector/CHANGELOG.md create mode 100644 packages/pseudo-session-connector/CHANGELOG.md create mode 100644 packages/rest-server/CHANGELOG.md diff --git a/.changeset/config.json b/.changeset/config.json index 0636c2a..90727c6 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,15 +7,14 @@ "@node-i3x/core", "@node-i3x/opcua-connector", "@node-i3x/pseudo-session-connector", - "@node-i3x/rest-server" + "@node-i3x/rest-server", + "@node-i3x/app", + "@node-i3x/demo-embedded" ] ], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": [ - "@node-i3x/app", - "@node-i3x/demo-embedded" - ] + "ignore": [] } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa81f81..5f816f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,12 +9,16 @@ on: branches: [main] pull_request: branches: [main] + workflow_call: + secrets: + NPM_STERFIVE_TOKEN: + required: false env: NODE_ENV: development jobs: - # -- Install ------------------------------------------------- + # -- Install & Build ------------------------------------------ install: runs-on: ubuntu-latest steps: @@ -35,13 +39,17 @@ jobs: - name: Install dependencies run: npm ci - - name: Cache node_modules + - name: Build all packages + run: npm run build + + - name: Cache workspace uses: actions/cache/save@v4 with: path: | node_modules packages/*/node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} + packages/*/dist + key: workspace-${{ github.sha }} # -- Check --------------------------------------------------- typecheck: @@ -54,13 +62,14 @@ jobs: with: node-version: 22 - - name: Restore node_modules + - name: Restore workspace uses: actions/cache/restore@v4 with: path: | node_modules packages/*/node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} + packages/*/dist + key: workspace-${{ github.sha }} - name: TypeScript type check run: npm run typecheck @@ -75,13 +84,14 @@ jobs: with: node-version: 22 - - name: Restore node_modules + - name: Restore workspace uses: actions/cache/restore@v4 with: path: | node_modules packages/*/node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} + packages/*/dist + key: workspace-${{ github.sha }} - name: Biome lint & format check run: npx biome check . @@ -97,13 +107,14 @@ jobs: with: node-version: 22 - - name: Restore node_modules + - name: Restore workspace uses: actions/cache/restore@v4 with: path: | node_modules packages/*/node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} + packages/*/dist + key: workspace-${{ github.sha }} - name: Run tests run: npm test @@ -126,13 +137,14 @@ jobs: with: node-version: 22 - - name: Restore node_modules + - name: Restore workspace uses: actions/cache/restore@v4 with: path: | node_modules packages/*/node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} + packages/*/dist + key: workspace-${{ github.sha }} - name: Remove @sterfive/opcua-optimized-client run: | @@ -142,32 +154,3 @@ jobs: - name: Run tests without optimized client run: npm test - - # -- Build --------------------------------------------------- - build: - needs: [typecheck, lint, test] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: Restore node_modules - uses: actions/cache/restore@v4 - with: - path: | - node_modules - packages/*/node_modules - key: node-modules-${{ hashFiles('package-lock.json') }} - - - name: Build all packages - run: npm run build - - - name: Upload build artifacts - uses: actions/upload-artifact@v4 - with: - name: dist - path: packages/*/dist/ - retention-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7e58ab2..a90bea0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,8 @@ # 2. On merge to main, the workflow either: # a) Opens/updates a "Version Packages" PR # b) If that PR is merged, publishes to npm with provenance +# +# IMPORTANT: Publish only happens after CI (tests/lint) passes. name: Release @@ -33,8 +35,14 @@ permissions: pull-requests: write # to create/update the "Version Packages" PR jobs: + # Gate: wait for CI to pass before releasing + ci: + uses: ./.github/workflows/ci.yml + secrets: inherit + release: name: Version & Publish + needs: ci runs-on: ubuntu-latest timeout-minutes: 30 @@ -59,6 +67,9 @@ jobs: - name: Install dependencies run: npm ci + - name: Build all packages + run: npm run build + - name: Create Release PR or Publish id: changesets uses: changesets/action@v1 diff --git a/.gitignore b/.gitignore index 66e5418f534ea3cf01fee93c1d3d3fe644e01cfa..0aaeb9e01939093c2750814e59ffe98f7017c744 100644 GIT binary patch delta 10 RcmWG^nPAVVrI(VL1ON}w0_^|* delta 23 ecmZ<>oM10h#*o2K%%I1R!jQ_4#K6nI#Q*?69RxT4 diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 0000000..8f980f6 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,2 @@ +npx biome check . +npm test diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md new file mode 100644 index 0000000..5cff1f3 --- /dev/null +++ b/packages/app/CHANGELOG.md @@ -0,0 +1,22 @@ +# @node-i3x/app + +## 0.2.0 + +### Minor Changes + +- feat: publishable CLI, turbo builds, and demo-embedded + + - @node-i3x/app: evolved into publishable CLI with commander, + cosmiconfig, layered config (defaults → yml → env → args) + - @node-i3x/demo-embedded: publishable with i3x-demo and + i3x-demo-client bin entries, CLI args for ports + - All library packages now export from dist/ (no tsx required) + - Added turbo for dependency-ordered cached builds + - Added VHS recording scripts for demo GIF + +### Patch Changes + +- Updated dependencies + - @node-i3x/core@0.2.0 + - @node-i3x/opcua-connector@0.2.0 + - @node-i3x/rest-server@0.2.0 diff --git a/packages/app/package.json b/packages/app/package.json index 85538ac..0e0f709 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@node-i3x/app", - "version": "0.1.0", + "version": "0.2.0", "description": "i3X CLI -- expose OPC UA servers as i3X REST APIs", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)", diff --git a/packages/app/src/banner.ts b/packages/app/src/banner.ts index 8e715ad..356eed1 100644 --- a/packages/app/src/banner.ts +++ b/packages/app/src/banner.ts @@ -7,14 +7,14 @@ export function printBanner( ): void { const lines = [ '', - ' i3X Server v' + version, + ` i3X Server v${version}`, '', - ' OPC UA: ' + config.endpoint, - ' REST: http://' + config.host + ':' + config.port, + ` OPC UA: ${config.endpoint}`, + ` REST: http://${config.host}:${config.port}`, ]; if (nodeCount !== undefined) { - lines.push(' Model: ' + nodeCount + ' nodes'); + lines.push(` Model: ${nodeCount} nodes`); } lines.push(''); @@ -26,12 +26,12 @@ export function printBanner( const width = maxLen + 2; const hr = '-'.repeat(width); - const top = ' +' + hr + '+'; - const bot = ' +' + hr + '+'; + const top = ` +${hr}+`; + const bot = ` +${hr}+`; console.log(top); for (const line of lines) { - console.log(' |' + line.padEnd(width) + '|'); + console.log(` |${line.padEnd(width)}|`); } console.log(bot); console.log(); diff --git a/packages/app/src/cli.ts b/packages/app/src/cli.ts index 1bee19d..b49a961 100644 --- a/packages/app/src/cli.ts +++ b/packages/app/src/cli.ts @@ -17,10 +17,7 @@ program .option('-p, --port ', 'REST API port', parseInt) .option('-H, --host ', 'REST API bind address') .option('--security-mode ', 'OPC UA security mode') - .option( - '--optimized-client ', - 'Optimized client: auto | disabled', - ) + .option('--optimized-client ', 'Optimized client: auto | disabled') .option( '--subscription-interval ', 'Subscription interval in seconds', @@ -36,8 +33,7 @@ program if (opts.port !== undefined) cliArgs.port = opts.port; if (opts.host) cliArgs.host = opts.host; if (opts.securityMode) cliArgs.securityMode = opts.securityMode; - if (opts.optimizedClient) - cliArgs.optimizedClient = opts.optimizedClient; + if (opts.optimizedClient) cliArgs.optimizedClient = opts.optimizedClient; if (opts.subscriptionInterval !== undefined) cliArgs.subscriptionInterval = opts.subscriptionInterval; if (opts.logLevel) cliArgs.logLevel = opts.logLevel; diff --git a/packages/app/src/config.ts b/packages/app/src/config.ts index 52ecb5a..93bb767 100644 --- a/packages/app/src/config.ts +++ b/packages/app/src/config.ts @@ -97,9 +97,7 @@ export async function resolveConfig( }); try { - const result = configPath - ? await explorer.load(configPath) - : await explorer.search(); + const result = configPath ? await explorer.load(configPath) : await explorer.search(); if (result && !result.isEmpty) { fileConfig = result.config as Partial; } diff --git a/packages/app/src/server.ts b/packages/app/src/server.ts index 3551a9e..f000e75 100644 --- a/packages/app/src/server.ts +++ b/packages/app/src/server.ts @@ -7,13 +7,10 @@ import { } from '@node-i3x/core'; import { OpcUaClient, OpcUaDataSourceAdapter } from '@node-i3x/opcua-connector'; import { createApp } from '@node-i3x/rest-server'; -import type { I3xConfig } from './config.js'; import { printBanner } from './banner.js'; +import type { I3xConfig } from './config.js'; -export async function startServer( - config: I3xConfig, - version: string, -): Promise { +export async function startServer(config: I3xConfig, version: string): Promise { const logger = consoleLogger; // 1. Outbound adapter (OPC UA) @@ -58,7 +55,7 @@ export async function startServer( const model = await modelService.preloadModel(); nodeCount = model.nodesById.size; } catch (err) { - logger.error('Model preload failed: ' + String(err)); + logger.error(`Model preload failed: ${String(err)}`); if (config.failOnPreloadError) process.exit(1); } } diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md new file mode 100644 index 0000000..a044bb8 --- /dev/null +++ b/packages/core/CHANGELOG.md @@ -0,0 +1,15 @@ +# @node-i3x/core + +## 0.2.0 + +### Minor Changes + +- feat: publishable CLI, turbo builds, and demo-embedded + + - @node-i3x/app: evolved into publishable CLI with commander, + cosmiconfig, layered config (defaults → yml → env → args) + - @node-i3x/demo-embedded: publishable with i3x-demo and + i3x-demo-client bin entries, CLI args for ports + - All library packages now export from dist/ (no tsx required) + - Added turbo for dependency-ordered cached builds + - Added VHS recording scripts for demo GIF diff --git a/packages/core/package.json b/packages/core/package.json index 2d80111..b6d06e0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@node-i3x/core", - "version": "0.1.0", + "version": "0.2.0", "description": "i3X domain core — models, ports, and services (zero dependencies)", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)", @@ -18,7 +18,21 @@ "type": "commercial", "url": "https://sterfive.com" }, - "keywords": ["opcua", "opc-ua", "i3x", "i3x2ua", "industrial", "iiot", "iot", "domain", "hexagonal-architecture", "ports-and-adapters", "digital-twin", "asset-management", "sterfive"], + "keywords": [ + "opcua", + "opc-ua", + "i3x", + "i3x2ua", + "industrial", + "iiot", + "iot", + "domain", + "hexagonal-architecture", + "ports-and-adapters", + "digital-twin", + "asset-management", + "sterfive" + ], "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -31,7 +45,12 @@ "publishConfig": { "provenance": true }, - "files": ["dist", "LICENSE", "LICENSE-AGPL-3.0", "LICENSING.md"], + "files": [ + "dist", + "LICENSE", + "LICENSE-AGPL-3.0", + "LICENSING.md" + ], "scripts": { "build": "tsup", "typecheck": "tsc --noEmit" diff --git a/packages/demo-embedded/CHANGELOG.md b/packages/demo-embedded/CHANGELOG.md new file mode 100644 index 0000000..84b11e3 --- /dev/null +++ b/packages/demo-embedded/CHANGELOG.md @@ -0,0 +1,23 @@ +# @node-i3x/demo-embedded + +## 0.2.0 + +### Minor Changes + +- feat: publishable CLI, turbo builds, and demo-embedded + + - @node-i3x/app: evolved into publishable CLI with commander, + cosmiconfig, layered config (defaults → yml → env → args) + - @node-i3x/demo-embedded: publishable with i3x-demo and + i3x-demo-client bin entries, CLI args for ports + - All library packages now export from dist/ (no tsx required) + - Added turbo for dependency-ordered cached builds + - Added VHS recording scripts for demo GIF + +### Patch Changes + +- Updated dependencies + - @node-i3x/core@0.2.0 + - @node-i3x/opcua-connector@0.2.0 + - @node-i3x/pseudo-session-connector@0.2.0 + - @node-i3x/rest-server@0.2.0 diff --git a/packages/demo-embedded/package.json b/packages/demo-embedded/package.json index 944e7df..8030844 100644 --- a/packages/demo-embedded/package.json +++ b/packages/demo-embedded/package.json @@ -1,6 +1,6 @@ { "name": "@node-i3x/demo-embedded", - "version": "0.1.0", + "version": "0.2.0", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)", "homepage": "https://sterfive.com", diff --git a/packages/demo-embedded/src/index.ts b/packages/demo-embedded/src/index.ts index ec63032..8c7dab4 100644 --- a/packages/demo-embedded/src/index.ts +++ b/packages/demo-embedded/src/index.ts @@ -6,6 +6,7 @@ // AddressSpace in memory. // ───────────────────────────────────────────────────────────── +import { parseArgs } from 'node:util'; import { consoleLogger, HistoryService, @@ -16,7 +17,6 @@ import { import { PseudoSessionDataSourceAdapter } from '@node-i3x/pseudo-session-connector'; import { createApp } from '@node-i3x/rest-server'; import { DataType, nodesets, OPCUAServer, type UAVariable, Variant } from 'node-opcua'; -import { parseArgs } from 'node:util'; const { values: args } = parseArgs({ options: { diff --git a/packages/opcua-connector/CHANGELOG.md b/packages/opcua-connector/CHANGELOG.md new file mode 100644 index 0000000..8a29c3b --- /dev/null +++ b/packages/opcua-connector/CHANGELOG.md @@ -0,0 +1,20 @@ +# @node-i3x/opcua-connector + +## 0.2.0 + +### Minor Changes + +- feat: publishable CLI, turbo builds, and demo-embedded + + - @node-i3x/app: evolved into publishable CLI with commander, + cosmiconfig, layered config (defaults → yml → env → args) + - @node-i3x/demo-embedded: publishable with i3x-demo and + i3x-demo-client bin entries, CLI args for ports + - All library packages now export from dist/ (no tsx required) + - Added turbo for dependency-ordered cached builds + - Added VHS recording scripts for demo GIF + +### Patch Changes + +- Updated dependencies + - @node-i3x/core@0.2.0 diff --git a/packages/opcua-connector/package.json b/packages/opcua-connector/package.json index daf7c65..6fdedf3 100644 --- a/packages/opcua-connector/package.json +++ b/packages/opcua-connector/package.json @@ -1,6 +1,6 @@ { "name": "@node-i3x/opcua-connector", - "version": "0.1.0", + "version": "0.2.0", "description": "i3X OPC UA adapter — implements IDataSourcePort using node-opcua", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)", @@ -18,7 +18,21 @@ "type": "commercial", "url": "https://sterfive.com" }, - "keywords": ["opcua", "opc-ua", "opc ua", "i3x", "industrial", "iiot", "iot", "scada", "plc", "node-opcua", "client", "automation", "sterfive"], + "keywords": [ + "opcua", + "opc-ua", + "opc ua", + "i3x", + "industrial", + "iiot", + "iot", + "scada", + "plc", + "node-opcua", + "client", + "automation", + "sterfive" + ], "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -31,7 +45,12 @@ "publishConfig": { "provenance": true }, - "files": ["dist", "LICENSE", "LICENSE-AGPL-3.0", "LICENSING.md"], + "files": [ + "dist", + "LICENSE", + "LICENSE-AGPL-3.0", + "LICENSING.md" + ], "scripts": { "build": "tsup", "typecheck": "tsc --noEmit" diff --git a/packages/pseudo-session-connector/CHANGELOG.md b/packages/pseudo-session-connector/CHANGELOG.md new file mode 100644 index 0000000..a951d3a --- /dev/null +++ b/packages/pseudo-session-connector/CHANGELOG.md @@ -0,0 +1,20 @@ +# @node-i3x/pseudo-session-connector + +## 0.2.0 + +### Minor Changes + +- feat: publishable CLI, turbo builds, and demo-embedded + + - @node-i3x/app: evolved into publishable CLI with commander, + cosmiconfig, layered config (defaults → yml → env → args) + - @node-i3x/demo-embedded: publishable with i3x-demo and + i3x-demo-client bin entries, CLI args for ports + - All library packages now export from dist/ (no tsx required) + - Added turbo for dependency-ordered cached builds + - Added VHS recording scripts for demo GIF + +### Patch Changes + +- Updated dependencies + - @node-i3x/core@0.2.0 diff --git a/packages/pseudo-session-connector/package.json b/packages/pseudo-session-connector/package.json index f2a28fd..5df3727 100644 --- a/packages/pseudo-session-connector/package.json +++ b/packages/pseudo-session-connector/package.json @@ -1,6 +1,6 @@ { "name": "@node-i3x/pseudo-session-connector", - "version": "0.1.0", + "version": "0.2.0", "description": "i3X data-source adapter using node-opcua PseudoSession — connects directly to an AddressSpace without binary OPC UA transport", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)", @@ -18,7 +18,19 @@ "type": "commercial", "url": "https://sterfive.com" }, - "keywords": ["opcua", "opc-ua", "i3x", "industrial", "iiot", "embedded", "pseudo-session", "address-space", "in-process", "node-opcua", "sterfive"], + "keywords": [ + "opcua", + "opc-ua", + "i3x", + "industrial", + "iiot", + "embedded", + "pseudo-session", + "address-space", + "in-process", + "node-opcua", + "sterfive" + ], "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -31,7 +43,12 @@ "publishConfig": { "provenance": true }, - "files": ["dist", "LICENSE", "LICENSE-AGPL-3.0", "LICENSING.md"], + "files": [ + "dist", + "LICENSE", + "LICENSE-AGPL-3.0", + "LICENSING.md" + ], "scripts": { "build": "tsup", "typecheck": "tsc --noEmit", diff --git a/packages/rest-server/CHANGELOG.md b/packages/rest-server/CHANGELOG.md new file mode 100644 index 0000000..4fb48b0 --- /dev/null +++ b/packages/rest-server/CHANGELOG.md @@ -0,0 +1,20 @@ +# @node-i3x/rest-server + +## 0.2.0 + +### Minor Changes + +- feat: publishable CLI, turbo builds, and demo-embedded + + - @node-i3x/app: evolved into publishable CLI with commander, + cosmiconfig, layered config (defaults → yml → env → args) + - @node-i3x/demo-embedded: publishable with i3x-demo and + i3x-demo-client bin entries, CLI args for ports + - All library packages now export from dist/ (no tsx required) + - Added turbo for dependency-ordered cached builds + - Added VHS recording scripts for demo GIF + +### Patch Changes + +- Updated dependencies + - @node-i3x/core@0.2.0 diff --git a/packages/rest-server/package.json b/packages/rest-server/package.json index 7dd1c19..f1513d3 100644 --- a/packages/rest-server/package.json +++ b/packages/rest-server/package.json @@ -1,6 +1,6 @@ { "name": "@node-i3x/rest-server", - "version": "0.1.0", + "version": "0.2.0", "description": "i3X REST inbound adapter — Fastify routes for the i3X Beta API", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)", @@ -18,7 +18,20 @@ "type": "commercial", "url": "https://sterfive.com" }, - "keywords": ["opcua", "opc-ua", "i3x", "rest-api", "rest", "fastify", "industrial", "iiot", "iot", "automation", "digital-twin", "sterfive"], + "keywords": [ + "opcua", + "opc-ua", + "i3x", + "rest-api", + "rest", + "fastify", + "industrial", + "iiot", + "iot", + "automation", + "digital-twin", + "sterfive" + ], "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -31,7 +44,12 @@ "publishConfig": { "provenance": true }, - "files": ["dist", "LICENSE", "LICENSE-AGPL-3.0", "LICENSING.md"], + "files": [ + "dist", + "LICENSE", + "LICENSE-AGPL-3.0", + "LICENSING.md" + ], "scripts": { "build": "tsup", "typecheck": "tsc --noEmit" From 2b24047895c5f5730d8369d36a1e92ac7152e20f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:53:57 +0000 Subject: [PATCH 2/3] Initial plan From 38c76e9fe71b57db86e2b2cef4d22dce7a11af46 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:59:09 +0000 Subject: [PATCH 3/3] fix: keep private workspaces out of changeset publishing --- .changeset/config.json | 9 ++--- packages/app/package.json | 1 + packages/core/tests/release-config.test.ts | 39 ++++++++++++++++++++++ packages/demo-embedded/package.json | 1 + 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 packages/core/tests/release-config.test.ts diff --git a/.changeset/config.json b/.changeset/config.json index 90727c6..0636c2a 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,14 +7,15 @@ "@node-i3x/core", "@node-i3x/opcua-connector", "@node-i3x/pseudo-session-connector", - "@node-i3x/rest-server", - "@node-i3x/app", - "@node-i3x/demo-embedded" + "@node-i3x/rest-server" ] ], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": [] + "ignore": [ + "@node-i3x/app", + "@node-i3x/demo-embedded" + ] } diff --git a/packages/app/package.json b/packages/app/package.json index 0e0f709..9ccaf3a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,5 +1,6 @@ { "name": "@node-i3x/app", + "private": true, "version": "0.2.0", "description": "i3X CLI -- expose OPC UA servers as i3X REST APIs", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", diff --git a/packages/core/tests/release-config.test.ts b/packages/core/tests/release-config.test.ts new file mode 100644 index 0000000..e3ca4a6 --- /dev/null +++ b/packages/core/tests/release-config.test.ts @@ -0,0 +1,39 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from 'vitest'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../..'); + +function readJson(relativePath: string): T { + return JSON.parse(fs.readFileSync(path.join(repoRoot, relativePath), 'utf8')); +} + +describe('release configuration', () => { + it('only fixed-versions publishable packages', () => { + const changesetConfig = readJson<{ + fixed: string[][]; + ignore: string[]; + }>('.changeset/config.json'); + + expect(changesetConfig.fixed).toEqual([ + [ + '@node-i3x/core', + '@node-i3x/opcua-connector', + '@node-i3x/pseudo-session-connector', + '@node-i3x/rest-server', + ], + ]); + expect(changesetConfig.ignore).toEqual(['@node-i3x/app', '@node-i3x/demo-embedded']); + }); + + it('marks non-publishable workspaces as private', () => { + const appPackage = readJson<{ private?: boolean }>('packages/app/package.json'); + const demoPackage = readJson<{ private?: boolean }>( + 'packages/demo-embedded/package.json', + ); + + expect(appPackage.private).toBe(true); + expect(demoPackage.private).toBe(true); + }); +}); diff --git a/packages/demo-embedded/package.json b/packages/demo-embedded/package.json index 8030844..85946c5 100644 --- a/packages/demo-embedded/package.json +++ b/packages/demo-embedded/package.json @@ -1,5 +1,6 @@ { "name": "@node-i3x/demo-embedded", + "private": true, "version": "0.2.0", "license": "AGPL-3.0-or-later OR LicenseRef-Sterfive-Commercial", "author": "Sterfive SAS (https://sterfive.com)",