@servicetitan/startup 38.3.1 → 39.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -157,7 +157,7 @@ class MFEList extends _types.Command {
157
157
  return (0, _utils.getPackages)({
158
158
  ignore: this.args.ignore,
159
159
  type: _utils.PackageType.Bundle
160
- }).filter(_utils.isWebComponent).map(({ name })=>name).sort((a, b)=>collator.compare(a, b));
160
+ }).filter(({ location })=>(0, _utils.isWebComponent)(location)).map(({ name })=>name).sort((a, b)=>collator.compare(a, b));
161
161
  }
162
162
  get registry() {
163
163
  var _this_args_registry;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/commands/mfe-list.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport { npmWhoAmI } from '@servicetitan/install';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport readline from 'readline/promises';\nimport {\n formatRelativeDate,\n getPackages,\n isWebComponent,\n log,\n logErrors,\n PackageType,\n} from '../../utils';\nimport { isTTY, NPMPackageInfo, npmView, runCommand } from '../utils';\nimport type { entry } from './registry/mfe-list';\nimport { Command } from './types';\nimport { DEFAULT_MFE_REGISTRY } from './utils';\n\nconst collator = new Intl.Collator();\n\nexport class MFEList extends Command<typeof entry> {\n @logErrors\n async execute() {\n await this.login();\n\n this.packageNames.forEach((name, index) => {\n const info = npmView({ packageName: name, registry: this.registry });\n if (info) {\n if (index > 0) {\n process.stdout.write('\\n');\n }\n\n process.stdout.write(this.getCaption(info) + '\\n');\n const table = this.getTable(info);\n if (table) {\n process.stdout.write(table + '\\n');\n }\n }\n });\n }\n\n private getCaption(info: NPMPackageInfo) {\n return [\n chalk.bold.cyan(info.name),\n info.version && `version: ${info.version}`,\n `versions: ${Object.keys(this.getTime(info)).length}`,\n ]\n .filter(el => !!el)\n .join(' | ');\n }\n\n private getTable(info: NPMPackageInfo) {\n const times = Object.entries(this.getTime(info)).sort(\n ([, a], [, b]) => -1 * collator.compare(a, b)\n );\n const versionTags = this.getVersionTags(info);\n const versions = this.args.tagged\n ? times.filter(([version]) => !!versionTags[version])\n : times.slice(0, this.limit);\n\n /* istanbul ignore next: debug only */\n log.debug('mfe-list', () =>\n JSON.stringify({ name: info.name, versionTags, versions }, null, 2)\n );\n\n if (versions.length === 0) {\n return '';\n }\n\n const table = new Table({\n head: ['Version', 'Tag', 'When'].map(title => chalk.bold.cyan(title)),\n style: { head: [] },\n });\n\n versions.forEach(([version, timestamp]) => {\n const when = formatRelativeDate(new Date(timestamp));\n const tag = (versionTags[version] ?? []).join(', ');\n table.push([version, chalk.bold.cyan(tag), when]);\n });\n\n return table.toString();\n }\n\n private getTime(info: NPMPackageInfo) {\n const { time: { created, modified, ...time } = {} } = info;\n return time;\n }\n\n private getVersionTags({ 'dist-tags': distTags = {} }: NPMPackageInfo) {\n return Object.entries(distTags).reduce<Record<string, string[]>>(\n (result, [name, version]) => {\n result[version] ??= [];\n result[version].push(name);\n return result;\n },\n {}\n );\n }\n\n private async ask(question: string) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(question);\n rl.close();\n return answer.trim().toLowerCase();\n }\n\n private async login() {\n if (\n this.registry !== DEFAULT_MFE_REGISTRY ||\n npmWhoAmI({ registry: this.registry }) !== undefined\n ) {\n return;\n }\n\n const message = `This machine is not authorized to access ${this.registry}.`;\n if (!isTTY()) {\n throw new Error(message);\n }\n\n const answer = await this.ask(chalk.bold.cyan(`${message} Authorize? [Y/n] `));\n if (answer && answer !== 'y') {\n throw new Error('Not authorized');\n }\n\n await runCommand(`npx --yes verdaccio-okta-oauth@latest --registry=${this.registry}`, {\n quiet: true,\n });\n }\n\n private get limit() {\n if (this.args.all) {\n return Number.MAX_SAFE_INTEGER;\n }\n return this.args.limit && this.args.limit > 0 ? this.args.limit : 20;\n }\n\n private get packageNames() {\n const { _ = [], packageNames = [] } = this.args;\n if (_.length || packageNames.length) {\n return [..._, ...packageNames];\n }\n\n return getPackages({ ignore: this.args.ignore, type: PackageType.Bundle })\n .filter(isWebComponent)\n .map(({ name }) => name)\n .sort((a, b) => collator.compare(a, b));\n }\n\n private get registry() {\n return this.args.registry ?? DEFAULT_MFE_REGISTRY;\n }\n}\n"],"names":["MFEList","collator","Intl","Collator","Command","execute","login","packageNames","forEach","name","index","info","npmView","packageName","registry","process","stdout","write","getCaption","table","getTable","chalk","bold","cyan","version","Object","keys","getTime","length","filter","el","join","times","entries","sort","a","b","compare","versionTags","getVersionTags","versions","args","tagged","slice","limit","log","debug","JSON","stringify","Table","head","map","title","style","timestamp","when","formatRelativeDate","Date","tag","push","toString","time","created","modified","distTags","reduce","result","ask","question","rl","readline","createInterface","input","stdin","output","answer","close","trim","toLowerCase","DEFAULT_MFE_REGISTRY","npmWhoAmI","undefined","message","isTTY","Error","runCommand","quiet","all","Number","MAX_SAFE_INTEGER","_","getPackages","ignore","type","PackageType","Bundle","isWebComponent"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/cli/commands/mfe-list.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport { npmWhoAmI } from '@servicetitan/install';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport readline from 'readline/promises';\nimport {\n formatRelativeDate,\n getPackages,\n isWebComponent,\n log,\n logErrors,\n PackageType,\n} from '../../utils';\nimport { isTTY, NPMPackageInfo, npmView, runCommand } from '../utils';\nimport type { entry } from './registry/mfe-list';\nimport { Command } from './types';\nimport { DEFAULT_MFE_REGISTRY } from './utils';\n\nconst collator = new Intl.Collator();\n\nexport class MFEList extends Command<typeof entry> {\n @logErrors\n async execute() {\n await this.login();\n\n this.packageNames.forEach((name, index) => {\n const info = npmView({ packageName: name, registry: this.registry });\n if (info) {\n if (index > 0) {\n process.stdout.write('\\n');\n }\n\n process.stdout.write(this.getCaption(info) + '\\n');\n const table = this.getTable(info);\n if (table) {\n process.stdout.write(table + '\\n');\n }\n }\n });\n }\n\n private getCaption(info: NPMPackageInfo) {\n return [\n chalk.bold.cyan(info.name),\n info.version && `version: ${info.version}`,\n `versions: ${Object.keys(this.getTime(info)).length}`,\n ]\n .filter(el => !!el)\n .join(' | ');\n }\n\n private getTable(info: NPMPackageInfo) {\n const times = Object.entries(this.getTime(info)).sort(\n ([, a], [, b]) => -1 * collator.compare(a, b)\n );\n const versionTags = this.getVersionTags(info);\n const versions = this.args.tagged\n ? times.filter(([version]) => !!versionTags[version])\n : times.slice(0, this.limit);\n\n /* istanbul ignore next: debug only */\n log.debug('mfe-list', () =>\n JSON.stringify({ name: info.name, versionTags, versions }, null, 2)\n );\n\n if (versions.length === 0) {\n return '';\n }\n\n const table = new Table({\n head: ['Version', 'Tag', 'When'].map(title => chalk.bold.cyan(title)),\n style: { head: [] },\n });\n\n versions.forEach(([version, timestamp]) => {\n const when = formatRelativeDate(new Date(timestamp));\n const tag = (versionTags[version] ?? []).join(', ');\n table.push([version, chalk.bold.cyan(tag), when]);\n });\n\n return table.toString();\n }\n\n private getTime(info: NPMPackageInfo) {\n const { time: { created, modified, ...time } = {} } = info;\n return time;\n }\n\n private getVersionTags({ 'dist-tags': distTags = {} }: NPMPackageInfo) {\n return Object.entries(distTags).reduce<Record<string, string[]>>(\n (result, [name, version]) => {\n result[version] ??= [];\n result[version].push(name);\n return result;\n },\n {}\n );\n }\n\n private async ask(question: string) {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await rl.question(question);\n rl.close();\n return answer.trim().toLowerCase();\n }\n\n private async login() {\n if (\n this.registry !== DEFAULT_MFE_REGISTRY ||\n npmWhoAmI({ registry: this.registry }) !== undefined\n ) {\n return;\n }\n\n const message = `This machine is not authorized to access ${this.registry}.`;\n if (!isTTY()) {\n throw new Error(message);\n }\n\n const answer = await this.ask(chalk.bold.cyan(`${message} Authorize? [Y/n] `));\n if (answer && answer !== 'y') {\n throw new Error('Not authorized');\n }\n\n await runCommand(`npx --yes verdaccio-okta-oauth@latest --registry=${this.registry}`, {\n quiet: true,\n });\n }\n\n private get limit() {\n if (this.args.all) {\n return Number.MAX_SAFE_INTEGER;\n }\n return this.args.limit && this.args.limit > 0 ? this.args.limit : 20;\n }\n\n private get packageNames() {\n const { _ = [], packageNames = [] } = this.args;\n if (_.length || packageNames.length) {\n return [..._, ...packageNames];\n }\n\n return getPackages({ ignore: this.args.ignore, type: PackageType.Bundle })\n .filter(({ location }) => isWebComponent(location))\n .map(({ name }) => name)\n .sort((a, b) => collator.compare(a, b));\n }\n\n private get registry() {\n return this.args.registry ?? DEFAULT_MFE_REGISTRY;\n }\n}\n"],"names":["MFEList","collator","Intl","Collator","Command","execute","login","packageNames","forEach","name","index","info","npmView","packageName","registry","process","stdout","write","getCaption","table","getTable","chalk","bold","cyan","version","Object","keys","getTime","length","filter","el","join","times","entries","sort","a","b","compare","versionTags","getVersionTags","versions","args","tagged","slice","limit","log","debug","JSON","stringify","Table","head","map","title","style","timestamp","when","formatRelativeDate","Date","tag","push","toString","time","created","modified","distTags","reduce","result","ask","question","rl","readline","createInterface","input","stdin","output","answer","close","trim","toLowerCase","DEFAULT_MFE_REGISTRY","npmWhoAmI","undefined","message","isTTY","Error","runCommand","quiet","all","Number","MAX_SAFE_INTEGER","_","getPackages","ignore","type","PackageType","Bundle","location","isWebComponent"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cli-npm.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cli-npm.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAWrF;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE,CAmB7F;AAED,wBAAgB,iBAAiB,WAOhC;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAI/F;AAED,wBAAsB,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAE7E;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAE7D;AAED,wBAAsB,aAAa,CAAC,EAChC,WAAW,EACX,cAAc,EACd,QAAQ,EACR,GAAG,GACN,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACf,iBAmBA;AAED,wBAAsB,YAAY,CAAC,EAC/B,WAAW,EACX,QAAQ,EACR,GAAG,GACN,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACf,iBAGA;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,8BAY5F"}
1
+ {"version":3,"file":"cli-npm.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cli-npm.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAWrF;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,EAAE,CAmB7F;AAED,wBAAgB,iBAAiB,WAOhC;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAI/F;AAED,wBAAsB,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAE7E;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,iBAE7D;AAED,wBAAsB,aAAa,CAAC,EAChC,WAAW,EACX,cAAc,EACd,QAAQ,EACR,GAAG,GACN,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACf,iBAmBA;AAED,wBAAsB,YAAY,CAAC,EAC/B,WAAW,EACX,QAAQ,EACR,GAAG,GACN,EAAE;IACC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACf,iBAGA;AAED,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,OAAO,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,8BAY5F"}
@@ -41,6 +41,11 @@ const _utils = require("../../utils");
41
41
  const _clios = require("./cli-os");
42
42
  const _withexponentialbackoff = require("./with-exponential-backoff");
43
43
  const NPM_TIMEOUT = 10000;
44
+ // npm >=12 wraps `npm view` output in an array
45
+ function parseNpmViewJson(result) {
46
+ const parsed = JSON.parse(result);
47
+ return Array.isArray(parsed) ? parsed[0] : parsed;
48
+ }
44
49
  function npmGetPackageVersions(registry, packageName) {
45
50
  try {
46
51
  const v = (0, _clios.runCommandOutput)(`npm show ${packageName} versions --registry ${registry} --json`, {
@@ -56,7 +61,7 @@ function npmGetPackageVersionsDetails(registry, packageName) {
56
61
  const result = (0, _clios.runCommandOutput)(`npm view ${packageName} time dist-tags --registry ${registry} --json`, {
57
62
  timeout: NPM_TIMEOUT
58
63
  });
59
- const { time, 'dist-tags': distTags } = JSON.parse(result);
64
+ const { time, 'dist-tags': distTags } = parseNpmViewJson(result);
60
65
  const tags = Object.fromEntries(Object.entries(distTags).map(([tag, version])=>[
61
66
  version,
62
67
  tag
@@ -127,7 +132,7 @@ function npmView({ packageName, registry }) {
127
132
  timeout: NPM_TIMEOUT
128
133
  });
129
134
  if (result) {
130
- return JSON.parse(result);
135
+ return parseNpmViewJson(result);
131
136
  }
132
137
  } catch (unused) {
133
138
  // ignore
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/cli/utils/cli-npm.ts"],"sourcesContent":["import { log } from '../../utils';\nimport { runCommand, runCommandOutput } from './cli-os';\nimport { withExponentialBackoff } from './with-exponential-backoff';\n\nexport interface Version {\n name: string;\n date: Date;\n tag?: string;\n}\n\nconst NPM_TIMEOUT = 10000;\n\nexport function npmGetPackageVersions(registry: string, packageName: string): string[] {\n try {\n const v = runCommandOutput(\n `npm show ${packageName} versions --registry ${registry} --json`,\n { timeout: NPM_TIMEOUT }\n );\n\n return JSON.parse(v);\n } catch {\n return [];\n }\n}\n\nexport function npmGetPackageVersionsDetails(registry: string, packageName: string): Version[] {\n try {\n const result = runCommandOutput(\n `npm view ${packageName} time dist-tags --registry ${registry} --json`,\n { timeout: NPM_TIMEOUT }\n );\n\n const { time, 'dist-tags': distTags } = JSON.parse(result);\n\n const tags = Object.fromEntries(\n Object.entries(distTags).map(([tag, version]) => [version, tag])\n );\n\n return Object.keys(time).reduce((out, version) => {\n return [...out, { name: version, date: new Date(time[version]), tag: tags[version] }];\n }, []);\n } catch {\n return [];\n }\n}\n\nexport function npmGetProjectRoot() {\n return runCommandOutput('npm prefix', {\n quiet: true,\n // ignore stderr because any error here is fundamental and will be repeated elsewhere\n stdio: ['inherit', 'pipe', 'ignore'],\n timeout: NPM_TIMEOUT,\n }).trim();\n}\n\nexport async function npmUnpublish(registry: string, packageName: string, packageVersion: string) {\n await runCommand(`npm unpublish ${packageName}@${packageVersion} --registry ${registry}`, {\n timeout: NPM_TIMEOUT,\n });\n}\n\nexport async function npmPublish({ dry, tag }: { dry?: boolean; tag?: string }) {\n await runCommand(['npm publish', !!tag && `--tag ${tag}`, !!dry && `--dry-run`]);\n}\n\nexport async function npmPackageSet(key: string, value: string) {\n await runCommand(`npm pkg set ${key}=${value}`);\n}\n\nexport async function npmTagVersion({\n packageName,\n packageVersion,\n registry,\n tag,\n}: {\n packageName: string;\n packageVersion: string;\n registry?: string;\n tag: string;\n}) {\n /*\n * Retrying with backoff because verdaccio's dist-tag write can briefly 404\n * right after the version it targets was published (metadata propagation lag).\n */\n await withExponentialBackoff(\n () =>\n runCommand(\n `npm dist-tag ${\n registry ? `--registry=${registry} ` : ''\n }add ${packageName}@${packageVersion} ${tag}`\n ),\n {\n onRetry: delay =>\n log.warning(\n `Failed to tag ${packageName}@${packageVersion} with \"${tag}\", retrying in ${delay}ms...`\n ),\n }\n );\n}\n\nexport async function npmRemoveTag({\n packageName,\n registry,\n tag,\n}: {\n packageName: string;\n registry?: string;\n tag: string;\n}) {\n const registryFlag = registry ? `--registry=${registry} ` : '';\n await runCommand(`npm dist-tag ${registryFlag}rm ${packageName} ${tag}`);\n}\n\nexport interface NPMPackageInfo {\n 'name': string;\n 'version': string;\n 'dist-tags'?: Record<string, string>;\n 'time'?: Record<string, string>;\n 'versions'?: string[];\n}\n\nexport function npmView({ packageName, registry }: { packageName: string; registry?: string }) {\n try {\n const result = runCommandOutput(\n ['npm', 'view', '--json', registry ? `--registry=${registry}` : '', packageName],\n { quiet: true, timeout: NPM_TIMEOUT }\n );\n if (result) {\n return JSON.parse(result) as NPMPackageInfo;\n }\n } catch {\n // ignore\n }\n}\n"],"names":["npmGetPackageVersions","npmGetPackageVersionsDetails","npmGetProjectRoot","npmPackageSet","npmPublish","npmRemoveTag","npmTagVersion","npmUnpublish","npmView","NPM_TIMEOUT","registry","packageName","v","runCommandOutput","timeout","JSON","parse","result","time","distTags","tags","Object","fromEntries","entries","map","tag","version","keys","reduce","out","name","date","Date","quiet","stdio","trim","packageVersion","runCommand","dry","key","value","withExponentialBackoff","onRetry","delay","log","warning","registryFlag"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/cli/utils/cli-npm.ts"],"sourcesContent":["import { log } from '../../utils';\nimport { runCommand, runCommandOutput } from './cli-os';\nimport { withExponentialBackoff } from './with-exponential-backoff';\n\nexport interface Version {\n name: string;\n date: Date;\n tag?: string;\n}\n\nconst NPM_TIMEOUT = 10000;\n\n// npm >=12 wraps `npm view` output in an array\nfunction parseNpmViewJson(result: string) {\n const parsed = JSON.parse(result);\n return Array.isArray(parsed) ? parsed[0] : parsed;\n}\n\nexport function npmGetPackageVersions(registry: string, packageName: string): string[] {\n try {\n const v = runCommandOutput(\n `npm show ${packageName} versions --registry ${registry} --json`,\n { timeout: NPM_TIMEOUT }\n );\n\n return JSON.parse(v);\n } catch {\n return [];\n }\n}\n\nexport function npmGetPackageVersionsDetails(registry: string, packageName: string): Version[] {\n try {\n const result = runCommandOutput(\n `npm view ${packageName} time dist-tags --registry ${registry} --json`,\n { timeout: NPM_TIMEOUT }\n );\n\n const { time, 'dist-tags': distTags } = parseNpmViewJson(result);\n\n const tags = Object.fromEntries(\n Object.entries(distTags).map(([tag, version]) => [version, tag])\n );\n\n return Object.keys(time).reduce((out, version) => {\n return [...out, { name: version, date: new Date(time[version]), tag: tags[version] }];\n }, []);\n } catch {\n return [];\n }\n}\n\nexport function npmGetProjectRoot() {\n return runCommandOutput('npm prefix', {\n quiet: true,\n // ignore stderr because any error here is fundamental and will be repeated elsewhere\n stdio: ['inherit', 'pipe', 'ignore'],\n timeout: NPM_TIMEOUT,\n }).trim();\n}\n\nexport async function npmUnpublish(registry: string, packageName: string, packageVersion: string) {\n await runCommand(`npm unpublish ${packageName}@${packageVersion} --registry ${registry}`, {\n timeout: NPM_TIMEOUT,\n });\n}\n\nexport async function npmPublish({ dry, tag }: { dry?: boolean; tag?: string }) {\n await runCommand(['npm publish', !!tag && `--tag ${tag}`, !!dry && `--dry-run`]);\n}\n\nexport async function npmPackageSet(key: string, value: string) {\n await runCommand(`npm pkg set ${key}=${value}`);\n}\n\nexport async function npmTagVersion({\n packageName,\n packageVersion,\n registry,\n tag,\n}: {\n packageName: string;\n packageVersion: string;\n registry?: string;\n tag: string;\n}) {\n /*\n * Retrying with backoff because verdaccio's dist-tag write can briefly 404\n * right after the version it targets was published (metadata propagation lag).\n */\n await withExponentialBackoff(\n () =>\n runCommand(\n `npm dist-tag ${\n registry ? `--registry=${registry} ` : ''\n }add ${packageName}@${packageVersion} ${tag}`\n ),\n {\n onRetry: delay =>\n log.warning(\n `Failed to tag ${packageName}@${packageVersion} with \"${tag}\", retrying in ${delay}ms...`\n ),\n }\n );\n}\n\nexport async function npmRemoveTag({\n packageName,\n registry,\n tag,\n}: {\n packageName: string;\n registry?: string;\n tag: string;\n}) {\n const registryFlag = registry ? `--registry=${registry} ` : '';\n await runCommand(`npm dist-tag ${registryFlag}rm ${packageName} ${tag}`);\n}\n\nexport interface NPMPackageInfo {\n 'name': string;\n 'version': string;\n 'dist-tags'?: Record<string, string>;\n 'time'?: Record<string, string>;\n 'versions'?: string[];\n}\n\nexport function npmView({ packageName, registry }: { packageName: string; registry?: string }) {\n try {\n const result = runCommandOutput(\n ['npm', 'view', '--json', registry ? `--registry=${registry}` : '', packageName],\n { quiet: true, timeout: NPM_TIMEOUT }\n );\n if (result) {\n return parseNpmViewJson(result) as NPMPackageInfo;\n }\n } catch {\n // ignore\n }\n}\n"],"names":["npmGetPackageVersions","npmGetPackageVersionsDetails","npmGetProjectRoot","npmPackageSet","npmPublish","npmRemoveTag","npmTagVersion","npmUnpublish","npmView","NPM_TIMEOUT","parseNpmViewJson","result","parsed","JSON","parse","Array","isArray","registry","packageName","v","runCommandOutput","timeout","time","distTags","tags","Object","fromEntries","entries","map","tag","version","keys","reduce","out","name","date","Date","quiet","stdio","trim","packageVersion","runCommand","dry","key","value","withExponentialBackoff","onRetry","delay","log","warning","registryFlag"],"mappings":";;;;;;;;;;;QAkBgBA;eAAAA;;QAaAC;eAAAA;;QAqBAC;eAAAA;;QAmBMC;eAAAA;;QAJAC;eAAAA;;QAuCAC;eAAAA;;QA/BAC;eAAAA;;QAdAC;eAAAA;;QAkENC;eAAAA;;;uBA/HI;uBACyB;wCACN;AAQvC,MAAMC,cAAc;AAEpB,+CAA+C;AAC/C,SAASC,iBAAiBC,MAAc;IACpC,MAAMC,SAASC,KAAKC,KAAK,CAACH;IAC1B,OAAOI,MAAMC,OAAO,CAACJ,UAAUA,MAAM,CAAC,EAAE,GAAGA;AAC/C;AAEO,SAASZ,sBAAsBiB,QAAgB,EAAEC,WAAmB;IACvE,IAAI;QACA,MAAMC,IAAIC,IAAAA,uBAAgB,EACtB,CAAC,SAAS,EAAEF,YAAY,qBAAqB,EAAED,SAAS,OAAO,CAAC,EAChE;YAAEI,SAASZ;QAAY;QAG3B,OAAOI,KAAKC,KAAK,CAACK;IACtB,EAAE,eAAM;QACJ,OAAO,EAAE;IACb;AACJ;AAEO,SAASlB,6BAA6BgB,QAAgB,EAAEC,WAAmB;IAC9E,IAAI;QACA,MAAMP,SAASS,IAAAA,uBAAgB,EAC3B,CAAC,SAAS,EAAEF,YAAY,2BAA2B,EAAED,SAAS,OAAO,CAAC,EACtE;YAAEI,SAASZ;QAAY;QAG3B,MAAM,EAAEa,IAAI,EAAE,aAAaC,QAAQ,EAAE,GAAGb,iBAAiBC;QAEzD,MAAMa,OAAOC,OAAOC,WAAW,CAC3BD,OAAOE,OAAO,CAACJ,UAAUK,GAAG,CAAC,CAAC,CAACC,KAAKC,QAAQ,GAAK;gBAACA;gBAASD;aAAI;QAGnE,OAAOJ,OAAOM,IAAI,CAACT,MAAMU,MAAM,CAAC,CAACC,KAAKH;YAClC,OAAO;mBAAIG;gBAAK;oBAAEC,MAAMJ;oBAASK,MAAM,IAAIC,KAAKd,IAAI,CAACQ,QAAQ;oBAAGD,KAAKL,IAAI,CAACM,QAAQ;gBAAC;aAAE;QACzF,GAAG,EAAE;IACT,EAAE,eAAM;QACJ,OAAO,EAAE;IACb;AACJ;AAEO,SAAS5B;IACZ,OAAOkB,IAAAA,uBAAgB,EAAC,cAAc;QAClCiB,OAAO;QACP,qFAAqF;QACrFC,OAAO;YAAC;YAAW;YAAQ;SAAS;QACpCjB,SAASZ;IACb,GAAG8B,IAAI;AACX;AAEO,eAAehC,aAAaU,QAAgB,EAAEC,WAAmB,EAAEsB,cAAsB;IAC5F,MAAMC,IAAAA,iBAAU,EAAC,CAAC,cAAc,EAAEvB,YAAY,CAAC,EAAEsB,eAAe,YAAY,EAAEvB,UAAU,EAAE;QACtFI,SAASZ;IACb;AACJ;AAEO,eAAeL,WAAW,EAAEsC,GAAG,EAAEb,GAAG,EAAmC;IAC1E,MAAMY,IAAAA,iBAAU,EAAC;QAAC;QAAe,CAAC,CAACZ,OAAO,CAAC,MAAM,EAAEA,KAAK;QAAE,CAAC,CAACa,OAAO,CAAC,SAAS,CAAC;KAAC;AACnF;AAEO,eAAevC,cAAcwC,GAAW,EAAEC,KAAa;IAC1D,MAAMH,IAAAA,iBAAU,EAAC,CAAC,YAAY,EAAEE,IAAI,CAAC,EAAEC,OAAO;AAClD;AAEO,eAAetC,cAAc,EAChCY,WAAW,EACXsB,cAAc,EACdvB,QAAQ,EACRY,GAAG,EAMN;IACG;;;KAGC,GACD,MAAMgB,IAAAA,8CAAsB,EACxB,IACIJ,IAAAA,iBAAU,EACN,CAAC,aAAa,EACVxB,WAAW,CAAC,WAAW,EAAEA,SAAS,CAAC,CAAC,GAAG,GAC1C,IAAI,EAAEC,YAAY,CAAC,EAAEsB,eAAe,CAAC,EAAEX,KAAK,GAErD;QACIiB,SAASC,CAAAA,QACLC,UAAG,CAACC,OAAO,CACP,CAAC,cAAc,EAAE/B,YAAY,CAAC,EAAEsB,eAAe,OAAO,EAAEX,IAAI,eAAe,EAAEkB,MAAM,KAAK,CAAC;IAErG;AAER;AAEO,eAAe1C,aAAa,EAC/Ba,WAAW,EACXD,QAAQ,EACRY,GAAG,EAKN;IACG,MAAMqB,eAAejC,WAAW,CAAC,WAAW,EAAEA,SAAS,CAAC,CAAC,GAAG;IAC5D,MAAMwB,IAAAA,iBAAU,EAAC,CAAC,aAAa,EAAES,aAAa,GAAG,EAAEhC,YAAY,CAAC,EAAEW,KAAK;AAC3E;AAUO,SAASrB,QAAQ,EAAEU,WAAW,EAAED,QAAQ,EAA8C;IACzF,IAAI;QACA,MAAMN,SAASS,IAAAA,uBAAgB,EAC3B;YAAC;YAAO;YAAQ;YAAUH,WAAW,CAAC,WAAW,EAAEA,UAAU,GAAG;YAAIC;SAAY,EAChF;YAAEmB,OAAO;YAAMhB,SAASZ;QAAY;QAExC,IAAIE,QAAQ;YACR,OAAOD,iBAAiBC;QAC5B;IACJ,EAAE,eAAM;IACJ,SAAS;IACb;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/startup",
3
- "version": "38.3.1",
3
+ "version": "39.0.1",
4
4
  "description": "CLI to create multi-package Lerna projects with TypeScript and React",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/uikit/startup",
6
6
  "repository": {
@@ -103,10 +103,10 @@
103
103
  "@jest/core": "~30.4.2",
104
104
  "@jest/types": "~30.4.1",
105
105
  "@jsdevtools/coverage-istanbul-loader": "^3.0.5",
106
- "@servicetitan/eslint-config": "38.3.1",
107
- "@servicetitan/install": "38.3.1",
108
- "@servicetitan/startup-utils": "38.3.1",
109
- "@servicetitan/stylelint-config": "38.3.1",
106
+ "@servicetitan/eslint-config": "39.0.1",
107
+ "@servicetitan/install": "39.0.1",
108
+ "@servicetitan/startup-utils": "39.0.1",
109
+ "@servicetitan/stylelint-config": "39.0.1",
110
110
  "@svgr/webpack": "^8.1.0",
111
111
  "@swc/cli": "^0.8.1",
112
112
  "@swc/core": "1.15.46",
@@ -120,7 +120,7 @@
120
120
  "css-minimizer-webpack-plugin": "^8.0.0",
121
121
  "debug": "^4.4.3",
122
122
  "deepmerge": "~4.3.1",
123
- "es-module-lexer": "^2.3.1",
123
+ "es-module-lexer": "^2.3.2",
124
124
  "eslint": "~9.39.2",
125
125
  "eta": "^4.6.0",
126
126
  "execa": "~5.1.1",
@@ -132,7 +132,7 @@
132
132
  "jest-circus": "~30.4.2",
133
133
  "jest-environment-jsdom": "~30.4.1",
134
134
  "jest-fetch-mock": "~4.2.0",
135
- "js-yaml": "~5.2.2",
135
+ "js-yaml": "~5.3.0",
136
136
  "json5": "^2.2.3",
137
137
  "lerna": "~9.0.7",
138
138
  "less": "~4.8.1",
@@ -141,7 +141,7 @@
141
141
  "lodash.kebabcase": "^4.1.1",
142
142
  "lodash.memoize": "^4.1.2",
143
143
  "magic-string": "^1.1.0",
144
- "memfs": "~4.64.0",
144
+ "memfs": "~4.68.1",
145
145
  "mini-css-extract-plugin": "~2.10.2",
146
146
  "minimizer-webpack-plugin": "^5.6.1",
147
147
  "moment-locales-webpack-plugin": "~1.2.0",
@@ -203,5 +203,5 @@
203
203
  "cli": {
204
204
  "webpack": false
205
205
  },
206
- "gitHead": "8f7bec33cb159c5f00e9bb416475835dd2cbef15"
206
+ "gitHead": "6e852d0d87277df097ee9fb38b096dae3fb6d68e"
207
207
  }
@@ -2,6 +2,7 @@ import { npmWhoAmI } from '@servicetitan/install';
2
2
  import chalk from 'chalk';
3
3
  import Table from 'cli-table3';
4
4
  import { vol } from 'memfs';
5
+ import path from 'path';
5
6
  import { createInterface } from 'readline/promises';
6
7
  import { formatRelativeDate, toArray } from '../../../utils';
7
8
  import { isTTY, npmView, runCommand } from '../../utils';
@@ -237,13 +238,11 @@ describe(`[startup] ${MFEList.name}`, () => {
237
238
  test('outputs all published versions', async () => {
238
239
  await subject();
239
240
 
240
- expectTable([
241
- {
242
- name: mfeName,
243
- tags: distTags,
244
- versions: Object.entries(time),
245
- },
246
- ]);
241
+ expectTable({
242
+ name: mfeName,
243
+ tags: distTags,
244
+ versions: Object.entries(time),
245
+ });
247
246
  });
248
247
  });
249
248
 
@@ -253,13 +252,11 @@ describe(`[startup] ${MFEList.name}`, () => {
253
252
  test('outputs specified number of versions', async () => {
254
253
  await subject();
255
254
 
256
- expectTable([
257
- {
258
- name: mfeName,
259
- tags: distTags,
260
- versions: Object.entries(time).slice(0, args.limit),
261
- },
262
- ]);
255
+ expectTable({
256
+ name: mfeName,
257
+ tags: distTags,
258
+ versions: Object.entries(time).slice(0, args.limit),
259
+ });
263
260
  });
264
261
  });
265
262
 
@@ -269,6 +266,31 @@ describe(`[startup] ${MFEList.name}`, () => {
269
266
  itOmitsTable();
270
267
  });
271
268
 
269
+ describe('when MFE config is a path', () => {
270
+ const configFile = 'web-component.config.js';
271
+
272
+ beforeEach(() => {
273
+ volFromJSON({
274
+ [configFile]: '',
275
+ 'packages/mfe/package.json': JSON.stringify({
276
+ name: mfeName,
277
+ cli: { 'web-component': `../../${configFile}` },
278
+ }),
279
+ });
280
+ jest.doMock(path.resolve(configFile), () => ({}), { virtual: true });
281
+ });
282
+
283
+ test('outputs table', async () => {
284
+ await subject();
285
+
286
+ expectTable({
287
+ name: mfeName,
288
+ tags: distTags,
289
+ versions: Object.entries(time).slice(0, DEFAULT_LIMIT),
290
+ });
291
+ });
292
+ });
293
+
272
294
  describe('when workspace has multiple MFEs', () => {
273
295
  const otherMfeName = `${mfeName}2`; // ensure sorts after first name
274
296
 
@@ -141,7 +141,7 @@ export class MFEList extends Command<typeof entry> {
141
141
  }
142
142
 
143
143
  return getPackages({ ignore: this.args.ignore, type: PackageType.Bundle })
144
- .filter(isWebComponent)
144
+ .filter(({ location }) => isWebComponent(location))
145
145
  .map(({ name }) => name)
146
146
  .sort((a, b) => collator.compare(a, b));
147
147
  }
@@ -141,6 +141,24 @@ describe('[startup] Cli Utils (Npm)', () => {
141
141
  expect(subject()).toEqual([]);
142
142
  });
143
143
  });
144
+
145
+ describe('when npm wraps the result in an array', () => {
146
+ const version = '1.0.1';
147
+ const tag = 'latest';
148
+ const date = new Date();
149
+ const result = {
150
+ 'time': { [version]: date },
151
+ 'dist-tags': { [tag]: version },
152
+ };
153
+
154
+ beforeEach(() => {
155
+ jest.mocked(runCommandOutput).mockReturnValue(JSON.stringify([result]));
156
+ });
157
+
158
+ test('converts the unwrapped result to Version[]', () => {
159
+ expect(subject()).toEqual([{ name: version, date, tag }]);
160
+ });
161
+ });
144
162
  });
145
163
 
146
164
  describe(npmGetProjectRoot.name, () => {
@@ -329,5 +347,15 @@ describe('[startup] Cli Utils (Npm)', () => {
329
347
  expect(subject()).toBeUndefined();
330
348
  });
331
349
  });
350
+
351
+ describe('when npm wraps the result in an array', () => {
352
+ beforeEach(() => {
353
+ jest.mocked(runCommandOutput).mockReturnValue(JSON.stringify([packageInfo]));
354
+ });
355
+
356
+ test('returns the unwrapped package info', () => {
357
+ expect(subject()).toEqual(packageInfo);
358
+ });
359
+ });
332
360
  });
333
361
  });
@@ -10,6 +10,12 @@ export interface Version {
10
10
 
11
11
  const NPM_TIMEOUT = 10000;
12
12
 
13
+ // npm >=12 wraps `npm view` output in an array
14
+ function parseNpmViewJson(result: string) {
15
+ const parsed = JSON.parse(result);
16
+ return Array.isArray(parsed) ? parsed[0] : parsed;
17
+ }
18
+
13
19
  export function npmGetPackageVersions(registry: string, packageName: string): string[] {
14
20
  try {
15
21
  const v = runCommandOutput(
@@ -30,7 +36,7 @@ export function npmGetPackageVersionsDetails(registry: string, packageName: stri
30
36
  { timeout: NPM_TIMEOUT }
31
37
  );
32
38
 
33
- const { time, 'dist-tags': distTags } = JSON.parse(result);
39
+ const { time, 'dist-tags': distTags } = parseNpmViewJson(result);
34
40
 
35
41
  const tags = Object.fromEntries(
36
42
  Object.entries(distTags).map(([tag, version]) => [version, tag])
@@ -126,7 +132,7 @@ export function npmView({ packageName, registry }: { packageName: string; regist
126
132
  { quiet: true, timeout: NPM_TIMEOUT }
127
133
  );
128
134
  if (result) {
129
- return JSON.parse(result) as NPMPackageInfo;
135
+ return parseNpmViewJson(result) as NPMPackageInfo;
130
136
  }
131
137
  } catch {
132
138
  // ignore