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 });