An experimental TypeSpec syntax for Lexicon

enforce empty @externals

Changed files
+14 -7
packages
emitter
src
test
spec
external
input
+1
packages/emitter/src/decorators.ts
··· 310 310 }); 311 311 return; 312 312 } 313 + 313 314 context.program.stateSet(externalKey).add(target); 314 315 } 315 316
+11
packages/emitter/src/emitter.ts
··· 124 124 125 125 // Skip external namespaces - they don't emit JSON files 126 126 if (isExternal(this.program, ns)) { 127 + // Validate that all models in external namespaces are empty (stub-only) 128 + for (const [_, model] of ns.models) { 129 + if (model.properties && model.properties.size > 0) { 130 + this.program.reportDiagnostic({ 131 + code: "external-model-not-empty", 132 + severity: "error", 133 + message: `Models in @external namespaces must be empty stubs. Model '${model.name}' in namespace '${fullName}' has properties.`, 134 + target: model, 135 + }); 136 + } 137 + } 127 138 return; 128 139 } 129 140
+2 -7
packages/emitter/test/spec/external/input/test/external.tsp
··· 2 2 3 3 @external 4 4 namespace test.external { 5 - model Main { 6 - shouldNotEmit: string; 7 - } 5 + model Main { } 8 6 9 - model AlsoNotEmitted { 10 - @required 11 - value: boolean; 12 - } 7 + model AlsoNotEmitted { } 13 8 }