@atcute/lex-cli 2.4.0 → 2.5.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.
Files changed (57) hide show
  1. package/README.md +40 -8
  2. package/dist/cli.js +10 -168
  3. package/dist/cli.js.map +1 -1
  4. package/dist/codegen.d.ts.map +1 -1
  5. package/dist/codegen.js +76 -78
  6. package/dist/codegen.js.map +1 -1
  7. package/dist/commands/export.d.ts +13 -0
  8. package/dist/commands/export.d.ts.map +1 -0
  9. package/dist/commands/export.js +76 -0
  10. package/dist/commands/export.js.map +1 -0
  11. package/dist/commands/generate.d.ts +13 -0
  12. package/dist/commands/generate.d.ts.map +1 -0
  13. package/dist/commands/generate.js +136 -0
  14. package/dist/commands/generate.js.map +1 -0
  15. package/dist/commands/pull.d.ts +13 -0
  16. package/dist/commands/pull.d.ts.map +1 -0
  17. package/dist/{pull.js → commands/pull.js} +35 -81
  18. package/dist/commands/pull.js.map +1 -0
  19. package/dist/config.d.ts +68 -6
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +54 -3
  22. package/dist/config.js.map +1 -1
  23. package/dist/lexicon-loader.d.ts +17 -0
  24. package/dist/lexicon-loader.d.ts.map +1 -0
  25. package/dist/lexicon-loader.js +167 -0
  26. package/dist/lexicon-loader.js.map +1 -0
  27. package/dist/pull-sources/atproto.d.ts +9 -0
  28. package/dist/pull-sources/atproto.d.ts.map +1 -0
  29. package/dist/pull-sources/atproto.js +192 -0
  30. package/dist/pull-sources/atproto.js.map +1 -0
  31. package/dist/pull-sources/git.d.ts +11 -0
  32. package/dist/pull-sources/git.d.ts.map +1 -0
  33. package/dist/pull-sources/git.js +80 -0
  34. package/dist/pull-sources/git.js.map +1 -0
  35. package/dist/pull-sources/types.d.ts +16 -0
  36. package/dist/pull-sources/types.d.ts.map +1 -0
  37. package/dist/pull-sources/types.js +2 -0
  38. package/dist/pull-sources/types.js.map +1 -0
  39. package/dist/shared-options.d.ts +6 -0
  40. package/dist/shared-options.d.ts.map +1 -0
  41. package/dist/shared-options.js +11 -0
  42. package/dist/shared-options.js.map +1 -0
  43. package/package.json +10 -7
  44. package/src/cli.ts +9 -210
  45. package/src/codegen.ts +90 -88
  46. package/src/commands/export.ts +106 -0
  47. package/src/commands/generate.ts +170 -0
  48. package/src/{pull.ts → commands/pull.ts} +49 -116
  49. package/src/config.ts +67 -4
  50. package/src/lexicon-loader.ts +199 -0
  51. package/src/pull-sources/atproto.ts +243 -0
  52. package/src/pull-sources/git.ts +103 -0
  53. package/src/pull-sources/types.ts +18 -0
  54. package/src/shared-options.ts +13 -0
  55. package/dist/pull.d.ts +0 -7
  56. package/dist/pull.d.ts.map +0 -1
  57. package/dist/pull.js.map +0 -1
package/dist/config.d.ts CHANGED
@@ -6,25 +6,73 @@ declare const gitSourceConfigSchema: v.ObjectType<{
6
6
  ref: v.Optional<string>;
7
7
  pattern: v.Type<string[]>;
8
8
  }, undefined>;
