graze-client 0.3.2 → 0.3.4

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/README.md CHANGED
@@ -6,7 +6,21 @@ This is a simple Typescript package for interacting with the [Graze](https://gra
6
6
  npm install graze-client
7
7
  ```
8
8
 
9
- It is a bit hastily put together and under development (not all APIs are implemented), but it works. Currently it is only deployed as ESM with Typescript declarations.
9
+ ## Features
10
+
11
+ 1. **getFeeds:** Get all your graze feeds.
12
+ 1. **getFeed:** Get a specific feed.
13
+ 1. **hidePost:** Hide a post from a feed.
14
+ 1. **updateAlgorithm:** Update an algorithm.
15
+ 1. **publishAlgorithm:** Publish an algorithm.
16
+ 1. **Algorithm Builder:** A custom utility to make building an algorithm easier. See the example below.
17
+
18
+ ### This is a WIP
19
+
20
+ This package is under development, so if you find bugs, please report. Known issues include:
21
+
22
+ 1. Not all graze operators or APIs are implemented. I have only implemented what I need so far, so feed free to make a PR adding more.
23
+ 2. Not everything is documented, but typescript is your friend. It you use this in an editor like VSCode, you should get good autocomplete hints for types.
10
24
 
11
25
  ## Usage
12
26
 
@@ -17,38 +31,67 @@ There are two exports:
17
31
  ### 1. A promise-based `GrazeService`
18
32
 
19
33
  ```ts
20
- import { GrazeService } from "graze-client";
34
+ import { GrazeService, F, Algo, FullForm } from "graze-client";
21
35
 
22
36
  const graze = new GrazeService({
23
37
  apiUrl: "https://api.graze.social",
24
- cookie: "my-graze-cookie",
38
+ cookie: "<change this>",
25
39
  userId: 15,
26
40
  });
27
41
 
42
+ // get feets
28
43
  const myFeeds = await graze.getFeeds();
29
44
  const feed = await graze.getFeed({ path: { feedId: 1234 } });
30
45
  // hide a post
31
46
  await graze.hidePost({
32
47
  payload: { algo_id: 1234, at_uri: "at://<did>/app.bsky.feed.post/<rkey>" },
33
48
  });
34
- // update an algorithm
35
- const hasVideo: Form.Filter = {
36
- embed_type: ["==", "video"],
37
- };
38
- const hasKeyword: Form.Filter = {
39
- regex_matches: ["text", /Hello World!/.source, true],
40
- };
41
- const res = await graze.updateAlgorithm({
42
- record_name: "my-feed",
43
- display_name: "My Feed",
49
+
50
+ // build a complex algorithm
51
+
52
+ const hasNoBadContent = F.and(
53
+ F.isContentOk(0.9),
54
+ F.hasNoNSFWLabels,
55
+ F.isNotListMember("my-blocklist-url")
56
+ );
57
+
58
+ const algo = Algo.filter(
59
+ // the top level filter will combine elements in an "and" block
60
+ hasNoBadContent,
61
+ F.hasVideo,
62
+ F.or(
63
+ F.posterFollows("@samuel.bsky.team"),
64
+ F.isListMember("my-whitelist-url"),
65
+ F.and(
66
+ F.regexMatches("text", "my-keyword-regex"),
67
+ F.regexMatches("embed.alt", "my-keyword-regex"),
68
+ F.regexMatches("embed.external.title", "my-keyword-regex"),
69
+ F.regexMatches("embed.external.description", "my-keyword-regex"),
70
+ F.isPost
71
+ ),
72
+ F.or(
73
+ // nested logic blocks will be automatically flattened, so this will
74
+ // be brought up one level since it is logically equivalent.
75
+ F.regexNegationMatches("text", "my-negative-keyword-regex")
76
+ )
77
+ )
78
+ );
79
+
80
+ const manifest: FullForm = {
81
+ algorithm_manifest: algo,
82
+ id: 12,
44
83
  user_id: 1,
84
+ display_name: "My Fancy Feed",
85
+ // file: add a file blob here to update the image
86
+ description: "This is a fancy feed with lots of logic for fun and profit.",
45
87
  order: "new",
46
- id: 1234,
47
- algorithm_manifest: {
48
- filter: { and: [hasVideo, hasKeyword] },
49
- },
50
- });
88
+ // CAUTION: this will change the feed slug and cause you to lose existing follows.
89
+ // but if you do it, don't worry you can set it back and it will be fixed : ).
90
+ record_name: "my-fancy-feed",
91
+ };
51
92
 
93
+ // send the algorithm to graze
94
+ const response = await graze.updateAlgorithm(manifest);
52
95
  // publish the algorithm
53
96
  const res = await graze.publishAlgorithm({ path: { feedId: 1234 } });
54
97
  ```
@@ -13,5 +13,6 @@ export declare class GrazeService {
13
13
  userId: number;
14
14
  });
15
15
  }
16
- export {};
16
+ export * from "./schema/index.js";
17
+ export { F, Algo } from "./builder.js";
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAS,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAC5B,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,GACvC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,KAAK,CAAC;AAEV,qBAAa,YAAY;IACvB,OAAO,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,QAAQ,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,QAAQ,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,eAAe,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvE,gBAAgB,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAE7D,EACV,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB;CAmBF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,MAAM,EAAS,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAC5B,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,GACvC,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,KAAK,CAAC;AAEV,qBAAa,YAAY;IACvB,OAAO,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,QAAQ,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,QAAQ,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzD,eAAe,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvE,gBAAgB,EAAE,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAE7D,EACV,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB;CAmBF;AA0BD,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC"}
@@ -38,4 +38,6 @@ const setup = Effect.gen(function* () {
38
38
  publishAlgorithm,
39
39
  };
40
40
  });
41
+ export * from "./schema/index.js";
42
+ export { F, Algo } from "./builder.js";
41
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQ/C,MAAM,OAAO,YAAY;IACvB,OAAO,CAAgD;IACvD,QAAQ,CAAiD;IACzD,QAAQ,CAAiD;IACzD,eAAe,CAAwD;IACvE,gBAAgB,CAAyD;IAEzE,YAAY,EACV,MAAM,EACN,MAAM,EACN,MAAM,GAKP;QACC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;YACrB,CAAC,eAAe,EAAE,MAAM,CAAC;YACzB,CAAC,cAAc,EAAE,MAAM,CAAC;YACxB,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EACnC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CACtB,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IAClC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAuC,EAAE,EAAE,CAC7D,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAwC,EAAE,EAAE,CAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAwC,EAAE,EAAE,CAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,CACtB,GAAG,IAA+C,EAClD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,CACvB,GAAG,IAAgD,EACnD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE9D,OAAO;QACL,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQ/C,MAAM,OAAO,YAAY;IACvB,OAAO,CAAgD;IACvD,QAAQ,CAAiD;IACzD,QAAQ,CAAiD;IACzD,eAAe,CAAwD;IACvE,gBAAgB,CAAyD;IAEzE,YAAY,EACV,MAAM,EACN,MAAM,EACN,MAAM,GAKP;QACC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;YACrB,CAAC,eAAe,EAAE,MAAM,CAAC;YACzB,CAAC,cAAc,EAAE,MAAM,CAAC;YACxB,CAAC,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EACnC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CACtB,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IAClC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAuC,EAAE,EAAE,CAC7D,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAwC,EAAE,EAAE,CAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAwC,EAAE,EAAE,CAC/D,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,CACtB,GAAG,IAA+C,EAClD,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,gBAAgB,GAAG,CACvB,GAAG,IAAgD,EACnD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE9D,OAAO;QACL,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,gBAAgB;KACjB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "graze-client",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A Typescript Graze API client.",
@@ -32,8 +32,8 @@
32
32
  "types": "./build/dts/schema/index.d.ts"
33
33
  },
34
34
  "./builder": {
35
- "import": "./build/esm/builder/index.js",
36
- "types": "./build/dts/builder/index.d.ts"
35
+ "import": "./build/esm/builder.js",
36
+ "types": "./build/dts/builder.d.ts"
37
37
  }
38
38
  },
39
39
  "scripts": {
package/src/index.ts CHANGED
@@ -66,3 +66,6 @@ const setup = Effect.gen(function* () {
66
66
  publishAlgorithm,
67
67
  };
68
68
  });
69
+
70
+ export * from "./schema/index.js";
71
+ export { F, Algo } from "./builder.js";