@servicetitan/startup 39.0.0 → 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.
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/startup",
3
- "version": "39.0.0",
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": "39.0.0",
107
- "@servicetitan/install": "39.0.0",
108
- "@servicetitan/startup-utils": "39.0.0",
109
- "@servicetitan/stylelint-config": "39.0.0",
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": "9138e3fcda061941b89620b9004426f5c13a89ae"
206
+ "gitHead": "6e852d0d87277df097ee9fb38b096dae3fb6d68e"
207
207
  }
@@ -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