back interdiff of round #1 and #0

[New feature] Externals #2

closed
opened by danabra.mov targeting main from external

A step towards https://tangled.org/@danabra.mov/typelex/issues/5.

This adds support for Externals, which are namespaces with @external decorator.

@external
namespace com.atproto.label.defs {
  model Label { }
}

@external
namespace app.bsky.graph.defs {
  model StarterPackViewBasic { }
  model ListViewBasic { }
}

They do NOT get emitted as JSON. They only exist to represent external Lexicons for which you have only JSON.

Models inside @external namespaces must be empty. However, they're allowed to be @tokens which we need to know to disambiguate unions and knownValues. (In the future, it's possible we won't rely on knowing that, but for now we do.)

I've converted the playground to use externals properly. I will convert tests in a follow-up.

files
packages
emitter
lib
src
test
spec
basic
output
com
example
external
input
test
output
playground
samples
REVERTED
packages/emitter/lib/decorators.tsp
···
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.
···
* ```
*/
extern dec errors(target: unknown, ...errors: unknown[]);
-
-
/**
-
* Marks a namespace as external, preventing it from emitting JSON output.
-
* This decorator can only be applied to namespaces.
-
* Useful for importing definitions from other lexicons without re-emitting them.
-
*
-
* @example
-
* ```typespec
-
* @external
-
* namespace com.atproto.repo.defs;
-
* ```
-
*/
-
extern dec external(target: Namespace);
ERROR
packages/emitter/src/tsp-index.ts

Failed to calculate interdiff for this file.

ERROR
packages/emitter/test/spec.test.ts

Failed to calculate interdiff for this file.

ERROR
packages/emitter/test/spec/basic/output/com/example/other.json

Failed to calculate interdiff for this file.

ERROR
packages/emitter/test/spec/external/input/test/normal.tsp

Failed to calculate interdiff for this file.

ERROR
packages/emitter/test/spec/external/output/test/normal.json

Failed to calculate interdiff for this file.

ERROR
packages/playground/samples/build.js

Failed to calculate interdiff for this file.

ERROR
packages/playground/samples/index.js

Failed to calculate interdiff for this file.

ERROR
packages/emitter/src/emitter.ts

Failed to calculate interdiff for this file.