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
32 changes: 20 additions & 12 deletions src/typespec-aaz/src/emit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ import {
projectProgram,
Program,
resolvePath,
Namespace,
getService,
} from "@typespec/compiler";

import { buildVersionProjections } from "@typespec/versioning";
import { HttpService, getAllHttpServices, reportIfNoRoutes } from "@typespec/http";
import { HttpService, getAllHttpServices, reportIfNoRoutes, getHttpService } from "@typespec/http";
import { getResourcePath, swaggerResourcePathToResourceId, } from "./utils.js";
import { AAZResourceSchema } from "./types.js";
import { AAZEmitterOptions, getTracer } from "./lib.js";
Expand Down Expand Up @@ -90,7 +92,6 @@ async function createGetResourceOperationEmitter(context: EmitContext<AAZEmitter
const apiVersion = sdkContext.apiVersion!;
tracer.trace("apiVersion", apiVersion);

let projectedProgram: Program;
const resOps: Record<string, AAZResourceSchema> = {};
context.options?.resources?.forEach((id) => {
resOps[id] = {
Expand All @@ -103,18 +104,24 @@ async function createGetResourceOperationEmitter(context: EmitContext<AAZEmitter
async function getResourcesOperations() {
const services = listServices(context.program);
for (const service of services) {
const originalProgram = context.program;
let program = context.program;
// currentService = service;
const versions = buildVersionProjections(context.program, service.type).filter(
(v) => apiVersion === v.version
);
for (const record of versions) {
projectedProgram = context.program;
if (record.projections.length > 0) {
projectedProgram = projectProgram(context.program, record.projections);
}
const projectedProgram = (program = projectProgram(originalProgram, record.projections));
const projectedServiceNs: Namespace = projectedProgram
? (projectedProgram.projector.projectedTypes.get(service.type) as Namespace)
: service.type;
const projectedService =
projectedServiceNs === program.getGlobalNamespaceType()
? { type: program.getGlobalNamespaceType() }
: getService(program, projectedServiceNs)!;
const aazContext: AAZEmitterContext = {
program: projectedProgram,
service: service,
program: program,
service: projectedService,
sdkContext: sdkContext,
apiVersion: apiVersion,
tracer,
Expand All @@ -135,12 +142,13 @@ async function createGetResourceOperationEmitter(context: EmitContext<AAZEmitter
return { getResourcesOperations };

function emitResourceOps(context: AAZEmitterContext) {
const services = ignoreDiagnostics(getAllHttpServices(context.program));
const operations = services[0].operations;
reportIfNoRoutes(projectedProgram, operations);
const { program, service } = context;
const httpService = ignoreDiagnostics(getHttpService(program, service.type));
const operations = httpService.operations;
reportIfNoRoutes(program, operations);

operations.forEach((op) => {
const resourcePath = getResourcePath(context.program, op);
const resourcePath = getResourcePath(program, op);
const resourceId = swaggerResourcePathToResourceId(resourcePath);
if (resourceId in resOps) {
resOps[resourceId]!.path = resourcePath;
Expand Down
Loading