@atproto/lex-cli 0.9.8 → 0.10.0-next.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # @atproto/lex-cli
2
2
 
3
+ ## 0.10.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#4929](https://github.com/bluesky-social/atproto/pull/4929) [`bb7491c`](https://github.com/bluesky-social/atproto/commit/bb7491c29e06181e1d2f8cf6eb454f9bb8ab961b) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Drop support for Node.js 18 and 20. Node.js 22 is now the minimum supported version. Docker images now use Node.js 24.
8
+
9
+ - [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`07ae5d4`](https://github.com/bluesky-social/atproto/commit/07ae5d4452df51e045e0239da7a04cf0bc154028) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Convert to pure ESM. All packages now ship `"type": "module"` with ES module output and Node16 module resolution.
10
+
11
+ Node.js 22's `require()` compatibility layer can still load these packages in CommonJS code.
12
+
13
+ - [#4943](https://github.com/bluesky-social/atproto/pull/4943) [`dfab396`](https://github.com/bluesky-social/atproto/commit/dfab3967a53b063f40fbd93325d2d6fe0eef5b16) Thanks [@devinivy](https://github.com/devinivy)! - **BREAKING:** Generated lexicon code now uses `.js` extensions on relative imports (e.g. `from '../lexicons.js'` instead of `from '../lexicons'`), enabling compatibility with Node16/NodeNext module resolution under ESM. Consumers using classic `node` or `bundler` resolution should be unaffected.
14
+
15
+ - [#4930](https://github.com/bluesky-social/atproto/pull/4930) [`042df15`](https://github.com/bluesky-social/atproto/commit/042df15087c0e62cd1e715fcbf58852fab875af9) Thanks [@devinivy](https://github.com/devinivy)! - Build with TypeScript 6.0. Emitted `.d.ts` files now use TypeScript 6's stricter `Uint8Array<ArrayBuffer>` typing in places where Web/Node APIs require buffer-backed (not shared-memory) byte arrays. Consumers compiling against these types on older TypeScript should see no runtime impact, but may need to widen or cast in spots that previously relied on `Uint8Array` defaulting to `<ArrayBufferLike>`.
16
+
17
+ Internal: tsconfig `moduleResolution: "node"` is silenced via `ignoreDeprecations: "6.0"` for now; the proper migration to `node16`/`bundler` resolution is deferred.
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies [[`bb7491c`](https://github.com/bluesky-social/atproto/commit/bb7491c29e06181e1d2f8cf6eb454f9bb8ab961b), [`07ae5d4`](https://github.com/bluesky-social/atproto/commit/07ae5d4452df51e045e0239da7a04cf0bc154028), [`042df15`](https://github.com/bluesky-social/atproto/commit/042df15087c0e62cd1e715fcbf58852fab875af9)]:
22
+ - @atproto/lexicon@0.7.0-next.0
23
+ - @atproto/syntax@0.6.0-next.0
24
+
25
+ ## 0.9.9
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies [[`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd), [`52834ab`](https://github.com/bluesky-social/atproto/commit/52834aba182da8df3611fd9dff924e6c6a3973a7), [`f7c2610`](https://github.com/bluesky-social/atproto/commit/f7c26103a6d4e24e5bedbb6fd908be140420e0dd)]:
30
+ - @atproto/syntax@0.5.0
31
+ - @atproto/lexicon@0.6.2
32
+
3
33
  ## 0.9.8
4
34
 
5
35
  ### Patch Changes
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  Dual MIT/Apache-2.0 License
2
2
 
3
- Copyright (c) 2022-2025 Bluesky Social PBC, and Contributors
3
+ Copyright (c) 2022-2026 Bluesky Social PBC, and Contributors
4
4
 
5
5
  Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
6
6
 
package/bin.js ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+
3
+ /* eslint-env node */
4
+
5
+ // @NOTE This file exists so that pnpm can properly link the "bin" scripts when
6
+ // the monorepo is being setup (during initial "pnpm install"), but was never
7
+ // built.
8
+
9
+ import './dist/index.js'
@@ -1,4 +1,4 @@
1
1
  import { type LexiconDoc } from '@atproto/lexicon';
2
- import { type GeneratedAPI } from '../types';
2
+ import { type GeneratedAPI } from '../types.js';
3
3
  export declare function genClientApi(lexiconDocs: LexiconDoc[]): Promise<GeneratedAPI>;
4
4
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/codegen/client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,UAAU,EAAY,MAAM,kBAAkB,CAAA;AAE5E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AA4B5C,wBAAsB,YAAY,CAChC,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/codegen/client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,UAAU,EAAY,MAAM,kBAAkB,CAAA;AAE5E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AA4B/C,wBAAsB,YAAY,CAChC,WAAW,EAAE,UAAU,EAAE,GACxB,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
@@ -1,12 +1,9 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.genClientApi = genClientApi;
4
- const ts_morph_1 = require("ts-morph");
5
- const lexicon_1 = require("@atproto/lexicon");
6
- const syntax_1 = require("@atproto/syntax");
7
- const common_1 = require("./common");
8
- const lex_gen_1 = require("./lex-gen");
9
- const util_1 = require("./util");
1
+ import { IndentationText, Project, VariableDeclarationKind, } from 'ts-morph';
2
+ import { Lexicons } from '@atproto/lexicon';
3
+ import { NSID } from '@atproto/syntax';
4
+ import { gen, lexiconsTs, utilTs } from './common.js';
5
+ import { genCommonImports, genImports, genRecord, genUserType, genXrpcInput, genXrpcOutput, genXrpcParams, } from './lex-gen.js';
6
+ import { lexiconsToDefTree, schemasToNsidTokens, toCamelCase, toScreamingSnakeCase, toTitleCase, } from './util.js';
10
7
  const ATP_METHODS = {
11
8
  list: 'com.atproto.repo.listRecords',
12
9
  get: 'com.atproto.repo.getRecord',
@@ -14,24 +11,24 @@ const ATP_METHODS = {
14
11
  put: 'com.atproto.repo.putRecord',
15
12
  delete: 'com.atproto.repo.deleteRecord',
16
13
  };
17
- async function genClientApi(lexiconDocs) {
18
- const project = new ts_morph_1.Project({
14
+ export async function genClientApi(lexiconDocs) {
15
+ const project = new Project({
19
16
  useInMemoryFileSystem: true,
20
- manipulationSettings: { indentationText: ts_morph_1.IndentationText.TwoSpaces },
17
+ manipulationSettings: { indentationText: IndentationText.TwoSpaces },
21
18
  });
22
19
  const api = { files: [] };
23
- const lexicons = new lexicon_1.Lexicons(lexiconDocs);
24
- const nsidTree = (0, util_1.lexiconsToDefTree)(lexiconDocs);
25
- const nsidTokens = (0, util_1.schemasToNsidTokens)(lexiconDocs);
20
+ const lexicons = new Lexicons(lexiconDocs);
21
+ const nsidTree = lexiconsToDefTree(lexiconDocs);
22
+ const nsidTokens = schemasToNsidTokens(lexiconDocs);
26
23
  for (const lexiconDoc of lexiconDocs) {
27
24
  api.files.push(await lexiconTs(project, lexicons, lexiconDoc));
28
25
  }
29
- api.files.push(await (0, common_1.utilTs)(project));
30
- api.files.push(await (0, common_1.lexiconsTs)(project, lexiconDocs));
26
+ api.files.push(await utilTs(project));
27
+ api.files.push(await lexiconsTs(project, lexiconDocs));
31
28
  api.files.push(await indexTs(project, lexiconDocs, nsidTree, nsidTokens));
32
29
  return api;
33
30
  }
34
- const indexTs = (project, lexiconDocs, nsidTree, nsidTokens) => (0, common_1.gen)(project, '/index.ts', async (file) => {
31
+ const indexTs = (project, lexiconDocs, nsidTree, nsidTokens) => gen(project, '/index.ts', async (file) => {
35
32
  //= import { XrpcClient, type FetchHandler, type FetchHandlerOptions } from '@atproto/xrpc'
36
33
  const xrpcImport = file.addImportDeclaration({
37
34
  moduleSpecifier: '@atproto/xrpc',
@@ -63,10 +60,10 @@ const indexTs = (project, lexiconDocs, nsidTree, nsidTokens) => (0, common_1.gen
63
60
  const moduleSpecifier = `./types/${lexicon.id.split('.').join('/')}.js`;
64
61
  file
65
62
  .addImportDeclaration({ moduleSpecifier })
66
- .setNamespaceImport((0, util_1.toTitleCase)(lexicon.id));
63
+ .setNamespaceImport(toTitleCase(lexicon.id));
67
64
  file
68
65
  .addExportDeclaration({ moduleSpecifier })
69
- .setNamespaceExport((0, util_1.toTitleCase)(lexicon.id));
66
+ .setNamespaceExport(toTitleCase(lexicon.id));
70
67
  }
71
68
  // generate token enums
72
69
  for (const nsidAuthority in nsidTokens) {
@@ -75,13 +72,13 @@ const indexTs = (project, lexiconDocs, nsidTree, nsidTokens) => (0, common_1.gen
75
72
  // }
76
73
  file.addVariableStatement({
77
74
  isExported: true,
78
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
75
+ declarationKind: VariableDeclarationKind.Const,
79
76
  declarations: [
80
77
  {
81
- name: (0, util_1.toScreamingSnakeCase)(nsidAuthority),
78
+ name: toScreamingSnakeCase(nsidAuthority),
82
79
  initializer: [
83
80
  '{',
84
- ...nsidTokens[nsidAuthority].map((nsidName) => `${(0, util_1.toTitleCase)(nsidName)}: "${nsidAuthority}.${nsidName}",`),
81
+ ...nsidTokens[nsidAuthority].map((nsidName) => `${toTitleCase(nsidName)}: "${nsidAuthority}.${nsidName}",`),
85
82
  '}',
86
83
  ].join('\n'),
87
84
  },
@@ -146,10 +143,10 @@ function genNamespaceCls(file, ns) {
146
143
  continue;
147
144
  }
148
145
  //= type: TypeRecord
149
- const name = syntax_1.NSID.parse(userType.nsid).name || '';
146
+ const name = NSID.parse(userType.nsid).name || '';
150
147
  cls.addProperty({
151
- name: (0, util_1.toCamelCase)(name),
152
- type: `${(0, util_1.toTitleCase)(userType.nsid)}Record`,
148
+ name: toCamelCase(name),
149
+ type: `${toTitleCase(userType.nsid)}Record`,
153
150
  });
154
151
  }
155
152
  for (const child of ns.children) {
@@ -179,8 +176,8 @@ function genNamespaceCls(file, ns) {
179
176
  ...ns.userTypes
180
177
  .filter((ut) => ut.def.type === 'record')
181
178
  .map((ut) => {
182
- const name = syntax_1.NSID.parse(ut.nsid).name || '';
183
- return `this.${(0, util_1.toCamelCase)(name)} = new ${(0, util_1.toTitleCase)(ut.nsid)}Record(client)`;
179
+ const name = NSID.parse(ut.nsid).name || '';
180
+ return `this.${toCamelCase(name)} = new ${toTitleCase(ut.nsid)}Record(client)`;
184
181
  }),
185
182
  ],
186
183
  });
@@ -190,8 +187,8 @@ function genNamespaceCls(file, ns) {
190
187
  continue;
191
188
  }
192
189
  const isGetReq = userType.def.type === 'query';
193
- const moduleName = (0, util_1.toTitleCase)(userType.nsid);
194
- const name = (0, util_1.toCamelCase)(syntax_1.NSID.parse(userType.nsid).name || '');
190
+ const moduleName = toTitleCase(userType.nsid);
191
+ const name = toCamelCase(NSID.parse(userType.nsid).name || '');
195
192
  const method = cls.addMethod({
196
193
  name,
197
194
  returnType: `Promise<${moduleName}.Response>`,
@@ -234,7 +231,7 @@ function genNamespaceCls(file, ns) {
234
231
  function genRecordCls(file, nsid, lexRecord) {
235
232
  //= export class {type}Record {...}
236
233
  const cls = file.addClass({
237
- name: `${(0, util_1.toTitleCase)(nsid)}Record`,
234
+ name: `${toTitleCase(nsid)}Record`,
238
235
  isExported: true,
239
236
  });
240
237
  //= _client: XrpcClient
@@ -252,7 +249,7 @@ function genRecordCls(file, nsid, lexRecord) {
252
249
  });
253
250
  cons.setBodyText(`this._client = client`);
254
251
  // methods
255
- const typeModule = (0, util_1.toTitleCase)(nsid);
252
+ const typeModule = toTitleCase(nsid);
256
253
  {
257
254
  //= list()
258
255
  const method = cls.addMethod({
@@ -262,7 +259,7 @@ function genRecordCls(file, nsid, lexRecord) {
262
259
  });
263
260
  method.addParameter({
264
261
  name: 'params',
265
- type: `OmitKey<${(0, util_1.toTitleCase)(ATP_METHODS.list)}.QueryParams, "collection">`,
262
+ type: `OmitKey<${toTitleCase(ATP_METHODS.list)}.QueryParams, "collection">`,
266
263
  });
267
264
  method.setBodyText([
268
265
  `const res = await this._client.call('${ATP_METHODS.list}', { collection: '${nsid}', ...params })`,
@@ -278,7 +275,7 @@ function genRecordCls(file, nsid, lexRecord) {
278
275
  });
279
276
  method.addParameter({
280
277
  name: 'params',
281
- type: `OmitKey<${(0, util_1.toTitleCase)(ATP_METHODS.get)}.QueryParams, "collection">`,
278
+ type: `OmitKey<${toTitleCase(ATP_METHODS.get)}.QueryParams, "collection">`,
282
279
  });
283
280
  method.setBodyText([
284
281
  `const res = await this._client.call('${ATP_METHODS.get}', { collection: '${nsid}', ...params })`,
@@ -294,7 +291,7 @@ function genRecordCls(file, nsid, lexRecord) {
294
291
  });
295
292
  method.addParameter({
296
293
  name: 'params',
297
- type: `OmitKey<${(0, util_1.toTitleCase)(ATP_METHODS.create)}.InputSchema, "collection" | "record">`,
294
+ type: `OmitKey<${toTitleCase(ATP_METHODS.create)}.InputSchema, "collection" | "record">`,
298
295
  });
299
296
  method.addParameter({
300
297
  name: 'record',
@@ -322,7 +319,7 @@ function genRecordCls(file, nsid, lexRecord) {
322
319
  });
323
320
  method.addParameter({
324
321
  name: 'params',
325
- type: `OmitKey<${(0, util_1.toTitleCase)(ATP_METHODS.put)}.InputSchema, "collection" | "record">`,
322
+ type: `OmitKey<${toTitleCase(ATP_METHODS.put)}.InputSchema, "collection" | "record">`,
326
323
  });
327
324
  method.addParameter({
328
325
  name: 'record',
@@ -347,7 +344,7 @@ function genRecordCls(file, nsid, lexRecord) {
347
344
  });
348
345
  method.addParameter({
349
346
  name: 'params',
350
- type: `OmitKey<${(0, util_1.toTitleCase)(ATP_METHODS.delete)}.InputSchema, "collection">`,
347
+ type: `OmitKey<${toTitleCase(ATP_METHODS.delete)}.InputSchema, "collection">`,
351
348
  });
352
349
  method.addParameter({
353
350
  name: 'headers?',
@@ -358,7 +355,7 @@ function genRecordCls(file, nsid, lexRecord) {
358
355
  ].join('\n'));
359
356
  }
360
357
  }
361
- const lexiconTs = (project, lexicons, lexiconDoc) => (0, common_1.gen)(project, `/types/${lexiconDoc.id.split('.').join('/')}.ts`, async (file) => {
358
+ const lexiconTs = (project, lexicons, lexiconDoc) => gen(project, `/types/${lexiconDoc.id.split('.').join('/')}.ts`, async (file) => {
362
359
  const main = lexiconDoc.defs.main;
363
360
  if (main?.type === 'query' ||
364
361
  main?.type === 'subscription' ||
@@ -372,33 +369,33 @@ const lexiconTs = (project, lexicons, lexiconDoc) => (0, common_1.gen)(project,
372
369
  { name: 'XRPCError' },
373
370
  ]);
374
371
  }
375
- (0, lex_gen_1.genCommonImports)(file, lexiconDoc.id);
372
+ genCommonImports(file, lexiconDoc.id);
376
373
  const imports = new Set();
377
374
  for (const defId in lexiconDoc.defs) {
378
375
  const def = lexiconDoc.defs[defId];
379
376
  const lexUri = `${lexiconDoc.id}#${defId}`;
380
377
  if (defId === 'main') {
381
378
  if (def.type === 'query' || def.type === 'procedure') {
382
- (0, lex_gen_1.genXrpcParams)(file, lexicons, lexUri, false);
383
- (0, lex_gen_1.genXrpcInput)(file, imports, lexicons, lexUri, false);
384
- (0, lex_gen_1.genXrpcOutput)(file, imports, lexicons, lexUri);
379
+ genXrpcParams(file, lexicons, lexUri, false);
380
+ genXrpcInput(file, imports, lexicons, lexUri, false);
381
+ genXrpcOutput(file, imports, lexicons, lexUri);
385
382
  genClientXrpcCommon(file, lexicons, lexUri);
386
383
  }
387
384
  else if (def.type === 'subscription') {
388
385
  continue;
389
386
  }
390
387
  else if (def.type === 'record') {
391
- (0, lex_gen_1.genRecord)(file, imports, lexicons, lexUri);
388
+ genRecord(file, imports, lexicons, lexUri);
392
389
  }
393
390
  else {
394
- (0, lex_gen_1.genUserType)(file, imports, lexicons, lexUri);
391
+ genUserType(file, imports, lexicons, lexUri);
395
392
  }
396
393
  }
397
394
  else {
398
- (0, lex_gen_1.genUserType)(file, imports, lexicons, lexUri);
395
+ genUserType(file, imports, lexicons, lexUri);
399
396
  }
400
397
  }
401
- (0, lex_gen_1.genImports)(file, imports, lexiconDoc.id);
398
+ genImports(file, imports, lexiconDoc.id);
402
399
  });
403
400
  function genClientXrpcCommon(file, lexicons, lexUri) {
404
401
  const def = lexicons.getDefOrThrow(lexUri, ['query', 'procedure']);
@@ -446,7 +443,7 @@ function genClientXrpcCommon(file, lexicons, lexUri) {
446
443
  // export class {errcode}Error {...}
447
444
  const customErrors = [];
448
445
  for (const error of def.errors || []) {
449
- let name = (0, util_1.toTitleCase)(error.name);
446
+ let name = toTitleCase(error.name);
450
447
  if (!name.endsWith('Error'))
451
448
  name += 'Error';
452
449
  const errCls = file.addClass({
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/codegen/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n IndentationText,\n Project,\n SourceFile,\n VariableDeclarationKind,\n} from 'ts-morph'\nimport { type LexRecord, type LexiconDoc, Lexicons } from '@atproto/lexicon'\nimport { NSID } from '@atproto/syntax'\nimport { type GeneratedAPI } from '../types'\nimport { gen, lexiconsTs, utilTs } from './common'\nimport {\n genCommonImports,\n genImports,\n genRecord,\n genUserType,\n genXrpcInput,\n genXrpcOutput,\n genXrpcParams,\n} from './lex-gen'\nimport {\n type DefTreeNode,\n lexiconsToDefTree,\n schemasToNsidTokens,\n toCamelCase,\n toScreamingSnakeCase,\n toTitleCase,\n} from './util'\n\nconst ATP_METHODS = {\n list: 'com.atproto.repo.listRecords',\n get: 'com.atproto.repo.getRecord',\n create: 'com.atproto.repo.createRecord',\n put: 'com.atproto.repo.putRecord',\n delete: 'com.atproto.repo.deleteRecord',\n}\n\nexport async function genClientApi(\n lexiconDocs: LexiconDoc[],\n): Promise<GeneratedAPI> {\n const project = new Project({\n useInMemoryFileSystem: true,\n manipulationSettings: { indentationText: IndentationText.TwoSpaces },\n })\n const api: GeneratedAPI = { files: [] }\n const lexicons = new Lexicons(lexiconDocs)\n const nsidTree = lexiconsToDefTree(lexiconDocs)\n const nsidTokens = schemasToNsidTokens(lexiconDocs)\n for (const lexiconDoc of lexiconDocs) {\n api.files.push(await lexiconTs(project, lexicons, lexiconDoc))\n }\n api.files.push(await utilTs(project))\n api.files.push(await lexiconsTs(project, lexiconDocs))\n api.files.push(await indexTs(project, lexiconDocs, nsidTree, nsidTokens))\n return api\n}\n\nconst indexTs = (\n project: Project,\n lexiconDocs: LexiconDoc[],\n nsidTree: DefTreeNode[],\n nsidTokens: Record<string, string[]>,\n) =>\n gen(project, '/index.ts', async (file) => {\n //= import { XrpcClient, type FetchHandler, type FetchHandlerOptions } from '@atproto/xrpc'\n const xrpcImport = file.addImportDeclaration({\n moduleSpecifier: '@atproto/xrpc',\n })\n xrpcImport.addNamedImports([\n { name: 'XrpcClient' },\n { name: 'FetchHandler', isTypeOnly: true },\n { name: 'FetchHandlerOptions', isTypeOnly: true },\n ])\n //= import {schemas} from './lexicons.js'\n file\n .addImportDeclaration({ moduleSpecifier: './lexicons.js' })\n .addNamedImports([{ name: 'schemas' }])\n //= import {CID} from 'multiformats/cid'\n file\n .addImportDeclaration({\n moduleSpecifier: 'multiformats/cid',\n })\n .addNamedImports([{ name: 'CID' }])\n\n //= import { type OmitKey, type Un$Typed } from './util.js'\n file\n .addImportDeclaration({ moduleSpecifier: `./util.js` })\n .addNamedImports([\n { name: 'OmitKey', isTypeOnly: true },\n { name: 'Un$Typed', isTypeOnly: true },\n ])\n\n // generate type imports and re-exports\n for (const lexicon of lexiconDocs) {\n const moduleSpecifier = `./types/${lexicon.id.split('.').join('/')}.js`\n file\n .addImportDeclaration({ moduleSpecifier })\n .setNamespaceImport(toTitleCase(lexicon.id))\n file\n .addExportDeclaration({ moduleSpecifier })\n .setNamespaceExport(toTitleCase(lexicon.id))\n }\n\n // generate token enums\n for (const nsidAuthority in nsidTokens) {\n // export const {THE_AUTHORITY} = {\n // {Name}: \"{authority.the.name}\"\n // }\n file.addVariableStatement({\n isExported: true,\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: toScreamingSnakeCase(nsidAuthority),\n initializer: [\n '{',\n ...nsidTokens[nsidAuthority].map(\n (nsidName) =>\n `${toTitleCase(nsidName)}: \"${nsidAuthority}.${nsidName}\",`,\n ),\n '}',\n ].join('\\n'),\n },\n ],\n })\n }\n\n //= export class AtpBaseClient {...}\n const clientCls = file.addClass({\n name: 'AtpBaseClient',\n isExported: true,\n extends: 'XrpcClient',\n })\n\n for (const ns of nsidTree) {\n //= ns: NS\n clientCls.addProperty({\n name: ns.propName,\n type: ns.className,\n })\n }\n\n //= constructor (options: FetchHandler | FetchHandlerOptions) {\n //= super(options, schemas)\n //= {namespace declarations}\n //= }\n clientCls.addConstructor({\n parameters: [\n { name: 'options', type: 'FetchHandler | FetchHandlerOptions' },\n ],\n statements: [\n 'super(options, schemas)',\n ...nsidTree.map(\n (ns) => `this.${ns.propName} = new ${ns.className}(this)`,\n ),\n ],\n })\n\n //= /** @deprecated use `this` instead */\n //= get xrpc(): XrpcClient {\n //= return this\n //= }\n clientCls\n .addGetAccessor({\n name: 'xrpc',\n returnType: 'XrpcClient',\n statements: ['return this'],\n })\n .addJsDoc('@deprecated use `this` instead')\n\n // generate classes for the schemas\n for (const ns of nsidTree) {\n genNamespaceCls(file, ns)\n }\n })\n\nfunction genNamespaceCls(file: SourceFile, ns: DefTreeNode) {\n //= export class {ns}NS {...}\n const cls = file.addClass({\n name: ns.className,\n isExported: true,\n })\n //= _client: XrpcClient\n cls.addProperty({\n name: '_client',\n type: 'XrpcClient',\n })\n\n for (const userType of ns.userTypes) {\n if (userType.def.type !== 'record') {\n continue\n }\n //= type: TypeRecord\n const name = NSID.parse(userType.nsid).name || ''\n cls.addProperty({\n name: toCamelCase(name),\n type: `${toTitleCase(userType.nsid)}Record`,\n })\n }\n\n for (const child of ns.children) {\n //= child: ChildNS\n cls.addProperty({\n name: child.propName,\n type: child.className,\n })\n\n // recurse\n genNamespaceCls(file, child)\n }\n\n //= constructor(public client: XrpcClient) {\n //= this._client = client\n //= {child namespace prop declarations}\n //= {record prop declarations}\n //= }\n cls.addConstructor({\n parameters: [\n {\n name: 'client',\n type: 'XrpcClient',\n },\n ],\n statements: [\n `this._client = client`,\n ...ns.children.map(\n (ns) => `this.${ns.propName} = new ${ns.className}(client)`,\n ),\n ...ns.userTypes\n .filter((ut) => ut.def.type === 'record')\n .map((ut) => {\n const name = NSID.parse(ut.nsid).name || ''\n return `this.${toCamelCase(name)} = new ${toTitleCase(\n ut.nsid,\n )}Record(client)`\n }),\n ],\n })\n\n // methods\n for (const userType of ns.userTypes) {\n if (userType.def.type !== 'query' && userType.def.type !== 'procedure') {\n continue\n }\n const isGetReq = userType.def.type === 'query'\n const moduleName = toTitleCase(userType.nsid)\n const name = toCamelCase(NSID.parse(userType.nsid).name || '')\n const method = cls.addMethod({\n name,\n returnType: `Promise<${moduleName}.Response>`,\n })\n if (isGetReq) {\n method.addParameter({\n name: 'params?',\n type: `${moduleName}.QueryParams`,\n })\n } else if (userType.def.type === 'procedure') {\n method.addParameter({\n name: 'data?',\n type: `${moduleName}.InputSchema`,\n })\n }\n method.addParameter({\n name: 'opts?',\n type: `${moduleName}.CallOptions`,\n })\n method.setBodyText(\n [\n `return this._client`,\n isGetReq\n ? `.call('${userType.nsid}', params, undefined, opts)`\n : `.call('${userType.nsid}', opts?.qp, data, opts)`,\n userType.def.errors?.length\n ? // Only add a catch block if there are custom errors\n ` .catch((e) => { throw ${moduleName}.toKnownErr(e) })`\n : '',\n ].join('\\n'),\n )\n }\n\n // record api classes\n for (const userType of ns.userTypes) {\n if (userType.def.type !== 'record') {\n continue\n }\n genRecordCls(file, userType.nsid, userType.def)\n }\n}\n\nfunction genRecordCls(file: SourceFile, nsid: string, lexRecord: LexRecord) {\n //= export class {type}Record {...}\n const cls = file.addClass({\n name: `${toTitleCase(nsid)}Record`,\n isExported: true,\n })\n //= _client: XrpcClient\n cls.addProperty({\n name: '_client',\n type: 'XrpcClient',\n })\n\n //= constructor(client: XrpcClient) {\n //= this._client = client\n //= }\n const cons = cls.addConstructor()\n cons.addParameter({\n name: 'client',\n type: 'XrpcClient',\n })\n cons.setBodyText(`this._client = client`)\n\n // methods\n const typeModule = toTitleCase(nsid)\n {\n //= list()\n const method = cls.addMethod({\n isAsync: true,\n name: 'list',\n returnType: `Promise<{cursor?: string, records: ({uri: string, value: ${typeModule}.Record})[]}>`,\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(ATP_METHODS.list)}.QueryParams, \"collection\">`,\n })\n method.setBodyText(\n [\n `const res = await this._client.call('${ATP_METHODS.list}', { collection: '${nsid}', ...params })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= get()\n const method = cls.addMethod({\n isAsync: true,\n name: 'get',\n returnType: `Promise<{uri: string, cid: string, value: ${typeModule}.Record}>`,\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(ATP_METHODS.get)}.QueryParams, \"collection\">`,\n })\n method.setBodyText(\n [\n `const res = await this._client.call('${ATP_METHODS.get}', { collection: '${nsid}', ...params })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= create()\n const method = cls.addMethod({\n isAsync: true,\n name: 'create',\n returnType: 'Promise<{uri: string, cid: string}>',\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(\n ATP_METHODS.create,\n )}.InputSchema, \"collection\" | \"record\">`,\n })\n method.addParameter({\n name: 'record',\n type: `Un$Typed<${typeModule}.Record>`,\n })\n method.addParameter({\n name: 'headers?',\n type: `Record<string, string>`,\n })\n const maybeRkeyPart = lexRecord.key?.startsWith('literal:')\n ? `rkey: '${lexRecord.key.replace('literal:', '')}', `\n : ''\n method.setBodyText(\n [\n `const collection = '${nsid}'`,\n `const res = await this._client.call('${ATP_METHODS.create}', undefined, { collection, ${maybeRkeyPart}...params, record: { ...record, $type: collection } }, { encoding: 'application/json', headers })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= put()\n const method = cls.addMethod({\n isAsync: true,\n name: 'put',\n returnType: 'Promise<{uri: string, cid: string}>',\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(ATP_METHODS.put)}.InputSchema, \"collection\" | \"record\">`,\n })\n method.addParameter({\n name: 'record',\n type: `Un$Typed<${typeModule}.Record>`,\n })\n method.addParameter({\n name: 'headers?',\n type: `Record<string, string>`,\n })\n method.setBodyText(\n [\n `const collection = '${nsid}'`,\n `const res = await this._client.call('${ATP_METHODS.put}', undefined, { collection, ...params, record: { ...record, $type: collection } }, { encoding: 'application/json', headers })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= delete()\n const method = cls.addMethod({\n isAsync: true,\n name: 'delete',\n returnType: 'Promise<void>',\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(\n ATP_METHODS.delete,\n )}.InputSchema, \"collection\">`,\n })\n method.addParameter({\n name: 'headers?',\n type: `Record<string, string>`,\n })\n\n method.setBodyText(\n [\n `await this._client.call('${ATP_METHODS.delete}', undefined, { collection: '${nsid}', ...params }, { headers })`,\n ].join('\\n'),\n )\n }\n}\n\nconst lexiconTs = (project, lexicons: Lexicons, lexiconDoc: LexiconDoc) =>\n gen(\n project,\n `/types/${lexiconDoc.id.split('.').join('/')}.ts`,\n async (file) => {\n const main = lexiconDoc.defs.main\n if (\n main?.type === 'query' ||\n main?.type === 'subscription' ||\n main?.type === 'procedure'\n ) {\n //= import {HeadersMap, XRPCError} from '@atproto/xrpc'\n const xrpcImport = file.addImportDeclaration({\n moduleSpecifier: '@atproto/xrpc',\n })\n xrpcImport.addNamedImports([\n { name: 'HeadersMap' },\n { name: 'XRPCError' },\n ])\n }\n\n genCommonImports(file, lexiconDoc.id)\n\n const imports: Set<string> = new Set()\n for (const defId in lexiconDoc.defs) {\n const def = lexiconDoc.defs[defId]\n const lexUri = `${lexiconDoc.id}#${defId}`\n if (defId === 'main') {\n if (def.type === 'query' || def.type === 'procedure') {\n genXrpcParams(file, lexicons, lexUri, false)\n genXrpcInput(file, imports, lexicons, lexUri, false)\n genXrpcOutput(file, imports, lexicons, lexUri)\n genClientXrpcCommon(file, lexicons, lexUri)\n } else if (def.type === 'subscription') {\n continue\n } else if (def.type === 'record') {\n genRecord(file, imports, lexicons, lexUri)\n } else {\n genUserType(file, imports, lexicons, lexUri)\n }\n } else {\n genUserType(file, imports, lexicons, lexUri)\n }\n }\n genImports(file, imports, lexiconDoc.id)\n },\n )\n\nfunction genClientXrpcCommon(\n file: SourceFile,\n lexicons: Lexicons,\n lexUri: string,\n) {\n const def = lexicons.getDefOrThrow(lexUri, ['query', 'procedure'])\n\n //= export interface CallOptions {...}\n const opts = file.addInterface({\n name: 'CallOptions',\n isExported: true,\n })\n opts.addProperty({ name: 'signal?', type: 'AbortSignal' })\n opts.addProperty({ name: 'headers?', type: 'HeadersMap' })\n if (def.type === 'procedure') {\n opts.addProperty({ name: 'qp?', type: 'QueryParams' })\n }\n if (def.type === 'procedure' && def.input) {\n let encodingType = 'string'\n if (def.input.encoding !== '*/*') {\n encodingType = def.input.encoding\n .split(',')\n .map((v) => `'${v.trim()}'`)\n .join(' | ')\n }\n opts.addProperty({\n name: 'encoding?',\n type: encodingType,\n })\n }\n\n // export interface Response {...}\n const res = file.addInterface({\n name: 'Response',\n isExported: true,\n })\n res.addProperty({ name: 'success', type: 'boolean' })\n res.addProperty({ name: 'headers', type: 'HeadersMap' })\n if (def.output?.schema) {\n if (def.output.encoding?.includes(',')) {\n res.addProperty({ name: 'data', type: 'OutputSchema | Uint8Array' })\n } else {\n res.addProperty({ name: 'data', type: 'OutputSchema' })\n }\n } else if (def.output?.encoding) {\n res.addProperty({ name: 'data', type: 'Uint8Array' })\n }\n\n // export class {errcode}Error {...}\n const customErrors: { name: string; cls: string }[] = []\n for (const error of def.errors || []) {\n let name = toTitleCase(error.name)\n if (!name.endsWith('Error')) name += 'Error'\n const errCls = file.addClass({\n name,\n extends: 'XRPCError',\n isExported: true,\n })\n errCls.addConstructor({\n parameters: [{ name: 'src', type: 'XRPCError' }],\n statements: [\n 'super(src.status, src.error, src.message, src.headers, { cause: src })',\n ],\n })\n\n customErrors.push({ name: error.name, cls: name })\n }\n\n // export function toKnownErr(err: any) {...}\n file.addFunction({\n name: 'toKnownErr',\n isExported: true,\n parameters: [{ name: 'e', type: 'any' }],\n statements: customErrors.length\n ? [\n 'if (e instanceof XRPCError) {',\n ...customErrors.map(\n (err) => `if (e.error === '${err.name}') return new ${err.cls}(e)`,\n ),\n '}',\n 'return e',\n ]\n : ['return e'],\n })\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/codegen/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n IndentationText,\n Project,\n SourceFile,\n VariableDeclarationKind,\n} from 'ts-morph'\nimport { type LexRecord, type LexiconDoc, Lexicons } from '@atproto/lexicon'\nimport { NSID } from '@atproto/syntax'\nimport { type GeneratedAPI } from '../types.js'\nimport { gen, lexiconsTs, utilTs } from './common.js'\nimport {\n genCommonImports,\n genImports,\n genRecord,\n genUserType,\n genXrpcInput,\n genXrpcOutput,\n genXrpcParams,\n} from './lex-gen.js'\nimport {\n type DefTreeNode,\n lexiconsToDefTree,\n schemasToNsidTokens,\n toCamelCase,\n toScreamingSnakeCase,\n toTitleCase,\n} from './util.js'\n\nconst ATP_METHODS = {\n list: 'com.atproto.repo.listRecords',\n get: 'com.atproto.repo.getRecord',\n create: 'com.atproto.repo.createRecord',\n put: 'com.atproto.repo.putRecord',\n delete: 'com.atproto.repo.deleteRecord',\n}\n\nexport async function genClientApi(\n lexiconDocs: LexiconDoc[],\n): Promise<GeneratedAPI> {\n const project = new Project({\n useInMemoryFileSystem: true,\n manipulationSettings: { indentationText: IndentationText.TwoSpaces },\n })\n const api: GeneratedAPI = { files: [] }\n const lexicons = new Lexicons(lexiconDocs)\n const nsidTree = lexiconsToDefTree(lexiconDocs)\n const nsidTokens = schemasToNsidTokens(lexiconDocs)\n for (const lexiconDoc of lexiconDocs) {\n api.files.push(await lexiconTs(project, lexicons, lexiconDoc))\n }\n api.files.push(await utilTs(project))\n api.files.push(await lexiconsTs(project, lexiconDocs))\n api.files.push(await indexTs(project, lexiconDocs, nsidTree, nsidTokens))\n return api\n}\n\nconst indexTs = (\n project: Project,\n lexiconDocs: LexiconDoc[],\n nsidTree: DefTreeNode[],\n nsidTokens: Record<string, string[]>,\n) =>\n gen(project, '/index.ts', async (file) => {\n //= import { XrpcClient, type FetchHandler, type FetchHandlerOptions } from '@atproto/xrpc'\n const xrpcImport = file.addImportDeclaration({\n moduleSpecifier: '@atproto/xrpc',\n })\n xrpcImport.addNamedImports([\n { name: 'XrpcClient' },\n { name: 'FetchHandler', isTypeOnly: true },\n { name: 'FetchHandlerOptions', isTypeOnly: true },\n ])\n //= import {schemas} from './lexicons.js'\n file\n .addImportDeclaration({ moduleSpecifier: './lexicons.js' })\n .addNamedImports([{ name: 'schemas' }])\n //= import {CID} from 'multiformats/cid'\n file\n .addImportDeclaration({\n moduleSpecifier: 'multiformats/cid',\n })\n .addNamedImports([{ name: 'CID' }])\n\n //= import { type OmitKey, type Un$Typed } from './util.js'\n file\n .addImportDeclaration({ moduleSpecifier: `./util.js` })\n .addNamedImports([\n { name: 'OmitKey', isTypeOnly: true },\n { name: 'Un$Typed', isTypeOnly: true },\n ])\n\n // generate type imports and re-exports\n for (const lexicon of lexiconDocs) {\n const moduleSpecifier = `./types/${lexicon.id.split('.').join('/')}.js`\n file\n .addImportDeclaration({ moduleSpecifier })\n .setNamespaceImport(toTitleCase(lexicon.id))\n file\n .addExportDeclaration({ moduleSpecifier })\n .setNamespaceExport(toTitleCase(lexicon.id))\n }\n\n // generate token enums\n for (const nsidAuthority in nsidTokens) {\n // export const {THE_AUTHORITY} = {\n // {Name}: \"{authority.the.name}\"\n // }\n file.addVariableStatement({\n isExported: true,\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: toScreamingSnakeCase(nsidAuthority),\n initializer: [\n '{',\n ...nsidTokens[nsidAuthority].map(\n (nsidName) =>\n `${toTitleCase(nsidName)}: \"${nsidAuthority}.${nsidName}\",`,\n ),\n '}',\n ].join('\\n'),\n },\n ],\n })\n }\n\n //= export class AtpBaseClient {...}\n const clientCls = file.addClass({\n name: 'AtpBaseClient',\n isExported: true,\n extends: 'XrpcClient',\n })\n\n for (const ns of nsidTree) {\n //= ns: NS\n clientCls.addProperty({\n name: ns.propName,\n type: ns.className,\n })\n }\n\n //= constructor (options: FetchHandler | FetchHandlerOptions) {\n //= super(options, schemas)\n //= {namespace declarations}\n //= }\n clientCls.addConstructor({\n parameters: [\n { name: 'options', type: 'FetchHandler | FetchHandlerOptions' },\n ],\n statements: [\n 'super(options, schemas)',\n ...nsidTree.map(\n (ns) => `this.${ns.propName} = new ${ns.className}(this)`,\n ),\n ],\n })\n\n //= /** @deprecated use `this` instead */\n //= get xrpc(): XrpcClient {\n //= return this\n //= }\n clientCls\n .addGetAccessor({\n name: 'xrpc',\n returnType: 'XrpcClient',\n statements: ['return this'],\n })\n .addJsDoc('@deprecated use `this` instead')\n\n // generate classes for the schemas\n for (const ns of nsidTree) {\n genNamespaceCls(file, ns)\n }\n })\n\nfunction genNamespaceCls(file: SourceFile, ns: DefTreeNode) {\n //= export class {ns}NS {...}\n const cls = file.addClass({\n name: ns.className,\n isExported: true,\n })\n //= _client: XrpcClient\n cls.addProperty({\n name: '_client',\n type: 'XrpcClient',\n })\n\n for (const userType of ns.userTypes) {\n if (userType.def.type !== 'record') {\n continue\n }\n //= type: TypeRecord\n const name = NSID.parse(userType.nsid).name || ''\n cls.addProperty({\n name: toCamelCase(name),\n type: `${toTitleCase(userType.nsid)}Record`,\n })\n }\n\n for (const child of ns.children) {\n //= child: ChildNS\n cls.addProperty({\n name: child.propName,\n type: child.className,\n })\n\n // recurse\n genNamespaceCls(file, child)\n }\n\n //= constructor(public client: XrpcClient) {\n //= this._client = client\n //= {child namespace prop declarations}\n //= {record prop declarations}\n //= }\n cls.addConstructor({\n parameters: [\n {\n name: 'client',\n type: 'XrpcClient',\n },\n ],\n statements: [\n `this._client = client`,\n ...ns.children.map(\n (ns) => `this.${ns.propName} = new ${ns.className}(client)`,\n ),\n ...ns.userTypes\n .filter((ut) => ut.def.type === 'record')\n .map((ut) => {\n const name = NSID.parse(ut.nsid).name || ''\n return `this.${toCamelCase(name)} = new ${toTitleCase(\n ut.nsid,\n )}Record(client)`\n }),\n ],\n })\n\n // methods\n for (const userType of ns.userTypes) {\n if (userType.def.type !== 'query' && userType.def.type !== 'procedure') {\n continue\n }\n const isGetReq = userType.def.type === 'query'\n const moduleName = toTitleCase(userType.nsid)\n const name = toCamelCase(NSID.parse(userType.nsid).name || '')\n const method = cls.addMethod({\n name,\n returnType: `Promise<${moduleName}.Response>`,\n })\n if (isGetReq) {\n method.addParameter({\n name: 'params?',\n type: `${moduleName}.QueryParams`,\n })\n } else if (userType.def.type === 'procedure') {\n method.addParameter({\n name: 'data?',\n type: `${moduleName}.InputSchema`,\n })\n }\n method.addParameter({\n name: 'opts?',\n type: `${moduleName}.CallOptions`,\n })\n method.setBodyText(\n [\n `return this._client`,\n isGetReq\n ? `.call('${userType.nsid}', params, undefined, opts)`\n : `.call('${userType.nsid}', opts?.qp, data, opts)`,\n userType.def.errors?.length\n ? // Only add a catch block if there are custom errors\n ` .catch((e) => { throw ${moduleName}.toKnownErr(e) })`\n : '',\n ].join('\\n'),\n )\n }\n\n // record api classes\n for (const userType of ns.userTypes) {\n if (userType.def.type !== 'record') {\n continue\n }\n genRecordCls(file, userType.nsid, userType.def)\n }\n}\n\nfunction genRecordCls(file: SourceFile, nsid: string, lexRecord: LexRecord) {\n //= export class {type}Record {...}\n const cls = file.addClass({\n name: `${toTitleCase(nsid)}Record`,\n isExported: true,\n })\n //= _client: XrpcClient\n cls.addProperty({\n name: '_client',\n type: 'XrpcClient',\n })\n\n //= constructor(client: XrpcClient) {\n //= this._client = client\n //= }\n const cons = cls.addConstructor()\n cons.addParameter({\n name: 'client',\n type: 'XrpcClient',\n })\n cons.setBodyText(`this._client = client`)\n\n // methods\n const typeModule = toTitleCase(nsid)\n {\n //= list()\n const method = cls.addMethod({\n isAsync: true,\n name: 'list',\n returnType: `Promise<{cursor?: string, records: ({uri: string, value: ${typeModule}.Record})[]}>`,\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(ATP_METHODS.list)}.QueryParams, \"collection\">`,\n })\n method.setBodyText(\n [\n `const res = await this._client.call('${ATP_METHODS.list}', { collection: '${nsid}', ...params })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= get()\n const method = cls.addMethod({\n isAsync: true,\n name: 'get',\n returnType: `Promise<{uri: string, cid: string, value: ${typeModule}.Record}>`,\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(ATP_METHODS.get)}.QueryParams, \"collection\">`,\n })\n method.setBodyText(\n [\n `const res = await this._client.call('${ATP_METHODS.get}', { collection: '${nsid}', ...params })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= create()\n const method = cls.addMethod({\n isAsync: true,\n name: 'create',\n returnType: 'Promise<{uri: string, cid: string}>',\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(\n ATP_METHODS.create,\n )}.InputSchema, \"collection\" | \"record\">`,\n })\n method.addParameter({\n name: 'record',\n type: `Un$Typed<${typeModule}.Record>`,\n })\n method.addParameter({\n name: 'headers?',\n type: `Record<string, string>`,\n })\n const maybeRkeyPart = lexRecord.key?.startsWith('literal:')\n ? `rkey: '${lexRecord.key.replace('literal:', '')}', `\n : ''\n method.setBodyText(\n [\n `const collection = '${nsid}'`,\n `const res = await this._client.call('${ATP_METHODS.create}', undefined, { collection, ${maybeRkeyPart}...params, record: { ...record, $type: collection } }, { encoding: 'application/json', headers })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= put()\n const method = cls.addMethod({\n isAsync: true,\n name: 'put',\n returnType: 'Promise<{uri: string, cid: string}>',\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(ATP_METHODS.put)}.InputSchema, \"collection\" | \"record\">`,\n })\n method.addParameter({\n name: 'record',\n type: `Un$Typed<${typeModule}.Record>`,\n })\n method.addParameter({\n name: 'headers?',\n type: `Record<string, string>`,\n })\n method.setBodyText(\n [\n `const collection = '${nsid}'`,\n `const res = await this._client.call('${ATP_METHODS.put}', undefined, { collection, ...params, record: { ...record, $type: collection } }, { encoding: 'application/json', headers })`,\n `return res.data`,\n ].join('\\n'),\n )\n }\n {\n //= delete()\n const method = cls.addMethod({\n isAsync: true,\n name: 'delete',\n returnType: 'Promise<void>',\n })\n method.addParameter({\n name: 'params',\n type: `OmitKey<${toTitleCase(\n ATP_METHODS.delete,\n )}.InputSchema, \"collection\">`,\n })\n method.addParameter({\n name: 'headers?',\n type: `Record<string, string>`,\n })\n\n method.setBodyText(\n [\n `await this._client.call('${ATP_METHODS.delete}', undefined, { collection: '${nsid}', ...params }, { headers })`,\n ].join('\\n'),\n )\n }\n}\n\nconst lexiconTs = (project, lexicons: Lexicons, lexiconDoc: LexiconDoc) =>\n gen(\n project,\n `/types/${lexiconDoc.id.split('.').join('/')}.ts`,\n async (file) => {\n const main = lexiconDoc.defs.main\n if (\n main?.type === 'query' ||\n main?.type === 'subscription' ||\n main?.type === 'procedure'\n ) {\n //= import {HeadersMap, XRPCError} from '@atproto/xrpc'\n const xrpcImport = file.addImportDeclaration({\n moduleSpecifier: '@atproto/xrpc',\n })\n xrpcImport.addNamedImports([\n { name: 'HeadersMap' },\n { name: 'XRPCError' },\n ])\n }\n\n genCommonImports(file, lexiconDoc.id)\n\n const imports: Set<string> = new Set()\n for (const defId in lexiconDoc.defs) {\n const def = lexiconDoc.defs[defId]\n const lexUri = `${lexiconDoc.id}#${defId}`\n if (defId === 'main') {\n if (def.type === 'query' || def.type === 'procedure') {\n genXrpcParams(file, lexicons, lexUri, false)\n genXrpcInput(file, imports, lexicons, lexUri, false)\n genXrpcOutput(file, imports, lexicons, lexUri)\n genClientXrpcCommon(file, lexicons, lexUri)\n } else if (def.type === 'subscription') {\n continue\n } else if (def.type === 'record') {\n genRecord(file, imports, lexicons, lexUri)\n } else {\n genUserType(file, imports, lexicons, lexUri)\n }\n } else {\n genUserType(file, imports, lexicons, lexUri)\n }\n }\n genImports(file, imports, lexiconDoc.id)\n },\n )\n\nfunction genClientXrpcCommon(\n file: SourceFile,\n lexicons: Lexicons,\n lexUri: string,\n) {\n const def = lexicons.getDefOrThrow(lexUri, ['query', 'procedure'])\n\n //= export interface CallOptions {...}\n const opts = file.addInterface({\n name: 'CallOptions',\n isExported: true,\n })\n opts.addProperty({ name: 'signal?', type: 'AbortSignal' })\n opts.addProperty({ name: 'headers?', type: 'HeadersMap' })\n if (def.type === 'procedure') {\n opts.addProperty({ name: 'qp?', type: 'QueryParams' })\n }\n if (def.type === 'procedure' && def.input) {\n let encodingType = 'string'\n if (def.input.encoding !== '*/*') {\n encodingType = def.input.encoding\n .split(',')\n .map((v) => `'${v.trim()}'`)\n .join(' | ')\n }\n opts.addProperty({\n name: 'encoding?',\n type: encodingType,\n })\n }\n\n // export interface Response {...}\n const res = file.addInterface({\n name: 'Response',\n isExported: true,\n })\n res.addProperty({ name: 'success', type: 'boolean' })\n res.addProperty({ name: 'headers', type: 'HeadersMap' })\n if (def.output?.schema) {\n if (def.output.encoding?.includes(',')) {\n res.addProperty({ name: 'data', type: 'OutputSchema | Uint8Array' })\n } else {\n res.addProperty({ name: 'data', type: 'OutputSchema' })\n }\n } else if (def.output?.encoding) {\n res.addProperty({ name: 'data', type: 'Uint8Array' })\n }\n\n // export class {errcode}Error {...}\n const customErrors: { name: string; cls: string }[] = []\n for (const error of def.errors || []) {\n let name = toTitleCase(error.name)\n if (!name.endsWith('Error')) name += 'Error'\n const errCls = file.addClass({\n name,\n extends: 'XRPCError',\n isExported: true,\n })\n errCls.addConstructor({\n parameters: [{ name: 'src', type: 'XRPCError' }],\n statements: [\n 'super(src.status, src.error, src.message, src.headers, { cause: src })',\n ],\n })\n\n customErrors.push({ name: error.name, cls: name })\n }\n\n // export function toKnownErr(err: any) {...}\n file.addFunction({\n name: 'toKnownErr',\n isExported: true,\n parameters: [{ name: 'e', type: 'any' }],\n statements: customErrors.length\n ? [\n 'if (e instanceof XRPCError) {',\n ...customErrors.map(\n (err) => `if (e.error === '${err.name}') return new ${err.cls}(e)`,\n ),\n '}',\n 'return e',\n ]\n : ['return e'],\n })\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Project, SourceFile } from 'ts-morph';
2
2
  import { type LexiconDoc } from '@atproto/lexicon';
3
- import { type GeneratedFile } from '../types';
3
+ import { type GeneratedFile } from '../types.js';
4
4
  export declare const utilTs: (project: any) => Promise<GeneratedFile>;
5
5
  export declare const lexiconsTs: (project: any, lexicons: LexiconDoc[]) => Promise<GeneratedFile>;
6
6
  export declare function gen(project: Project, path: string, gen: (file: SourceFile) => Promise<void>): Promise<GeneratedFile>;
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/codegen/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAA;AACvE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAW7C,eAAO,MAAM,MAAM,GAAI,YAAO,2BAuH1B,CAAA;AAEJ,eAAO,MAAM,UAAU,GAAI,YAAO,EAAE,UAAU,UAAU,EAAE,2BA8HtD,CAAA;AAEJ,wBAAsB,GAAG,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GACvC,OAAO,CAAC,aAAa,CAAC,CAQxB"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/codegen/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAA;AACvE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAWhD,eAAO,MAAM,MAAM,GAAI,YAAO,2BAuH1B,CAAA;AAEJ,eAAO,MAAM,UAAU,GAAI,YAAO,EAAE,UAAU,UAAU,EAAE,2BA8HtD,CAAA;AAEJ,wBAAsB,GAAG,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GACvC,OAAO,CAAC,aAAa,CAAC,CAQxB"}
@@ -1,10 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.lexiconsTs = exports.utilTs = void 0;
4
- exports.gen = gen;
5
- const prettier_1 = require("prettier");
6
- const ts_morph_1 = require("ts-morph");
7
- const util_1 = require("./util");
1
+ import { format } from 'prettier';
2
+ import { VariableDeclarationKind } from 'ts-morph';
3
+ import { toTitleCase } from './util.js';
8
4
  const PRETTIER_OPTS = {
9
5
  parser: 'typescript',
10
6
  tabWidth: 2,
@@ -12,7 +8,7 @@ const PRETTIER_OPTS = {
12
8
  singleQuote: true,
13
9
  trailingComma: 'all',
14
10
  };
15
- const utilTs = (project) => gen(project, '/util.ts', async (file) => {
11
+ export const utilTs = (project) => gen(project, '/util.ts', async (file) => {
16
12
  file.replaceWithText(`
17
13
  import { type ValidationResult } from '@atproto/lexicon'
18
14
 
@@ -130,8 +126,7 @@ export function asPredicate<V extends Validator>(validate: V) {
130
126
  }
131
127
  `);
132
128
  });
133
- exports.utilTs = utilTs;
134
- const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (file) => {
129
+ export const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (file) => {
135
130
  //= import { type LexiconDoc, Lexicons } from '@atproto/lexicon'
136
131
  file
137
132
  .addImportDeclaration({
@@ -143,7 +138,7 @@ const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (fi
143
138
  { name: 'ValidationError' },
144
139
  { name: 'ValidationResult', isTypeOnly: true },
145
140
  ]);
146
- //= import { is$typed, maybe$typed, type $Typed } from './util'
141
+ //= import { is$typed, maybe$typed, type $Typed } from './util.js'
147
142
  file
148
143
  .addImportDeclaration({
149
144
  moduleSpecifier: './util.js',
@@ -156,13 +151,13 @@ const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (fi
156
151
  //= export const schemaDict = {...} as const satisfies Record<string, LexiconDoc>
157
152
  file.addVariableStatement({
158
153
  isExported: true,
159
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
154
+ declarationKind: VariableDeclarationKind.Const,
160
155
  declarations: [
161
156
  {
162
157
  name: 'schemaDict',
163
158
  initializer: JSON.stringify(lexicons.reduce((acc, cur) => ({
164
159
  ...acc,
165
- [(0, util_1.toTitleCase)(cur.id)]: cur,
160
+ [toTitleCase(cur.id)]: cur,
166
161
  }), {}), null, 2) + ' as const satisfies Record<string, LexiconDoc>',
167
162
  },
168
163
  ],
@@ -170,7 +165,7 @@ const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (fi
170
165
  //= export const schemas = Object.values(schemaDict) satisfies LexiconDoc[]
171
166
  file.addVariableStatement({
172
167
  isExported: true,
173
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
168
+ declarationKind: VariableDeclarationKind.Const,
174
169
  declarations: [
175
170
  {
176
171
  name: 'schemas',
@@ -181,7 +176,7 @@ const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (fi
181
176
  //= export const lexicons: Lexicons = new Lexicons(schemas)
182
177
  file.addVariableStatement({
183
178
  isExported: true,
184
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
179
+ declarationKind: VariableDeclarationKind.Const,
185
180
  declarations: [
186
181
  {
187
182
  name: 'lexicons',
@@ -230,24 +225,23 @@ const lexiconsTs = (project, lexicons) => gen(project, '/lexicons.ts', async (fi
230
225
  //= export const ids = {...}
231
226
  file.addVariableStatement({
232
227
  isExported: true,
233
- declarationKind: ts_morph_1.VariableDeclarationKind.Const,
228
+ declarationKind: VariableDeclarationKind.Const,
234
229
  declarations: [
235
230
  {
236
231
  name: 'ids',
237
232
  initializer: `{${lexicons
238
- .map((lex) => `\n ${(0, util_1.toTitleCase)(lex.id)}: ${JSON.stringify(lex.id)},`)
233
+ .map((lex) => `\n ${toTitleCase(lex.id)}: ${JSON.stringify(lex.id)},`)
239
234
  .join('')}\n} as const`,
240
235
  },
241
236
  ],
242
237
  });
243
238
  });
244
- exports.lexiconsTs = lexiconsTs;
245
- async function gen(project, path, gen) {
239
+ export async function gen(project, path, gen) {
246
240
  const file = project.createSourceFile(path);
247
241
  await gen(file);
248
242
  await file.save(); // Save in the "in memory" file system
249
243
  const src = `${banner()}${file.getFullText()}`;
250
- const content = await (0, prettier_1.format)(src, PRETTIER_OPTS);
244
+ const content = await format(src, PRETTIER_OPTS);
251
245
  return { path, content };
252
246
  }
253
247
  function banner() {