2026-05-11 15:50:34 +02:00
import { dirname , join } from 'node:path' ;
2026-05-10 23:12:26 +02:00
import assert from 'node:assert/strict' ;
import { readFile } from 'node:fs/promises' ;
export const DEFAULT _VERSION _TAG = 'latest' ;
export const NO _PACKAGE _REASON =
2026-05-10 23:51:24 +02:00
'Set KTX_PUBLISHED_KTX_PACKAGE or release-policy.json publishedPackageSmoke.packageName to the published npm package name after the release decision.' ;
2026-05-10 23:12:26 +02:00
function optionalTrimmedString ( value ) {
return typeof value === 'string' && value . trim ( ) . length > 0 ? value . trim ( ) : null ;
}
function assertSafePackageName ( packageName , label ) {
if ( ! /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/ . test ( packageName ) ) {
throw new Error ( ` Invalid ${ label } : ${ packageName } ` ) ;
}
}
function assertSafeVersionTag ( version , label ) {
if ( ! /^[a-zA-Z0-9][a-zA-Z0-9._+-]*$/ . test ( version ) ) {
throw new Error ( ` Invalid ${ label } : ${ version } ` ) ;
}
}
function assertHttpRegistry ( registry , label ) {
const parsed = new URL ( registry ) ;
if ( parsed . protocol !== 'https:' && parsed . protocol !== 'http:' ) {
throw new Error ( ` ${ label } must be an http(s) URL ` ) ;
}
}
2026-05-11 15:50:34 +02:00
function registryEnv ( config ) {
return config . registry ? { npm _config _registry : config . registry } : { } ;
}
function runtimeCommandEnv ( config , runtimeRoot ) {
return { ... registryEnv ( config ) , KTX _RUNTIME _ROOT : runtimeRoot } ;
}
function semanticQueryArgs ( projectDir ) {
return [
'sl' ,
'query' ,
'--project-dir' ,
projectDir ,
'--connection-id' ,
'orbit_demo' ,
'--measure' ,
'contracts.contract_count' ,
'--format' ,
'sql' ,
'--yes' ,
] ;
}
2026-05-10 23:12:26 +02:00
function normalizePolicyConfig ( policyConfig = { } ) {
if ( policyConfig === null || policyConfig === undefined ) {
return { packageName : null , version : DEFAULT _VERSION _TAG , registry : null } ;
}
if ( typeof policyConfig !== 'object' || Array . isArray ( policyConfig ) ) {
throw new Error ( 'release-policy.json publishedPackageSmoke must be a JSON object' ) ;
}
const normalized = {
packageName : optionalTrimmedString ( policyConfig . packageName ) ,
version : optionalTrimmedString ( policyConfig . version ) ? ? DEFAULT _VERSION _TAG ,
registry : optionalTrimmedString ( policyConfig . registry ) ,
} ;
assertSafeVersionTag ( normalized . version , 'release-policy.json publishedPackageSmoke.version' ) ;
if ( normalized . registry ) {
assertHttpRegistry ( normalized . registry , 'release-policy.json publishedPackageSmoke.registry' ) ;
}
return normalized ;
}
export function readPublishedPackageSmokeConfig ( env = process . env , args = process . argv . slice ( 2 ) , policyConfig = { } ) {
const requireConfig = args . includes ( '--require-config' ) ;
const policy = normalizePolicyConfig ( policyConfig ) ;
2026-05-10 23:51:24 +02:00
const envPackageName = optionalTrimmedString ( env . KTX _PUBLISHED _KTX _PACKAGE ) ;
2026-05-10 23:12:26 +02:00
const packageName = envPackageName ? ? policy . packageName ;
if ( ! packageName ) {
return {
enabled : false ,
requireConfig ,
reason : NO _PACKAGE _REASON ,
} ;
}
const configSource = envPackageName ? 'environment' : 'release-policy' ;
assertSafePackageName (
packageName ,
configSource === 'environment'
2026-05-10 23:51:24 +02:00
? 'KTX_PUBLISHED_KTX_PACKAGE'
2026-05-10 23:12:26 +02:00
: 'release-policy.json publishedPackageSmoke.packageName' ,
) ;
2026-05-10 23:51:24 +02:00
const packageVersion = optionalTrimmedString ( env . KTX _PUBLISHED _KTX _VERSION ) ? ? policy . version ;
2026-05-10 23:12:26 +02:00
assertSafeVersionTag (
packageVersion ,
2026-05-10 23:51:24 +02:00
optionalTrimmedString ( env . KTX _PUBLISHED _KTX _VERSION )
? 'KTX_PUBLISHED_KTX_VERSION'
2026-05-10 23:12:26 +02:00
: 'release-policy.json publishedPackageSmoke.version' ,
) ;
2026-05-10 23:51:24 +02:00
const registry = optionalTrimmedString ( env . KTX _PUBLISHED _KTX _REGISTRY ) ? ? policy . registry ;
2026-05-10 23:12:26 +02:00
if ( registry ) {
assertHttpRegistry (
registry ,
2026-05-10 23:51:24 +02:00
optionalTrimmedString ( env . KTX _PUBLISHED _KTX _REGISTRY )
? 'KTX_PUBLISHED_KTX_REGISTRY'
2026-05-10 23:12:26 +02:00
: 'release-policy.json publishedPackageSmoke.registry' ,
) ;
}
return {
enabled : true ,
requireConfig ,
configSource ,
packageName ,
packageVersion ,
registry ,
} ;
}
export async function readPublishedPackageSmokeConfigFromPolicyFile (
policyPath ,
env = process . env ,
args = process . argv . slice ( 2 ) ,
) {
const policy = JSON . parse ( await readFile ( policyPath , 'utf8' ) ) ;
return readPublishedPackageSmokeConfig ( env , args , policy . publishedPackageSmoke ? ? { } ) ;
}
export function publishedPackageSpec ( config ) {
assert . equal ( config . enabled , true , 'publishedPackageSpec requires an enabled smoke config' ) ;
return ` ${ config . packageName } @ ${ config . packageVersion } ` ;
}
2026-05-11 15:50:34 +02:00
export function buildPublishedPackageNpxCommand ( config , args , label = 'published package command' , extraEnv = { } ) {
2026-05-10 23:12:26 +02:00
return {
label ,
command : 'npx' ,
args : [ '--yes' , publishedPackageSpec ( config ) , ... args ] ,
2026-05-11 15:50:34 +02:00
env : { ... registryEnv ( config ) , ... extraEnv } ,
2026-05-10 23:12:26 +02:00
} ;
}
2026-05-11 15:50:34 +02:00
export function buildPublishedPackageSmokeCommands (
config ,
projectDir ,
runtimeRoot = join ( dirname ( projectDir ) , 'managed-runtime' ) ,
) {
const runtimeEnv = runtimeCommandEnv ( config , runtimeRoot ) ;
const packageEnv = registryEnv ( config ) ;
const queryArgs = semanticQueryArgs ( projectDir ) ;
2026-05-10 23:12:26 +02:00
return [
2026-05-11 15:50:34 +02:00
buildPublishedPackageNpxCommand ( config , [ '--version' ] , 'published package npx version' ) ,
2026-05-10 23:12:26 +02:00
buildPublishedPackageNpxCommand (
config ,
2026-05-11 15:50:34 +02:00
[ 'setup' , 'demo' , '--project-dir' , projectDir , '--no-input' , '--plain' ] ,
'published package setup demo' ,
{ KTX _RUNTIME _ROOT : runtimeRoot } ,
2026-05-10 23:12:26 +02:00
) ,
2026-05-11 15:50:34 +02:00
buildPublishedPackageNpxCommand ( config , queryArgs , 'published package npx sl query' , {
KTX _RUNTIME _ROOT : runtimeRoot ,
} ) ,
{
label : 'published package local install' ,
command : 'pnpm' ,
args : [ 'add' , publishedPackageSpec ( config ) ] ,
env : packageEnv ,
} ,
{
label : 'published package local version' ,
command : 'npx' ,
args : [ 'ktx' , '--version' ] ,
env : packageEnv ,
} ,
{
label : 'published package local sl query' ,
command : 'npx' ,
args : [ 'ktx' , ... queryArgs ] ,
env : runtimeEnv ,
} ,
{
label : 'published package global install' ,
command : 'pnpm' ,
args : [ 'add' , '--global' , publishedPackageSpec ( config ) ] ,
env : packageEnv ,
} ,
{
label : 'published package global version' ,
command : 'ktx' ,
args : [ '--version' ] ,
env : packageEnv ,
} ,
{
label : 'published package global sl query' ,
command : 'ktx' ,
args : queryArgs ,
env : runtimeEnv ,
} ,
2026-05-10 23:12:26 +02:00
] ;
}