9
+ declare const atprotoNsidsSourceConfigSchema: v.ObjectType<{
10
+ type: v.Type<"atproto">;
11
+ mode: v.Type<"nsids">;
12
+ nsids: v.Type<`${string}.${string}.${string}`[]>;
13
+ }, undefined>;
14
+ declare const atprotoAuthoritySourceConfigSchema: v.ObjectType<{
15
+ type: v.Type<"atproto">;
16
+ mode: v.Type<"authority">;
17
+ authority: v.Type<`${string}.${string}` | `did:plc:${string}` | `did:web:${string}`>;
18
+ pattern: v.Optional<string[]>;
19
+ }, undefined>;
20
+ declare const atprotoSourceConfigSchema: v.UnionType<[v.ObjectType<{
21
+ type: v.Type<"atproto">;
22
+ mode: v.Type<"nsids">;
23
+ nsids: v.Type<`${string}.${string}.${string}`[]>;
24
+ }, undefined>, v.ObjectType<{
25
+ type: v.Type<"atproto">;
26
+ mode: v.Type<"authority">;
27
+ authority: v.Type<`${string}.${string}` | `did:plc:${string}` | `did:web:${string}`>;
28
+ pattern: v.Optional<string[]>;
29
+ }, undefined>]>;
9
30
  declare const sourceConfigSchema: v.UnionType<[v.ObjectType<{
10
31
  type: v.Type<"git">;
11
32
  remote: v.Type<string>;
12
33
  ref: v.Optional<string>;
13
34
  pattern: v.Type<string[]>;
14
- }, undefined>]>;
35
+ }, undefined>, v.UnionType<[v.ObjectType<{
36
+ type: v.Type<"atproto">;
37
+ mode: v.Type<"nsids">;
38
+ nsids: v.Type<`${string}.${string}.${string}`[]>;
39
+ }, undefined>, v.ObjectType<{
40
+ type: v.Type<"atproto">;
41
+ mode: v.Type<"authority">;
42
+ authority: v.Type<`${string}.${string}` | `did:plc:${string}` | `did:web:${string}`>;
43
+ pattern: v.Optional<string[]>;
44
+ }, undefined>]>]>;
15
45
  declare const pullConfigSchema: v.ObjectType<{
16
46
  outdir: v.Type<string>;
17
47
  clean: v.Optional<boolean>;
18
- sources: v.Type<{
48
+ sources: v.Type<({
49
+ type: "atproto";
50
+ mode: "nsids";
51
+ nsids: `${string}.${string}.${string}`[];
52
+ } | {
53
+ type: "atproto";
54
+ mode: "authority";
55
+ authority: `${string}.${string}` | `did:plc:${string}` | `did:web:${string}`;
56
+ pattern?: string[] | undefined;
57
+ } | {
19
58
  type: "git";
20
59
  remote: string;
21
60
  ref?: string | undefined;
22
61
  pattern: string[];
23
- }[]>;
62
+ })[]>;
63
+ }, undefined>;
64
+ declare const exportConfigSchema: v.ObjectType<{
65
+ outdir: v.Type<string>;
66
+ files: v.Optional<string[]>;
67
+ clean: v.Optional<boolean>;
24
68
  }, undefined>;
25
69
  export type GitSourceConfig = v.Infer<typeof gitSourceConfigSchema>;
70
+ export type AtprotoNsidsSourceConfig = v.Infer<typeof atprotoNsidsSourceConfigSchema>;
71
+ export type AtprotoAuthoritySourceConfig = v.Infer<typeof atprotoAuthoritySourceConfigSchema>;
72
+ export type AtprotoSourceConfig = v.Infer<typeof atprotoSourceConfigSchema>;
26
73
  export type SourceConfig = v.Infer<typeof sourceConfigSchema>;
27
74
  export type PullConfig = v.Infer<typeof pullConfigSchema>;
