/ clis / lesswrong / tag.js
tag.js
 1  import { cli, Strategy } from '@jackwener/opencli/registry';
 2  import { EmptyResultError } from '@jackwener/opencli/errors';
 3  import { DOMAIN, SITE, gqlRequest, resolveTagId } from './_helpers.js';
 4  cli({
 5      site: SITE,
 6      name: 'tag',
 7      description: 'Posts by tag',
 8      domain: DOMAIN,
 9      strategy: Strategy.PUBLIC,
10      browser: false,
11      args: [
12          {
13              name: 'tag',
14              type: 'string',
15              required: true,
16              positional: true,
17              help: 'Tag slug or name',
18          },
19          { name: 'limit', type: 'int', default: 10, help: 'Number of results' },
20      ],
21      columns: ['rank', 'title', 'author', 'karma', 'comments', 'url'],
22      func: async (_page, kwargs) => {
23          const tagInput = String(kwargs.tag);
24          const limit = Number(kwargs.limit ?? 10);
25          const tag = await resolveTagId(tagInput);
26          if (!tag?._id) {
27              throw new EmptyResultError(`lesswrong tag ${tagInput}`, 'Use "opencli lesswrong tags" to list available tags');
28          }
29          const query = `query PostsByTag {
30        posts(input: {terms: {view: "tagRelevance", tagId: "${tag._id}", limit: ${limit}}}) {
31          results { _id title user { displayName } baseScore commentCount slug postedAt }
32        }
33      }`;
34          const data = await gqlRequest(query);
35          const posts = (data?.posts?.results ?? []);
36          return posts.map((item, i) => ({
37              rank: i + 1,
38              title: item.title ?? '',
39              author: item.user?.displayName ?? 'Unknown',
40              karma: item.baseScore ?? 0,
41              comments: item.commentCount ?? 0,
42              url: `https://${DOMAIN}/posts/${item._id}/${item.slug}`,
43          }));
44      },
45  });