microsoft/typespec

Public

mirrored from https://github.com/microsoft/typespecAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
abd213cd488a512fc2da78fc209f25cbf235ae41

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

packages/bundle-uploader/src/index.ts

102lines · modecode

1import { AzureCliCredential } from "@azure/identity";
2import { createTypeSpecBundle } from "@typespec/bundler";
3import { readFile } from "fs/promises";
4import JSON5 from "json5";
5import { resolve } from "path";
6import { join as joinUnix } from "path/posix";
7import pc from "picocolors";
8import { parse } from "semver";
9import { TypeSpecBundledPackageUploader } from "./upload-browser-package.js";
10
11function logInfo(...args: any[]) {
12 // eslint-disable-next-line no-console
13 console.log(...args);
14}
15
16function logSuccess(message: string) {
17 logInfo(pc.green(`✔ ${message}`));
18}
19
20export interface BundleAndUploadPackagesOptions {
21 repoRoot: string;
22 /**
23 * List of packages to bundle and upload.
24 */
25 packages: string[];
26
27 /**
28 * Name of the index for those packages.
29 */
30 indexName: string;
31
32 /**
33 * Version for the index
34 */
35 indexVersion: string;
36}
37
38/** Return the version of the package in major.minor.x format */
39export async function getPackageVersion(repoRoot: string, pkgName: string) {
40 const rushJson = await loadRushJson(repoRoot);
41 const project = rushJson.projects.find((x) => x.packageName === pkgName);
42 if (project === undefined) {
43 throw new Error(`Cannot get version for package: "${pkgName}", it is not found in rush.json`);
44 }
45 const content = await readFile(resolve(repoRoot, project.projectFolder, "package.json"));
46 const pkg = JSON.parse(content.toString());
47 const version = parse(pkg.version);
48 if (version === null) {
49 throw new Error(`Couldn't resolve version from "${pkgName}": "${pkg.version}"`);
50 }
51 return `${version.major}.${version.minor}.x`;
52}
53
54export async function bundleAndUploadPackages({
55 repoRoot,
56 packages,
57 indexName,
58 indexVersion,
59}: BundleAndUploadPackagesOptions) {
60 const rushJson = await loadRushJson(repoRoot);
61 const projects = rushJson.projects.filter((x) => packages.includes(x.packageName));
62 logInfo("Current index version:", indexVersion);
63
64 const uploader = new TypeSpecBundledPackageUploader(new AzureCliCredential());
65 await uploader.createIfNotExists();
66
67 const importMap: Record<string, string> = {};
68 for (const project of projects) {
69 const bundle = await createTypeSpecBundle(resolve(repoRoot, project.projectFolder));
70 const manifest = bundle.manifest;
71 const result = await uploader.upload(bundle);
72 if (result.status === "uploaded") {
73 logSuccess(`Bundle for package ${manifest.name}@${manifest.version} uploaded.`);
74 } else {
75 logInfo(`Bundle for package ${manifest.name} already exist for version ${manifest.version}.`);
76 }
77 for (const [key, value] of Object.entries(result.imports)) {
78 importMap[joinUnix(project.packageName, key)] = value;
79 }
80 }
81 logInfo(`Import map for ${indexVersion}:`, importMap);
82 await uploader.uploadIndex(indexName, {
83 version: indexVersion,
84 imports: importMap,
85 });
86 logSuccess(`Updated index for version ${indexVersion}.`);
87}
88
89interface RushJson {
90 projects: RushProject[];
91}
92
93interface RushProject {
94 packageName: string;
95 projectFolder: string;
96 versionPolicyName?: string;
97 shouldPublish?: boolean;
98}
99async function loadRushJson(repoRoot: string): Promise<RushJson> {
100 const content = await readFile(resolve(repoRoot, "rush.json"));
101 return JSON5.parse(content.toString());
102}
103