75
+ export type ExportConfig = v.Infer<typeof exportConfigSchema>;
28
76
  export declare const lexiconConfigSchema: v.ObjectType<{
29
77
  outdir: v.Type<string>;
30
78
  files: v.Type<string[]>;
@@ -36,18 +84,32 @@ export declare const lexiconConfigSchema: v.ObjectType<{
36
84
  pull: v.Optional<{
37
85
  outdir: string;
38
86
  clean?: boolean | undefined;
39
- sources: {
87
+ sources: ({
88
+ type: "atproto";
89
+ mode: "nsids";
90
+ nsids: `${string}.${string}.${string}`[];
91
+ } | {
92
+ type: "atproto";
93
+ mode: "authority";
94
+ authority: `${string}.${string}` | `did:plc:${string}` | `did:web:${string}`;
95
+ pattern?: string[] | undefined;
96
+ } | {
40
97
  type: "git";
41
98
  remote: string;
42
99
  ref?: string | undefined;
43
100
  pattern: string[];
44
- }[];
101
+ })[];
102
+ }>;
103
+ export: v.Optional<{
104
+ outdir: string;
105
+ files?: string[] | undefined;
106
+ clean?: boolean | undefined;
45
107
  }>;
46
108
  }, undefined>;
47
109
  export type LexiconConfig = v.Infer<typeof lexiconConfigSchema>;
48
110
  export interface NormalizedConfig extends LexiconConfig {
49
111
  root: string;
50
112
  }
51
- export declare const loadConfig: (configPath: string) => Promise<NormalizedConfig>;
113
+ export declare const loadConfig: (configPath?: string) => Promise<NormalizedConfig>;
52
114
  export {};
53
115
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAKpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,QAAA,MAAM,qBAAqB;;;;;aAUzB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;;eAAiC,CAAC;AAE1D,QAAA,MAAM,gBAAgB;;;;;;;;;aAMpB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAyC1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;aAiB9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,UAAU,GAAU,YAAY,MAAM,KAAG,OAAO,CAAC,gBAAgB,CA6B7E,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AAMpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,QAAA,MAAM,qBAAqB;;;;;aAUzB,CAAC;AAEH,QAAA,MAAM,8BAA8B;;;;aAMlC,CAAC;AAEH,QAAA,MAAM,kCAAkC;;;;;aAatC,CAAC;AAEH,QAAA,MAAM,yBAAyB;;;;;;;;;eAA8E,CAAC;AAE9G,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;iBAA4D,CAAC;AAErF,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;aAMpB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;aAItB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AACtF,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kCAAkC,CAAC,CAAC;AAC9F,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAyC9D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAkB9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,UAAU,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,gBAAgB,CAsD9E,CAAC"}
package/dist/config.js CHANGED
@@ -1,8 +1,10 @@
1
+ import * as fs from 'node:fs/promises';
1
2
  import * as path from 'node:path';
2
3
  import * as url from 'node:url';
3
4
  import * as v from '@badrap/valita';
4
5
  import pc from 'picocolors';
5
- import { isNsid } from '@atcute/lexicons/syntax';
6
+ import { isAtprotoDid } from '@atcute/identity';
7
+ import { isHandle, isNsid } from '@atcute/lexicons/syntax';
6
8
  const gitSourceConfigSchema = v.object({
7
9
  type: v.literal('git'),
8
10
  remote: v.string().assert((value) => value.length > 0, `must not be empty`),
@@ -14,7 +16,27 @@ const gitSourceConfigSchema = v.object({
14
16
  .array(v.string().assert((value) => value.length > 0, `must not be empty`))
15
17
  .assert((value) => value.length > 0, `must include at least one glob pattern`),
16
18
  });
17
- const sourceConfigSchema = v.union(gitSourceConfigSchema);
19
+ const atprotoNsidsSourceConfigSchema = v.object({
20
+ type: v.literal('atproto'),
21
+ mode: v.literal('nsids'),
22
+ nsids: v
23
+ .array(v.string().assert((value) => isNsid(value), `must be valid nsid`))
24
+ .assert((value) => value.length > 0, `must include at least one nsid`),
25
+ });
26
+ const atprotoAuthoritySourceConfigSchema = v.object({
27
+ type: v.literal('atproto'),
28
+ mode: v.literal('authority'),
29
+ authority: v
30
+ .string()
31
+ .assert((value) => isHandle(value) || isAtprotoDid(value), `must a valid at-identifier`),
32
+ pattern: v
33
+ .array(v
34
+ .string()
35
+ .assert((value) => isValidLexiconPattern(value), `must be valid nsid or pattern ending with .*`))
36
+ .optional(),
37
+ });
38
+ const atprotoSourceConfigSchema = v.union(atprotoNsidsSourceConfigSchema, atprotoAuthoritySourceConfigSchema);
39
+ const sourceConfigSchema = v.union(gitSourceConfigSchema, atprotoSourceConfigSchema);
18
40
  const pullConfigSchema = v.object({
19
41
  outdir: v.string().assert((value) => value.length > 0, `must not be empty`),
20
42
  clean: v.boolean().optional(),
@@ -22,6 +44,11 @@ const pullConfigSchema = v.object({
22
44
  .array(sourceConfigSchema)
23
45
  .assert((value) => value.length > 0, `must include at least one source`),
24
46
  });
47
+ const exportConfigSchema = v.object({
48
+ outdir: v.string().assert((value) => value.length > 0, `must not be empty`),
49
+ files: v.array(v.string().assert((value) => value.length > 0, `must not be empty`)).optional(),
50
+ clean: v.boolean().optional(),
51
+ });
25
52
  const isValidLexiconPattern = (pattern) => {
26
53
  if (pattern.endsWith('.*')) {
27
54
  return isNsid(`${pattern.slice(0, -2)}.x`);
@@ -68,9 +95,33 @@ export const lexiconConfigSchema = v.object({
68
95
  .partial()
69
96
  .optional(),
70
97
  pull: pullConfigSchema.optional(),
98
+ export: exportConfigSchema.optional(),
71
99
  });
72
100
  export const loadConfig = async (configPath) => {
73
- const configFilename = path.resolve(configPath);
101
+ let configFilename;
102
+ if (configPath) {
103
+ configFilename = path.resolve(configPath);
104
+ }
105
+ else {
106
+ // try to find lex.config.js or lex.config.ts in the current directory
107
+ const candidates = ['lex.config.js', 'lex.config.ts'];
108
+ for (const candidate of candidates) {
109
+ const candidatePath = path.resolve(candidate);
110
+ try {
111
+ await fs.access(candidatePath);
112
+ configFilename = candidatePath;
113
+ break;
114
+ }
115
+ catch {
116
+ // file doesn't exist, try next candidate
117
+ }
118
+ }
119
+ if (!configFilename) {
120
+ console.error(pc.bold(pc.red(`config file not found`)));
121
+ console.error(`looked for: ${candidates.join(', ')}`);
122
+ process.exit(1);
123
+ }
124
+ }
74
125
  const configDirname = path.dirname(configFilename);
75
126
  let rawConfig;
76
127
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type LexiconDoc } from '@atcute/lexicon-doc';
2
+ /**
3
+ * represents a loaded lexicon document with its source file
4
+ */
5
+ export interface LoadedLexicon {
6
+ nsid: string;
7
+ doc: LexiconDoc;
8
+ filename: string;
9
+ }
10
+ /**
11
+ * loads lexicon documents from glob patterns
12
+ * @param patterns glob patterns to match files
13
+ * @param root root directory for resolving paths
14
+ * @returns array of loaded lexicon documents
15
+ */
16
+ export declare const loadLexicons: (patterns: string[], root: string) => Promise<LoadedLexicon[]>;
17
+ //# sourceMappingURL=lexicon-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexicon-loader.d.ts","sourceRoot":"","sources":["../src/lexicon-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAQpF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACjB;AA0GD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAU,UAAU,MAAM,EAAE,EAAE,MAAM,MAAM,KAAG,OAAO,CAAC,aAAa,EAAE,CAmE5F,CAAC"}
@@ -0,0 +1,167 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import * as url from 'node:url';
4
+ import { lexiconDoc, refineLexiconDoc } from '@atcute/lexicon-doc';
5
+ import { build } from '@atcute/lexicon-doc/builder';
6
+ import pc from 'picocolors';
7
+ /** file extensions recognized as module files */
8
+ const MODULE_EXTENSIONS = new Set(['.js', '.cjs', '.mjs', '.ts', '.cts', '.mts']);
9
+ /**
10
+ * checks if a filename is a module file based on extension
11
+ * @param filename the filename to check
12
+ * @returns true if it's a module file
13
+ */
14
+ const isModuleFile = (filename) => {
15
+ const ext = path.extname(filename);
16
+ return MODULE_EXTENSIONS.has(ext);
17
+ };
18
+ /**
19
+ * basic validation that a value looks like a LexDocumentBuilder
20
+ * @param value the value to check
21
+ * @returns true if it appears to be a LexDocumentBuilder
22
+ */
23
+ const isLexDocumentBuilder = (value) => {
24
+ return (typeof value === 'object' &&
25
+ value !== null &&
26
+ 'id' in value &&
27
+ typeof value.id === 'string' &&
28
+ 'defs' in value &&
29
+ typeof value.defs === 'object');
30
+ };
31
+ /**
32
+ * loads and validates a lexicon document from a JSON file
33
+ * @param absolutePath absolute path to the JSON file
34
+ * @param relativePath relative path for error messages
35
+ * @returns parsed and validated lexicon document
36
+ */
37
+ const loadJsonFile = async (absolutePath, relativePath) => {
38
+ let source;
39
+ try {
40
+ source = await fs.readFile(absolutePath, 'utf8');
41
+ }
42
+ catch (err) {
43
+ console.error(pc.bold(pc.red(`file read error with "${relativePath}"`)));
44
+ console.error(err);
45
+ process.exit(1);
46
+ }
47
+ let json;
48
+ try {
49
+ json = JSON.parse(source);
50
+ }
51
+ catch (err) {
52
+ console.error(pc.bold(pc.red(`json parse error in "${relativePath}"`)));
53
+ console.error(err);
54
+ process.exit(1);
55
+ }
56
+ const result = lexiconDoc.try(json, { mode: 'strip' });
57
+ if (!result.ok) {
58
+ console.error(pc.bold(pc.red(`schema validation failed for "${relativePath}"`)));
59
+ console.error(result.message);
60
+ for (const issue of result.issues) {
61
+ console.log(`- ${issue.code} at .${issue.path.join('.')}`);
62
+ }
63
+ process.exit(1);
64
+ }
65
+ const issues = refineLexiconDoc(result.value, true);
66
+ if (issues.length > 0) {
67
+ console.error(pc.bold(pc.red(`lint validation failed for "${relativePath}"`)));
68
+ for (const issue of issues) {
69
+ console.log(`- ${issue.message} at .${issue.path.join('.')}`);
70
+ }
71
+ process.exit(1);
72
+ }
73
+ return result.value;
74
+ };
75
+ /**
76
+ * loads a LexDocumentBuilder from a module file
77
+ * @param absolutePath absolute path to the module file
78
+ * @param relativePath relative path for error messages
79
+ * @returns the LexDocumentBuilder from the module's default export
80
+ */
81
+ const loadModuleBuilder = async (absolutePath, relativePath) => {
82
+ let mod;
83
+ try {
84
+ const fileUrl = url.pathToFileURL(absolutePath);
85
+ mod = await import(fileUrl.href);
86
+ }
87
+ catch (err) {
88
+ console.error(pc.bold(pc.red(`failed to import module "${relativePath}"`)));
89
+ console.error(err);
90
+ process.exit(1);
91
+ }
92
+ const defaultExport = mod?.default;
93
+ if (!isLexDocumentBuilder(defaultExport)) {
94
+ console.error(pc.bold(pc.red(`module "${relativePath}" default export is not a valid LexDocumentBuilder`)));
95
+ console.error(`expected default export to be a LexDocumentBuilder (object with 'id' and 'defs')`);
96
+ process.exit(1);
97
+ }
98
+ return defaultExport;
99
+ };
100
+ /**
101
+ * loads lexicon documents from glob patterns
102
+ * @param patterns glob patterns to match files
103
+ * @param root root directory for resolving paths
104
+ * @returns array of loaded lexicon documents
105
+ */
106
+ export const loadLexicons = async (patterns, root) => {
107
+ const results = [];
108
+ const seen = new Map();
109
+ // collect JSON docs and module builders separately
110
+ const jsonDocs = [];
111
+ const moduleBuilders = [];
112
+ for await (const filename of fs.glob(patterns, { cwd: root })) {
113
+ const absolutePath = path.join(root, filename);
114
+ if (isModuleFile(filename)) {
115
+ const builder = await loadModuleBuilder(absolutePath, filename);
116
+ moduleBuilders.push({ builder, filename });
117
+ }
118
+ else {
119
+ // assume JSON for anything else (including .json)
120
+ const doc = await loadJsonFile(absolutePath, filename);
121
+ jsonDocs.push({ doc, filename });
122
+ }
123
+ }
124
+ // add JSON docs directly (already built)
125
+ for (const { doc, filename } of jsonDocs) {
126
+ const existing = seen.get(doc.id);
127
+ if (existing) {
128
+ console.error(pc.bold(pc.red(`duplicate lexicon "${doc.id}"`)));
129
+ console.error(`- found in ${filename}`);
130
+ console.error(`- already found in ${existing}`);
131
+ process.exit(1);
132
+ }
133
+ seen.set(doc.id, filename);
134
+ results.push({ nsid: doc.id, doc, filename });
135
+ }
136
+ // build all module builders together (for cross-references)
137
+ if (moduleBuilders.length > 0) {
138
+ // check for duplicates in builders
139
+ const buildersByNsid = new Map();
140
+ for (const { builder, filename } of moduleBuilders) {
141
+ const existing = buildersByNsid.get(builder.id) ?? seen.get(builder.id);
142
+ if (existing) {
143
+ console.error(pc.bold(pc.red(`duplicate lexicon "${builder.id}"`)));
144
+ console.error(`- found in ${filename}`);
145
+ console.error(`- already found in ${existing}`);
146
+ process.exit(1);
147
+ }
148
+ buildersByNsid.set(builder.id, filename);
149
+ }
150
+ let built;
151
+ try {
152
+ built = build({ documents: moduleBuilders.map((m) => m.builder) });
153
+ }
154
+ catch (err) {
155
+ console.error(pc.bold(pc.red(`build failed for module lexicons`)));
156
+ console.error(err);
157
+ process.exit(1);
158
+ }
159
+ for (const { builder, filename } of moduleBuilders) {
160
+ const doc = built[builder.id];
161
+ seen.set(builder.id, filename);
162
+ results.push({ nsid: builder.id, doc, filename });
163
+ }
164
+ }
165
+ return results;
166
+ };
167
+ //# sourceMappingURL=lexicon-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexicon-loader.js","sourceRoot":"","sources":["../src/lexicon-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AtprotoSourceConfig } from '../config.js';
2
+ import type { PullResult } from './types.js';
3
+ /**
4
+ * pulls lexicon documents from AT Protocol network resolution
5
+ * @param source atproto source configuration
6
+ * @returns pulled lexicons and ISO timestamp
7
+ */
8
+ export declare const pullAtprotoSource: (source: AtprotoSourceConfig) => Promise<PullResult>;
9
+ //# sourceMappingURL=atproto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../../src/pull-sources/atproto.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAoE7D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAU,QAAQ,mBAAmB,KAAG,OAAO,CAAC,UAAU,CAmJvF,CAAC"}
@@ -0,0 +1,192 @@
1
+ import { getPdsEndpoint, isAtprotoDid } from '@atcute/identity';
2
+ import { CompositeDidDocumentResolver, CompositeHandleResolver, DohJsonHandleResolver, PlcDidDocumentResolver, WebDidDocumentResolver, WellKnownHandleResolver, } from '@atcute/identity-resolver';
3
+ import { refineLexiconDoc } from '@atcute/lexicon-doc';
4
+ import { DohJsonLexiconAuthorityResolver, LexiconSchemaResolver } from '@atcute/lexicon-resolver';
5
+ import { isHandle, isNsid, parseCanonicalResourceUri, } from '@atcute/lexicons/syntax';
6
+ import pc from 'picocolors';
7
+ /**
8
+ * discovers all published lexicons for an authority by listing records in the
9
+ * com.atproto.lexicon.schema collection
10
+ * @param authority the authority DID
11
+ * @param didResolver DID document resolver
12
+ * @returns array of NSID strings
13
+ */
14
+ const discoverLexiconsForAuthority = async (authority, didResolver) => {
15
+ // resolve DID to get PDS endpoint
16
+ const didDocument = await didResolver.resolve(authority);
17
+ const pdsEndpoint = getPdsEndpoint(didDocument);
18
+ if (!pdsEndpoint) {
19
+ throw new Error(`no pds service in did document; did=${authority}`);
20
+ }
21
+ // call com.atproto.repo.listRecords to get all lexicon schema records
22
+ const nsids = [];
23
+ let cursor;
24
+ do {
25
+ const url = new URL('/xrpc/com.atproto.repo.listRecords', pdsEndpoint);
26
+ url.searchParams.set('repo', authority);
27
+ url.searchParams.set('collection', 'com.atproto.lexicon.schema');
28
+ url.searchParams.set('limit', '100');
29
+ if (cursor) {
30
+ url.searchParams.set('cursor', cursor);
31
+ }
32
+ const response = await fetch(url, {
33
+ headers: { accept: 'application/json' },
34
+ });
35
+ if (!response.ok) {
36
+ throw new Error(`http ${response.status} when listing records`);
37
+ }
38
+ const data = (await response.json());
39
+ // extract NSIDs from record keys (the rkey in at://did/collection/rkey)
40
+ for (const record of data.records) {
41
+ const r = parseCanonicalResourceUri(record.uri);
42
+ if (!r.ok) {
43
+ continue;
44
+ }
45
+ const nsid = r.value.rkey;
46
+ if (!isNsid(nsid)) {
47
+ continue;
48
+ }
49
+ nsids.push(nsid);
50
+ }
51
+ cursor = data.cursor;
52
+ } while (cursor);
53
+ return nsids;
54
+ };
55
+ /**
56
+ * pulls lexicon documents from AT Protocol network resolution
57
+ * @param source atproto source configuration
58
+ * @returns pulled lexicons and ISO timestamp
59
+ */
60
+ export const pullAtprotoSource = async (source) => {
61
+ // create resolver instances (reusable across NSIDs)
62
+ const authorityResolver = new DohJsonLexiconAuthorityResolver({
63
+ dohUrl: 'https://cloudflare-dns.com/dns-query',
64
+ });
65
+ const didResolver = new CompositeDidDocumentResolver({
66
+ methods: {
67
+ plc: new PlcDidDocumentResolver(),
68
+ web: new WebDidDocumentResolver(),
69
+ },
70
+ });
71
+ const schemaResolver = new LexiconSchemaResolver({
72
+ didDocumentResolver: didResolver,
73
+ });
74
+ const handleResolver = new CompositeHandleResolver({
75
+ strategy: 'race',
76
+ methods: {
77
+ http: new WellKnownHandleResolver(),
78
+ dns: new DohJsonHandleResolver({
79
+ dohUrl: 'https://cloudflare-dns.com/dns-query',
80
+ }),
81
+ },
82
+ });
83
+ const pulled = new Map();
84
+ const errors = [];
85
+ let nsids;
86
+ let authorityDid = null;
87
+ let sourceDesc;
88
+ let sourceName = null;
89
+ if (source.mode === 'nsids') {
90
+ nsids = source.nsids;
91
+ sourceDesc = `atproto (${nsids.length} nsids)`;
92
+ }
93
+ else {
94
+ // mode 2: authority-based
95
+ // step 2a: resolve authority (handle -> DID if needed)
96
+ let resolvedDid;
97
+ const handle = isHandle(source.authority) ? source.authority : null;
98
+ try {
99
+ if (isAtprotoDid(source.authority)) {
100
+ resolvedDid = source.authority;
101
+ }
102
+ else if (handle) {
103
+ resolvedDid = await handleResolver.resolve(handle);
104
+ }
105
+ else {
106
+ console.error(pc.bold(pc.red(`invalid authority: ${source.authority}`)));
107
+ console.error(`must be a valid DID or handle`);
108
+ process.exit(1);
109
+ }
110
+ authorityDid = resolvedDid;
111
+ sourceDesc = `atproto (authority: ${authorityDid})`;
112
+ sourceName = handle ?? authorityDid;
113
+ }
114
+ catch (err) {
115
+ console.error(pc.bold(pc.red(`failed to resolve authority: ${source.authority}`)));
116
+ console.error(err);
117
+ process.exit(1);
118
+ }
119
+ // step 2b: discover all lexicons for this authority
120
+ try {
121
+ nsids = await discoverLexiconsForAuthority(authorityDid, didResolver);
122
+ }
123
+ catch (err) {
124
+ console.error(pc.bold(pc.red(`failed to discover lexicons for ${sourceName}`)));
125
+ console.error(err);
126
+ process.exit(1);
127
+ }
128
+ // step 2c: filter by pattern if specified
129
+ if (source.pattern) {
130
+ nsids = nsids.filter((nsid) => {
131
+ return source.pattern.some((pattern) => {
132
+ if (pattern.endsWith('.*')) {
133
+ const prefix = pattern.slice(0, -2);
134
+ return nsid === prefix || nsid.startsWith(prefix + '.');
135
+ }
136
+ return nsid === pattern;
137
+ });
138
+ });
139
+ }
140
+ if (nsids.length === 0) {
141
+ console.warn(pc.yellow(`warning: no lexicons found for ${sourceName}`));
142
+ }
143
+ }
144
+ // fetch each NSID
145
+ let fetchedCount = 0;
146
+ for (const nsid of nsids) {
147
+ try {
148
+ // step 1: resolve authority from NSID (DNS)
149
+ const resolvedAuthority = await authorityResolver.resolve(nsid);
150
+ // step 2: cross-verify authority if in authority-based mode
151
+ if (authorityDid && resolvedAuthority !== authorityDid) {
152
+ throw new Error(`authority mismatch: NSID ${nsid} claims authority ${resolvedAuthority} but expected ${authorityDid}`);
153
+ }
154
+ // step 3: fetch schema from authority's PDS
155
+ const resolved = await schemaResolver.resolve(resolvedAuthority, nsid);
156
+ // step 4: lint the lexicon document
157
+ const issues = refineLexiconDoc(resolved.schema, true);
158
+ if (issues.length > 0) {
159
+ const messages = issues.map((i) => ` ${i.path}: ${i.message}`).join('\n');
160
+ throw new Error(`lint validation failed:\n${messages}`);
161
+ }
162
+ // create in-memory location (no file on disk yet)
163
+ const location = {
164
+ absolutePath: `<atproto:${nsid}>`,
165
+ relativePath: `${nsid}.json`,
166
+ sourceDescription: sourceDesc,
167
+ };
168
+ pulled.set(nsid, {
169
+ nsid,
170
+ doc: resolved.schema,
171
+ location,
172
+ });
173
+ fetchedCount++;
174
+ console.log(`${pc.green('+')} ${nsid}`);
175
+ }
176
+ catch (err) {
177
+ // best-effort: collect errors but continue
178
+ errors.push({ nsid, error: err });
179
+ }
180
+ }
181
+ // report all errors at end
182
+ if (errors.length > 0) {
183
+ console.warn(pc.yellow(`\nwarning: failed to fetch ${errors.length} lexicon(s):`));
184
+ for (const { nsid, error } of errors) {
185
+ console.warn(` - ${nsid}: ${error.message}`);
186
+ }
187
+ }
188
+ const suffix = sourceName ? ` from ${pc.cyan(sourceName)}` : '';
189
+ console.log(`pulled ${pc.cyan(fetchedCount.toString())} lexicons${suffix}`);
190
+ return { pulled };
191
+ };
192
+ //# sourceMappingURL=atproto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"atproto.js","sourceRoot":"","sources":["../../src/pull-sources/atproto.ts"],"names":[],"mappings":"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"}