@typespec/openapi 1.13.0-dev.0 → 1.13.0-dev.2

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/README.md CHANGED
@@ -147,10 +147,13 @@ op read(): string;
147
147
 
148
148
  #### `@tagMetadata`
149
149
 
150
- Specify OpenAPI additional information.
150
+ Specify OpenAPI tag metadata. Can be used in two forms:
151
+
152
+ - Inline form: specify a single tag by name with optional metadata.
153
+ - Array form: specify an ordered list of tags with their metadata in a single decorator call.
151
154
 
152
155
  ```typespec
153
- @TypeSpec.OpenAPI.tagMetadata(name: valueof string, tagMetadata: valueof TypeSpec.OpenAPI.TagMetadata)
156
+ @TypeSpec.OpenAPI.tagMetadata(name: valueof string | TypeSpec.OpenAPI.TagMetadataWithName[], tagMetadata?: valueof TypeSpec.OpenAPI.TagMetadata)
154
157
  ```
155
158
 
156
159
  ##### Target
@@ -159,13 +162,15 @@ Specify OpenAPI additional information.
159
162
 
160
163
  ##### Parameters
161
164
 
162
- | Name | Type | Description |
163
- | ----------- | ------------------------------------- | ---------------------- |
164
- | name | `valueof string` | tag name |
165
- | tagMetadata | [valueof `TagMetadata`](#tagmetadata) | Additional information |
165
+ | Name | Type | Description |
166
+ | ----------- | ---------------------------------------------------------- | ------------------------------------------------------------------- |
167
+ | name | `valueof string \| TypeSpec.OpenAPI.TagMetadataWithName[]` | Tag name (inline form) or array of tags with metadata (array form). |
168
+ | tagMetadata | [valueof `TagMetadata`](#tagmetadata) | Additional information for the tag. Only used in inline form. |
166
169
 
167
170
  ##### Examples
168
171
 
172
+ ###### Inline form
173
+
169
174
  ```typespec
170
175
  @service
171
176
  @tagMetadata(
@@ -181,3 +186,16 @@ namespace PetStore {
181
186
 
182
187
  }
183
188
  ```
189
+
190
+ ###### Array form (preserves explicit tag order)
191
+
192
+ ```typespec
193
+ @service
194
+ @tagMetadata(#[
195
+ #{ name: "First Tag", description: "First tag description" },
196
+ #{ name: "Second Tag", description: "Second tag description" }
197
+ ])
198
+ namespace PetStore {
199
+
200
+ }
201
+ ```
@@ -8,11 +8,22 @@ export interface AdditionalInfo {
8
8
  readonly contact?: Contact;
9
9
  readonly license?: License;
10
10
  }
11
+ export interface TagMetadataWithName {
12
+ readonly [key: string]: unknown;
13
+ readonly name: string;
14
+ readonly description?: string;
15
+ readonly externalDocs?: ExternalDocs;
16
+ readonly parent?: string;
17
+ readonly summary?: string;
18
+ readonly kind?: string;
19
+ }
11
20
  export interface TagMetadata {
12
21
  readonly [key: string]: unknown;
13
22
  readonly description?: string;
14
23
  readonly externalDocs?: ExternalDocs;
15
24
  readonly parent?: string;
25
+ readonly summary?: string;
26
+ readonly kind?: string;
16
27
  }
17
28
  export interface Contact {
18
29
  readonly [key: string]: unknown;
@@ -87,19 +98,30 @@ export type ExternalDocsDecorator = (context: DecoratorContext, target: Type, ur
87
98
  */
88
99
  export type InfoDecorator = (context: DecoratorContext, target: Namespace, additionalInfo: AdditionalInfo) => DecoratorValidatorCallbacks | void;
89
100
  /**
90
- * Specify OpenAPI additional information.
101
+ * Specify OpenAPI tag metadata. Can be used in two forms:
102
+ * - Inline form: specify a single tag by name with optional metadata.
103
+ * - Array form: specify an ordered list of tags with their metadata in a single decorator call.
91
104
  *
92
- * @param name tag name
93
- * @param tagMetadata Additional information
94
- * @example
105
+ * @param name Tag name (inline form) or array of tags with metadata (array form).
106
+ * @param tagMetadata Additional information for the tag. Only used in inline form.
107
+ * @example Inline form
95
108
  * ```typespec
96
109
  * @service()
97
110
  * @tagMetadata("Tag Name", #{description: "Tag description", externalDocs: #{url: "https://example.com", description: "More info.", `x-custom`: "string"}, `x-custom`: "string"})
98
111
  * @tagMetadata("Child Tag", #{description: "Child tag description", parent: "Tag Name"})
99
112
  * namespace PetStore {}
100
113
  * ```
114
+ * @example Array form (preserves explicit tag order)
115
+ * ```typespec
116
+ * @service()
117
+ * @tagMetadata(#[
118
+ * #{ name: "First Tag", description: "First tag description" },
119
+ * #{ name: "Second Tag", description: "Second tag description" },
120
+ * ])
121
+ * namespace PetStore {}
122
+ * ```
101
123
  */
102
- export type TagMetadataDecorator = (context: DecoratorContext, target: Namespace, name: string, tagMetadata: TagMetadata) => DecoratorValidatorCallbacks | void;
124
+ export type TagMetadataDecorator = (context: DecoratorContext, target: Namespace, name: string | readonly TagMetadataWithName[], tagMetadata?: TagMetadata) => DecoratorValidatorCallbacks | void;
103
125
  export type TypeSpecOpenAPIDecorators = {
104
126
  operationId: OperationIdDecorator;
105
127
  extension: ExtensionDecorator;
@@ -1 +1 @@
1
- {"version":3,"file":"TypeSpec.OpenAPI.d.ts","sourceRoot":"","sources":["../../generated-defs/TypeSpec.OpenAPI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,KAAK,EACL,SAAS,EACT,SAAS,EACT,IAAI,EACL,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,MAAM,KAChB,2BAA2B,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,IAAI,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,KACX,2BAA2B,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,KAAK,KACV,2BAA2B,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;GAUG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,IAAI,EACZ,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,KACjB,2BAA2B,GAAG,IAAI,CAAC;AAExC;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,EACjB,cAAc,EAAE,cAAc,KAC3B,2BAA2B,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,WAAW,KACrB,2BAA2B,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,yBAAyB,GAAG;IACtC,WAAW,EAAE,oBAAoB,CAAC;IAClC,SAAS,EAAE,kBAAkB,CAAC;IAC9B,eAAe,EAAE,wBAAwB,CAAC;IAC1C,YAAY,EAAE,qBAAqB,CAAC;IACpC,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,oBAAoB,CAAC;CACnC,CAAC"}
1
+ {"version":3,"file":"TypeSpec.OpenAPI.d.ts","sourceRoot":"","sources":["../../generated-defs/TypeSpec.OpenAPI.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Namespace, Operation, Program, Type } from "@typespec/compiler";
2
- import { DefaultResponseDecorator, ExtensionDecorator, ExternalDocsDecorator, InfoDecorator, OperationIdDecorator, TagMetadata, TagMetadataDecorator } from "../generated-defs/TypeSpec.OpenAPI.js";
3
- import { AdditionalInfo, ExtensionKey, ExternalDocs } from "./types.js";
2
+ import { DefaultResponseDecorator, ExtensionDecorator, ExternalDocsDecorator, InfoDecorator, OperationIdDecorator, TagMetadataDecorator } from "../generated-defs/TypeSpec.OpenAPI.js";
3
+ import { AdditionalInfo, ExtensionKey, ExternalDocs, TagMetadataWithName } from "./types.js";
4
4
  export declare const
5
5
  /**
6
6
  * Returns operationId set via the `@operationId` decorator or `undefined`
@@ -75,15 +75,17 @@ export declare function getInfo(program: Program, entity: Namespace): Additional
75
75
  /** Resolve the info entry by merging data specified with `@service`, `@summary` and `@info`. */
76
76
  export declare function resolveInfo(program: Program, entity: Namespace): AdditionalInfo | undefined;
77
77
  /** Get TagsMetadata set with `@tagMetadata` decorator */
78
- declare const getTagsMetadata: (program: Program, type: Type) => {
79
- [name: string]: TagMetadata;
80
- } | undefined;
78
+ declare const getTagsMetadata: (program: Program, type: Type) => TagMetadataWithName[] | undefined;
81
79
  /**
82
80
  * Decorator to add metadata to a tag associated with a namespace.
81
+ * Supports two forms:
82
+ * - Inline form: `@tagMetadata("tag-name", #{...})` - adds a single tag by name
83
+ * - Array form: `@tagMetadata(#[#{name: "tag1", ...}, ...])` - sets an ordered list of tags
84
+ *
83
85
  * @param context - The decorator context.
84
86
  * @param entity - The namespace entity to associate the tag with.
85
- * @param name - The name of the tag.
86
- * @param tagMetadata - Optional metadata for the tag.
87
+ * @param name - The name of the tag (inline form) or an array of tag metadata objects (array form).
88
+ * @param tagMetadata - Optional metadata for the tag. Only used in inline form.
87
89
  */
88
90
  export declare const tagMetadataDecorator: TagMetadataDecorator;
89
91
  export { getTagsMetadata };
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,SAAS,EACT,SAAS,EACT,OAAO,EAEP,IAAI,EAEL,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,oBAAoB,EACrB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAExE,eAAO;AACL;;GAEG;AACH,cAAc;AAEd;;;;;GAKG;AACH,cAAc,4DACqD,CAAC;AACtE;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAC;AAIF,uCAAuC;AACvC,eAAO,MAAM,UAAU,EAAE,kBAaxB,CAAC;AAuCF;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,QAGrD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,QAKhG;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,CAAC,CAE5F;AAQD,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,EAAE,wBAM9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAEzE;AAID;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,qBAW3B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,YAAY,GAAG,SAAS,CAExF;AAID,kCAAkC;AAClC,eAAO,MAAM,KAAK,EAAE,aAmCnB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAEvF;AAED,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAU3F;AAMD,yDAAyD;AACzD,QAAA,MAAO,eAAe;;aAErB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBAkElC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,SAAS,EACT,SAAS,EACT,OAAO,EAEP,IAAI,EAEL,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EAEpB,oBAAoB,EAErB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE7F,eAAO;AACL;;GAEG;AACH,cAAc;AAEd;;;;;GAKG;AACH,cAAc,4DACqD,CAAC;AACtE;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,oBAM1B,CAAC;AAIF,uCAAuC;AACvC,eAAO,MAAM,UAAU,EAAE,kBAaxB,CAAC;AAuCF;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,cAAc,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,QAGrD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,QAKhG;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,WAAW,CAAC,YAAY,EAAE,GAAG,CAAC,CAE5F;AAQD,6CAA6C;AAC7C,eAAO,MAAM,gBAAgB,EAAE,wBAM9B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAEzE;AAID;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,qBAW3B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,YAAY,GAAG,SAAS,CAExF;AAID,kCAAkC;AAClC,eAAO,MAAM,KAAK,EAAE,aAmCnB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAEvF;AAED,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,SAAS,CAU3F;AAMD,yDAAyD;AACzD,QAAA,MAAO,eAAe,qEAErB,CAAC;AAUF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBAqIlC,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { compilerAssert, getDoc, getService, getSummary, isType, serializeValueAsJson, } from "@typespec/compiler";
2
- import { useStateMap } from "@typespec/compiler/utils";
2
+ import { useStateMap, useStateSet } from "@typespec/compiler/utils";
3
3
  import * as http from "@typespec/http";
4
4
  import { validateAdditionalInfoModel, validateIsUri } from "./helpers.js";
5
5
  import { createStateSymbol, OpenAPIKeys, reportDiagnostic } from "./lib.js";
@@ -180,12 +180,21 @@ function omitUndefined(data) {
180
180
  }
181
181
  /** Get TagsMetadata set with `@tagMetadata` decorator */
182
182
  const [getTagsMetadata, setTagsMetadata] = useStateMap(OpenAPIKeys.tagsMetadata);
183
+ /**
184
+ * State set tracking namespaces that have used the array form of @tagMetadata.
185
+ * Used to detect mixing of array and inline forms.
186
+ */
187
+ const [isTagsMetadataArrayFormUsed, setTagsMetadataArrayFormUsed] = useStateSet(createStateSymbol("tagsMetadataArrayForm"));
183
188
  /**
184
189
  * Decorator to add metadata to a tag associated with a namespace.
190
+ * Supports two forms:
191
+ * - Inline form: `@tagMetadata("tag-name", #{...})` - adds a single tag by name
192
+ * - Array form: `@tagMetadata(#[#{name: "tag1", ...}, ...])` - sets an ordered list of tags
193
+ *
185
194
  * @param context - The decorator context.
186
195
  * @param entity - The namespace entity to associate the tag with.
187
- * @param name - The name of the tag.
188
- * @param tagMetadata - Optional metadata for the tag.
196
+ * @param name - The name of the tag (inline form) or an array of tag metadata objects (array form).
197
+ * @param tagMetadata - Optional metadata for the tag. Only used in inline form.
189
198
  */
190
199
  export const tagMetadataDecorator = (context, entity, name, tagMetadata) => {
191
200
  // Check if the namespace is a service namespace
@@ -200,30 +209,76 @@ export const tagMetadataDecorator = (context, entity, name, tagMetadata) => {
200
209
  });
201
210
  return;
202
211
  }
203
- // Retrieve existing tags metadata or initialize an empty object
204
- const tags = getTagsMetadata(context.program, entity) ?? {};
205
- // Check for duplicate tag names
206
- if (tags[name]) {
207
- reportDiagnostic(context.program, {
208
- code: "duplicate-tag",
209
- format: { tagName: name },
210
- target: context.getArgumentTarget(0),
211
- });
212
- return;
213
- }
214
- // Validate the additionalInfo model
215
- if (!validateAdditionalInfoModel(context.program, context.getArgumentTarget(0), tagMetadata, "TypeSpec.OpenAPI.TagMetadata")) {
216
- return;
212
+ if (typeof name !== "string") {
213
+ // Array form: @tagMetadata(#[#{name: "tag1", ...}, ...])
214
+ // Check that no tagMetadata argument was provided (third argument not allowed with array form)
215
+ if (tagMetadata !== undefined) {
216
+ reportDiagnostic(context.program, {
217
+ code: "tag-metadata-array-with-metadata-arg",
218
+ target: context.getArgumentTarget(1),
219
+ });
220
+ return;
221
+ }
222
+ // Check if either inline form or array form was already used (cannot mix or call twice)
223
+ const existingTags = getTagsMetadata(context.program, entity);
224
+ if ((existingTags && existingTags.length > 0) ||
225
+ isTagsMetadataArrayFormUsed(context.program, entity)) {
226
+ reportDiagnostic(context.program, {
227
+ code: "mixed-tag-metadata-form",
228
+ target: context.getArgumentTarget(0),
229
+ });
230
+ return;
231
+ }
232
+ // Validate and store all tags from the array
233
+ for (const tagItem of name) {
234
+ if (!validateAdditionalInfoModel(context.program, context.getArgumentTarget(0), tagItem, "TypeSpec.OpenAPI.TagMetadataWithName")) {
235
+ return;
236
+ }
237
+ if (tagItem.externalDocs?.url) {
238
+ if (!validateIsUri(context.program, context.getArgumentTarget(0), tagItem.externalDocs.url, "externalDocs.url")) {
239
+ return;
240
+ }
241
+ }
242
+ }
243
+ setTagsMetadataArrayFormUsed(context.program, entity);
244
+ setTagsMetadata(context.program, entity, [...name]);
217
245
  }
218
- // Validate the externalDocs.url property
219
- if (tagMetadata.externalDocs?.url) {
220
- if (!validateIsUri(context.program, context.getArgumentTarget(0), tagMetadata.externalDocs.url, "externalDocs.url")) {
246
+ else {
247
+ // Inline form: @tagMetadata("tag-name", #{...})
248
+ // Check if array form was already used
249
+ if (isTagsMetadataArrayFormUsed(context.program, entity)) {
250
+ reportDiagnostic(context.program, {
251
+ code: "mixed-tag-metadata-form",
252
+ target: context.getArgumentTarget(0),
253
+ });
221
254
  return;
222
255
  }
256
+ // Retrieve existing tags metadata or initialize an empty array
257
+ const tags = getTagsMetadata(context.program, entity) ?? [];
258
+ // Check for duplicate tag names
259
+ if (tags.some((t) => t.name === name)) {
260
+ reportDiagnostic(context.program, {
261
+ code: "duplicate-tag",
262
+ format: { tagName: name },
263
+ target: context.getArgumentTarget(0),
264
+ });
265
+ return;
266
+ }
267
+ const resolvedMetadata = tagMetadata ?? {};
268
+ // Validate the additionalInfo model
269
+ if (!validateAdditionalInfoModel(context.program, context.getArgumentTarget(0), resolvedMetadata, "TypeSpec.OpenAPI.TagMetadata")) {
270
+ return;
271
+ }
272
+ // Validate the externalDocs.url property
273
+ if (resolvedMetadata.externalDocs?.url) {
274
+ if (!validateIsUri(context.program, context.getArgumentTarget(0), resolvedMetadata.externalDocs.url, "externalDocs.url")) {
275
+ return;
276
+ }
277
+ }
278
+ // Update the tags metadata with the new tag
279
+ tags.push({ name, ...resolvedMetadata });
280
+ setTagsMetadata(context.program, entity, tags);
223
281
  }
224
- // Update the tags metadata with the new tag
225
- tags[name] = tagMetadata;
226
- setTagsMetadata(context.program, entity, tags);
227
282
  };
228
283
  export { getTagsMetadata };
229
284
  //# sourceMappingURL=decorators.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export type { DefaultResponseDecorator, ExtensionDecorator, ExternalDocsDecorator, InfoDecorator, } from "../generated-defs/TypeSpec.OpenAPI.js";
2
2
  export { $defaultResponse, $extension, $externalDocs, $info, $operationId, getExtensions, getExternalDocs, getInfo, getOperationId, getTagsMetadata, isDefaultResponse, resolveInfo, setExtension, setInfo, setOperationId, } from "./decorators.js";
3
3
  export { checkDuplicateTypeName, getOpenAPITypeName, getParameterKey, isReadonlyProperty, resolveOperationId, shouldInline, } from "./helpers.js";
4
- export { AdditionalInfo, Contact, ExtensionKey, ExternalDocs, License } from "./types.js";
4
+ export { AdditionalInfo, Contact, ExtensionKey, ExternalDocs, License, TagMetadata, TagMetadataWithName, } from "./types.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,GACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,KAAK,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,GACd,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,KAAK,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,OAAO,EACP,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,KAAK,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,KAAK,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,OAAO,EACP,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,cAAc,CAAC;AAWtB,gBAAgB;AAChB,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/src/lib.d.ts CHANGED
@@ -12,11 +12,17 @@ export declare const $lib: import("@typespec/compiler").TypeSpecLibrary<{
12
12
  "duplicate-tag": {
13
13
  readonly default: import("@typespec/compiler").CallableMessage<["tagName"]>;
14
14
  };
15
+ "mixed-tag-metadata-form": {
16
+ readonly default: "Cannot mix the array form and the inline form of @tagMetadata on the same namespace. Use either @tagMetadata(#[...]) or multiple @tagMetadata(\"name\", #{...}) calls, not both.";
17
+ };
18
+ "tag-metadata-array-with-metadata-arg": {
19
+ readonly default: "When using the array form of @tagMetadata, the second argument (tagMetadata) must not be provided. Include all tag metadata inside the array elements.";
20
+ };
15
21
  "tag-metadata-target-service": {
16
22
  readonly default: import("@typespec/compiler").CallableMessage<["namespace"]>;
17
23
  };
18
24
  }, Record<string, any>, "tagsMetadata">;
19
- export declare const createDiagnostic: <C extends "invalid-extension-key" | "duplicate-type-name" | "not-url" | "duplicate-tag" | "tag-metadata-target-service", M extends keyof {
25
+ export declare const createDiagnostic: <C extends "invalid-extension-key" | "duplicate-type-name" | "not-url" | "duplicate-tag" | "mixed-tag-metadata-form" | "tag-metadata-array-with-metadata-arg" | "tag-metadata-target-service", M extends keyof {
20
26
  "invalid-extension-key": {
21
27
  readonly default: import("@typespec/compiler").CallableMessage<["value"]>;
22
28
  };
@@ -30,6 +36,12 @@ export declare const createDiagnostic: <C extends "invalid-extension-key" | "dup
30
36
  "duplicate-tag": {
31
37
  readonly default: import("@typespec/compiler").CallableMessage<["tagName"]>;
32
38
  };
39
+ "mixed-tag-metadata-form": {
40
+ readonly default: "Cannot mix the array form and the inline form of @tagMetadata on the same namespace. Use either @tagMetadata(#[...]) or multiple @tagMetadata(\"name\", #{...}) calls, not both.";
41
+ };
42
+ "tag-metadata-array-with-metadata-arg": {
43
+ readonly default: "When using the array form of @tagMetadata, the second argument (tagMetadata) must not be provided. Include all tag metadata inside the array elements.";
44
+ };
33
45
  "tag-metadata-target-service": {
34
46
  readonly default: import("@typespec/compiler").CallableMessage<["namespace"]>;
35
47
  };
@@ -47,10 +59,16 @@ export declare const createDiagnostic: <C extends "invalid-extension-key" | "dup
47
59
  "duplicate-tag": {
48
60
  readonly default: import("@typespec/compiler").CallableMessage<["tagName"]>;
49
61
  };
62
+ "mixed-tag-metadata-form": {
63
+ readonly default: "Cannot mix the array form and the inline form of @tagMetadata on the same namespace. Use either @tagMetadata(#[...]) or multiple @tagMetadata(\"name\", #{...}) calls, not both.";
64
+ };
65
+ "tag-metadata-array-with-metadata-arg": {
66
+ readonly default: "When using the array form of @tagMetadata, the second argument (tagMetadata) must not be provided. Include all tag metadata inside the array elements.";
67
+ };
50
68
  "tag-metadata-target-service": {
51
69
  readonly default: import("@typespec/compiler").CallableMessage<["namespace"]>;
52
70
  };
53
- }, C, M>) => import("@typespec/compiler").Diagnostic, reportDiagnostic: <C extends "invalid-extension-key" | "duplicate-type-name" | "not-url" | "duplicate-tag" | "tag-metadata-target-service", M extends keyof {
71
+ }, C, M>) => import("@typespec/compiler").Diagnostic, reportDiagnostic: <C extends "invalid-extension-key" | "duplicate-type-name" | "not-url" | "duplicate-tag" | "mixed-tag-metadata-form" | "tag-metadata-array-with-metadata-arg" | "tag-metadata-target-service", M extends keyof {
54
72
  "invalid-extension-key": {
55
73
  readonly default: import("@typespec/compiler").CallableMessage<["value"]>;
56
74
  };
@@ -64,6 +82,12 @@ export declare const createDiagnostic: <C extends "invalid-extension-key" | "dup
64
82
  "duplicate-tag": {
65
83
  readonly default: import("@typespec/compiler").CallableMessage<["tagName"]>;
66
84
  };
85
+ "mixed-tag-metadata-form": {
86
+ readonly default: "Cannot mix the array form and the inline form of @tagMetadata on the same namespace. Use either @tagMetadata(#[...]) or multiple @tagMetadata(\"name\", #{...}) calls, not both.";
87
+ };
88
+ "tag-metadata-array-with-metadata-arg": {
89
+ readonly default: "When using the array form of @tagMetadata, the second argument (tagMetadata) must not be provided. Include all tag metadata inside the array elements.";
90
+ };
67
91
  "tag-metadata-target-service": {
68
92
  readonly default: import("@typespec/compiler").CallableMessage<["namespace"]>;
69
93
  };
@@ -81,6 +105,12 @@ export declare const createDiagnostic: <C extends "invalid-extension-key" | "dup
81
105
  "duplicate-tag": {
82
106
  readonly default: import("@typespec/compiler").CallableMessage<["tagName"]>;
83
107
  };
108
+ "mixed-tag-metadata-form": {
109
+ readonly default: "Cannot mix the array form and the inline form of @tagMetadata on the same namespace. Use either @tagMetadata(#[...]) or multiple @tagMetadata(\"name\", #{...}) calls, not both.";
110
+ };
111
+ "tag-metadata-array-with-metadata-arg": {
112
+ readonly default: "When using the array form of @tagMetadata, the second argument (tagMetadata) must not be provided. Include all tag metadata inside the array elements.";
113
+ };
84
114
  "tag-metadata-target-service": {
85
115
  readonly default: import("@typespec/compiler").CallableMessage<["namespace"]>;
86
116
  };
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;uCAsCf,CAAC;AAEH,eAAO,MACL,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAChB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAChB,iBAAiB,4BACN,WAAW,gCAChB,CAAC"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;uCAkDf,CAAC;AAEH,eAAO,MACL,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAChB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAChB,iBAAiB,4BACN,WAAW,gCAChB,CAAC"}
package/dist/src/lib.js CHANGED
@@ -27,6 +27,18 @@ export const $lib = createTypeSpecLibrary({
27
27
  default: paramMessage `"Metadata for tag '${"tagName"}' was specified twice."`,
28
28
  },
29
29
  },
30
+ "mixed-tag-metadata-form": {
31
+ severity: "error",
32
+ messages: {
33
+ default: `Cannot mix the array form and the inline form of @tagMetadata on the same namespace. Use either @tagMetadata(#[...]) or multiple @tagMetadata("name", #{...}) calls, not both.`,
34
+ },
35
+ },
36
+ "tag-metadata-array-with-metadata-arg": {
37
+ severity: "error",
38
+ messages: {
39
+ default: `When using the array form of @tagMetadata, the second argument (tagMetadata) must not be provided. Include all tag metadata inside the array elements.`,
40
+ },
41
+ },
30
42
  "tag-metadata-target-service": {
31
43
  severity: "error",
32
44
  messages: {
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACxC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE;QACX,uBAAuB,EAAE;YACvB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,mDAAmD,OAAO,GAAG;aACnF;SACF;QACD,qBAAqB,EAAE;YACrB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,yBAAyB,OAAO,4FAA4F;gBACjJ,SAAS,EAAE,YAAY,CAAA,6BAA6B,OAAO,4FAA4F;aACxJ;SACF;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,GAAG,UAAU,KAAK,OAAO,sBAAsB;aACrE;SACF;QACD,eAAe,EAAE;YACf,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,sBAAsB,SAAS,yBAAyB;aAC9E;SACF;QACD,6BAA6B,EAAE;YAC7B,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,iFAAiF,WAAW,qBAAqB;aACvI;SACF;KACF;IACD,KAAK,EAAE;QACL,YAAY,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE;KACvE;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EAAE,WAAW,GACvB,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,CAAC,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACxC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE;QACX,uBAAuB,EAAE;YACvB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,mDAAmD,OAAO,GAAG;aACnF;SACF;QACD,qBAAqB,EAAE;YACrB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,yBAAyB,OAAO,4FAA4F;gBACjJ,SAAS,EAAE,YAAY,CAAA,6BAA6B,OAAO,4FAA4F;aACxJ;SACF;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,GAAG,UAAU,KAAK,OAAO,sBAAsB;aACrE;SACF;QACD,eAAe,EAAE;YACf,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,sBAAsB,SAAS,yBAAyB;aAC9E;SACF;QACD,yBAAyB,EAAE;YACzB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,gLAAgL;aAC1L;SACF;QACD,sCAAsC,EAAE;YACtC,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,wJAAwJ;aAClK;SACF;QACD,6BAA6B,EAAE;YAC7B,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE;gBACR,OAAO,EAAE,YAAY,CAAA,iFAAiF,WAAW,qBAAqB;aACvI;SACF;KACF;IACD,KAAK,EAAE;QACL,YAAY,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE;KACvE;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,EACX,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EAAE,WAAW,GACvB,GAAG,IAAI,CAAC"}
@@ -51,4 +51,28 @@ export interface ExternalDocs {
51
51
  /** Optional description */
52
52
  description?: string;
53
53
  }
54
+ /**
55
+ * Metadata for a tag.
56
+ */
57
+ export interface TagMetadata {
58
+ /** A description of the tag. */
59
+ description?: string;
60
+ /** External documentation for the tag. */
61
+ externalDocs?: ExternalDocs;
62
+ /** The name of a parent tag (only supported natively in OpenAPI 3.2; emitted as `x-oai-parent` for 3.0 and 3.1). */
63
+ parent?: string;
64
+ /** A short summary of the tag, used for display purposes. Only supported natively in OpenAPI 3.2. For 3.0 and 3.1, this will be emitted as `x-oai-summary`. */
65
+ summary?: string;
66
+ /** A machine-readable string to categorize what sort of tag it is. Only supported natively in OpenAPI 3.2. For 3.0 and 3.1, this will be emitted as `x-oai-kind`. */
67
+ kind?: string;
68
+ /** Additional extension data. Keys must start with `x-`. */
69
+ [extensionKey: string]: unknown;
70
+ }
71
+ /**
72
+ * Metadata for a tag including the tag name. Used with the array form of `@tagMetadata`.
73
+ */
74
+ export interface TagMetadataWithName extends TagMetadata {
75
+ /** The name of the tag. */
76
+ name: string;
77
+ }
54
78
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,MAAM,EAAE,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,wIAAwI;IACxI,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IAEb,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,MAAM,EAAE,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,wIAAwI;IACxI,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IAEb,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,oHAAoH;IACpH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,+JAA+J;IAC/J,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qKAAqK;IACrK,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,4DAA4D;IAC5D,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -118,19 +118,33 @@ extern dec info(target: Namespace, additionalInfo: valueof AdditionalInfo);
118
118
 
119
119
  /** Metadata to a single tag that is used by operations. */
120
120
  model TagMetadata {
121
- /** A description of the API. */
121
+ /** A description of the tag. */
122
122
  description?: string;
123
123
 
124
- /** An external Docs information of the API. */
124
+ /** External documentation information for the tag. */
125
125
  externalDocs?: ExternalDocs;
126
126
 
127
127
  /** The name of a tag that this tag is nested under. Only supported in OpenAPI 3.2. For 3.0 and 3.1, this will be converted to `x-parent`. */
128
128
  parent?: string;
129
129
 
130
+ /** A short summary of the tag, used for display purposes. Only supported natively in OpenAPI 3.2. For 3.0 and 3.1, this will be emitted as `x-oai-summary`. */
131
+ summary?: string;
132
+
133
+ /** A machine-readable string to categorize what sort of tag it is. Any string value can be used. Only supported natively in OpenAPI 3.2. For 3.0 and 3.1, this will be emitted as `x-oai-kind`. */
134
+ kind?: string;
135
+
130
136
  /** Attach some custom data, The extension key must start with `x-`. */
131
137
  ...Record<unknown>;
132
138
  }
133
139
 
140
+ /** Metadata for a tag that includes the name of the tag. Used with the array form of `@tagMetadata`. */
141
+ model TagMetadataWithName {
142
+ /** The name of the tag. */
143
+ name: string;
144
+
145
+ ...TagMetadata;
146
+ }
147
+
134
148
  /** External Docs information. */
135
149
  model ExternalDocs {
136
150
  /** Documentation url */
@@ -144,16 +158,33 @@ model ExternalDocs {
144
158
  }
145
159
 
146
160
  /**
147
- * Specify OpenAPI additional information.
148
- * @param name tag name
149
- * @param tagMetadata Additional information
161
+ * Specify OpenAPI tag metadata. Can be used in two forms:
162
+ * - Inline form: specify a single tag by name with optional metadata.
163
+ * - Array form: specify an ordered list of tags with their metadata in a single decorator call.
150
164
  *
151
- * @example
165
+ * @param name Tag name (inline form) or array of tags with metadata (array form).
166
+ * @param tagMetadata Additional information for the tag. Only used in inline form.
167
+ *
168
+ * @example Inline form
152
169
  * ```typespec
153
170
  * @service()
154
171
  * @tagMetadata("Tag Name", #{description: "Tag description", externalDocs: #{url: "https://example.com", description: "More info.", `x-custom`: "string"}, `x-custom`: "string"})
155
172
  * @tagMetadata("Child Tag", #{description: "Child tag description", parent: "Tag Name"})
156
173
  * namespace PetStore {}
157
174
  * ```
175
+ *
176
+ * @example Array form (preserves explicit tag order)
177
+ * ```typespec
178
+ * @service()
179
+ * @tagMetadata(#[
180
+ * #{ name: "First Tag", description: "First tag description" },
181
+ * #{ name: "Second Tag", description: "Second tag description" },
182
+ * ])
183
+ * namespace PetStore {}
184
+ * ```
158
185
  */
159
- extern dec tagMetadata(target: Namespace, name: valueof string, tagMetadata: valueof TagMetadata);
186
+ extern dec tagMetadata(
187
+ target: Namespace,
188
+ name: valueof string | TagMetadataWithName[],
189
+ tagMetadata?: valueof TagMetadata
190
+ );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec/openapi",
3
- "version": "1.13.0-dev.0",
3
+ "version": "1.13.0-dev.2",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec library providing OpenAPI concepts",
6
6
  "homepage": "https://typespec.io",
@@ -39,16 +39,16 @@
39
39
  "!dist/test/**"
40
40
  ],
41
41
  "peerDependencies": {
42
- "@typespec/compiler": "^1.12.0 || >= 1.13.0-dev.0",
42
+ "@typespec/compiler": "^1.12.0 || >= 1.13.0-dev.6",
43
43
  "@typespec/http": "^1.12.0 || >= 1.13.0-dev.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "^25.5.2",
47
- "@typespec/compiler": "^1.12.0 || >= 1.13.0-dev.0",
47
+ "@typespec/compiler": "^1.12.0 || >= 1.13.0-dev.6",
48
48
  "@typespec/http": "^1.12.0 || >= 1.13.0-dev.0",
49
49
  "@typespec/library-linter": "^0.82.0 || >= 0.83.0-dev.0",
50
50
  "@typespec/rest": "^0.82.0 || >= 0.83.0-dev.0",
51
- "@typespec/tspd": "^0.74.2 || >= 0.74.3-dev.2",
51
+ "@typespec/tspd": "^0.74.2 || >= 0.74.3-dev.3",
52
52
  "@vitest/coverage-v8": "^4.1.3",
53
53
  "@vitest/ui": "^4.1.3",
54
54
  "rimraf": "^6.1.3",