Remove tsc-multi, re-install gts, apply autoformatting and linting

This commit is contained in:
Jon Staab
2024-12-17 10:59:27 -08:00
parent 0b86613161
commit f33e03740e
122 changed files with 2243 additions and 2178 deletions
+3 -8
View File
@@ -15,21 +15,16 @@
"exports": {
".": {
"types": "./build/src/index.d.ts",
"import": "./build/src/index.mjs",
"require": "./build/src/index.cjs"
"import": "./build/src/index.js",
"require": "./build/src/index.js"
}
},
"scripts": {
"pub": "npm run lint && npm run build && npm publish",
"build": "gts clean && tsc-multi",
"build": "gts clean && tsc",
"lint": "gts lint",
"fix": "gts fix"
},
"devDependencies": {
"gts": "^5.0.1",
"tsc-multi": "^1.1.0",
"typescript": "~5.1.6"
},
"dependencies": {
"@welshman/lib": "~0.0.33",
"@welshman/util": "~0.0.50"
+73 -43
View File
@@ -1,15 +1,25 @@
import {uniq, identity, flatten, pushToMapKey, intersection, tryCatch, now} from '@welshman/lib'
import type {TrustedEvent, Filter} from '@welshman/util'
import {intersectFilters, matchFilter, getAddress, getIdFilters, unionFilters} from '@welshman/util'
import type {CreatedAtItem, RequestItem, ListItem, LabelItem, WOTItem, DVMItem, Scope, Feed, FeedOptions} from './core'
import {getFeedArgs, feedsFromTags} from './utils'
import {FeedType} from './core'
import {uniq, identity, flatten, pushToMapKey, intersection, tryCatch, now} from "@welshman/lib"
import type {TrustedEvent, Filter} from "@welshman/util"
import {intersectFilters, matchFilter, getAddress, getIdFilters, unionFilters} from "@welshman/util"
import type {
CreatedAtItem,
RequestItem,
ListItem,
LabelItem,
WOTItem,
DVMItem,
Scope,
Feed,
FeedOptions,
} from "./core.js"
import {getFeedArgs, feedsFromTags} from "./utils.js"
import {FeedType} from "./core.js"
export class FeedCompiler {
constructor(readonly options: FeedOptions) {}
canCompile(feed: Feed): boolean {
switch(feed[0]) {
switch (feed[0]) {
case FeedType.Union:
case FeedType.Intersection:
return getFeedArgs(feed).every(f => this.canCompile(f))
@@ -34,22 +44,37 @@ export class FeedCompiler {
}
async compile(feed: Feed): Promise<RequestItem[]> {
switch(feed[0]) {
case FeedType.ID: return this._compileFilter('ids', getFeedArgs(feed))
case FeedType.Kind: return this._compileFilter('kinds', getFeedArgs(feed))
case FeedType.Author: return this._compileFilter('authors', getFeedArgs(feed))
case FeedType.DVM: return await this._compileDvms(getFeedArgs(feed))
case FeedType.Intersection: return await this._compileIntersection(getFeedArgs(feed))
case FeedType.List: return await this._compileLists(getFeedArgs(feed))
case FeedType.Label: return await this._compileLabels(getFeedArgs(feed))
case FeedType.Union: return await this._compileUnion(getFeedArgs(feed))
case FeedType.Address: return this._compileAddresses(getFeedArgs(feed))
case FeedType.CreatedAt: return this._compileCreatedAt(getFeedArgs(feed))
case FeedType.Scope: return this._compileScopes(getFeedArgs(feed))
case FeedType.Search: return this._compileSearches(getFeedArgs(feed))
case FeedType.WOT: return this._compileWot(getFeedArgs(feed))
case FeedType.Relay: return [{relays: getFeedArgs(feed)}]
case FeedType.Global: return [{filters: [{}]}]
switch (feed[0]) {
case FeedType.ID:
return this._compileFilter("ids", getFeedArgs(feed))
case FeedType.Kind:
return this._compileFilter("kinds", getFeedArgs(feed))
case FeedType.Author:
return this._compileFilter("authors", getFeedArgs(feed))
case FeedType.DVM:
return await this._compileDvms(getFeedArgs(feed))
case FeedType.Intersection:
return await this._compileIntersection(getFeedArgs(feed))
case FeedType.List:
return await this._compileLists(getFeedArgs(feed))
case FeedType.Label:
return await this._compileLabels(getFeedArgs(feed))
case FeedType.Union:
return await this._compileUnion(getFeedArgs(feed))
case FeedType.Address:
return this._compileAddresses(getFeedArgs(feed))
case FeedType.CreatedAt:
return this._compileCreatedAt(getFeedArgs(feed))
case FeedType.Scope:
return this._compileScopes(getFeedArgs(feed))
case FeedType.Search:
return this._compileSearches(getFeedArgs(feed))
case FeedType.WOT:
return this._compileWot(getFeedArgs(feed))
case FeedType.Relay:
return [{relays: getFeedArgs(feed)}]
case FeedType.Global:
return [{filters: [{}]}]
case FeedType.Tag: {
const [key, ...value] = getFeedArgs(feed)
@@ -99,7 +124,13 @@ export class FeedCompiler {
}
_compileWot(wotItems: WOTItem[]) {
return [{filters: wotItems.map(({min = 0, max = 1}) => ({authors: this.options.getPubkeysForWOTRange(min, max)}))}]
return [
{
filters: wotItems.map(({min = 0, max = 1}) => ({
authors: this.options.getPubkeysForWOTRange(min, max),
})),
},
]
}
async _compileDvms(items: DVMItem[]): Promise<RequestItem[]> {
@@ -110,14 +141,14 @@ export class FeedCompiler {
this.options.requestDVM({
...request,
onEvent: async (e: TrustedEvent) => {
const tags = await tryCatch(() => JSON.parse(e.content)) || []
const tags = (await tryCatch(() => JSON.parse(e.content))) || []
for (const feed of feedsFromTags(tags, mappings)) {
feeds.push(feed)
}
},
})
)
}),
),
)
return await this._compileUnion(feeds)
@@ -129,16 +160,15 @@ export class FeedCompiler {
const result = []
for (let {filters, relays} of head || []) {
const matchingGroups = tail.map(
items => items.filter(
it => (
(!relays || !it.relays || intersection(relays, it.relays).length > 0) &&
(!filters || !it.filters || intersectFilters([filters, it.filters]).length > 0)
)
const matchingGroups = tail
.map(items =>
items.filter(
it =>
(!relays || !it.relays || intersection(relays, it.relays).length > 0) &&
(!filters || !it.filters || intersectFilters([filters, it.filters]).length > 0),
),
)
).filter(
items => items.length > 0
)
.filter(items => items.length > 0)
if (matchingGroups.length < tail.length) {
continue
@@ -190,7 +220,7 @@ export class FeedCompiler {
}
}
}
})
}),
)
const items: RequestItem[] = []
@@ -238,8 +268,8 @@ export class FeedCompiler {
}
return feeds
})
)
}),
),
)
return this._compileUnion(feeds)
@@ -254,8 +284,8 @@ export class FeedCompiler {
relays,
filters: [{kinds: [1985], ...filter}],
onEvent: (e: TrustedEvent) => events.push(e),
})
)
}),
),
)
const feeds = flatten(
@@ -272,8 +302,8 @@ export class FeedCompiler {
}
return feedsFromTags(tags, mappings)
})
)
}),
),
)
return this._compileUnion(feeds)
+68 -63
View File
@@ -1,9 +1,9 @@
import {inc, memoize, omitVals, max, min, now} from '@welshman/lib'
import type {TrustedEvent, Filter} from '@welshman/util'
import {EPOCH, trimFilters, guessFilterDelta} from '@welshman/util'
import type {Feed, RequestItem, FeedOptions} from './core'
import {FeedType} from './core'
import {FeedCompiler} from './compiler'
import {inc, memoize, omitVals, max, min, now} from "@welshman/lib"
import type {TrustedEvent, Filter} from "@welshman/util"
import {EPOCH, trimFilters, guessFilterDelta} from "@welshman/util"
import type {Feed, RequestItem, FeedOptions} from "./core.js"
import {FeedType} from "./core.js"
import {FeedCompiler} from "./compiler.js"
export class FeedController {
compiler: FeedCompiler
@@ -26,7 +26,7 @@ export class FeedController {
return this._getRequestsLoader(requestItems)
}
switch(type) {
switch (type) {
case FeedType.Difference:
return this._getDifferenceLoader(feed as Feed[])
case FeedType.Intersection:
@@ -45,8 +45,8 @@ export class FeedController {
const seen = new Set()
const exhausted = new Set()
const loaders = await Promise.all(
requests.map(
request => this._getRequestLoader(request, {
requests.map(request =>
this._getRequestLoader(request, {
onExhausted: () => exhausted.add(request),
onEvent: e => {
if (!seen.has(e.id)) {
@@ -54,8 +54,8 @@ export class FeedController {
seen.add(e.id)
}
},
})
)
}),
),
)
return async (limit: number) => {
@@ -75,8 +75,8 @@ export class FeedController {
filters = [{}]
}
const untils = filters.flatMap((filter: Filter) => filter.until ? [filter.until] : [])
const sinces = filters.flatMap((filter: Filter) => filter.since ? [filter.since] : [])
const untils = filters.flatMap((filter: Filter) => (filter.until ? [filter.until] : []))
const sinces = filters.flatMap((filter: Filter) => (filter.since ? [filter.since] : []))
const maxUntil = untils.length === filters.length ? max(untils) : now()
const minSince = sinces.length === filters.length ? min(sinces) : EPOCH
const initialDelta = guessFilterDelta(filters)
@@ -110,15 +110,17 @@ export class FeedController {
let count = 0
await request(omitVals([undefined], {
relays,
filters: trimFilters(requestFilters),
onEvent: (event: TrustedEvent) => {
count += 1
until = Math.min(until, event.created_at - 1)
onEvent?.(event)
},
}))
await request(
omitVals([undefined], {
relays,
filters: trimFilters(requestFilters),
onEvent: (event: TrustedEvent) => {
count += 1
until = Math.min(until, event.created_at - 1)
onEvent?.(event)
},
}),
)
if (useWindowing) {
if (since === minSince) {
@@ -149,20 +151,21 @@ export class FeedController {
const seen = new Set()
const controllers = await Promise.all(
feeds.map((thisFeed: Feed, i: number) =>
new FeedController({
...options,
feed: thisFeed,
onExhausted: () => exhausted.add(i),
onEvent: (event: TrustedEvent) => {
if (i === 0) {
events.push(event)
} else {
skip.add(event.id)
}
},
})
)
feeds.map(
(thisFeed: Feed, i: number) =>
new FeedController({
...options,
feed: thisFeed,
onExhausted: () => exhausted.add(i),
onEvent: (event: TrustedEvent) => {
if (i === 0) {
events.push(event)
} else {
skip.add(event.id)
}
},
}),
),
)
return async (limit: number) => {
@@ -173,7 +176,7 @@ export class FeedController {
}
await controller.load(limit)
})
}),
)
for (const event of events.splice(0)) {
@@ -197,17 +200,18 @@ export class FeedController {
const seen = new Set()
const controllers = await Promise.all(
feeds.map((thisFeed: Feed, i: number) =>
new FeedController({
...options,
feed: thisFeed,
onExhausted: () => exhausted.add(i),
onEvent: (event: TrustedEvent) => {
events.push(event)
counts.set(event.id, inc(counts.get(event.id)))
},
})
)
feeds.map(
(thisFeed: Feed, i: number) =>
new FeedController({
...options,
feed: thisFeed,
onExhausted: () => exhausted.add(i),
onEvent: (event: TrustedEvent) => {
events.push(event)
counts.set(event.id, inc(counts.get(event.id)))
},
}),
),
)
return async (limit: number) => {
@@ -218,7 +222,7 @@ export class FeedController {
}
await controller.load(limit)
})
}),
)
for (const event of events.splice(0)) {
@@ -240,19 +244,20 @@ export class FeedController {
const seen = new Set()
const controllers = await Promise.all(
feeds.map((thisFeed: Feed, i: number) =>
new FeedController({
...options,
feed: thisFeed,
onExhausted: () => exhausted.add(i),
onEvent: (event: TrustedEvent) => {
if (!seen.has(event.id)) {
onEvent?.(event)
seen.add(event.id)
}
},
})
)
feeds.map(
(thisFeed: Feed, i: number) =>
new FeedController({
...options,
feed: thisFeed,
onExhausted: () => exhausted.add(i),
onEvent: (event: TrustedEvent) => {
if (!seen.has(event.id)) {
onEvent?.(event)
seen.add(event.id)
}
},
}),
),
)
return async (limit: number) => {
@@ -263,7 +268,7 @@ export class FeedController {
}
await controller.load(limit)
})
}),
)
if (exhausted.size === controllers.length) {
+40 -40
View File
@@ -1,4 +1,4 @@
import type {TrustedEvent, Filter} from '@welshman/util'
import type {TrustedEvent, Filter} from "@welshman/util"
export enum FeedType {
Address = "address",
@@ -28,43 +28,43 @@ export enum Scope {
}
export type FilterFeedType =
FeedType.ID |
FeedType.Address |
FeedType.Author |
FeedType.Kind |
FeedType.Relay |
FeedType.Tag
| FeedType.ID
| FeedType.Address
| FeedType.Author
| FeedType.Kind
| FeedType.Relay
| FeedType.Tag
export type TagFeedMapping = [string, Feed]
export type DVMItem = {
kind: number,
tags?: string[][],
relays?: string[],
mappings?: TagFeedMapping[],
kind: number
tags?: string[][]
relays?: string[]
mappings?: TagFeedMapping[]
}
export type ListItem = {
addresses: string[],
mappings?: TagFeedMapping[],
addresses: string[]
mappings?: TagFeedMapping[]
}
export type LabelItem = {
relays?: string[],
relays?: string[]
authors?: string[]
[key: `#${string}`]: string[]
mappings?: TagFeedMapping[],
mappings?: TagFeedMapping[]
}
export type WOTItem = {
min?: number,
max?: number,
min?: number
max?: number
}
export type CreatedAtItem = {
since?: number,
until?: number,
relative?: string[],
since?: number
until?: number
relative?: string[]
}
export type AddressFeed = [type: FeedType.Address, ...addresses: string[]]
@@ -86,23 +86,23 @@ export type TagFeed = [type: FeedType.Tag, key: string, ...values: string[]]
export type UnionFeed = [type: FeedType.Union, ...feeds: Feed[]]
export type Feed =
AddressFeed |
AuthorFeed |
CreatedAtFeed |
DVMFeed |
DifferenceFeed |
IDFeed |
IntersectionFeed |
GlobalFeed |
KindFeed |
ListFeed |
LabelFeed |
WOTFeed |
RelayFeed |
ScopeFeed |
SearchFeed |
TagFeed |
UnionFeed
| AddressFeed
| AuthorFeed
| CreatedAtFeed
| DVMFeed
| DifferenceFeed
| IDFeed
| IntersectionFeed
| GlobalFeed
| KindFeed
| ListFeed
| LabelFeed
| WOTFeed
| RelayFeed
| ScopeFeed
| SearchFeed
| TagFeed
| UnionFeed
export type RequestItem = {
relays?: string[]
@@ -114,9 +114,9 @@ export type RequestOpts = RequestItem & {
}
export type DVMRequest = {
kind: number,
tags?: string[][],
relays?: string[],
kind: number
tags?: string[][]
relays?: string[]
}
export type DVMOpts = DVMRequest & {
+4 -4
View File
@@ -1,4 +1,4 @@
export * from './core'
export * from './compiler'
export * from './controller'
export * from './utils'
export * from "./core.js"
export * from "./compiler.js"
export * from "./controller.js"
export * from "./utils.js"
+105 -67
View File
@@ -1,6 +1,6 @@
import {ensureNumber} from '@welshman/lib'
import type {Filter} from '@welshman/util'
import {getTagValues} from '@welshman/util'
import {ensureNumber} from "@welshman/lib"
import type {Filter} from "@welshman/util"
import {getTagValues} from "@welshman/util"
import {
FeedType,
Feed,
@@ -28,46 +28,66 @@ import {
ListItem,
LabelItem,
CreatedAtItem,
} from './core'
} from "./core.js"
export const makeAddressFeed = (...addresses: string[]): AddressFeed => [FeedType.Address, ...addresses]
export const makeAuthorFeed = (...pubkeys: string[]): AuthorFeed => [FeedType.Author, ...pubkeys]
export const makeCreatedAtFeed = (...items: CreatedAtItem[]): CreatedAtFeed => [FeedType.CreatedAt, ...items]
export const makeDVMFeed = (...items: DVMItem[]): DVMFeed => [FeedType.DVM, ...items]
export const makeDifferenceFeed = (...feeds: Feed[]): DifferenceFeed => [FeedType.Difference, ...feeds]
export const makeIDFeed = (...ids: string[]): IDFeed => [FeedType.ID, ...ids]
export const makeIntersectionFeed = (...feeds: Feed[]): IntersectionFeed => [FeedType.Intersection, ...feeds]
export const makeGlobalFeed = (): GlobalFeed => [FeedType.Global]
export const makeKindFeed = (...kinds: number[]): KindFeed => [FeedType.Kind, ...kinds]
export const makeListFeed = (...items: ListItem[]): ListFeed => [FeedType.List, ...items]
export const makeLabelFeed = (...items: LabelItem[]): LabelFeed => [FeedType.Label, ...items]
export const makeWOTFeed = (...items: WOTItem[]): WOTFeed => [FeedType.WOT, ...items]
export const makeRelayFeed = (...urls: string[]): RelayFeed => [FeedType.Relay, ...urls]
export const makeScopeFeed = (...scopes: Scope[]): ScopeFeed => [FeedType.Scope, ...scopes]
export const makeSearchFeed = (...searches: string[]): SearchFeed => [FeedType.Search, ...searches]
export const makeTagFeed = (key: string, ...values: string[]): TagFeed => [FeedType.Tag, key, ...values]
export const makeUnionFeed = (...feeds: Feed[]): UnionFeed => [FeedType.Union, ...feeds]
export const makeAddressFeed = (...addresses: string[]): AddressFeed => [
FeedType.Address,
...addresses,
]
export const makeAuthorFeed = (...pubkeys: string[]): AuthorFeed => [FeedType.Author, ...pubkeys]
export const makeCreatedAtFeed = (...items: CreatedAtItem[]): CreatedAtFeed => [
FeedType.CreatedAt,
...items,
]
export const makeDVMFeed = (...items: DVMItem[]): DVMFeed => [FeedType.DVM, ...items]
export const makeDifferenceFeed = (...feeds: Feed[]): DifferenceFeed => [
FeedType.Difference,
...feeds,
]
export const makeIDFeed = (...ids: string[]): IDFeed => [FeedType.ID, ...ids]
export const makeIntersectionFeed = (...feeds: Feed[]): IntersectionFeed => [
FeedType.Intersection,
...feeds,
]
export const makeGlobalFeed = (): GlobalFeed => [FeedType.Global]
export const makeKindFeed = (...kinds: number[]): KindFeed => [FeedType.Kind, ...kinds]
export const makeListFeed = (...items: ListItem[]): ListFeed => [FeedType.List, ...items]
export const makeLabelFeed = (...items: LabelItem[]): LabelFeed => [FeedType.Label, ...items]
export const makeWOTFeed = (...items: WOTItem[]): WOTFeed => [FeedType.WOT, ...items]
export const makeRelayFeed = (...urls: string[]): RelayFeed => [FeedType.Relay, ...urls]
export const makeScopeFeed = (...scopes: Scope[]): ScopeFeed => [FeedType.Scope, ...scopes]
export const makeSearchFeed = (...searches: string[]): SearchFeed => [FeedType.Search, ...searches]
export const makeTagFeed = (key: string, ...values: string[]): TagFeed => [
FeedType.Tag,
key,
...values,
]
export const makeUnionFeed = (...feeds: Feed[]): UnionFeed => [FeedType.Union, ...feeds]
export const isAddressFeed = (feed: Feed): feed is AddressFeed => feed[0] === FeedType.Address
export const isAuthorFeed = (feed: Feed): feed is AuthorFeed => feed[0] === FeedType.Author
export const isCreatedAtFeed = (feed: Feed): feed is CreatedAtFeed => feed[0] === FeedType.CreatedAt
export const isDVMFeed = (feed: Feed): feed is DVMFeed => feed[0] === FeedType.DVM
export const isDifferenceFeed = (feed: Feed): feed is DifferenceFeed => feed[0] === FeedType.Difference
export const isIDFeed = (feed: Feed): feed is IDFeed => feed[0] === FeedType.ID
export const isIntersectionFeed = (feed: Feed): feed is IntersectionFeed => feed[0] === FeedType.Intersection
export const isGlobalFeed = (feed: Feed): feed is GlobalFeed => feed[0] === FeedType.Global
export const isKindFeed = (feed: Feed): feed is KindFeed => feed[0] === FeedType.Kind
export const isListFeed = (feed: Feed): feed is ListFeed => feed[0] === FeedType.List
export const isLabelFeed = (feed: Feed): feed is LabelFeed => feed[0] === FeedType.Label
export const isWOTFeed = (feed: Feed): feed is WOTFeed => feed[0] === FeedType.WOT
export const isRelayFeed = (feed: Feed): feed is RelayFeed => feed[0] === FeedType.Relay
export const isScopeFeed = (feed: Feed): feed is ScopeFeed => feed[0] === FeedType.Scope
export const isSearchFeed = (feed: Feed): feed is SearchFeed => feed[0] === FeedType.Search
export const isTagFeed = (feed: Feed): feed is TagFeed => feed[0] === FeedType.Tag
export const isUnionFeed = (feed: Feed): feed is UnionFeed => feed[0] === FeedType.Union
export const isAddressFeed = (feed: Feed): feed is AddressFeed => feed[0] === FeedType.Address
export const isAuthorFeed = (feed: Feed): feed is AuthorFeed => feed[0] === FeedType.Author
export const isCreatedAtFeed = (feed: Feed): feed is CreatedAtFeed => feed[0] === FeedType.CreatedAt
export const isDVMFeed = (feed: Feed): feed is DVMFeed => feed[0] === FeedType.DVM
export const isDifferenceFeed = (feed: Feed): feed is DifferenceFeed =>
feed[0] === FeedType.Difference
export const isIDFeed = (feed: Feed): feed is IDFeed => feed[0] === FeedType.ID
export const isIntersectionFeed = (feed: Feed): feed is IntersectionFeed =>
feed[0] === FeedType.Intersection
export const isGlobalFeed = (feed: Feed): feed is GlobalFeed => feed[0] === FeedType.Global
export const isKindFeed = (feed: Feed): feed is KindFeed => feed[0] === FeedType.Kind
export const isListFeed = (feed: Feed): feed is ListFeed => feed[0] === FeedType.List
export const isLabelFeed = (feed: Feed): feed is LabelFeed => feed[0] === FeedType.Label
export const isWOTFeed = (feed: Feed): feed is WOTFeed => feed[0] === FeedType.WOT
export const isRelayFeed = (feed: Feed): feed is RelayFeed => feed[0] === FeedType.Relay
export const isScopeFeed = (feed: Feed): feed is ScopeFeed => feed[0] === FeedType.Scope
export const isSearchFeed = (feed: Feed): feed is SearchFeed => feed[0] === FeedType.Search
export const isTagFeed = (feed: Feed): feed is TagFeed => feed[0] === FeedType.Tag
export const isUnionFeed = (feed: Feed): feed is UnionFeed => feed[0] === FeedType.Union
export function getFeedArgs(feed: IntersectionFeed | UnionFeed | DifferenceFeed): Feed[]
export function getFeedArgs(feed: AddressFeed | AuthorFeed | IDFeed | RelayFeed | SearchFeed): string[]
export function getFeedArgs(
feed: AddressFeed | AuthorFeed | IDFeed | RelayFeed | SearchFeed,
): string[]
export function getFeedArgs(feed: CreatedAtFeed): CreatedAtItem[]
export function getFeedArgs(feed: ListFeed): ListItem[]
export function getFeedArgs(feed: LabelFeed): LabelItem[]
@@ -79,23 +99,42 @@ export function getFeedArgs(feed: TagFeed): [string, ...string[]]
export function getFeedArgs(feed: GlobalFeed): []
export function getFeedArgs(feed: Feed) {
switch (feed[0]) {
case FeedType.Intersection: return feed.slice(1) as Feed[]
case FeedType.Union: return feed.slice(1) as Feed[]
case FeedType.Difference: return feed.slice(1) as Feed[]
case FeedType.Address: return feed.slice(1) as string[]
case FeedType.Author: return feed.slice(1) as string[]
case FeedType.ID: return feed.slice(1) as string[]
case FeedType.Relay: return feed.slice(1) as string[]
case FeedType.Search: return feed.slice(1) as string[]
case FeedType.Tag: return feed.slice(1) as [string, ...string[]]
case FeedType.CreatedAt: return feed.slice(1) as CreatedAtItem[]
case FeedType.List: return feed.slice(1) as ListItem[]
case FeedType.Label: return feed.slice(1) as LabelItem[]
case FeedType.DVM: return feed.slice(1) as DVMItem[]
case FeedType.WOT: return feed.slice(1) as WOTItem[]
case FeedType.Scope: return feed.slice(1) as Scope[]
case FeedType.Kind: return feed.slice(1) as number[]
case FeedType.Global: return feed.slice(1) as never[]
case FeedType.Intersection:
return feed.slice(1) as Feed[]
case FeedType.Union:
return feed.slice(1) as Feed[]
case FeedType.Difference:
return feed.slice(1) as Feed[]
case FeedType.Address:
return feed.slice(1) as string[]
case FeedType.Author:
return feed.slice(1) as string[]
case FeedType.ID:
return feed.slice(1) as string[]
case FeedType.Relay:
return feed.slice(1) as string[]
case FeedType.Search:
return feed.slice(1) as string[]
case FeedType.Tag:
return feed.slice(1) as [string, ...string[]]
case FeedType.CreatedAt:
return feed.slice(1) as CreatedAtItem[]
case FeedType.List:
return feed.slice(1) as ListItem[]
case FeedType.Label:
return feed.slice(1) as LabelItem[]
case FeedType.DVM:
return feed.slice(1) as DVMItem[]
case FeedType.WOT:
return feed.slice(1) as WOTItem[]
case FeedType.Scope:
return feed.slice(1) as Scope[]
case FeedType.Kind:
return feed.slice(1) as number[]
case FeedType.Global:
return feed.slice(1) as never[]
default:
throw new Error(`Invalid feed type ${feed[0]}`)
}
}
@@ -103,11 +142,11 @@ export const hasSubFeeds = (feed: Feed): feed is IntersectionFeed | UnionFeed |
[FeedType.Union, FeedType.Intersection, FeedType.Difference].includes(feed[0])
export const defaultTagFeedMappings: TagFeedMapping[] = [
['a', [FeedType.Address]],
['e', [FeedType.ID]],
['p', [FeedType.Author]],
['r', [FeedType.Relay]],
['t', [FeedType.Tag, '#t']],
["a", [FeedType.Address]],
["e", [FeedType.ID]],
["p", [FeedType.Author]],
["r", [FeedType.Relay]],
["t", [FeedType.Tag, "#t"]],
]
export const feedsFromTags = (tags: string[][], mappings?: TagFeedMapping[]) => {
@@ -143,18 +182,17 @@ export const feedsFromFilter = ({since, until, ...filter}: Filter) => {
}
for (const [k, v] of Object.entries(filter)) {
if (k === 'ids') feeds.push(makeIDFeed(...v as string[]))
else if (k === 'kinds') feeds.push(makeKindFeed(...v as number[]))
else if (k === 'authors') feeds.push(makeAuthorFeed(...v as string[]))
else if (k.startsWith('#')) feeds.push(makeTagFeed(k as string, ...v as string[]))
if (k === "ids") feeds.push(makeIDFeed(...(v as string[])))
else if (k === "kinds") feeds.push(makeKindFeed(...(v as number[])))
else if (k === "authors") feeds.push(makeAuthorFeed(...(v as string[])))
else if (k.startsWith("#")) feeds.push(makeTagFeed(k as string, ...(v as string[])))
else throw new Error(`Unable to create feed from filter ${k}: ${v}`)
}
return feeds
}
export const feedFromFilter = (filter: Filter) =>
makeIntersectionFeed(...feedsFromFilter(filter))
export const feedFromFilter = (filter: Filter) => makeIntersectionFeed(...feedsFromFilter(filter))
export const feedsFromFilters = (filters: Filter[]) =>
makeUnionFeed(...filters.map(filter => feedFromFilter(filter)))
-7
View File
@@ -1,7 +0,0 @@
{
"targets": [
{"extname": ".cjs", "module": "commonjs"},
{"extname": ".mjs", "module": "esnext", "moduleResolution": "node"}
],
"projects": ["tsconfig.json"]
}
+7 -4
View File
@@ -3,9 +3,12 @@
"compilerOptions": {
"rootDir": ".",
"outDir": "build",
"esModuleInterop": true,
"skipLibCheck": true,
"lib": ["esnext", "dom", "dom.iterable"]
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": ["esnext", "dom"]
},
"include": ["src/**/*.ts"]
"include": [
"src/**/*.ts",
"test/**/*.ts"
]
}