Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions packages/typespec-ts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,20 @@ 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;
}
/** Shared status */
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) {
Expand All @@ -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,
{
Expand All @@ -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,
Expand All @@ -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: {
Expand All @@ -188,14 +200,20 @@ 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;
// 1. Clear sources folder
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();

Expand Down Expand Up @@ -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");
Expand All @@ -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
});
Expand All @@ -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);
Expand Down Expand Up @@ -390,23 +416,36 @@ 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) {
dpgContext.rlcOptions!.generateSample = true;
}
}

// eslint-disable-next-line no-console
console.time("onEmit: resolve references");
binder.resolveAllReferences(
modularSourcesRoot,
dpgContext.generationPathDetail?.rootDir
);
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(
Expand All @@ -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 {
Expand Down Expand Up @@ -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(
Expand Down
Loading