diff --git a/packages/typespec-ts/src/index.ts b/packages/typespec-ts/src/index.ts index a42323d84e..411ff6cec9 100644 --- a/packages/typespec-ts/src/index.ts +++ b/packages/typespec-ts/src/index.ts @@ -120,6 +120,8 @@ import { getClassicalClientName } from "./modular/helpers/namingHelpers.js"; export * from "./lib.js"; export async function $onEmit(context: EmitContext) { + // eslint-disable-next-line no-console + console.time("onEmit"); if (context.program.compilerOptions.noEmit || context.program.hasError()) { return; } @@ -127,7 +129,11 @@ export async function $onEmit(context: EmitContext) { const outputProject = new Project(); const program: Program = context.program; const emitterOptions: EmitterOptions = context.options; + // eslint-disable-next-line no-console + console.time("onEmit: create context"); const dpgContext = await createContextWithDefaultOptions(context); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: create context"); // Report any diagnostics from TCGC if (dpgContext.diagnostics?.length > 0) { @@ -150,6 +156,8 @@ export async function $onEmit(context: EmitContext) { compilerContext: context, tcgcContext: dpgContext }); + // eslint-disable-next-line no-console + console.time("onEmit: load static helpers"); const staticHelpers = await loadStaticHelpers( outputProject, { @@ -172,6 +180,8 @@ export async function $onEmit(context: EmitContext) { program } ); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: load static helpers"); const extraDependencies = isAzurePackage({ options: rlcOptions }) ? { ...AzurePollingDependencies, @@ -180,6 +190,8 @@ export async function $onEmit(context: EmitContext) { ...AzureTestDependencies } : { ...DefaultCoreDependencies }; + // eslint-disable-next-line no-console + console.time("onEmit: provide binder"); const binder = provideBinder(outputProject, { staticHelpers, dependencies: { @@ -188,6 +200,8 @@ export async function $onEmit(context: EmitContext) { useSubpathImports: rlcOptions.azureSdkForJs === true }); provideSdkTypes(dpgContext); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: provide binder"); const rlcCodeModels: RLCModel[] = []; let modularEmitterOptions: ModularEmitterOptions; @@ -195,7 +209,11 @@ export async function $onEmit(context: EmitContext) { await clearSrcFolder(); // 2. Generate RLC code model // TODO: skip this step in modular once modular generator is sufficiently decoupled + // eslint-disable-next-line no-console + console.time("onEmit: build RLC code models"); await buildRLCCodeModels(); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: build RLC code models"); // 3. Clear samples-dev folder if generateSample is true await clearSamplesDevFolder(); @@ -323,6 +341,8 @@ export async function $onEmit(context: EmitContext) { } async function generateModularSources() { + // eslint-disable-next-line no-console + console.time("onEmit: generate modular sources"); const modularSourcesRoot = dpgContext.generationPathDetail?.modularSourcesDir ?? "src"; const project = useContext("outputProject"); @@ -344,8 +364,12 @@ export async function $onEmit(context: EmitContext) { } ); + // eslint-disable-next-line no-console + console.time("onEmit: emit models"); emitTypes(dpgContext, { sourceRoot: modularSourcesRoot }); emitNonModelResponseTypes(dpgContext, { sourceRoot: modularSourcesRoot }); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: emit models"); buildSubpathIndexFile(modularEmitterOptions, "models", undefined, { recursive: true }); @@ -354,6 +378,8 @@ export async function $onEmit(context: EmitContext) { // If no clients, we still need to build the root index file buildRootIndex(dpgContext, modularEmitterOptions, rootIndexFile); } + // eslint-disable-next-line no-console + console.time("onEmit: emit source files"); for (const subClient of clientMap) { await renameClientName(subClient[1], modularEmitterOptions); buildApiOptions(dpgContext, subClient, modularEmitterOptions); @@ -390,9 +416,15 @@ export async function $onEmit(context: EmitContext) { subClient ); } + // eslint-disable-next-line no-console + console.timeEnd("onEmit: emit source files"); // Enable modular sample generation when explicitly set to true or MPG if (emitterOptions["generate-sample"] === true) { + // eslint-disable-next-line no-console + console.time("onEmit: emit samples"); const samples = emitSamples(dpgContext); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: emit samples"); // Refine the rlc sample generation logic // TODO: remember to remove this out when RLC is splitted from Modular if (samples.length > 0) { @@ -400,6 +432,8 @@ export async function $onEmit(context: EmitContext) { } } + // eslint-disable-next-line no-console + console.time("onEmit: resolve references"); binder.resolveAllReferences( modularSourcesRoot, dpgContext.generationPathDetail?.rootDir @@ -407,6 +441,11 @@ export async function $onEmit(context: EmitContext) { if (program.compilerOptions.noEmit || program.hasError()) { return; } + // eslint-disable-next-line no-console + console.timeEnd("onEmit: resolve references"); + + // eslint-disable-next-line no-console + console.time("onEmit: generate files"); for (const file of project.getSourceFiles()) { await emitContentByBuilder( @@ -415,6 +454,10 @@ export async function $onEmit(context: EmitContext) { modularEmitterOptions as any ); } + // eslint-disable-next-line no-console + console.timeEnd("onEmit: generate files"); + // eslint-disable-next-line no-console + console.timeEnd("onEmit: generate modular sources"); } interface Metadata { @@ -710,6 +753,8 @@ export async function $onEmit(context: EmitContext) { .map((subClient) => getClientContextPath(subClient, options)) .map((path) => path.substring(path.indexOf("src"))); } + // eslint-disable-next-line no-console + console.timeEnd("onEmit"); } export async function createContextWithDefaultOptions(