microsoft/typespec

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
copilot/fix-8243

Branches

Tags

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

Clone

HTTPS

Download ZIP

packages/bundle-uploader/src/index.ts

93lines · modecode

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