@azure-tools/typespec-ts 0.40.2 → 0.41.0-alpha.20250610.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/modular/buildRootIndex.d.ts +1 -1
- package/dist/src/modular/buildRootIndex.d.ts.map +1 -1
- package/dist/src/modular/buildRootIndex.js +24 -13
- package/dist/src/modular/buildRootIndex.js.map +1 -1
- package/dist/src/modular/emitModels.d.ts.map +1 -1
- package/dist/src/modular/emitModels.js +2 -17
- package/dist/src/modular/emitModels.js.map +1 -1
- package/dist/src/modular/emitSamples.js +2 -6
- package/dist/src/modular/emitSamples.js.map +1 -1
- package/dist/src/modular/serialization/buildDeserializerFunction.js +2 -2
- package/dist/src/modular/serialization/buildDeserializerFunction.js.map +1 -1
- package/dist/src/modular/serialization/buildSerializerFunction.js +2 -2
- package/dist/src/modular/serialization/buildSerializerFunction.js.map +1 -1
- package/dist/src/utils/modelUtils.js +1 -1
- package/dist/src/utils/modelUtils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/index.ts +6 -2
- package/src/modular/buildRootIndex.ts +29 -13
- package/src/modular/emitModels.ts +2 -19
- package/src/modular/emitSamples.ts +2 -4
- package/src/modular/serialization/buildDeserializerFunction.ts +2 -2
- package/src/modular/serialization/buildSerializerFunction.ts +2 -2
- package/src/utils/modelUtils.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure-tools/typespec-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.41.0-alpha.20250610.1",
|
|
4
4
|
"description": "An experimental TypeSpec emitter for TypeScript RLC",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -18,13 +18,13 @@
|
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@azure-rest/core-client": "^2.3.1",
|
|
21
|
-
"@typespec/http-specs": "0.1.0-alpha.22
|
|
22
|
-
"@typespec/spector": "0.1.0-alpha.14
|
|
23
|
-
"@typespec/spec-api": "0.1.0-alpha.
|
|
24
|
-
"@azure-tools/azure-http-specs": "^0.1.0-alpha.
|
|
21
|
+
"@typespec/http-specs": "0.1.0-alpha.22",
|
|
22
|
+
"@typespec/spector": "0.1.0-alpha.14",
|
|
23
|
+
"@typespec/spec-api": "0.1.0-alpha.6",
|
|
24
|
+
"@azure-tools/azure-http-specs": "^0.1.0-alpha.18",
|
|
25
25
|
"@azure-tools/typespec-autorest": "^0.56.0",
|
|
26
26
|
"@azure-tools/typespec-azure-core": "^0.56.0",
|
|
27
|
-
"@azure-tools/typespec-azure-resource-manager": "^0.56.
|
|
27
|
+
"@azure-tools/typespec-azure-resource-manager": "^0.56.2",
|
|
28
28
|
"@azure-tools/typespec-client-generator-core": "^0.56.2",
|
|
29
29
|
"@azure/abort-controller": "^2.1.2",
|
|
30
30
|
"@azure/core-auth": "^1.6.0",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"@typespec/xml": "^0.70.0"
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"@azure-tools/rlc-common": "
|
|
79
|
+
"@azure-tools/rlc-common": "0.41.0-alpha.20250610.1",
|
|
80
80
|
"fs-extra": "^11.1.0",
|
|
81
81
|
"lodash": "^4.17.21",
|
|
82
82
|
"prettier": "^3.3.3",
|
package/src/index.ts
CHANGED
|
@@ -295,6 +295,10 @@ export async function $onEmit(context: EmitContext) {
|
|
|
295
295
|
});
|
|
296
296
|
console.time("onEmit: emit source files");
|
|
297
297
|
const clientMap = getClientHierarchyMap(dpgContext);
|
|
298
|
+
if (clientMap.length === 0) {
|
|
299
|
+
// If no clients, we still need to build the root index file
|
|
300
|
+
buildRootIndex(dpgContext, modularEmitterOptions, rootIndexFile);
|
|
301
|
+
}
|
|
298
302
|
for (const subClient of clientMap) {
|
|
299
303
|
await renameClientName(subClient[1], modularEmitterOptions);
|
|
300
304
|
buildApiOptions(dpgContext, subClient, modularEmitterOptions);
|
|
@@ -324,9 +328,9 @@ export async function $onEmit(context: EmitContext) {
|
|
|
324
328
|
}
|
|
325
329
|
buildRootIndex(
|
|
326
330
|
dpgContext,
|
|
327
|
-
subClient,
|
|
328
331
|
modularEmitterOptions,
|
|
329
|
-
rootIndexFile
|
|
332
|
+
rootIndexFile,
|
|
333
|
+
subClient
|
|
330
334
|
);
|
|
331
335
|
}
|
|
332
336
|
console.timeEnd("onEmit: emit source files");
|
|
@@ -16,10 +16,15 @@ import { useContext } from "../contextManager.js";
|
|
|
16
16
|
|
|
17
17
|
export function buildRootIndex(
|
|
18
18
|
context: SdkContext,
|
|
19
|
-
clientMap: [string[], SdkClientType<SdkServiceOperation>],
|
|
20
19
|
emitterOptions: ModularEmitterOptions,
|
|
21
|
-
rootIndexFile: SourceFile
|
|
20
|
+
rootIndexFile: SourceFile,
|
|
21
|
+
clientMap?: [string[], SdkClientType<SdkServiceOperation>]
|
|
22
22
|
) {
|
|
23
|
+
if (!clientMap) {
|
|
24
|
+
// we still need to export the models if no client is provided
|
|
25
|
+
exportModels(emitterOptions, rootIndexFile);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
23
28
|
const project = useContext("outputProject");
|
|
24
29
|
const [_, client] = clientMap;
|
|
25
30
|
const srcPath = emitterOptions.modularOptions.sourceRoot;
|
|
@@ -50,17 +55,7 @@ export function buildRootIndex(
|
|
|
50
55
|
subfolder,
|
|
51
56
|
true
|
|
52
57
|
);
|
|
53
|
-
|
|
54
|
-
.getExportDeclarations()
|
|
55
|
-
?.find((i) => {
|
|
56
|
-
return i.getModuleSpecifierValue()?.startsWith(`./models/`);
|
|
57
|
-
});
|
|
58
|
-
if (!modelsExportsIndex) {
|
|
59
|
-
exportModules(rootIndexFile, project, srcPath, clientName, "models", {
|
|
60
|
-
isTopLevel: true,
|
|
61
|
-
recursive: true
|
|
62
|
-
});
|
|
63
|
-
}
|
|
58
|
+
exportModels(emitterOptions, rootIndexFile, clientName);
|
|
64
59
|
exportModules(rootIndexFile, project, srcPath, clientName, "api", {
|
|
65
60
|
subfolder,
|
|
66
61
|
interfaceOnly: true,
|
|
@@ -75,6 +70,27 @@ export function buildRootIndex(
|
|
|
75
70
|
exportFileContentsType(context, rootIndexFile);
|
|
76
71
|
}
|
|
77
72
|
|
|
73
|
+
function exportModels(
|
|
74
|
+
emitterOptions: ModularEmitterOptions,
|
|
75
|
+
rootIndexFile: SourceFile,
|
|
76
|
+
clientName: string = ""
|
|
77
|
+
) {
|
|
78
|
+
// export models index file if not exists
|
|
79
|
+
const project = useContext("outputProject");
|
|
80
|
+
const srcPath = emitterOptions.modularOptions.sourceRoot;
|
|
81
|
+
const modelsExportsIndex = rootIndexFile
|
|
82
|
+
.getExportDeclarations()
|
|
83
|
+
?.find((i) => {
|
|
84
|
+
return i.getModuleSpecifierValue()?.startsWith(`./models/`);
|
|
85
|
+
});
|
|
86
|
+
if (!modelsExportsIndex) {
|
|
87
|
+
exportModules(rootIndexFile, project, srcPath, clientName, "models", {
|
|
88
|
+
isTopLevel: true,
|
|
89
|
+
recursive: true
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
78
94
|
/**
|
|
79
95
|
* This is a temporary solution for adding paging exports. Eventually we will have the binder generate the exports automatically.
|
|
80
96
|
*/
|
|
@@ -314,26 +314,9 @@ function addSerializationFunctions(
|
|
|
314
314
|
type,
|
|
315
315
|
skipDiscriminatedUnion
|
|
316
316
|
);
|
|
317
|
-
let typeName = undefined;
|
|
318
|
-
switch (type.kind) {
|
|
319
|
-
case "array":
|
|
320
|
-
typeName = "array";
|
|
321
|
-
break;
|
|
322
|
-
case "dict":
|
|
323
|
-
typeName = "record";
|
|
324
|
-
break;
|
|
325
|
-
default:
|
|
326
|
-
break;
|
|
327
|
-
}
|
|
328
317
|
|
|
329
|
-
const serializerRefkey =
|
|
330
|
-
|
|
331
|
-
? refkey(type.valueType, typeName, "serializer")
|
|
332
|
-
: refkey(type, "serializer");
|
|
333
|
-
const deserailizerRefKey =
|
|
334
|
-
type.kind === "array" || type.kind === "dict"
|
|
335
|
-
? refkey(type.valueType, typeName, "deserializer")
|
|
336
|
-
: refkey(type, "deserializer");
|
|
318
|
+
const serializerRefkey = refkey(type, "serializer");
|
|
319
|
+
const deserailizerRefKey = refkey(type, "deserializer");
|
|
337
320
|
if (
|
|
338
321
|
serializationFunction &&
|
|
339
322
|
typeof serializationFunction !== "string" &&
|
|
@@ -237,9 +237,7 @@ function emitMethodSamples(
|
|
|
237
237
|
function buildParameterValueMap(example: SdkHttpOperationExample) {
|
|
238
238
|
const parameterMap: Record<string, SdkHttpParameterExampleValue> = {};
|
|
239
239
|
example.parameters.forEach(
|
|
240
|
-
(param) =>
|
|
241
|
-
(parameterMap[param.parameter.serializedName ?? param.parameter.name] =
|
|
242
|
-
param)
|
|
240
|
+
(param) => (parameterMap[param.parameter.serializedName] = param)
|
|
243
241
|
);
|
|
244
242
|
return parameterMap;
|
|
245
243
|
}
|
|
@@ -312,7 +310,7 @@ function prepareExampleParameters(
|
|
|
312
310
|
}
|
|
313
311
|
// required/optional body parameters
|
|
314
312
|
const bodyParam = method.operation.bodyParam;
|
|
315
|
-
const bodyName = bodyParam?.
|
|
313
|
+
const bodyName = bodyParam?.serializedName;
|
|
316
314
|
const bodyExample = parameterMap[bodyName ?? ""];
|
|
317
315
|
if (bodyName && bodyExample && bodyExample.value) {
|
|
318
316
|
if (
|
|
@@ -424,7 +424,7 @@ function buildDictTypeDeserializer(
|
|
|
424
424
|
|
|
425
425
|
const deserializerFunctionName = `${normalizeModelName(context, type, NameType.Operation, false, true)}Deserializer`;
|
|
426
426
|
if (nameOnly) {
|
|
427
|
-
return resolveReference(refkey(type
|
|
427
|
+
return resolveReference(refkey(type, "deserializer"));
|
|
428
428
|
}
|
|
429
429
|
const deserializerFunction: FunctionDeclarationStructure = {
|
|
430
430
|
kind: StructureKind.Function,
|
|
@@ -482,7 +482,7 @@ function buildArrayTypeDeserializer(
|
|
|
482
482
|
}
|
|
483
483
|
const deserializerFunctionName = `${normalizeModelName(context, type, NameType.Operation, false, true)}Deserializer`;
|
|
484
484
|
if (nameOnly) {
|
|
485
|
-
return resolveReference(refkey(type
|
|
485
|
+
return resolveReference(refkey(type, "deserializer"));
|
|
486
486
|
}
|
|
487
487
|
const serializerFunction: FunctionDeclarationStructure = {
|
|
488
488
|
kind: StructureKind.Function,
|
|
@@ -488,7 +488,7 @@ function buildDictTypeSerializer(
|
|
|
488
488
|
}
|
|
489
489
|
const serializerFunctionName = `${normalizeModelName(context, type, NameType.Operation, false, true)}Serializer`;
|
|
490
490
|
if (nameOnly) {
|
|
491
|
-
return resolveReference(refkey(type
|
|
491
|
+
return resolveReference(refkey(type, "serializer"));
|
|
492
492
|
}
|
|
493
493
|
const serializerFunction: FunctionDeclarationStructure = {
|
|
494
494
|
kind: StructureKind.Function,
|
|
@@ -546,7 +546,7 @@ function buildArrayTypeSerializer(
|
|
|
546
546
|
}
|
|
547
547
|
const serializerFunctionName = `${normalizeModelName(context, type, NameType.Operation, false, true)}Serializer`;
|
|
548
548
|
if (nameOnly) {
|
|
549
|
-
return resolveReference(refkey(type
|
|
549
|
+
return resolveReference(refkey(type, "serializer"));
|
|
550
550
|
}
|
|
551
551
|
const serializerFunction: FunctionDeclarationStructure = {
|
|
552
552
|
kind: StructureKind.Function,
|
package/src/utils/modelUtils.ts
CHANGED
|
@@ -519,7 +519,7 @@ function isOasString(type: Type): boolean {
|
|
|
519
519
|
if (type.kind === "String") {
|
|
520
520
|
// A string literal
|
|
521
521
|
return true;
|
|
522
|
-
} else if (type.kind === "
|
|
522
|
+
} else if (type.kind === "Scalar" && type.name === "string") {
|
|
523
523
|
// string type
|
|
524
524
|
return true;
|
|
525
525
|
} else if (type.kind === "Union") {
|