An experimental TypeSpec syntax for Lexicon

make tests use @external

+2047 -269
+4 -18
packages/emitter/test/integration.test.ts
··· 54 54 path.join(scenario, "output"), 55 55 ); 56 56 57 - // Compile all inputs together (for cross-references) 58 - const tspFiles = Object.keys(inputFiles).filter((f) => 59 - f.endsWith(".tsp"), 60 - ); 61 - let emitResult: EmitResult; 62 - 63 - if (tspFiles.length > 0) { 64 - // Create a virtual main.tsp that imports all other files 65 - const mainContent = 66 - 'import "@typelex/emitter";\n' + 67 - tspFiles.map((f) => `import "./${normalizePathToPosix(f)}";`).join("\n"); 68 - const filesWithMain = { ...inputFiles, "main.tsp": mainContent }; 69 - emitResult = await doEmit(filesWithMain, "main.tsp"); 70 - } else { 71 - emitResult = { files: {}, diagnostics: [], inputFiles: {} }; 72 - } 73 - 74 57 // Generate a test for each expected output 75 58 for (const expectedPath of Object.keys(expectedFiles)) { 76 59 if (!expectedPath.endsWith(".json")) continue; ··· 80 63 const hasInput = Object.keys(inputFiles).includes(inputPath); 81 64 82 65 if (hasInput) { 83 - it(`should emit ${expectedPath}`, function () { 66 + it(`should emit ${expectedPath}`, async function () { 67 + // Compile each file in isolation 68 + const emitResult = await doEmit({ [inputPath]: inputFiles[inputPath] }, inputPath); 69 + 84 70 // Check for compilation errors 85 71 if (emitResult.diagnostics.length > 0) { 86 72 const formattedDiagnostics = emitResult.diagnostics.map((diag) =>
+46
packages/emitter/test/integration/atproto/input/app/bsky/actor/defs.tsp
··· 372 372 isActive?: boolean; 373 373 } 374 374 } 375 + 376 + // --- Externals --- 377 + 378 + @external 379 + namespace com.atproto.label.defs { 380 + model Label { } 381 + } 382 + 383 + @external 384 + namespace app.bsky.graph.defs { 385 + model StarterPackViewBasic { } 386 + model ListViewBasic { } 387 + } 388 + 389 + @external 390 + namespace com.atproto.repo.strongRef { 391 + model Main { } 392 + } 393 + 394 + @external 395 + namespace app.bsky.notification.defs { 396 + model ActivitySubscription { } 397 + } 398 + 399 + @external 400 + namespace app.bsky.feed.threadgate { 401 + model MentionRule { } 402 + model FollowerRule { } 403 + model FollowingRule { } 404 + model ListRule { } 405 + } 406 + 407 + @external 408 + namespace app.bsky.feed.postgate { 409 + model DisableRule { } 410 + } 411 + 412 + @external 413 + namespace app.bsky.actor.status { 414 + @token model Live { } 415 + } 416 + 417 + @external 418 + namespace app.bsky.embed.external { 419 + model View { } 420 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/getPreferences.tsp
··· 7 7 @required preferences: app.bsky.actor.defs.Preferences; 8 8 }; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace app.bsky.actor.defs { 15 + model Preferences { } 16 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/getProfile.tsp
··· 8 8 @required actor: atIdentifier 9 9 ): app.bsky.actor.defs.ProfileViewDetailed; 10 10 } 11 + 12 + // --- Externals --- 13 + 14 + @external 15 + namespace app.bsky.actor.defs { 16 + model ProfileViewDetailed { } 17 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/getProfiles.tsp
··· 10 10 @required profiles: app.bsky.actor.defs.ProfileViewDetailed[]; 11 11 }; 12 12 } 13 + 14 + // --- Externals --- 15 + 16 + @external 17 + namespace app.bsky.actor.defs { 18 + model ProfileViewDetailed { } 19 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/getSuggestions.tsp
··· 19 19 recId?: int32; 20 20 }; 21 21 } 22 + 23 + // --- Externals --- 24 + 25 + @external 26 + namespace app.bsky.actor.defs { 27 + model ProfileView { } 28 + }
+12
packages/emitter/test/integration/atproto/input/app/bsky/actor/profile.tsp
··· 34 34 createdAt?: datetime; 35 35 } 36 36 } 37 + 38 + // --- Externals --- 39 + 40 + @external 41 + namespace com.atproto.label.defs { 42 + model SelfLabels { } 43 + } 44 + 45 + @external 46 + namespace com.atproto.repo.strongRef { 47 + model Main { } 48 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/putPreferences.tsp
··· 7 7 @required preferences: app.bsky.actor.defs.Preferences; 8 8 }): void; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace app.bsky.actor.defs { 15 + model Preferences { } 16 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/searchActors.tsp
··· 20 20 @required actors: app.bsky.actor.defs.ProfileView[]; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace app.bsky.actor.defs { 28 + model ProfileView { } 29 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/searchActorsTypeahead.tsp
··· 17 17 @required actors: app.bsky.actor.defs.ProfileViewBasic[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace app.bsky.actor.defs { 25 + model ProfileViewBasic { } 26 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/actor/status.tsp
··· 22 22 @token 23 23 model Live {} 24 24 } 25 + 26 + // --- Externals --- 27 + 28 + @external 29 + namespace app.bsky.embed.external { 30 + model Main { } 31 + }
+14
packages/emitter/test/integration/atproto/input/app/bsky/bookmark/defs.tsp
··· 24 24 ); 25 25 } 26 26 } 27 + 28 + // --- Externals --- 29 + 30 + @external 31 + namespace com.atproto.repo.strongRef { 32 + model Main { } 33 + } 34 + 35 + @external 36 + namespace app.bsky.feed.defs { 37 + model BlockedPost { } 38 + model NotFoundPost { } 39 + model PostView { } 40 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/bookmark/getBookmarks.tsp
··· 14 14 @required bookmarks: app.bsky.bookmark.defs.BookmarkView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.bookmark.defs { 22 + model BookmarkView { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/embed/images.tsp
··· 40 40 aspectRatio?: app.bsky.embed.defs.AspectRatio; 41 41 } 42 42 } 43 + 44 + // --- Externals --- 45 + 46 + @external 47 + namespace app.bsky.embed.defs { 48 + model AspectRatio { } 49 + }
+54
packages/emitter/test/integration/atproto/input/app/bsky/embed/record.tsp
··· 74 74 detached: boolean = true; 75 75 } 76 76 } 77 + 78 + // --- Externals --- 79 + 80 + @external 81 + namespace com.atproto.repo.strongRef { 82 + model Main { } 83 + } 84 + 85 + @external 86 + namespace app.bsky.feed.defs { 87 + model GeneratorView { } 88 + model BlockedAuthor { } 89 + } 90 + 91 + @external 92 + namespace app.bsky.graph.defs { 93 + model ListView { } 94 + model StarterPackViewBasic { } 95 + } 96 + 97 + @external 98 + namespace app.bsky.labeler.defs { 99 + model LabelerView { } 100 + } 101 + 102 + @external 103 + namespace app.bsky.actor.defs { 104 + model ProfileViewBasic { } 105 + } 106 + 107 + @external 108 + namespace com.atproto.label.defs { 109 + model Label { } 110 + } 111 + 112 + @external 113 + namespace app.bsky.embed.images { 114 + model View { } 115 + } 116 + 117 + @external 118 + namespace app.bsky.embed.video { 119 + model View { } 120 + } 121 + 122 + @external 123 + namespace app.bsky.embed.external { 124 + model View { } 125 + } 126 + 127 + @external 128 + namespace app.bsky.embed.recordWithMedia { 129 + model View { } 130 + }
+26
packages/emitter/test/integration/atproto/input/app/bsky/embed/recordWithMedia.tsp
··· 26 26 ); 27 27 } 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace app.bsky.embed.`record` { 34 + model Main { } 35 + model View { } 36 + } 37 + 38 + @external 39 + namespace app.bsky.embed.images { 40 + model Main { } 41 + model View { } 42 + } 43 + 44 + @external 45 + namespace app.bsky.embed.video { 46 + model Main { } 47 + model View { } 48 + } 49 + 50 + @external 51 + namespace app.bsky.embed.external { 52 + model Main { } 53 + model View { } 54 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/embed/video.tsp
··· 36 36 aspectRatio?: app.bsky.embed.defs.AspectRatio; 37 37 } 38 38 } 39 + 40 + // --- Externals --- 41 + 42 + @external 43 + namespace app.bsky.embed.defs { 44 + model AspectRatio { } 45 + }
+49
packages/emitter/test/integration/atproto/input/app/bsky/feed/defs.tsp
··· 246 246 @token 247 247 model InteractionShare {} 248 248 } 249 + 250 + // --- Externals --- 251 + 252 + @external 253 + namespace app.bsky.actor.defs { 254 + model ProfileViewBasic { } 255 + model ViewerState { } 256 + model ProfileView { } 257 + } 258 + 259 + @external 260 + namespace app.bsky.embed.images { 261 + model View { } 262 + } 263 + 264 + @external 265 + namespace app.bsky.embed.video { 266 + model View { } 267 + } 268 + 269 + @external 270 + namespace app.bsky.embed.external { 271 + model View { } 272 + } 273 + 274 + @external 275 + namespace app.bsky.embed.`record` { 276 + model View { } 277 + } 278 + 279 + @external 280 + namespace app.bsky.embed.recordWithMedia { 281 + model View { } 282 + } 283 + 284 + @external 285 + namespace com.atproto.label.defs { 286 + model Label { } 287 + } 288 + 289 + @external 290 + namespace app.bsky.richtext.facet { 291 + model Main { } 292 + } 293 + 294 + @external 295 + namespace app.bsky.graph.defs { 296 + model ListViewBasic { } 297 + }
+18
packages/emitter/test/integration/atproto/input/app/bsky/feed/generator.tsp
··· 30 30 @required createdAt: datetime; 31 31 } 32 32 } 33 + 34 + // --- Externals --- 35 + 36 + @external 37 + namespace app.bsky.richtext.facet { 38 + model Main { } 39 + } 40 + 41 + @external 42 + namespace com.atproto.label.defs { 43 + model SelfLabels { } 44 + } 45 + 46 + @external 47 + namespace app.bsky.feed.defs { 48 + @token model ContentModeUnspecified { } 49 + @token model ContentModeVideo { } 50 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getActorFeeds.tsp
··· 16 16 @required feeds: app.bsky.feed.defs.GeneratorView[]; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace app.bsky.feed.defs { 24 + model GeneratorView { } 25 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getActorLikes.tsp
··· 20 20 @required feed: app.bsky.feed.defs.FeedViewPost[]; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace app.bsky.feed.defs { 28 + model FeedViewPost { } 29 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getAuthorFeed.tsp
··· 25 25 @required feed: app.bsky.feed.defs.FeedViewPost[]; 26 26 }; 27 27 } 28 + 29 + // --- Externals --- 30 + 31 + @external 32 + namespace app.bsky.feed.defs { 33 + model FeedViewPost { } 34 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getFeed.tsp
··· 19 19 @required feed: app.bsky.feed.defs.FeedViewPost[]; 20 20 }; 21 21 } 22 + 23 + // --- Externals --- 24 + 25 + @external 26 + namespace app.bsky.feed.defs { 27 + model FeedViewPost { } 28 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getFeedGenerator.tsp
··· 18 18 isValid: boolean; 19 19 }; 20 20 } 21 + 22 + // --- Externals --- 23 + 24 + @external 25 + namespace app.bsky.feed.defs { 26 + model GeneratorView { } 27 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getFeedGenerators.tsp
··· 9 9 @required feeds: app.bsky.feed.defs.GeneratorView[]; 10 10 }; 11 11 } 12 + 13 + // --- Externals --- 14 + 15 + @external 16 + namespace app.bsky.feed.defs { 17 + model GeneratorView { } 18 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getFeedSkeleton.tsp
··· 26 26 reqId?: string; 27 27 }; 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace app.bsky.feed.defs { 34 + model SkeletonFeedPost { } 35 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getLikes.tsp
··· 28 28 @required actor: app.bsky.actor.defs.ProfileView; 29 29 } 30 30 } 31 + 32 + // --- Externals --- 33 + 34 + @external 35 + namespace app.bsky.actor.defs { 36 + model ProfileView { } 37 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getListFeed.tsp
··· 20 20 @required feed: app.bsky.feed.defs.FeedViewPost[]; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace app.bsky.feed.defs { 28 + model FeedViewPost { } 29 + }
+10
packages/emitter/test/integration/atproto/input/app/bsky/feed/getPostThread.tsp
··· 26 26 threadgate?: app.bsky.feed.defs.ThreadgateView; 27 27 }; 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace app.bsky.feed.defs { 34 + model ThreadViewPost { } 35 + model NotFoundPost { } 36 + model BlockedPost { } 37 + model ThreadgateView { } 38 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getPosts.tsp
··· 11 11 @required posts: app.bsky.feed.defs.PostView[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.feed.defs { 19 + model PostView { } 20 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getQuotes.tsp
··· 22 22 @required posts: app.bsky.feed.defs.PostView[]; 23 23 }; 24 24 } 25 + 26 + // --- Externals --- 27 + 28 + @external 29 + namespace app.bsky.feed.defs { 30 + model PostView { } 31 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getRepostedBy.tsp
··· 22 22 @required repostedBy: app.bsky.actor.defs.ProfileView[]; 23 23 }; 24 24 } 25 + 26 + // --- Externals --- 27 + 28 + @external 29 + namespace app.bsky.actor.defs { 30 + model ProfileView { } 31 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getSuggestedFeeds.tsp
··· 14 14 @required feeds: app.bsky.feed.defs.GeneratorView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.feed.defs { 22 + model GeneratorView { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/getTimeline.tsp
··· 17 17 @required feed: app.bsky.feed.defs.FeedViewPost[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace app.bsky.feed.defs { 25 + model FeedViewPost { } 26 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/like.tsp
··· 13 13 via?: com.atproto.repo.strongRef.Main; 14 14 } 15 15 } 16 + 17 + // --- Externals --- 18 + 19 + @external 20 + namespace com.atproto.repo.strongRef { 21 + model Main { } 22 + }
+42
packages/emitter/test/integration/atproto/input/app/bsky/feed/post.tsp
··· 74 74 @maxGraphemes(64) 75 75 @maxLength(640) 76 76 scalar PostTag extends string; 77 + 78 + // --- Externals --- 79 + 80 + @external 81 + namespace app.bsky.richtext.facet { 82 + model Main { } 83 + } 84 + 85 + @external 86 + namespace app.bsky.embed.images { 87 + model Main { } 88 + } 89 + 90 + @external 91 + namespace app.bsky.embed.video { 92 + model Main { } 93 + } 94 + 95 + @external 96 + namespace app.bsky.embed.external { 97 + model Main { } 98 + } 99 + 100 + @external 101 + namespace app.bsky.embed.`record` { 102 + model Main { } 103 + } 104 + 105 + @external 106 + namespace app.bsky.embed.recordWithMedia { 107 + model Main { } 108 + } 109 + 110 + @external 111 + namespace com.atproto.label.defs { 112 + model SelfLabels { } 113 + } 114 + 115 + @external 116 + namespace com.atproto.repo.strongRef { 117 + model Main { } 118 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/repost.tsp
··· 9 9 via?: com.atproto.repo.strongRef.Main; 10 10 } 11 11 } 12 + 13 + // --- Externals --- 14 + 15 + @external 16 + namespace com.atproto.repo.strongRef { 17 + model Main { } 18 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/searchPosts.tsp
··· 56 56 @required posts: app.bsky.feed.defs.PostView[]; 57 57 }; 58 58 } 59 + 60 + // --- Externals --- 61 + 62 + @external 63 + namespace app.bsky.feed.defs { 64 + model PostView { } 65 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/feed/sendInteractions.tsp
··· 7 7 @required interactions: app.bsky.feed.defs.Interaction[]; 8 8 }): {}; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace app.bsky.feed.defs { 15 + model Interaction { } 16 + }
+23
packages/emitter/test/integration/atproto/input/app/bsky/graph/defs.tsp
··· 139 139 followedBy?: atUri; 140 140 } 141 141 } 142 + 143 + // --- Externals --- 144 + 145 + @external 146 + namespace com.atproto.label.defs { 147 + model Label { } 148 + } 149 + 150 + @external 151 + namespace app.bsky.actor.defs { 152 + model ProfileView { } 153 + model ProfileViewBasic { } 154 + } 155 + 156 + @external 157 + namespace app.bsky.richtext.facet { 158 + model Main { } 159 + } 160 + 161 + @external 162 + namespace app.bsky.feed.defs { 163 + model GeneratorView { } 164 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getActorStarterPacks.tsp
··· 16 16 @required starterPacks: app.bsky.graph.defs.StarterPackViewBasic[]; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace app.bsky.graph.defs { 24 + model StarterPackViewBasic { } 25 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getBlocks.tsp
··· 14 14 @required blocks: app.bsky.actor.defs.ProfileView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.actor.defs { 22 + model ProfileView { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getFollowers.tsp
··· 17 17 @required followers: app.bsky.actor.defs.ProfileView[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace app.bsky.actor.defs { 25 + model ProfileView { } 26 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getFollows.tsp
··· 17 17 @required follows: app.bsky.actor.defs.ProfileView[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace app.bsky.actor.defs { 25 + model ProfileView { } 26 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getKnownFollowers.tsp
··· 17 17 @required followers: app.bsky.actor.defs.ProfileView[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace app.bsky.actor.defs { 25 + model ProfileView { } 26 + }
+8
packages/emitter/test/integration/atproto/input/app/bsky/graph/getList.tsp
··· 18 18 @required items: app.bsky.graph.defs.ListItemView[]; 19 19 }; 20 20 } 21 + 22 + // --- Externals --- 23 + 24 + @external 25 + namespace app.bsky.graph.defs { 26 + model ListView { } 27 + model ListItemView { } 28 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getListBlocks.tsp
··· 14 14 @required lists: app.bsky.graph.defs.ListView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.graph.defs { 22 + model ListView { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getListMutes.tsp
··· 14 14 @required lists: app.bsky.graph.defs.ListView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.graph.defs { 22 + model ListView { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getLists.tsp
··· 20 20 @required lists: app.bsky.graph.defs.ListView[]; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace app.bsky.graph.defs { 28 + model ListView { } 29 + }
+8
packages/emitter/test/integration/atproto/input/app/bsky/graph/getListsWithMembership.tsp
··· 27 27 listItem?: app.bsky.graph.defs.ListItemView; 28 28 } 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace app.bsky.graph.defs { 35 + model ListView { } 36 + model ListItemView { } 37 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getMutes.tsp
··· 14 14 @required mutes: app.bsky.actor.defs.ProfileView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.actor.defs { 22 + model ProfileView { } 23 + }
+8
packages/emitter/test/integration/atproto/input/app/bsky/graph/getRelationships.tsp
··· 26 26 /** the primary actor at-identifier could not be resolved */ 27 27 model ActorNotFound {} 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace app.bsky.graph.defs { 34 + model Relationship { } 35 + model NotFoundActor { } 36 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getStarterPack.tsp
··· 11 11 @required starterPack: app.bsky.graph.defs.StarterPackView; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.graph.defs { 19 + model StarterPackView { } 20 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getStarterPacks.tsp
··· 11 11 @required starterPacks: app.bsky.graph.defs.StarterPackViewBasic[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.graph.defs { 19 + model StarterPackViewBasic { } 20 + }
+8
packages/emitter/test/integration/atproto/input/app/bsky/graph/getStarterPacksWithMembership.tsp
··· 24 24 listItem?: app.bsky.graph.defs.ListItemView; 25 25 } 26 26 } 27 + 28 + // --- Externals --- 29 + 30 + @external 31 + namespace app.bsky.graph.defs { 32 + model StarterPackView { } 33 + model ListItemView { } 34 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/getSuggestedFollowsByActor.tsp
··· 16 16 recId?: int32; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace app.bsky.actor.defs { 24 + model ProfileView { } 25 + }
+17
packages/emitter/test/integration/atproto/input/app/bsky/graph/list.tsp
··· 27 27 @required createdAt: datetime; 28 28 } 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace app.bsky.graph.defs { 35 + model ListPurpose { } 36 + } 37 + 38 + @external 39 + namespace app.bsky.richtext.facet { 40 + model Main { } 41 + } 42 + 43 + @external 44 + namespace com.atproto.label.defs { 45 + model SelfLabels { } 46 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/searchStarterPacks.tsp
··· 18 18 @required starterPacks: app.bsky.graph.defs.StarterPackViewBasic[]; 19 19 }; 20 20 } 21 + 22 + // --- Externals --- 23 + 24 + @external 25 + namespace app.bsky.graph.defs { 26 + model StarterPackViewBasic { } 27 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/graph/starterpack.tsp
··· 33 33 uri: atUri; 34 34 } 35 35 } 36 + 37 + // --- Externals --- 38 + 39 + @external 40 + namespace app.bsky.richtext.facet { 41 + model Main { } 42 + }
+20
packages/emitter/test/integration/atproto/input/app/bsky/labeler/defs.tsp
··· 54 54 labelValueDefinitions?: com.atproto.label.defs.LabelValueDefinition[]; 55 55 } 56 56 } 57 + 58 + // --- Externals --- 59 + 60 + @external 61 + namespace app.bsky.actor.defs { 62 + model ProfileView { } 63 + } 64 + 65 + @external 66 + namespace com.atproto.label.defs { 67 + model Label { } 68 + model LabelValue { } 69 + model LabelValueDefinition { } 70 + } 71 + 72 + @external 73 + namespace com.atproto.moderation.defs { 74 + model ReasonType { } 75 + model SubjectType { } 76 + }
+8
packages/emitter/test/integration/atproto/input/app/bsky/labeler/getServices.tsp
··· 15 15 )[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace app.bsky.labeler.defs { 23 + model LabelerView { } 24 + model LabelerViewDetailed { } 25 + }
+18
packages/emitter/test/integration/atproto/input/app/bsky/labeler/service.tsp
··· 20 20 subjectCollections?: nsid[]; 21 21 } 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace app.bsky.labeler.defs { 28 + model LabelerPolicies { } 29 + } 30 + 31 + @external 32 + namespace com.atproto.label.defs { 33 + model SelfLabels { } 34 + } 35 + 36 + @external 37 + namespace com.atproto.moderation.defs { 38 + model ReasonType { } 39 + model SubjectType { } 40 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/notification/getPreferences.tsp
··· 7 7 @required preferences: app.bsky.notification.defs.Preferences; 8 8 }; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace app.bsky.notification.defs { 15 + model Preferences { } 16 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/notification/listActivitySubscriptions.tsp
··· 14 14 @required subscriptions: app.bsky.actor.defs.ProfileView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.actor.defs { 22 + model ProfileView { } 23 + }
+12
packages/emitter/test/integration/atproto/input/app/bsky/notification/listNotifications.tsp
··· 40 40 labels?: com.atproto.label.defs.Label[]; 41 41 }; 42 42 } 43 + 44 + // --- Externals --- 45 + 46 + @external 47 + namespace app.bsky.actor.defs { 48 + model ProfileView { } 49 + } 50 + 51 + @external 52 + namespace com.atproto.label.defs { 53 + model Label { } 54 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/notification/putActivitySubscription.tsp
··· 13 13 activitySubscription?: app.bsky.notification.defs.ActivitySubscription; 14 14 }; 15 15 } 16 + 17 + // --- Externals --- 18 + 19 + @external 20 + namespace app.bsky.notification.defs { 21 + model ActivitySubscription { } 22 + }
+10
packages/emitter/test/integration/atproto/input/app/bsky/notification/putPreferencesV2.tsp
··· 21 21 @required preferences: app.bsky.notification.defs.Preferences; 22 22 }; 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace app.bsky.notification.defs { 29 + model ChatPreference { } 30 + model FilterablePreference { } 31 + model Preference { } 32 + model Preferences { } 33 + }
+13
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/defs.tsp
··· 114 114 completeUa?: string; 115 115 } 116 116 } 117 + 118 + // --- Externals --- 119 + 120 + @external 121 + namespace app.bsky.actor.defs { 122 + model ProfileViewBasic { } 123 + } 124 + 125 + @external 126 + namespace app.bsky.feed.defs { 127 + model PostView { } 128 + model BlockedAuthor { } 129 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getAgeAssuranceState.tsp
··· 5 5 @query 6 6 op main(): app.bsky.unspecced.defs.AgeAssuranceState; 7 7 } 8 + 9 + // --- Externals --- 10 + 11 + @external 12 + namespace app.bsky.unspecced.defs { 13 + model AgeAssuranceState { } 14 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.tsp
··· 11 11 @required starterPacks: app.bsky.graph.defs.StarterPackView[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.graph.defs { 19 + model StarterPackView { } 20 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getPopularFeedGenerators.tsp
··· 15 15 @required feeds: app.bsky.feed.defs.GeneratorView[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace app.bsky.feed.defs { 23 + model GeneratorView { } 24 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getPostThreadOtherV2.tsp
··· 26 26 @required value: (app.bsky.unspecced.defs.ThreadItemPost | unknown); 27 27 } 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace app.bsky.unspecced.defs { 34 + model ThreadItemPost { } 35 + }
+15
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getPostThreadV2.tsp
··· 55 55 ); 56 56 } 57 57 } 58 + 59 + // --- Externals --- 60 + 61 + @external 62 + namespace app.bsky.feed.defs { 63 + model ThreadgateView { } 64 + } 65 + 66 + @external 67 + namespace app.bsky.unspecced.defs { 68 + model ThreadItemPost { } 69 + model ThreadItemNoUnauthenticated { } 70 + model ThreadItemNotFound { } 71 + model ThreadItemBlocked { } 72 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getSuggestedFeeds.tsp
··· 11 11 @required feeds: app.bsky.feed.defs.GeneratorView[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.feed.defs { 19 + model GeneratorView { } 20 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getSuggestedStarterPacks.tsp
··· 11 11 @required starterPacks: app.bsky.graph.defs.StarterPackView[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.graph.defs { 19 + model StarterPackView { } 20 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getSuggestedUsers.tsp
··· 14 14 @required actors: app.bsky.actor.defs.ProfileView[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.actor.defs { 22 + model ProfileView { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getSuggestionsSkeleton.tsp
··· 26 26 recId?: integer; 27 27 }; 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace app.bsky.unspecced.defs { 34 + model SkeletonSearchActor { } 35 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getTrendingTopics.tsp
··· 15 15 @required suggested: app.bsky.unspecced.defs.TrendingTopic[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace app.bsky.unspecced.defs { 23 + model TrendingTopic { } 24 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getTrends.tsp
··· 11 11 @required trends: app.bsky.unspecced.defs.TrendView[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace app.bsky.unspecced.defs { 19 + model TrendView { } 20 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/getTrendsSkeleton.tsp
··· 14 14 @required trends: app.bsky.unspecced.defs.SkeletonTrend[]; 15 15 }; 16 16 } 17 + 18 + // --- Externals --- 19 + 20 + @external 21 + namespace app.bsky.unspecced.defs { 22 + model SkeletonTrend { } 23 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/initAgeAssurance.tsp
··· 22 22 countryCode: string; 23 23 }): app.bsky.unspecced.defs.AgeAssuranceState; 24 24 } 25 + 26 + // --- Externals --- 27 + 28 + @external 29 + namespace app.bsky.unspecced.defs { 30 + model AgeAssuranceState { } 31 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/searchActorsSkeleton.tsp
··· 31 31 @required actors: app.bsky.unspecced.defs.SkeletonSearchActor[]; 32 32 }; 33 33 } 34 + 35 + // --- Externals --- 36 + 37 + @external 38 + namespace app.bsky.unspecced.defs { 39 + model SkeletonSearchActor { } 40 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/searchPostsSkeleton.tsp
··· 59 59 @required posts: app.bsky.unspecced.defs.SkeletonSearchPost[]; 60 60 }; 61 61 } 62 + 63 + // --- Externals --- 64 + 65 + @external 66 + namespace app.bsky.unspecced.defs { 67 + model SkeletonSearchPost { } 68 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/unspecced/searchStarterPacksSkeleton.tsp
··· 28 28 @required starterPacks: app.bsky.unspecced.defs.SkeletonSearchStarterPack[]; 29 29 }; 30 30 } 31 + 32 + // --- Externals --- 33 + 34 + @external 35 + namespace app.bsky.unspecced.defs { 36 + model SkeletonSearchStarterPack { } 37 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/video/getJobStatus.tsp
··· 9 9 @required jobStatus: app.bsky.video.defs.JobStatus; 10 10 }; 11 11 } 12 + 13 + // --- Externals --- 14 + 15 + @external 16 + namespace app.bsky.video.defs { 17 + model JobStatus { } 18 + }
+7
packages/emitter/test/integration/atproto/input/app/bsky/video/uploadVideo.tsp
··· 10 10 @required jobStatus: app.bsky.video.defs.JobStatus; 11 11 }; 12 12 } 13 + 14 + // --- Externals --- 15 + 16 + @external 17 + namespace app.bsky.video.defs { 18 + model JobStatus { } 19 + }
+14
packages/emitter/test/integration/atproto/input/chat/bsky/actor/defs.tsp
··· 20 20 verification?: app.bsky.actor.defs.VerificationState; 21 21 } 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace app.bsky.actor.defs { 28 + model ProfileAssociated { } 29 + model ViewerState { } 30 + model VerificationState { } 31 + } 32 + 33 + @external 34 + namespace com.atproto.label.defs { 35 + model Label { } 36 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/addReaction.tsp
··· 27 27 @required message: chat.bsky.convo.defs.MessageView; 28 28 }; 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace chat.bsky.convo.defs { 35 + model MessageView { } 36 + }
+18
packages/emitter/test/integration/atproto/input/chat/bsky/convo/defs.tsp
··· 139 139 @required reaction: ReactionView; 140 140 } 141 141 } 142 + 143 + // --- Externals --- 144 + 145 + @external 146 + namespace app.bsky.richtext.facet { 147 + model Main { } 148 + } 149 + 150 + @external 151 + namespace app.bsky.embed.`record` { 152 + model Main { } 153 + model View { } 154 + } 155 + 156 + @external 157 + namespace chat.bsky.actor.defs { 158 + model ProfileViewBasic { } 159 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/deleteMessageForSelf.tsp
··· 7 7 @required messageId: string; 8 8 }): chat.bsky.convo.defs.DeletedMessageView; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace chat.bsky.convo.defs { 15 + model DeletedMessageView { } 16 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/getConvo.tsp
··· 6 6 @required convo: chat.bsky.convo.defs.ConvoView; 7 7 }; 8 8 } 9 + 10 + // --- Externals --- 11 + 12 + @external 13 + namespace chat.bsky.convo.defs { 14 + model ConvoView { } 15 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/getConvoAvailability.tsp
··· 13 13 convo?: chat.bsky.convo.defs.ConvoView; 14 14 }; 15 15 } 16 + 17 + // --- Externals --- 18 + 19 + @external 20 + namespace chat.bsky.convo.defs { 21 + model ConvoView { } 22 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/getConvoForMembers.tsp
··· 11 11 @required convo: chat.bsky.convo.defs.ConvoView; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace chat.bsky.convo.defs { 19 + model ConvoView { } 20 + }
+16
packages/emitter/test/integration/atproto/input/chat/bsky/convo/getLog.tsp
··· 21 21 )[]; 22 22 }; 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace chat.bsky.convo.defs { 29 + model LogBeginConvo { } 30 + model LogAcceptConvo { } 31 + model LogLeaveConvo { } 32 + model LogMuteConvo { } 33 + model LogUnmuteConvo { } 34 + model LogCreateMessage { } 35 + model LogDeleteMessage { } 36 + model LogReadMessage { } 37 + model LogAddReaction { } 38 + model LogRemoveReaction { } 39 + }
+8
packages/emitter/test/integration/atproto/input/chat/bsky/convo/getMessages.tsp
··· 21 21 )[]; 22 22 }; 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace chat.bsky.convo.defs { 29 + model MessageView { } 30 + model DeletedMessageView { } 31 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/listConvos.tsp
··· 17 17 @required convos: chat.bsky.convo.defs.ConvoView[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace chat.bsky.convo.defs { 25 + model ConvoView { } 26 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/muteConvo.tsp
··· 8 8 @required convo: chat.bsky.convo.defs.ConvoView; 9 9 }; 10 10 } 11 + 12 + // --- Externals --- 13 + 14 + @external 15 + namespace chat.bsky.convo.defs { 16 + model ConvoView { } 17 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/removeReaction.tsp
··· 24 24 @required message: chat.bsky.convo.defs.MessageView; 25 25 }; 26 26 } 27 + 28 + // --- Externals --- 29 + 30 + @external 31 + namespace chat.bsky.convo.defs { 32 + model MessageView { } 33 + }
+8
packages/emitter/test/integration/atproto/input/chat/bsky/convo/sendMessage.tsp
··· 7 7 @required message: chat.bsky.convo.defs.MessageInput; 8 8 }): chat.bsky.convo.defs.MessageView; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace chat.bsky.convo.defs { 15 + model MessageInput { } 16 + model MessageView { } 17 + }
+8
packages/emitter/test/integration/atproto/input/chat/bsky/convo/sendMessageBatch.tsp
··· 15 15 @required message: chat.bsky.convo.defs.MessageInput; 16 16 } 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace chat.bsky.convo.defs { 23 + model MessageView { } 24 + model MessageInput { } 25 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/unmuteConvo.tsp
··· 8 8 @required convo: chat.bsky.convo.defs.ConvoView; 9 9 }; 10 10 } 11 + 12 + // --- Externals --- 13 + 14 + @external 15 + namespace chat.bsky.convo.defs { 16 + model ConvoView { } 17 + }
+7
packages/emitter/test/integration/atproto/input/chat/bsky/convo/updateRead.tsp
··· 9 9 @required convo: chat.bsky.convo.defs.ConvoView; 10 10 }; 11 11 } 12 + 13 + // --- Externals --- 14 + 15 + @external 16 + namespace chat.bsky.convo.defs { 17 + model ConvoView { } 18 + }
+8
packages/emitter/test/integration/atproto/input/chat/bsky/moderation/getMessageContext.tsp
··· 20 20 )[]; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace chat.bsky.convo.defs { 28 + model MessageView { } 29 + model DeletedMessageView { } 30 + }
+8
packages/emitter/test/integration/atproto/input/com/atproto/admin/defs.tsp
··· 38 38 @required value: string; 39 39 } 40 40 } 41 + 42 + // --- Externals --- 43 + 44 + @external 45 + namespace com.atproto.server.defs { 46 + model InviteCode { } 47 + model InviteCodeUse { } 48 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/admin/getAccountInfo.tsp
··· 7 7 @required did: did 8 8 ): com.atproto.admin.defs.AccountView; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace com.atproto.admin.defs { 15 + model AccountView { } 16 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/admin/getAccountInfos.tsp
··· 9 9 @required infos: com.atproto.admin.defs.AccountView[]; 10 10 }; 11 11 } 12 + 13 + // --- Externals --- 14 + 15 + @external 16 + namespace com.atproto.admin.defs { 17 + model AccountView { } 18 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/admin/getInviteCodes.tsp
··· 16 16 @required codes: com.atproto.server.defs.InviteCode[]; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace com.atproto.server.defs { 24 + model InviteCode { } 25 + }
+14
packages/emitter/test/integration/atproto/input/com/atproto/admin/getSubjectStatus.tsp
··· 20 20 deactivated?: com.atproto.admin.defs.StatusAttr; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace com.atproto.admin.defs { 28 + model RepoRef { } 29 + model RepoBlobRef { } 30 + model StatusAttr { } 31 + } 32 + 33 + @external 34 + namespace com.atproto.repo.strongRef { 35 + model Main { } 36 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/admin/searchAccounts.tsp
··· 15 15 @required accounts: com.atproto.admin.defs.AccountView[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace com.atproto.admin.defs { 23 + model AccountView { } 24 + }
+14
packages/emitter/test/integration/atproto/input/com/atproto/admin/updateSubjectStatus.tsp
··· 26 26 takedown?: com.atproto.admin.defs.StatusAttr; 27 27 }; 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace com.atproto.admin.defs { 34 + model RepoRef { } 35 + model RepoBlobRef { } 36 + model StatusAttr { } 37 + } 38 + 39 + @external 40 + namespace com.atproto.repo.strongRef { 41 + model Main { } 42 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/identity/refreshIdentity.tsp
··· 17 17 @required identifier: atIdentifier; 18 18 }): com.atproto.identity.defs.IdentityInfo; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace com.atproto.identity.defs { 25 + model IdentityInfo { } 26 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/identity/resolveIdentity.tsp
··· 19 19 identifier: atIdentifier 20 20 ): com.atproto.identity.defs.IdentityInfo; 21 21 } 22 + 23 + // --- Externals --- 24 + 25 + @external 26 + namespace com.atproto.identity.defs { 27 + model IdentityInfo { } 28 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/label/queryLabels.tsp
··· 21 21 @required labels: com.atproto.label.defs.Label[]; 22 22 }; 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace com.atproto.label.defs { 29 + model Label { } 30 + }
+8
packages/emitter/test/integration/atproto/input/com/atproto/label/subscribeLabels.tsp
··· 21 21 cursor?: integer 22 22 ): (Labels | Info); 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace com.atproto.label.defs { 29 + model Label { } 30 + model Info { } 31 + }
+17
packages/emitter/test/integration/atproto/input/com/atproto/moderation/createReport.tsp
··· 50 50 meta?: unknown; 51 51 } 52 52 } 53 + 54 + // --- Externals --- 55 + 56 + @external 57 + namespace com.atproto.moderation.defs { 58 + model ReasonType { } 59 + } 60 + 61 + @external 62 + namespace com.atproto.admin.defs { 63 + model RepoRef { } 64 + } 65 + 66 + @external 67 + namespace com.atproto.repo.strongRef { 68 + model Main { } 69 + }
+51
packages/emitter/test/integration/atproto/input/com/atproto/moderation/defs.tsp
··· 93 93 string, 94 94 } 95 95 } 96 + 97 + // --- Externals --- 98 + 99 + @external 100 + namespace tools.ozone.report.defs { 101 + @token model ReasonAppeal { } 102 + @token model ReasonChildSafetyCSAM { } 103 + @token model ReasonChildSafetyEndangerment { } 104 + @token model ReasonChildSafetyGroom { } 105 + @token model ReasonChildSafetyHarassment { } 106 + @token model ReasonChildSafetyMinorPrivacy { } 107 + @token model ReasonChildSafetyOther { } 108 + @token model ReasonChildSafetyPromotion { } 109 + @token model ReasonCivicDisclosure { } 110 + @token model ReasonCivicElectoralProcess { } 111 + @token model ReasonCivicImpersonation { } 112 + @token model ReasonCivicInterference { } 113 + @token model ReasonCivicMisinformation { } 114 + @token model ReasonHarassmentDoxxing { } 115 + @token model ReasonHarassmentHateSpeech { } 116 + @token model ReasonHarassmentOther { } 117 + @token model ReasonHarassmentTargeted { } 118 + @token model ReasonHarassmentTroll { } 119 + @token model ReasonMisleadingBot { } 120 + @token model ReasonMisleadingImpersonation { } 121 + @token model ReasonMisleadingMisinformation { } 122 + @token model ReasonMisleadingOther { } 123 + @token model ReasonMisleadingScam { } 124 + @token model ReasonMisleadingSpam { } 125 + @token model ReasonMisleadingSyntheticContent { } 126 + @token model ReasonRuleBanEvasion { } 127 + @token model ReasonRuleOther { } 128 + @token model ReasonRuleProhibitedSales { } 129 + @token model ReasonRuleSiteSecurity { } 130 + @token model ReasonRuleStolenContent { } 131 + @token model ReasonSexualAbuseContent { } 132 + @token model ReasonSexualAnimal { } 133 + @token model ReasonSexualDeepfake { } 134 + @token model ReasonSexualNCII { } 135 + @token model ReasonSexualOther { } 136 + @token model ReasonSexualSextortion { } 137 + @token model ReasonSexualUnlabeled { } 138 + @token model ReasonViolenceAnimalWelfare { } 139 + @token model ReasonViolenceExtremistContent { } 140 + @token model ReasonViolenceGlorification { } 141 + @token model ReasonViolenceGraphicContent { } 142 + @token model ReasonViolenceOther { } 143 + @token model ReasonViolenceSelfHarm { } 144 + @token model ReasonViolenceThreats { } 145 + @token model ReasonViolenceTrafficking { } 146 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/repo/applyWrites.tsp
··· 79 79 80 80 model DeleteResult {} 81 81 } 82 + 83 + // --- Externals --- 84 + 85 + @external 86 + namespace com.atproto.repo.defs { 87 + model CommitMeta { } 88 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/repo/createRecord.tsp
··· 36 36 /** Indicates that 'swapCommit' didn't match current repo commit. */ 37 37 model InvalidSwap {} 38 38 } 39 + 40 + // --- Externals --- 41 + 42 + @external 43 + namespace com.atproto.repo.defs { 44 + model CommitMeta { } 45 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/repo/deleteRecord.tsp
··· 28 28 29 29 model InvalidSwap {} 30 30 } 31 + 32 + // --- Externals --- 33 + 34 + @external 35 + namespace com.atproto.repo.defs { 36 + model CommitMeta { } 37 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/repo/putRecord.tsp
··· 39 39 40 40 model InvalidSwap {} 41 41 } 42 + 43 + // --- Externals --- 44 + 45 + @external 46 + namespace com.atproto.repo.defs { 47 + model CommitMeta { } 48 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/server/getAccountInviteCodes.tsp
··· 15 15 @required codes: com.atproto.server.defs.InviteCode[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace com.atproto.server.defs { 23 + model InviteCode { } 24 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/sync/getHostStatus.tsp
··· 22 22 23 23 model HostNotFound {} 24 24 } 25 + 26 + // --- Externals --- 27 + 28 + @external 29 + namespace com.atproto.sync.defs { 30 + model HostStatus { } 31 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/sync/listHosts.tsp
··· 29 29 status?: com.atproto.sync.defs.HostStatus; 30 30 } 31 31 } 32 + 33 + // --- Externals --- 34 + 35 + @external 36 + namespace com.atproto.sync.defs { 37 + model HostStatus { } 38 + }
+7
packages/emitter/test/integration/atproto/input/com/atproto/temp/fetchLabels.tsp
··· 13 13 @required labels: com.atproto.label.defs.Label[]; 14 14 }; 15 15 } 16 + 17 + // --- Externals --- 18 + 19 + @external 20 + namespace com.atproto.label.defs { 21 + model Label { } 22 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/communication/createTemplate.tsp
··· 26 26 createdBy?: did; 27 27 }): tools.ozone.communication.defs.TemplateView; 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace tools.ozone.communication.defs { 34 + model TemplateView { } 35 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/communication/listTemplates.tsp
··· 7 7 @required communicationTemplates: tools.ozone.communication.defs.TemplateView[]; 8 8 }; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace tools.ozone.communication.defs { 15 + model TemplateView { } 16 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/communication/updateTemplate.tsp
··· 29 29 disabled?: boolean; 30 30 }): tools.ozone.communication.defs.TemplateView; 31 31 } 32 + 33 + // --- Externals --- 34 + 35 + @external 36 + namespace tools.ozone.communication.defs { 37 + model TemplateView { } 38 + }
+34
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/defs.tsp
··· 601 601 @token 602 602 model TimelineEventPlcTombstone {} 603 603 } 604 + 605 + // --- Externals --- 606 + 607 + @external 608 + namespace com.atproto.admin.defs { 609 + model RepoRef { } 610 + model ThreatSignature { } 611 + } 612 + 613 + @external 614 + namespace com.atproto.repo.strongRef { 615 + model Main { } 616 + } 617 + 618 + @external 619 + namespace chat.bsky.convo.defs { 620 + model MessageRef { } 621 + } 622 + 623 + @external 624 + namespace com.atproto.moderation.defs { 625 + model SubjectType { } 626 + model ReasonType { } 627 + } 628 + 629 + @external 630 + namespace com.atproto.server.defs { 631 + model InviteCode { } 632 + } 633 + 634 + @external 635 + namespace com.atproto.label.defs { 636 + model Label { } 637 + }
+40
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/emitEvent.tsp
··· 54 54 externalId?: string; 55 55 }): tools.ozone.moderation.defs.ModEventView; 56 56 } 57 + 58 + // --- Externals --- 59 + 60 + @external 61 + namespace tools.ozone.moderation.defs { 62 + model ModEventTakedown { } 63 + model ModEventAcknowledge { } 64 + model ModEventEscalate { } 65 + model ModEventComment { } 66 + model ModEventLabel { } 67 + model ModEventReport { } 68 + model ModEventMute { } 69 + model ModEventUnmute { } 70 + model ModEventMuteReporter { } 71 + model ModEventUnmuteReporter { } 72 + model ModEventReverseTakedown { } 73 + model ModEventResolveAppeal { } 74 + model ModEventEmail { } 75 + model ModEventDivert { } 76 + model ModEventTag { } 77 + model AccountEvent { } 78 + model IdentityEvent { } 79 + model RecordEvent { } 80 + model ModEventPriorityScore { } 81 + model AgeAssuranceEvent { } 82 + model AgeAssuranceOverrideEvent { } 83 + model RevokeAccountCredentialsEvent { } 84 + model ModTool { } 85 + model ModEventView { } 86 + } 87 + 88 + @external 89 + namespace com.atproto.admin.defs { 90 + model RepoRef { } 91 + } 92 + 93 + @external 94 + namespace com.atproto.repo.strongRef { 95 + model Main { } 96 + }
+39
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getAccountTimeline.tsp
··· 55 55 @required count: integer; 56 56 } 57 57 } 58 + 59 + // --- Externals --- 60 + 61 + @external 62 + namespace tools.ozone.moderation.defs { 63 + model ModEventTakedown { } 64 + model ModEventReverseTakedown { } 65 + model ModEventComment { } 66 + model ModEventReport { } 67 + model ModEventLabel { } 68 + model ModEventAcknowledge { } 69 + model ModEventEscalate { } 70 + model ModEventMute { } 71 + model ModEventUnmute { } 72 + model ModEventMuteReporter { } 73 + model ModEventUnmuteReporter { } 74 + model ModEventEmail { } 75 + model ModEventResolveAppeal { } 76 + model ModEventDivert { } 77 + model ModEventTag { } 78 + model AccountEvent { } 79 + model IdentityEvent { } 80 + model RecordEvent { } 81 + model ModEventPriorityScore { } 82 + model RevokeAccountCredentialsEvent { } 83 + model AgeAssuranceEvent { } 84 + model AgeAssuranceOverrideEvent { } 85 + @token model TimelineEventPlcCreate { } 86 + @token model TimelineEventPlcOperation { } 87 + @token model TimelineEventPlcTombstone { } 88 + } 89 + 90 + @external 91 + namespace tools.ozone.hosting.getAccountHistory { 92 + model AccountCreated { } 93 + model EmailConfirmed { } 94 + model PasswordUpdated { } 95 + model HandleUpdated { } 96 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getEvent.tsp
··· 5 5 @query 6 6 op main(@required id: integer): tools.ozone.moderation.defs.ModEventViewDetail; 7 7 } 8 + 9 + // --- Externals --- 10 + 11 + @external 12 + namespace tools.ozone.moderation.defs { 13 + model ModEventViewDetail { } 14 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getRecord.tsp
··· 8 8 @errors(RecordNotFound) 9 9 op main(@required uri: atUri, cid?: cid): tools.ozone.moderation.defs.RecordViewDetail; 10 10 } 11 + 12 + // --- Externals --- 13 + 14 + @external 15 + namespace tools.ozone.moderation.defs { 16 + model RecordViewDetail { } 17 + }
+8
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getRecords.tsp
··· 16 16 )[]; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace tools.ozone.moderation.defs { 24 + model RecordViewDetail { } 25 + model RecordViewNotFound { } 26 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getRepo.tsp
··· 8 8 @errors(RepoNotFound) 9 9 op main(@required did: did): tools.ozone.moderation.defs.RepoViewDetail; 10 10 } 11 + 12 + // --- Externals --- 13 + 14 + @external 15 + namespace tools.ozone.moderation.defs { 16 + model RepoViewDetail { } 17 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getReporterStats.tsp
··· 11 11 @required stats: tools.ozone.moderation.defs.ReporterStats[]; 12 12 }; 13 13 } 14 + 15 + // --- Externals --- 16 + 17 + @external 18 + namespace tools.ozone.moderation.defs { 19 + model ReporterStats { } 20 + }
+8
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getRepos.tsp
··· 16 16 )[]; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace tools.ozone.moderation.defs { 24 + model RepoViewDetail { } 25 + model RepoViewNotFound { } 26 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/getSubjects.tsp
··· 12 12 @required subjects: tools.ozone.moderation.defs.SubjectView[]; 13 13 }; 14 14 } 15 + 16 + // --- Externals --- 17 + 18 + @external 19 + namespace tools.ozone.moderation.defs { 20 + model SubjectView { } 21 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/queryEvents.tsp
··· 80 80 @required events: tools.ozone.moderation.defs.ModEventView[]; 81 81 }; 82 82 } 83 + 84 + // --- Externals --- 85 + 86 + @external 87 + namespace tools.ozone.moderation.defs { 88 + model ModEventView { } 89 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/queryStatuses.tsp
··· 131 131 @required subjectStatuses: tools.ozone.moderation.defs.SubjectStatusView[]; 132 132 }; 133 133 } 134 + 135 + // --- Externals --- 136 + 137 + @external 138 + namespace tools.ozone.moderation.defs { 139 + model SubjectStatusView { } 140 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/moderation/searchRepos.tsp
··· 20 20 @required repos: tools.ozone.moderation.defs.RepoView[]; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace tools.ozone.moderation.defs { 28 + model RepoView { } 29 + }
+10
packages/emitter/test/integration/atproto/input/tools/ozone/safelink/addRule.tsp
··· 28 28 createdBy?: did; 29 29 }): tools.ozone.safelink.defs.Event; 30 30 } 31 + 32 + // --- Externals --- 33 + 34 + @external 35 + namespace tools.ozone.safelink.defs { 36 + model PatternType { } 37 + model ActionType { } 38 + model ReasonType { } 39 + model Event { } 40 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/safelink/queryEvents.tsp
··· 27 27 @required events: tools.ozone.safelink.defs.Event[]; 28 28 }; 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace tools.ozone.safelink.defs { 35 + model Event { } 36 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/safelink/queryRules.tsp
··· 36 36 @required rules: tools.ozone.safelink.defs.UrlRule[]; 37 37 }; 38 38 } 39 + 40 + // --- Externals --- 41 + 42 + @external 43 + namespace tools.ozone.safelink.defs { 44 + model UrlRule { } 45 + }
+8
packages/emitter/test/integration/atproto/input/tools/ozone/safelink/removeRule.tsp
··· 21 21 createdBy?: did; 22 22 }): tools.ozone.safelink.defs.Event; 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace tools.ozone.safelink.defs { 29 + model PatternType { } 30 + model Event { } 31 + }
+10
packages/emitter/test/integration/atproto/input/tools/ozone/safelink/updateRule.tsp
··· 25 25 createdBy?: did; 26 26 }): tools.ozone.safelink.defs.Event; 27 27 } 28 + 29 + // --- Externals --- 30 + 31 + @external 32 + namespace tools.ozone.safelink.defs { 33 + model PatternType { } 34 + model ActionType { } 35 + model ReasonType { } 36 + model Event { } 37 + }
+10
packages/emitter/test/integration/atproto/input/tools/ozone/server/getConfig.tsp
··· 27 27 | string; 28 28 } 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace tools.ozone.team.defs { 35 + @token model RoleAdmin { } 36 + @token model RoleModerator { } 37 + @token model RoleTriage { } 38 + @token model RoleVerifier { } 39 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/set/getValues.tsp
··· 23 23 cursor?: string; 24 24 }; 25 25 } 26 + 27 + // --- Externals --- 28 + 29 + @external 30 + namespace tools.ozone.set.defs { 31 + model SetView { } 32 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/set/querySets.tsp
··· 37 37 cursor?: string; 38 38 }; 39 39 } 40 + 41 + // --- Externals --- 42 + 43 + @external 44 + namespace tools.ozone.set.defs { 45 + model SetView { } 46 + }
+8
packages/emitter/test/integration/atproto/input/tools/ozone/set/upsertSet.tsp
··· 5 5 @procedure 6 6 op main(input: tools.ozone.set.defs.Set): tools.ozone.set.defs.SetView; 7 7 } 8 + 9 + // --- Externals --- 10 + 11 + @external 12 + namespace tools.ozone.set.defs { 13 + model Set { } 14 + model SetView { } 15 + }
+10
packages/emitter/test/integration/atproto/input/tools/ozone/setting/defs.tsp
··· 27 27 @required lastUpdatedBy: did; 28 28 } 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace tools.ozone.team.defs { 35 + @token model RoleModerator { } 36 + @token model RoleTriage { } 37 + @token model RoleAdmin { } 38 + @token model RoleVerifier { } 39 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/setting/listOptions.tsp
··· 24 24 @required options: tools.ozone.setting.defs.Option[]; 25 25 }; 26 26 } 27 + 28 + // --- Externals --- 29 + 30 + @external 31 + namespace tools.ozone.setting.defs { 32 + model Option { } 33 + }
+15
packages/emitter/test/integration/atproto/input/tools/ozone/setting/upsertOption.tsp
··· 23 23 @required option: tools.ozone.setting.defs.Option; 24 24 }; 25 25 } 26 + 27 + // --- Externals --- 28 + 29 + @external 30 + namespace tools.ozone.team.defs { 31 + @token model RoleModerator { } 32 + @token model RoleTriage { } 33 + @token model RoleVerifier { } 34 + @token model RoleAdmin { } 35 + } 36 + 37 + @external 38 + namespace tools.ozone.setting.defs { 39 + model Option { } 40 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/signature/findCorrelation.tsp
··· 7 7 @required details: tools.ozone.signature.defs.SigDetail[]; 8 8 }; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace tools.ozone.signature.defs { 15 + model SigDetail { } 16 + }
+12
packages/emitter/test/integration/atproto/input/tools/ozone/signature/findRelatedAccounts.tsp
··· 23 23 similarities?: tools.ozone.signature.defs.SigDetail[]; 24 24 } 25 25 } 26 + 27 + // --- Externals --- 28 + 29 + @external 30 + namespace com.atproto.admin.defs { 31 + model AccountView { } 32 + } 33 + 34 + @external 35 + namespace tools.ozone.signature.defs { 36 + model SigDetail { } 37 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/signature/searchAccounts.tsp
··· 17 17 @required accounts: com.atproto.admin.defs.AccountView[]; 18 18 }; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace com.atproto.admin.defs { 25 + model AccountView { } 26 + }
+11
packages/emitter/test/integration/atproto/input/tools/ozone/team/addMember.tsp
··· 19 19 | string; 20 20 }): tools.ozone.team.defs.Member; 21 21 } 22 + 23 + // --- Externals --- 24 + 25 + @external 26 + namespace tools.ozone.team.defs { 27 + @token model RoleAdmin { } 28 + @token model RoleModerator { } 29 + @token model RoleVerifier { } 30 + @token model RoleTriage { } 31 + model Member { } 32 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/team/defs.tsp
··· 27 27 @token 28 28 model RoleVerifier {} 29 29 } 30 + 31 + // --- Externals --- 32 + 33 + @external 34 + namespace app.bsky.actor.defs { 35 + model ProfileViewDetailed { } 36 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/team/listMembers.tsp
··· 18 18 @required members: tools.ozone.team.defs.Member[]; 19 19 }; 20 20 } 21 + 22 + // --- Externals --- 23 + 24 + @external 25 + namespace tools.ozone.team.defs { 26 + model Member { } 27 + }
+11
packages/emitter/test/integration/atproto/input/tools/ozone/team/updateMember.tsp
··· 19 19 | string; 20 20 }): tools.ozone.team.defs.Member; 21 21 } 22 + 23 + // --- Externals --- 24 + 25 + @external 26 + namespace tools.ozone.team.defs { 27 + @token model RoleAdmin { } 28 + @token model RoleModerator { } 29 + @token model RoleVerifier { } 30 + @token model RoleTriage { } 31 + model Member { } 32 + }
+8
packages/emitter/test/integration/atproto/input/tools/ozone/verification/defs.tsp
··· 52 52 ); 53 53 } 54 54 } 55 + 56 + // --- Externals --- 57 + 58 + @external 59 + namespace tools.ozone.moderation.defs { 60 + model RepoViewDetail { } 61 + model RepoViewNotFound { } 62 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/verification/grantVerifications.tsp
··· 41 41 subject: did; 42 42 } 43 43 } 44 + 45 + // --- Externals --- 46 + 47 + @external 48 + namespace tools.ozone.verification.defs { 49 + model VerificationView { } 50 + }
+7
packages/emitter/test/integration/atproto/input/tools/ozone/verification/listVerifications.tsp
··· 43 43 @required verifications: tools.ozone.verification.defs.VerificationView[]; 44 44 }; 45 45 } 46 + 47 + // --- Externals --- 48 + 49 + @external 50 + namespace tools.ozone.verification.defs { 51 + model VerificationView { } 52 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/defs.tsp
··· 38 38 @required value: string; 39 39 } 40 40 } 41 + 42 + // --- Externals --- 43 + 44 + @external 45 + namespace com.atproto.server.defs { 46 + model InviteCode { } 47 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/getAccountInfo.tsp
··· 7 7 @required did: did 8 8 ): com.atproto.admin.defs.AccountView; 9 9 } 10 + 11 + // --- Externals --- 12 + 13 + @external 14 + namespace com.atproto.admin.defs { 15 + model AccountView { } 16 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/getAccountInfos.tsp
··· 9 9 @required infos: com.atproto.admin.defs.AccountView[]; 10 10 }; 11 11 } 12 + 13 + // --- Externals --- 14 + 15 + @external 16 + namespace com.atproto.admin.defs { 17 + model AccountView { } 18 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/getInviteCodes.tsp
··· 16 16 @required codes: com.atproto.server.defs.InviteCode[]; 17 17 }; 18 18 } 19 + 20 + // --- Externals --- 21 + 22 + @external 23 + namespace com.atproto.server.defs { 24 + model InviteCode { } 25 + }
+14
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/getSubjectStatus.tsp
··· 20 20 deactivated?: com.atproto.admin.defs.StatusAttr; 21 21 }; 22 22 } 23 + 24 + // --- Externals --- 25 + 26 + @external 27 + namespace com.atproto.admin.defs { 28 + model RepoRef { } 29 + model RepoBlobRef { } 30 + model StatusAttr { } 31 + } 32 + 33 + @external 34 + namespace com.atproto.repo.strongRef { 35 + model Main { } 36 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/searchAccounts.tsp
··· 15 15 @required accounts: com.atproto.admin.defs.AccountView[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace com.atproto.admin.defs { 23 + model AccountView { } 24 + }
+14
packages/emitter/test/integration/lexicon-examples/input/com/atproto/admin/updateSubjectStatus.tsp
··· 26 26 takedown?: com.atproto.admin.defs.StatusAttr; 27 27 }; 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace com.atproto.admin.defs { 34 + model RepoRef { } 35 + model RepoBlobRef { } 36 + model StatusAttr { } 37 + } 38 + 39 + @external 40 + namespace com.atproto.repo.strongRef { 41 + model Main { } 42 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/identity/refreshIdentity.tsp
··· 17 17 @required identifier: atIdentifier; 18 18 }): com.atproto.identity.defs.IdentityInfo; 19 19 } 20 + 21 + // --- Externals --- 22 + 23 + @external 24 + namespace com.atproto.identity.defs { 25 + model IdentityInfo { } 26 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/identity/resolveIdentity.tsp
··· 19 19 identifier: atIdentifier 20 20 ): com.atproto.identity.defs.IdentityInfo; 21 21 } 22 + 23 + // --- Externals --- 24 + 25 + @external 26 + namespace com.atproto.identity.defs { 27 + model IdentityInfo { } 28 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/label/queryLabels.tsp
··· 21 21 @required labels: com.atproto.label.defs.Label[]; 22 22 }; 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace com.atproto.label.defs { 29 + model Label { } 30 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/label/subscribeLabels.tsp
··· 21 21 cursor?: integer 22 22 ): (Labels | Info); 23 23 } 24 + 25 + // --- Externals --- 26 + 27 + @external 28 + namespace com.atproto.label.defs { 29 + model Label { } 30 + }
+17
packages/emitter/test/integration/lexicon-examples/input/com/atproto/moderation/createReport.tsp
··· 50 50 meta?: unknown; 51 51 } 52 52 } 53 + 54 + // --- Externals --- 55 + 56 + @external 57 + namespace com.atproto.moderation.defs { 58 + model ReasonType { } 59 + } 60 + 61 + @external 62 + namespace com.atproto.admin.defs { 63 + model RepoRef { } 64 + } 65 + 66 + @external 67 + namespace com.atproto.repo.strongRef { 68 + model Main { } 69 + }
+51
packages/emitter/test/integration/lexicon-examples/input/com/atproto/moderation/defs.tsp
··· 102 102 string, 103 103 } 104 104 } 105 + 106 + // --- Externals --- 107 + 108 + @external 109 + namespace tools.ozone.report.defs { 110 + @token model ReasonAppeal { } 111 + @token model ReasonViolenceAnimalWelfare { } 112 + @token model ReasonViolenceThreats { } 113 + @token model ReasonViolenceGraphicContent { } 114 + @token model ReasonViolenceSelfHarm { } 115 + @token model ReasonViolenceGlorification { } 116 + @token model ReasonViolenceExtremistContent { } 117 + @token model ReasonViolenceTrafficking { } 118 + @token model ReasonViolenceOther { } 119 + @token model ReasonSexualAbuseContent { } 120 + @token model ReasonSexualNCII { } 121 + @token model ReasonSexualSextortion { } 122 + @token model ReasonSexualDeepfake { } 123 + @token model ReasonSexualAnimal { } 124 + @token model ReasonSexualUnlabeled { } 125 + @token model ReasonSexualOther { } 126 + @token model ReasonChildSafetyCSAM { } 127 + @token model ReasonChildSafetyGroom { } 128 + @token model ReasonChildSafetyMinorPrivacy { } 129 + @token model ReasonChildSafetyEndangerment { } 130 + @token model ReasonChildSafetyHarassment { } 131 + @token model ReasonChildSafetyPromotion { } 132 + @token model ReasonChildSafetyOther { } 133 + @token model ReasonHarassmentTroll { } 134 + @token model ReasonHarassmentTargeted { } 135 + @token model ReasonHarassmentHateSpeech { } 136 + @token model ReasonHarassmentDoxxing { } 137 + @token model ReasonHarassmentOther { } 138 + @token model ReasonMisleadingBot { } 139 + @token model ReasonMisleadingImpersonation { } 140 + @token model ReasonMisleadingSpam { } 141 + @token model ReasonMisleadingScam { } 142 + @token model ReasonMisleadingSyntheticContent { } 143 + @token model ReasonMisleadingMisinformation { } 144 + @token model ReasonMisleadingOther { } 145 + @token model ReasonRuleSiteSecurity { } 146 + @token model ReasonRuleStolenContent { } 147 + @token model ReasonRuleProhibitedSales { } 148 + @token model ReasonRuleBanEvasion { } 149 + @token model ReasonRuleOther { } 150 + @token model ReasonCivicElectoralProcess { } 151 + @token model ReasonCivicDisclosure { } 152 + @token model ReasonCivicInterference { } 153 + @token model ReasonCivicMisinformation { } 154 + @token model ReasonCivicImpersonation { } 155 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/repo/applyWrites.tsp
··· 79 79 80 80 model DeleteResult {} 81 81 } 82 + 83 + // --- Externals --- 84 + 85 + @external 86 + namespace com.atproto.repo.defs { 87 + model CommitMeta { } 88 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/repo/createRecord.tsp
··· 36 36 /** Indicates that 'swapCommit' didn't match current repo commit. */ 37 37 model InvalidSwap {} 38 38 } 39 + 40 + // --- Externals --- 41 + 42 + @external 43 + namespace com.atproto.repo.defs { 44 + model CommitMeta { } 45 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/repo/deleteRecord.tsp
··· 28 28 29 29 model InvalidSwap {} 30 30 } 31 + 32 + // --- Externals --- 33 + 34 + @external 35 + namespace com.atproto.repo.defs { 36 + model CommitMeta { } 37 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/repo/putRecord.tsp
··· 39 39 40 40 model InvalidSwap {} 41 41 } 42 + 43 + // --- Externals --- 44 + 45 + @external 46 + namespace com.atproto.repo.defs { 47 + model CommitMeta { } 48 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/server/getAccountInviteCodes.tsp
··· 15 15 @required codes: com.atproto.server.defs.InviteCode[]; 16 16 }; 17 17 } 18 + 19 + // --- Externals --- 20 + 21 + @external 22 + namespace com.atproto.server.defs { 23 + model InviteCode { } 24 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/sync/getHostStatus.tsp
··· 22 22 23 23 model HostNotFound {} 24 24 } 25 + 26 + // --- Externals --- 27 + 28 + @external 29 + namespace com.atproto.sync.defs { 30 + model HostStatus { } 31 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/sync/listHosts.tsp
··· 29 29 status?: com.atproto.sync.defs.HostStatus; 30 30 } 31 31 } 32 + 33 + // --- Externals --- 34 + 35 + @external 36 + namespace com.atproto.sync.defs { 37 + model HostStatus { } 38 + }
+7
packages/emitter/test/integration/lexicon-examples/input/com/atproto/temp/fetchLabels.tsp
··· 13 13 @required labels: com.atproto.label.defs.Label[]; 14 14 }; 15 15 } 16 + 17 + // --- Externals --- 18 + 19 + @external 20 + namespace com.atproto.label.defs { 21 + model Label { } 22 + }
+7
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/blocks/blockquote.tsp
··· 6 6 facets?: `pub`.leaflet.richtext.facet.Main[]; 7 7 } 8 8 } 9 + 10 + // --- Externals --- 11 + 12 + @external 13 + namespace `pub`.leaflet.richtext.facet { 14 + model Main { } 15 + }
+7
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/blocks/bskyPost.tsp
··· 5 5 @required postRef: com.atproto.repo.strongRef.Main; 6 6 } 7 7 } 8 + 9 + // --- Externals --- 10 + 11 + @external 12 + namespace com.atproto.repo.strongRef { 13 + model Main { } 14 + }
+7
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/blocks/header.tsp
··· 10 10 facets?: `pub`.leaflet.richtext.facet.Main[]; 11 11 } 12 12 } 13 + 14 + // --- Externals --- 15 + 16 + @external 17 + namespace `pub`.leaflet.richtext.facet { 18 + model Main { } 19 + }
+7
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/blocks/text.tsp
··· 6 6 facets?: `pub`.leaflet.richtext.facet.Main[]; 7 7 } 8 8 } 9 + 10 + // --- Externals --- 11 + 12 + @external 13 + namespace `pub`.leaflet.richtext.facet { 14 + model Main { } 15 + }
+17
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/blocks/unorderedList.tsp
··· 10 10 children?: ListItem[]; 11 11 } 12 12 } 13 + 14 + // --- Externals --- 15 + 16 + @external 17 + namespace `pub`.leaflet.blocks.text { 18 + model Main { } 19 + } 20 + 21 + @external 22 + namespace `pub`.leaflet.blocks.header { 23 + model Main { } 24 + } 25 + 26 + @external 27 + namespace `pub`.leaflet.blocks.image { 28 + model Main { } 29 + }
+12
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/comment.tsp
··· 26 26 @required parent: atUri; 27 27 } 28 28 } 29 + 30 + // --- Externals --- 31 + 32 + @external 33 + namespace `pub`.leaflet.richtext.facet { 34 + model Main { } 35 + } 36 + 37 + @external 38 + namespace `pub`.leaflet.pages.linearDocument { 39 + model Quote { } 40 + }
+12
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/document.tsp
··· 23 23 @required pages: (`pub`.leaflet.pages.linearDocument.Main | unknown)[]; 24 24 } 25 25 } 26 + 27 + // --- Externals --- 28 + 29 + @external 30 + namespace com.atproto.repo.strongRef { 31 + model Main { } 32 + } 33 + 34 + @external 35 + namespace `pub`.leaflet.pages.linearDocument { 36 + model Main { } 37 + }
+57
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/pages/linearDocument.tsp
··· 43 43 @required offset: integer; 44 44 } 45 45 } 46 + 47 + // --- Externals --- 48 + 49 + @external 50 + namespace `pub`.leaflet.blocks.iframe { 51 + model Main { } 52 + } 53 + 54 + @external 55 + namespace `pub`.leaflet.blocks.text { 56 + model Main { } 57 + } 58 + 59 + @external 60 + namespace `pub`.leaflet.blocks.blockquote { 61 + model Main { } 62 + } 63 + 64 + @external 65 + namespace `pub`.leaflet.blocks.header { 66 + model Main { } 67 + } 68 + 69 + @external 70 + namespace `pub`.leaflet.blocks.image { 71 + model Main { } 72 + } 73 + 74 + @external 75 + namespace `pub`.leaflet.blocks.unorderedList { 76 + model Main { } 77 + } 78 + 79 + @external 80 + namespace `pub`.leaflet.blocks.website { 81 + model Main { } 82 + } 83 + 84 + @external 85 + namespace `pub`.leaflet.blocks.math { 86 + model Main { } 87 + } 88 + 89 + @external 90 + namespace `pub`.leaflet.blocks.code { 91 + model Main { } 92 + } 93 + 94 + @external 95 + namespace `pub`.leaflet.blocks.horizontalRule { 96 + model Main { } 97 + } 98 + 99 + @external 100 + namespace `pub`.leaflet.blocks.bskyPost { 101 + model Main { } 102 + }
+13
packages/emitter/test/integration/lexicon-examples/input/pub/leaflet/publication.tsp
··· 34 34 accentText?: (`pub`.leaflet.theme.color.Rgba | `pub`.leaflet.theme.color.Rgb | unknown); 35 35 } 36 36 } 37 + 38 + // --- Externals --- 39 + 40 + @external 41 + namespace `pub`.leaflet.theme.color { 42 + model Rgba { } 43 + model Rgb { } 44 + } 45 + 46 + @external 47 + namespace `pub`.leaflet.theme.backgroundImage { 48 + model Main { } 49 + }
+12
packages/emitter/test/integration/lexicon-examples/input/sh/tangled/repo/issue/state.tsp
··· 10 10 state: "sh.tangled.repo.issue.state.open" | "sh.tangled.repo.issue.state.closed" | string = "sh.tangled.repo.issue.state.open"; 11 11 } 12 12 } 13 + 14 + // --- Externals --- 15 + 16 + @external 17 + namespace sh.tangled.repo.issue.state.open { 18 + @token model Main { } 19 + } 20 + 21 + @external 22 + namespace sh.tangled.repo.issue.state.closed { 23 + @token model Main { } 24 + }
+17
packages/emitter/test/integration/lexicon-examples/input/sh/tangled/repo/pull/status.tsp
··· 10 10 status: "sh.tangled.repo.pull.status.open" | "sh.tangled.repo.pull.status.closed" | "sh.tangled.repo.pull.status.merged" | string = "sh.tangled.repo.pull.status.open"; 11 11 } 12 12 } 13 + 14 + // --- Externals --- 15 + 16 + @external 17 + namespace sh.tangled.repo.pull.status.open { 18 + @token model Main { } 19 + } 20 + 21 + @external 22 + namespace sh.tangled.repo.pull.status.closed { 23 + @token model Main { } 24 + } 25 + 26 + @external 27 + namespace sh.tangled.repo.pull.status.merged { 28 + @token model Main { } 29 + }
+2 -3
packages/playground/package.json
··· 4 4 "private": true, 5 5 "type": "module", 6 6 "scripts": { 7 - "build:samples": "node samples/build.js", 8 - "dev": "npm run build:samples && vite", 9 - "build": "npm run build:samples && vite build", 7 + "dev": "vite", 8 + "build": "vite build", 10 9 "preview": "vite preview" 11 10 }, 12 11 "dependencies": {
-96
packages/playground/samples/build.js
··· 1 - // @ts-check 2 - import { writeFileSync, mkdirSync, readFileSync } from "fs"; 3 - import { dirname, resolve, join } from "path"; 4 - import { fileURLToPath } from "url"; 5 - import { deepStrictEqual } from "assert"; 6 - import { lexicons, bundleLexicon } from "./index.js"; 7 - import { createTestHost, findTestPackageRoot, resolveVirtualPath } from "@typespec/compiler/testing"; 8 - 9 - const __dirname = dirname(fileURLToPath(import.meta.url)); 10 - const outputDir = resolve(__dirname, "dist"); 11 - const pkgRoot = await findTestPackageRoot(import.meta.url); 12 - 13 - // TypeSpec library setup for testing 14 - const TypelexTestLibrary = { 15 - name: "@typelex/emitter", 16 - packageRoot: pkgRoot.replace("/playground", "/emitter"), 17 - files: [ 18 - { realDir: "", pattern: "package.json", virtualPath: "./node_modules/@typelex/emitter" }, 19 - { realDir: "dist", pattern: "**/*.js", virtualPath: "./node_modules/@typelex/emitter/dist" }, 20 - { realDir: "lib/", pattern: "*.tsp", virtualPath: "./node_modules/@typelex/emitter/lib" }, 21 - ], 22 - }; 23 - 24 - // Create output directory 25 - mkdirSync(outputDir, { recursive: true }); 26 - 27 - // Write each bundled lexicon to disk and verify it compiles correctly 28 - const samplesList = {}; 29 - 30 - for (const [namespace, lexicon] of lexicons) { 31 - const bundled = bundleLexicon(namespace); 32 - const filename = `${namespace}.tsp`; 33 - const filepath = join(outputDir, filename); 34 - 35 - writeFileSync(filepath, bundled); 36 - 37 - const host = await createTestHost({ libraries: [TypelexTestLibrary] }); 38 - host.addTypeSpecFile("main.tsp", bundled); 39 - 40 - const baseOutputPath = resolveVirtualPath("test-output/"); 41 - const [, diagnostics] = await host.compileAndDiagnose("main.tsp", { 42 - outputDir: baseOutputPath, 43 - noEmit: false, 44 - emit: ["@typelex/emitter"], 45 - }); 46 - 47 - if (diagnostics.length > 0) { 48 - console.error(`❌ ${namespace}: Compilation errors`); 49 - diagnostics.forEach(d => console.error(` ${d.message}`)); 50 - process.exit(1); 51 - } 52 - 53 - // Get emitted JSON 54 - const outputFiles = [...host.fs.entries()] 55 - .filter(([name]) => name.startsWith(baseOutputPath)) 56 - .map(([name, value]) => { 57 - let relativePath = name.replace(baseOutputPath, ""); 58 - if (relativePath.startsWith("@typelex/emitter/")) { 59 - relativePath = relativePath.replace("@typelex/emitter/", ""); 60 - } 61 - return [relativePath, value]; 62 - }); 63 - 64 - const expectedJsonPath = namespace.replace(/\./g, "/") + ".json"; 65 - const emittedJson = outputFiles.find(([path]) => path === expectedJsonPath); 66 - 67 - if (!emittedJson) { 68 - console.error(`❌ ${namespace}: No JSON output found (expected ${expectedJsonPath})`); 69 - process.exit(1); 70 - } 71 - 72 - // Compare with expected JSON 73 - const expectedJsonFile = join( 74 - pkgRoot.replace("/playground", "/emitter"), 75 - "test/integration", 76 - lexicon.suite, 77 - "output", 78 - lexicon.file.replace(".tsp", ".json") 79 - ); 80 - 81 - const expectedJson = JSON.parse(readFileSync(expectedJsonFile, "utf-8")); 82 - const actualJson = JSON.parse(emittedJson[1]); 83 - 84 - deepStrictEqual(actualJson, expectedJson); 85 - 86 - samplesList[namespace] = { 87 - filename: `samples/dist/${filename}`, 88 - preferredEmitter: "@typelex/emitter", 89 - }; 90 - } 91 - 92 - // Write the samples index 93 - const samplesIndex = `export default ${JSON.stringify(samplesList, null, 2)};`; 94 - writeFileSync(join(outputDir, "samples.js"), samplesIndex); 95 - 96 - console.log(`\n✅ ${lexicons.size} samples verified successfully`);
+15 -152
packages/playground/samples/index.js
··· 5 5 6 6 const __dirname = dirname(fileURLToPath(import.meta.url)); 7 7 8 - // Get all tsp and json files 8 + // Get all tsp files 9 9 function getAllFiles(dir, baseDir = dir) { 10 10 const files = []; 11 11 const entries = readdirSync(dir); ··· 16 16 17 17 if (stat.isDirectory()) { 18 18 files.push(...getAllFiles(fullPath, baseDir)); 19 - } else if (entry.endsWith(".tsp") || entry.endsWith(".json")) { 19 + } else if (entry.endsWith(".tsp")) { 20 20 files.push(relative(baseDir, fullPath)); 21 21 } 22 22 } ··· 24 24 return files.sort(); 25 25 } 26 26 27 - // Extract all refs from JSON (recursively search for strings with #) 28 - function extractRefsFromJson(obj, refs = new Map()) { 29 - if (typeof obj === "string") { 30 - // Match pattern like "foo.bar#baz" or "foo.barCamel#baz" (must have # to be a ref) 31 - const match = obj.match(/^([a-z][a-zA-Z.]+)#([a-z][a-zA-Z]*)$/); 32 - if (match) { 33 - const ns = match[1]; 34 - const def = match[2]; 35 - const modelName = def.charAt(0).toUpperCase() + def.slice(1); 36 - if (!refs.has(ns)) { 37 - refs.set(ns, new Set()); 38 - } 39 - refs.get(ns).add(modelName); 40 - } else { 41 - // Also match plain namespace refs like "foo.bar.baz" or "foo.bar.bazCamel" (must have at least 2 dots) 42 - const nsMatch = obj.match(/^([a-z][a-zA-Z]*(?:\.[a-z][a-zA-Z]*){2,})$/); 43 - if (nsMatch) { 44 - const ns = nsMatch[1]; 45 - if (!refs.has(ns)) { 46 - refs.set(ns, new Set()); 47 - } 48 - refs.get(ns).add("Main"); 49 - } 50 - } 51 - } else if (Array.isArray(obj)) { 52 - for (const item of obj) { 53 - extractRefsFromJson(item, refs); 54 - } 55 - } else if (obj && typeof obj === "object") { 56 - for (const value of Object.values(obj)) { 57 - extractRefsFromJson(value, refs); 58 - } 59 - } 60 - return refs; 61 - } 62 - 63 27 const integrationDir = join(__dirname, "../../emitter/test/integration"); 64 28 65 29 // Get all test suite directories ··· 68 32 return statSync(fullPath).isDirectory() && !name.startsWith("."); 69 33 }); 70 34 71 - // Build lexicons with refs extracted from JSON 72 - const lexicons = new Map(); // namespace -> { file, content, refs, suite } 35 + // Load all lexicons from test suites 36 + const lexicons = new Map(); // namespace -> { file, content, suite } 73 37 74 - // Process all test suites 75 38 for (const suite of testSuites) { 76 39 const inputDir = join(integrationDir, suite, "input"); 77 - const outputDir = join(integrationDir, suite, "output"); 78 - 79 40 const inputFiles = getAllFiles(inputDir).filter((f) => f.endsWith(".tsp")); 80 41 81 42 for (const file of inputFiles) { ··· 83 44 const content = readFileSync(fullPath, "utf-8"); 84 45 const namespace = file.replace(/\.tsp$/, "").replace(/\//g, "."); 85 46 86 - // Find corresponding JSON output 87 - const jsonFile = file.replace(/\.tsp$/, ".json"); 88 - const jsonPath = join(outputDir, jsonFile); 89 - const jsonContent = readFileSync(jsonPath, "utf-8"); 90 - const jsonData = JSON.parse(jsonContent); 91 - const refs = extractRefsFromJson(jsonData); 92 - 93 - lexicons.set(namespace, { file, content, refs, suite }); 47 + lexicons.set(namespace, { file, content, suite }); 94 48 } 95 49 } 96 50 97 - // TypeSpec reserved keywords that need escaping 98 - const TYPESPEC_KEYWORDS = new Set([ 99 - "record", 100 - "pub", 101 - "interface", 102 - "model", 103 - "namespace", 104 - "op", 105 - "import", 106 - "export", 107 - "using", 108 - "alias", 109 - "enum", 110 - "union", 111 - "scalar", 112 - "extends", 113 - ]); 114 - 115 - // Escape a namespace part if it's a reserved keyword 116 - function escapeNamespacePart(part) { 117 - return TYPESPEC_KEYWORDS.has(part) ? `\`${part}\`` : part; 51 + // Build samples list for playground 52 + const samplesList = {}; 53 + for (const [namespace] of lexicons) { 54 + samplesList[namespace] = { 55 + filename: `samples/${namespace}.tsp`, 56 + preferredEmitter: "@typelex/emitter", 57 + }; 118 58 } 119 59 120 - // Escape a full namespace path 121 - function escapeNamespace(namespace) { 122 - return namespace.split(".").map(escapeNamespacePart).join("."); 123 - } 124 - 125 - // Get the JSON for a lexicon to check its definitions 126 - function getLexiconJson(namespace) { 127 - const lexicon = lexicons.get(namespace); 128 - if (!lexicon) return null; 129 - 130 - const jsonPath = join( 131 - integrationDir, 132 - lexicon.suite, 133 - "output", 134 - lexicon.file.replace(".tsp", ".json"), 135 - ); 136 - 137 - try { 138 - return JSON.parse(readFileSync(jsonPath, "utf-8")); 139 - } catch { 140 - return null; 141 - } 142 - } 60 + export { lexicons }; 61 + export default samplesList; 143 62 144 - // Check if a definition in JSON is a token 145 - function isToken(lexiconJson, defName) { 146 - if (!lexiconJson || !lexiconJson.defs) return false; 147 - const def = lexiconJson.defs[defName]; 148 - return def && def.type === "token"; 149 - } 150 - 151 - // Bundle a lexicon with stubs for referenced types (from JSON) 152 - function bundleLexicon(namespace) { 153 - const mainLexicon = lexicons.get(namespace); 154 - if (!mainLexicon) return ""; 155 - 156 - let bundled = mainLexicon.content; 157 - 158 - // Add stubs from refs extracted from JSON output (excluding self-references) 159 - if (mainLexicon.refs.size > 0) { 160 - let hasExternalRefs = false; 161 - for (const [ns] of mainLexicon.refs) { 162 - if (ns !== namespace) { 163 - hasExternalRefs = true; 164 - break; 165 - } 166 - } 167 - 168 - if (hasExternalRefs) { 169 - bundled += "\n// --- Externals ---\n"; 170 - } 171 - 172 - for (const [ns, models] of mainLexicon.refs) { 173 - // Skip if this is the current namespace 174 - if (ns === namespace) continue; 175 - 176 - // Get the JSON for this referenced namespace to check for tokens 177 - const refJson = getLexiconJson(ns); 178 - 179 - const escapedNs = escapeNamespace(ns); 180 - bundled += `\n@external\nnamespace ${escapedNs} {\n`; 181 - for (const model of models) { 182 - // Check if this definition exists in the JSON and is a token 183 - const defName = model.charAt(0).toLowerCase() + model.slice(1); 184 - if (refJson && isToken(refJson, defName)) { 185 - bundled += ` @token model ${model} { }\n`; 186 - } else { 187 - bundled += ` model ${model} { }\n`; 188 - } 189 - } 190 - bundled += `}\n`; 191 - } 192 - } 193 - 194 - return bundled; 195 - } 196 - 197 - // Export for build script 198 - export { lexicons, bundleLexicon }; 199 - 200 - console.log(`Loaded ${lexicons.size} lexicons for bundling`); 63 + console.log(`Loaded ${lexicons.size} lexicons`);