@everyprotocol/every-cli 0.1.5 → 0.1.6

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.
@@ -0,0 +1,111 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import jp from "jsonpath";
4
+ import * as _ from "lodash-es";
5
+ import { Command } from "commander";
6
+ const DEFAULT_DIR = "./register";
7
+ const STATIC_RULES = {
8
+ // contract
9
+ "deploy.addr": {
10
+ file: "deploy.json",
11
+ root: "$",
12
+ field: "deployedTo",
13
+ },
14
+ // kind
15
+ "kind.id": { file: "kind.json", root: "$.events[?(@.name=='KindRegistered')].data", field: "id" },
16
+ "kind.rev": { file: "kind.json", root: "$.events[?(@.name=='KindRegistered')].data.desc", field: "rev" },
17
+ "kind.krev": { file: "kind.json", root: "$.events[?(@.name=='KindRegistered')].data.desc", field: "kindRev" },
18
+ "kind.srev": { file: "kind.json", root: "$.events[?(@.name=='KindRegistered')].data.desc", field: "setRev" },
19
+ // set
20
+ "set.id": { file: "set.json", root: "$.events[?(@.name=='SetRegistered')].data", field: "id" },
21
+ "set.rev": { file: "set.json", root: "$.events[?(@.name=='SetRegistered')].data.desc", field: "rev" },
22
+ "set.krev": { file: "set.json", root: "$.events[?(@.name=='SetRegistered')].data.desc", field: "kindRev" },
23
+ "set.srev": { file: "set.json", root: "$.events[?(@.name=='SetRegistered')].data.desc", field: "setRev" },
24
+ // matter: first entry’s MatterRegistered by default
25
+ "matter.hash": { file: "matter.json", root: "$[0].events[?(@.event=='MatterRegistered')].data", field: "1" },
26
+ "matter.who": { file: "matter.json", root: "$[0].events[?(@.event=='MatterRegistered')].data", field: "0" },
27
+ };
28
+ function dynamicRule(key) {
29
+ const esc = (s) => s.replace(/'/g, "\\'");
30
+ // hash=<path> → hashes.json: find by .path and return .hash
31
+ {
32
+ const m = key.match(/^hash=(.+)$/);
33
+ if (m) {
34
+ const filePath = esc(m[1]);
35
+ return {
36
+ file: "hashes.json",
37
+ root: `$[?(@.path=='${filePath}')]`,
38
+ field: "hash",
39
+ };
40
+ }
41
+ }
42
+ // matter.hash=<path> → matter.json: find entry by .file, then MatterRegistered.data[1]
43
+ {
44
+ const m = key.match(/^matter\.hash=(.+)$/);
45
+ if (m) {
46
+ const filePath = esc(m[1]);
47
+ return {
48
+ file: "matter.json",
49
+ root: `$[?(@.file=='${filePath}')].events[?(@.event=='MatterRegistered')].data`,
50
+ field: "1",
51
+ };
52
+ }
53
+ }
54
+ // matter.who=<path> → matter.json: find entry by .file, then MatterRegistered.data[0]
55
+ {
56
+ const m = key.match(/^matter\.who=(.+)$/);
57
+ if (m) {
58
+ const filePath = esc(m[1]);
59
+ return {
60
+ file: "matter.json",
61
+ root: `$[?(@.file=='${filePath}')].events[?(@.event=='MatterRegistered')].data`,
62
+ field: "0",
63
+ };
64
+ }
65
+ }
66
+ return null;
67
+ }
68
+ function resolveRule(key) {
69
+ let rule = dynamicRule(key);
70
+ if (rule)
71
+ return rule;
72
+ rule = STATIC_RULES[key];
73
+ if (!rule)
74
+ throw new Error(`Unknown key: ${key}`);
75
+ return rule;
76
+ }
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ function pickOnce(getData, key) {
79
+ const rule = resolveRule(key);
80
+ const data = getData(rule.file);
81
+ const roots = jp.query(data, rule.root);
82
+ if (roots.length === 0) {
83
+ throw new Error(`Root not found for key "${key}": ${rule.root} in ${rule.file}`);
84
+ }
85
+ // Pick the first matched root
86
+ const obj = roots[0];
87
+ const value = rule.field ? _.get(obj, rule.field) : obj;
88
+ if (value === undefined) {
89
+ throw new Error(`Field not found for key "${key}": ${rule.field} in ${rule.file}`);
90
+ }
91
+ return String(value);
92
+ }
93
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
94
+ function loadJson(fullPath) {
95
+ const raw = fs.readFileSync(fullPath, "utf8");
96
+ return JSON.parse(raw);
97
+ }
98
+ export const pickCmd = new Command("pick")
99
+ .description("Pick values from outputs")
100
+ .argument("<keys...>", "Keys to resolve")
101
+ .option("--from <dir>", "Output directory", DEFAULT_DIR)
102
+ .action(function (keys) {
103
+ const { from } = this.opts();
104
+ const dir = from || DEFAULT_DIR;
105
+ const loadJsonCache = _.memoize((rel) => {
106
+ const full = path.join(dir, rel);
107
+ return loadJson(full);
108
+ });
109
+ const outputs = keys.map((key) => pickOnce(loadJsonCache, key));
110
+ console.log(outputs.join(" "));
111
+ });
package/dist/program.js CHANGED
@@ -12,6 +12,7 @@ import { setCmd } from "./cmds/set.js";
12
12
  import { objectCmd } from "./cmds/object.js";
13
13
  import { minterCmd } from "./cmds/minter.js";
14
14
  import { universeCmd } from "./cmds/universe.js";
15
+ import { pickCmd } from "./cmds/pick.js";
15
16
  export const program = new Command("every")
16
17
  .description("CLI for interacting with Every Protocol")
17
18
  .version(version())
@@ -27,4 +28,5 @@ export const program = new Command("every")
27
28
  .addCommand(minterCmd)
28
29
  .addCommand(balanceCmd)
29
30
  .addCommand(walletCmd)
30
- .addCommand(configCmd);
31
+ .addCommand(configCmd)
32
+ .addCommand(pickCmd, { hidden: true });
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@everyprotocol/every-cli",
3
3
  "type": "module",
4
- "version": "0.1.5",
4
+ "version": "0.1.6",
5
5
  "files": [
6
6
  "dist/",
7
7
  "abis/",
@@ -16,6 +16,7 @@
16
16
  "@eslint/js": "^9.26.0",
17
17
  "@types/bun": "latest",
18
18
  "@types/columnify": "^1.5.4",
19
+ "@types/jsonpath": "^0.2.4",
19
20
  "@types/lodash-es": "^4.17.12",
20
21
  "@types/prompt-sync": "^4.2.3",
21
22
  "@typescript-eslint/eslint-plugin": "^8.32.1",
@@ -39,6 +40,7 @@
39
40
  "ethers": "^6.14.0",
40
41
  "json11": "^2.0.2",
41
42
  "json5": "^2.2.3",
43
+ "jsonpath": "^1.1.1",
42
44
  "lodash-es": "^4.17.21",
43
45
  "prompt-sync": "^4.2.0",
44
46
  "viem": "^2.29.1"