diff --git a/packages/emitter/lib/decorators.tsp b/packages/emitter/lib/decorators.tsp index 8354b5a..6b711c4 100644 --- a/packages/emitter/lib/decorators.tsp +++ b/packages/emitter/lib/decorators.tsp @@ -1,7 +1,5 @@ import "../dist/tsp-index.js"; -using TypeSpec.Reflection; - /** * Specifies the maximum number of graphemes (user-perceived characters) allowed. * Used alongside maxLength for proper Unicode text handling. diff --git a/packages/emitter/src/decorators.ts b/packages/emitter/src/decorators.ts index 41aa54a..8d15668 100644 --- a/packages/emitter/src/decorators.ts +++ b/packages/emitter/src/decorators.ts @@ -310,6 +310,7 @@ export function $external(context: DecoratorContext, target: Type) { }); return; } + context.program.stateSet(externalKey).add(target); } diff --git a/packages/emitter/src/emitter.ts b/packages/emitter/src/emitter.ts index 2f72574..8b74710 100644 --- a/packages/emitter/src/emitter.ts +++ b/packages/emitter/src/emitter.ts @@ -124,6 +124,17 @@ export class TypelexEmitter { // Skip external namespaces - they don't emit JSON files if (isExternal(this.program, ns)) { + // Validate that all models in external namespaces are empty (stub-only) + for (const [_, model] of ns.models) { + if (model.properties && model.properties.size > 0) { + this.program.reportDiagnostic({ + code: "external-model-not-empty", + severity: "error", + message: `Models in @external namespaces must be empty stubs. Model '${model.name}' in namespace '${fullName}' has properties.`, + target: model, + }); + } + } return; } diff --git a/packages/emitter/test/spec/external/input/test/external.tsp b/packages/emitter/test/spec/external/input/test/external.tsp index 9a7115a..22d73b7 100644 --- a/packages/emitter/test/spec/external/input/test/external.tsp +++ b/packages/emitter/test/spec/external/input/test/external.tsp @@ -2,12 +2,7 @@ import "@typelex/emitter"; @external namespace test.external { - model Main { - shouldNotEmit: string; - } + model Main { } - model AlsoNotEmitted { - @required - value: boolean; - } + model AlsoNotEmitted { } }