@welshman/app 0.10.3 → 0.10.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/dist/domain/src/behaviors/Imeta.d.ts +38 -0
- package/dist/domain/src/behaviors/Imeta.d.ts.map +1 -0
- package/dist/domain/src/behaviors/Imeta.js +80 -0
- package/dist/domain/src/behaviors/Imeta.js.map +1 -0
- package/dist/domain/src/core/EventReader.d.ts +2 -0
- package/dist/domain/src/core/EventReader.d.ts.map +1 -1
- package/dist/domain/src/core/EventReader.js +4 -0
- package/dist/domain/src/core/EventReader.js.map +1 -1
- package/dist/domain/src/core/EventWriter.d.ts +9 -1
- package/dist/domain/src/core/EventWriter.d.ts.map +1 -1
- package/dist/domain/src/core/EventWriter.js +17 -2
- package/dist/domain/src/core/EventWriter.js.map +1 -1
- package/dist/domain/src/index.d.ts +10 -0
- package/dist/domain/src/index.d.ts.map +1 -1
- package/dist/domain/src/index.js +10 -0
- package/dist/domain/src/index.js.map +1 -1
- package/dist/domain/src/kinds/BadgeAward.d.ts +19 -0
- package/dist/domain/src/kinds/BadgeAward.d.ts.map +1 -0
- package/dist/domain/src/kinds/BadgeAward.js +49 -0
- package/dist/domain/src/kinds/BadgeAward.js.map +1 -0
- package/dist/domain/src/kinds/BadgeDefinition.d.ts +25 -0
- package/dist/domain/src/kinds/BadgeDefinition.d.ts.map +1 -0
- package/dist/domain/src/kinds/BadgeDefinition.js +58 -0
- package/dist/domain/src/kinds/BadgeDefinition.js.map +1 -0
- package/dist/domain/src/kinds/CalendarRsvp.d.ts +27 -0
- package/dist/domain/src/kinds/CalendarRsvp.d.ts.map +1 -0
- package/dist/domain/src/kinds/CalendarRsvp.js +92 -0
- package/dist/domain/src/kinds/CalendarRsvp.js.map +1 -0
- package/dist/domain/src/kinds/DateEvent.d.ts +24 -0
- package/dist/domain/src/kinds/DateEvent.d.ts.map +1 -0
- package/dist/domain/src/kinds/DateEvent.js +74 -0
- package/dist/domain/src/kinds/DateEvent.js.map +1 -0
- package/dist/domain/src/kinds/Picture.d.ts +25 -0
- package/dist/domain/src/kinds/Picture.d.ts.map +1 -0
- package/dist/domain/src/kinds/Picture.js +69 -0
- package/dist/domain/src/kinds/Picture.js.map +1 -0
- package/dist/domain/src/kinds/ProfileBadges.d.ts +27 -0
- package/dist/domain/src/kinds/ProfileBadges.d.ts.map +1 -0
- package/dist/domain/src/kinds/ProfileBadges.js +67 -0
- package/dist/domain/src/kinds/ProfileBadges.js.map +1 -0
- package/dist/domain/src/kinds/Wiki.d.ts +35 -0
- package/dist/domain/src/kinds/Wiki.d.ts.map +1 -0
- package/dist/domain/src/kinds/Wiki.js +107 -0
- package/dist/domain/src/kinds/Wiki.js.map +1 -0
- package/dist/domain/src/kinds/WikiMergeRequest.d.ts +27 -0
- package/dist/domain/src/kinds/WikiMergeRequest.d.ts.map +1 -0
- package/dist/domain/src/kinds/WikiMergeRequest.js +94 -0
- package/dist/domain/src/kinds/WikiMergeRequest.js.map +1 -0
- package/dist/domain/src/kinds/WikiRedirect.d.ts +20 -0
- package/dist/domain/src/kinds/WikiRedirect.d.ts.map +1 -0
- package/dist/domain/src/kinds/WikiRedirect.js +65 -0
- package/dist/domain/src/kinds/WikiRedirect.js.map +1 -0
- package/dist/lib/src/Tools.d.ts +5 -2
- package/dist/lib/src/Tools.d.ts.map +1 -1
- package/dist/lib/src/Tools.js +18 -11
- package/dist/lib/src/Tools.js.map +1 -1
- package/dist/util/src/Kinds.d.ts +2 -0
- package/dist/util/src/Kinds.d.ts.map +1 -1
- package/dist/util/src/Kinds.js +2 -0
- package/dist/util/src/Kinds.js.map +1 -1
- package/dist/util/src/RelaySelection.d.ts +1 -0
- package/dist/util/src/RelaySelection.d.ts.map +1 -1
- package/dist/util/src/RelaySelection.js +1 -0
- package/dist/util/src/RelaySelection.js.map +1 -1
- package/dist/util/src/Wiki.d.ts +3 -0
- package/dist/util/src/Wiki.d.ts.map +1 -0
- package/dist/util/src/Wiki.js +16 -0
- package/dist/util/src/Wiki.js.map +1 -0
- package/dist/util/src/index.d.ts +1 -0
- package/dist/util/src/index.d.ts.map +1 -1
- package/dist/util/src/index.js +1 -0
- package/dist/util/src/index.js.map +1 -1
- package/package.json +15 -15
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { TrustedEvent } from "@welshman/util";
|
|
2
|
+
import { EventReader } from "../core/EventReader.js";
|
|
3
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
4
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
5
|
+
import { KindFactory } from "../core/Kind.js";
|
|
6
|
+
export type RsvpStatus = "accepted" | "declined" | "tentative";
|
|
7
|
+
export type RsvpFreebusy = "free" | "busy";
|
|
8
|
+
export declare class CalendarRsvpReader extends EventReader {
|
|
9
|
+
calendarEvent(): string | undefined;
|
|
10
|
+
calendarEventId(): string | undefined;
|
|
11
|
+
status(): RsvpStatus | undefined;
|
|
12
|
+
freebusy(): RsvpFreebusy | undefined;
|
|
13
|
+
}
|
|
14
|
+
export declare class CalendarRsvpWriter extends EventWriter<CalendarRsvpReader> {
|
|
15
|
+
setCalendarEvent(address: string): this;
|
|
16
|
+
setCalendarEventFromEvent(event: TrustedEvent): this;
|
|
17
|
+
setStatus(status: RsvpStatus): this;
|
|
18
|
+
setFreebusy(freebusy: RsvpFreebusy): this;
|
|
19
|
+
clearFreebusy(): this;
|
|
20
|
+
validate(): void;
|
|
21
|
+
}
|
|
22
|
+
export declare class CalendarRsvpQuery extends EventQuery {
|
|
23
|
+
forCalendarEvent(address: string): this;
|
|
24
|
+
protected renderRoutes(): import("@welshman/util").RelaySelection[];
|
|
25
|
+
}
|
|
26
|
+
export declare const CalendarRsvp: KindFactory<CalendarRsvpReader, CalendarRsvpWriter, CalendarRsvpQuery>;
|
|
27
|
+
//# sourceMappingURL=CalendarRsvp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarRsvp.d.ts","sourceRoot":"","sources":["../../../../../domain/src/kinds/CalendarRsvp.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAE3C,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,CAAA;AAE9D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAA;AAI1C,qBAAa,kBAAmB,SAAQ,WAAW;IACjD,aAAa;IAKb,eAAe;IAIf,MAAM,IACmD,UAAU,GAAG,SAAS;IAK/E,QAAQ,IAC6C,YAAY,GAAG,SAAS;CAE9E;AAED,qBAAa,kBAAmB,SAAQ,WAAW,CAAC,kBAAkB,CAAC;IAErE,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAMhC,yBAAyB,CAAC,KAAK,EAAE,YAAY;IAe7C,SAAS,CAAC,MAAM,EAAE,UAAU;IAW5B,WAAW,CAAC,QAAQ,EAAE,YAAY;IAIlC,aAAa;IAIb,QAAQ;CAeT;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IAE/C,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAIhC,SAAS,CAAC,YAAY;CAWvB;AAED,eAAO,MAAM,YAAY,wEAKvB,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { spec } from "@welshman/lib";
|
|
2
|
+
import { Address, EVENT_RSVP, addressTags, getAddress, hexTags, inbox, outbox, tagSpec, tagValue, } from "@welshman/util";
|
|
3
|
+
import { EventReader } from "../core/EventReader.js";
|
|
4
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
5
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
6
|
+
import { KindFactory } from "../core/Kind.js";
|
|
7
|
+
// NIP-52 kind-31925 rsvp to a calendar event. It names the event by address, since
|
|
8
|
+
// a `DateEvent` or `TimeEvent` may be edited after the rsvp is written.
|
|
9
|
+
export class CalendarRsvpReader extends EventReader {
|
|
10
|
+
calendarEvent() {
|
|
11
|
+
return tagValue(addressTags("a"), this.event.tags);
|
|
12
|
+
}
|
|
13
|
+
// The exact revision of the calendar event replied to, when the author pinned one.
|
|
14
|
+
calendarEventId() {
|
|
15
|
+
return tagValue(hexTags("e"), this.event.tags);
|
|
16
|
+
}
|
|
17
|
+
status() {
|
|
18
|
+
return tagValue(tagSpec("status"), this.event.tags);
|
|
19
|
+
}
|
|
20
|
+
// Whether the author is otherwise free, which is separate from whether they
|
|
21
|
+
// are coming. Absent on a declined rsvp.
|
|
22
|
+
freebusy() {
|
|
23
|
+
return tagValue(tagSpec("fb"), this.event.tags);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class CalendarRsvpWriter extends EventWriter {
|
|
27
|
+
// An rsvp answers exactly one calendar event, so replace any existing one.
|
|
28
|
+
setCalendarEvent(address) {
|
|
29
|
+
return this.dropTags(spec(["a"])).addTags(["a", address]);
|
|
30
|
+
}
|
|
31
|
+
// Pins the rsvp to this revision of the event and credits its organizer, so the
|
|
32
|
+
// rsvp reaches their inbox.
|
|
33
|
+
setCalendarEventFromEvent(event) {
|
|
34
|
+
this.setCalendarEvent(getAddress(event));
|
|
35
|
+
this.addMention(event.pubkey);
|
|
36
|
+
const tag = ["e", event.id, ""];
|
|
37
|
+
this.dropTags(spec(["e"])).addTags(tag);
|
|
38
|
+
this.hint(outbox(event.pubkey)).then(url => {
|
|
39
|
+
tag[2] = url;
|
|
40
|
+
});
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
setStatus(status) {
|
|
44
|
+
this.dropTags(spec(["status"])).addTags(["status", status]);
|
|
45
|
+
// NIP-52 has no free/busy on a declined rsvp — there is nothing to block out.
|
|
46
|
+
if (status === "declined") {
|
|
47
|
+
this.clearFreebusy();
|
|
48
|
+
}
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
setFreebusy(freebusy) {
|
|
52
|
+
return this.dropTags(spec(["fb"])).addTags(["fb", freebusy]);
|
|
53
|
+
}
|
|
54
|
+
clearFreebusy() {
|
|
55
|
+
return this.dropTags(spec(["fb"]));
|
|
56
|
+
}
|
|
57
|
+
validate() {
|
|
58
|
+
super.validate();
|
|
59
|
+
if (!this.extraTags.some(spec(["a"]))) {
|
|
60
|
+
throw new Error("An rsvp must name a calendar event via an a tag");
|
|
61
|
+
}
|
|
62
|
+
if (!this.extraTags.some(spec(["status"]))) {
|
|
63
|
+
throw new Error("An rsvp must have a status");
|
|
64
|
+
}
|
|
65
|
+
if (this.extraTags.some(spec(["status", "declined"])) && this.extraTags.some(spec(["fb"]))) {
|
|
66
|
+
throw new Error("A declined rsvp must not say whether its author is free");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export class CalendarRsvpQuery extends EventQuery {
|
|
71
|
+
// Every rsvp to a calendar event, whoever wrote it.
|
|
72
|
+
forCalendarEvent(address) {
|
|
73
|
+
return this.addTag("a", [address]);
|
|
74
|
+
}
|
|
75
|
+
renderRoutes() {
|
|
76
|
+
const organizers = (this.tagValues.get("a") ?? [])
|
|
77
|
+
.filter(address => Address.isAddress(address))
|
|
78
|
+
.map(address => Address.from(address).pubkey);
|
|
79
|
+
return [
|
|
80
|
+
...this.authorRoutes(),
|
|
81
|
+
...this.mentionRoutes(),
|
|
82
|
+
...organizers.map(pubkey => inbox(pubkey, 0.5)),
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export const CalendarRsvp = new KindFactory({
|
|
87
|
+
kind: EVENT_RSVP,
|
|
88
|
+
reader: CalendarRsvpReader,
|
|
89
|
+
writer: CalendarRsvpWriter,
|
|
90
|
+
query: CalendarRsvpQuery,
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=CalendarRsvp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CalendarRsvp.js","sourceRoot":"","sources":["../../../../../domain/src/kinds/CalendarRsvp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EventReader } from "../core/EventReader.js";
|
|
2
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
3
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
4
|
+
import { KindFactory } from "../core/Kind.js";
|
|
5
|
+
import type { KindContext } from "../core/Kind.js";
|
|
6
|
+
export declare class DateEventReader extends EventReader {
|
|
7
|
+
title(): string | undefined;
|
|
8
|
+
location(): string | undefined;
|
|
9
|
+
start(): string | undefined;
|
|
10
|
+
end(): string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare class DateEventWriter extends EventWriter<DateEventReader> {
|
|
13
|
+
constructor(kind: number, context: KindContext, reader?: DateEventReader);
|
|
14
|
+
setTitle(title: string): this;
|
|
15
|
+
setLocation(location: string): this;
|
|
16
|
+
setStart(start: string): this;
|
|
17
|
+
setEnd(end: string): this;
|
|
18
|
+
protected renderDomainTags(): string[][];
|
|
19
|
+
}
|
|
20
|
+
export declare class DateEventQuery extends EventQuery {
|
|
21
|
+
protected renderRoutes(): import("@welshman/util").RelaySelection[];
|
|
22
|
+
}
|
|
23
|
+
export declare const DateEvent: KindFactory<DateEventReader, DateEventWriter, DateEventQuery>;
|
|
24
|
+
//# sourceMappingURL=DateEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateEvent.d.ts","sourceRoot":"","sources":["../../../../../domain/src/kinds/DateEvent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAY,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAahD,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,KAAK;IAIL,QAAQ;IAIR,KAAK;IAKL,GAAG;CAGJ;AAED,qBAAa,eAAgB,SAAQ,WAAW,CAAC,eAAe,CAAC;gBACnD,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,eAAe;IASxE,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,WAAW,CAAC,QAAQ,EAAE,MAAM;IAI5B,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,SAAS,CAAC,gBAAgB;CAc3B;AAED,qBAAa,cAAe,SAAQ,UAAU;IAC5C,SAAS,CAAC,YAAY;CAGvB;AAED,eAAO,MAAM,SAAS,+DAKpB,CAAA"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { range, DAY, spec } from "@welshman/lib";
|
|
2
|
+
import { EVENT_DATE, tagSpec, tagValue } from "@welshman/util";
|
|
3
|
+
import { EventReader } from "../core/EventReader.js";
|
|
4
|
+
import { EventWriter, TagParser } from "../core/EventWriter.js";
|
|
5
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
6
|
+
import { KindFactory } from "../core/Kind.js";
|
|
7
|
+
// A date-based event spans whole days in no particular timezone, so its bounds are
|
|
8
|
+
// `YYYY-MM-DD` strings rather than timestamps. Parsing one gives the UTC midnight
|
|
9
|
+
// it starts at, which is what the day buckets are counted from.
|
|
10
|
+
const parseDate = (date = "") => {
|
|
11
|
+
const ts = Date.parse(date);
|
|
12
|
+
return isNaN(ts) ? undefined : ts / 1000;
|
|
13
|
+
};
|
|
14
|
+
// NIP-52 kind-31922 date-based calendar event — an all-day event, as against
|
|
15
|
+
// `TimeEvent`'s kind 31923, which starts and ends at an instant.
|
|
16
|
+
export class DateEventReader extends EventReader {
|
|
17
|
+
title() {
|
|
18
|
+
return tagValue(tagSpec("title"), this.event.tags);
|
|
19
|
+
}
|
|
20
|
+
location() {
|
|
21
|
+
return tagValue(tagSpec("location"), this.event.tags);
|
|
22
|
+
}
|
|
23
|
+
start() {
|
|
24
|
+
return tagValue(tagSpec("start"), this.event.tags);
|
|
25
|
+
}
|
|
26
|
+
// The day after the last one the event covers, per NIP-52. Absent on a one-day event.
|
|
27
|
+
end() {
|
|
28
|
+
return tagValue(tagSpec("end"), this.event.tags);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class DateEventWriter extends EventWriter {
|
|
32
|
+
constructor(kind, context, reader) {
|
|
33
|
+
super(kind, context, reader);
|
|
34
|
+
const parser = new TagParser(this.extraTags);
|
|
35
|
+
parser.consume("D");
|
|
36
|
+
this.extraTags = parser.tags;
|
|
37
|
+
}
|
|
38
|
+
setTitle(title) {
|
|
39
|
+
return this.dropTags(spec(["title"])).addTags(["title", title]);
|
|
40
|
+
}
|
|
41
|
+
setLocation(location) {
|
|
42
|
+
return this.dropTags(spec(["location"])).addTags(["location", location]);
|
|
43
|
+
}
|
|
44
|
+
setStart(start) {
|
|
45
|
+
return this.dropTags(spec(["start"])).addTags(["start", start]);
|
|
46
|
+
}
|
|
47
|
+
setEnd(end) {
|
|
48
|
+
return this.dropTags(spec(["end"])).addTags(["end", end]);
|
|
49
|
+
}
|
|
50
|
+
renderDomainTags() {
|
|
51
|
+
const tags = [];
|
|
52
|
+
const start = parseDate(this.extraTags.find(spec(["start"]))?.[1]);
|
|
53
|
+
const end = parseDate(this.extraTags.find(spec(["end"]))?.[1]);
|
|
54
|
+
// An event with no end covers its start day alone.
|
|
55
|
+
if (start !== undefined) {
|
|
56
|
+
for (const t of range(start, end ?? start + DAY, DAY)) {
|
|
57
|
+
tags.push(["D", String(Math.floor(t / DAY))]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return tags;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export class DateEventQuery extends EventQuery {
|
|
64
|
+
renderRoutes() {
|
|
65
|
+
return [...this.authorRoutes(), ...this.mentionRoutes()];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export const DateEvent = new KindFactory({
|
|
69
|
+
kind: EVENT_DATE,
|
|
70
|
+
reader: DateEventReader,
|
|
71
|
+
writer: DateEventWriter,
|
|
72
|
+
query: DateEventQuery,
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=DateEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateEvent.js","sourceRoot":"","sources":["../../../../../domain/src/kinds/DateEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAC,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,gBAAgB,CAAA;AAC5D,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAG3C,mFAAmF;AACnF,kFAAkF;AAClF,gEAAgE;AAChE,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAE3B,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAA;AAC1C,CAAC,CAAA;AAED,6EAA6E;AAC7E,iEAAiE;AACjE,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,KAAK;QACH,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,QAAQ;QACN,OAAO,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAED,KAAK;QACH,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,sFAAsF;IACtF,GAAG;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAClD,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,WAA4B;IAC/D,YAAY,IAAY,EAAE,OAAoB,EAAE,MAAwB;QACtE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAE5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE5C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;IAC9B,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAC3D,CAAC;IAES,gBAAgB;QACxB,MAAM,IAAI,GAAe,EAAE,CAAA;QAC3B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CAAC,CAAA;QAC5E,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAW,CAAC,CAAA;QAExE,mDAAmD;QACnD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAClC,YAAY;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;IAC1D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC;IACvC,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE,cAAc;CACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EventReader } from "../core/EventReader.js";
|
|
2
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
3
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
4
|
+
import { KindFactory } from "../core/Kind.js";
|
|
5
|
+
import type { KindContext } from "../core/Kind.js";
|
|
6
|
+
export declare class PictureReader extends EventReader {
|
|
7
|
+
title(): string | undefined;
|
|
8
|
+
topics(): string[];
|
|
9
|
+
location(): string | undefined;
|
|
10
|
+
geohash(): string | undefined;
|
|
11
|
+
}
|
|
12
|
+
export declare class PictureWriter extends EventWriter<PictureReader> {
|
|
13
|
+
constructor(kind: number, context: KindContext, reader?: PictureReader);
|
|
14
|
+
setTitle(title: string): this;
|
|
15
|
+
setTopics(topics: string[]): this;
|
|
16
|
+
setLocation(location: string): this;
|
|
17
|
+
setGeohash(geohash: string): this;
|
|
18
|
+
validate(): void;
|
|
19
|
+
protected renderDomainTags(): string[][];
|
|
20
|
+
}
|
|
21
|
+
export declare class PictureQuery extends EventQuery {
|
|
22
|
+
protected renderRoutes(): import("@welshman/util").RelaySelection[];
|
|
23
|
+
}
|
|
24
|
+
export declare const Picture: KindFactory<PictureReader, PictureWriter, PictureQuery>;
|
|
25
|
+
//# sourceMappingURL=Picture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Picture.d.ts","sourceRoot":"","sources":["../../../../../domain/src/kinds/Picture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAY,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAIhD,qBAAa,aAAc,SAAQ,WAAW;IAC5C,KAAK;IAIL,MAAM;IAIN,QAAQ;IAIR,OAAO;CAGR;AAED,qBAAa,aAAc,SAAQ,WAAW,CAAC,aAAa,CAAC;gBAC/C,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,aAAa;IAUtE,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE;IAI1B,WAAW,CAAC,QAAQ,EAAE,MAAM;IAI5B,UAAU,CAAC,OAAO,EAAE,MAAM;IAI1B,QAAQ;IAUR,SAAS,CAAC,gBAAgB;CAO3B;AAED,qBAAa,YAAa,SAAQ,UAAU;IAC1C,SAAS,CAAC,YAAY;CAGvB;AAED,eAAO,MAAM,OAAO,yDAKlB,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { removeUndefined, spec, uniq } from "@welshman/lib";
|
|
2
|
+
import { PICTURE_NOTE, tagSpec, tagValue, tagValues, topicTags } from "@welshman/util";
|
|
3
|
+
import { EventReader } from "../core/EventReader.js";
|
|
4
|
+
import { EventWriter, TagParser } from "../core/EventWriter.js";
|
|
5
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
6
|
+
import { KindFactory } from "../core/Kind.js";
|
|
7
|
+
// NIP-68 kind-20 picture event. The content is the description; every image is an
|
|
8
|
+
// `imeta` tag, read through the reader's `imeta()`.
|
|
9
|
+
export class PictureReader extends EventReader {
|
|
10
|
+
title() {
|
|
11
|
+
return tagValue(tagSpec("title"), this.event.tags);
|
|
12
|
+
}
|
|
13
|
+
topics() {
|
|
14
|
+
return tagValues(topicTags("t"), this.event.tags);
|
|
15
|
+
}
|
|
16
|
+
location() {
|
|
17
|
+
return tagValue(tagSpec("location"), this.event.tags);
|
|
18
|
+
}
|
|
19
|
+
geohash() {
|
|
20
|
+
return tagValue(tagSpec("g"), this.event.tags);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class PictureWriter extends EventWriter {
|
|
24
|
+
constructor(kind, context, reader) {
|
|
25
|
+
super(kind, context, reader);
|
|
26
|
+
const parser = new TagParser(this.extraTags);
|
|
27
|
+
parser.consume("x");
|
|
28
|
+
parser.consume("m");
|
|
29
|
+
this.extraTags = parser.tags;
|
|
30
|
+
}
|
|
31
|
+
setTitle(title) {
|
|
32
|
+
return this.dropTags(spec(["title"])).addTags(["title", title]);
|
|
33
|
+
}
|
|
34
|
+
setTopics(topics) {
|
|
35
|
+
return this.dropTags(spec(["t"])).addTags(...topics.map(topic => ["t", topic]));
|
|
36
|
+
}
|
|
37
|
+
setLocation(location) {
|
|
38
|
+
return this.dropTags(spec(["location"])).addTags(["location", location]);
|
|
39
|
+
}
|
|
40
|
+
setGeohash(geohash) {
|
|
41
|
+
return this.dropTags(spec(["g"])).addTags(["g", geohash]);
|
|
42
|
+
}
|
|
43
|
+
validate() {
|
|
44
|
+
super.validate();
|
|
45
|
+
if (this.imeta().length === 0) {
|
|
46
|
+
throw new Error("A picture event must have at least one image");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// NIP-68 repeats each image's hash and mime type at the top level so pictures can
|
|
50
|
+
// be found by them without reading every imeta tag.
|
|
51
|
+
renderDomainTags() {
|
|
52
|
+
const images = this.imeta();
|
|
53
|
+
const hashes = uniq(removeUndefined(images.map(image => image.hash)));
|
|
54
|
+
const mimeTypes = uniq(removeUndefined(images.map(image => image.mimeType)));
|
|
55
|
+
return [...hashes.map(hash => ["x", hash]), ...mimeTypes.map(mimeType => ["m", mimeType])];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class PictureQuery extends EventQuery {
|
|
59
|
+
renderRoutes() {
|
|
60
|
+
return [...this.authorRoutes(), ...this.mentionRoutes()];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export const Picture = new KindFactory({
|
|
64
|
+
kind: PICTURE_NOTE,
|
|
65
|
+
reader: PictureReader,
|
|
66
|
+
writer: PictureWriter,
|
|
67
|
+
query: PictureQuery,
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=Picture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Picture.js","sourceRoot":"","sources":["../../../../../domain/src/kinds/Picture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAC,MAAM,eAAe,CAAA;AACzD,OAAO,EAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAA;AACpF,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAG3C,kFAAkF;AAClF,oDAAoD;AACpD,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,KAAK;QACH,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,MAAM;QACJ,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,QAAQ;QACN,OAAO,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAED,OAAO;QACL,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,WAA0B;IAC3D,YAAY,IAAY,EAAE,OAAoB,EAAE,MAAsB;QACpE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAE5B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAE5C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACnB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACnB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAA;IAC9B,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,SAAS,CAAC,MAAgB;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IACjF,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC1E,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAA;QAEhB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,oDAAoD;IAC1C,gBAAgB;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAE5E,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC5F,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,UAAU;IAChC,YAAY;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAA;IAC1D,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;IACrC,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,KAAK,EAAE,YAAY;CACpB,CAAC,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EventReader } from "../core/EventReader.js";
|
|
2
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
3
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
4
|
+
import { KindFactory } from "../core/Kind.js";
|
|
5
|
+
import type { KindContext } from "../core/Kind.js";
|
|
6
|
+
export declare const PROFILE_BADGES_IDENTIFIER = "profile_badges";
|
|
7
|
+
export type ProfileBadge = {
|
|
8
|
+
address: string;
|
|
9
|
+
awardId: string;
|
|
10
|
+
relay?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare class ProfileBadgesReader extends EventReader {
|
|
13
|
+
badges(): ProfileBadge[];
|
|
14
|
+
includes(address: string): boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class ProfileBadgesWriter extends EventWriter<ProfileBadgesReader> {
|
|
17
|
+
constructor(kind: number, context: KindContext, reader?: ProfileBadgesReader);
|
|
18
|
+
setBadges(badges: ProfileBadge[]): this;
|
|
19
|
+
addBadge(badge: ProfileBadge): this;
|
|
20
|
+
removeBadge(address: string): this;
|
|
21
|
+
private withoutBadge;
|
|
22
|
+
}
|
|
23
|
+
export declare class ProfileBadgesQuery extends EventQuery {
|
|
24
|
+
protected renderRoutes(): import("@welshman/util").RelaySelection[];
|
|
25
|
+
}
|
|
26
|
+
export declare const ProfileBadges: KindFactory<ProfileBadgesReader, ProfileBadgesWriter, ProfileBadgesQuery>;
|
|
27
|
+
//# sourceMappingURL=ProfileBadges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileBadges.d.ts","sourceRoot":"","sources":["../../../../../domain/src/kinds/ProfileBadges.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAIhD,eAAO,MAAM,yBAAyB,mBAAmB,CAAA;AAEzD,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AA0BD,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,MAAM,IAAI,YAAY,EAAE;IAIxB,QAAQ,CAAC,OAAO,EAAE,MAAM;CAGzB;AAED,qBAAa,mBAAoB,SAAQ,WAAW,CAAC,mBAAmB,CAAC;gBAC3D,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,mBAAmB;IAM5E,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE;IAKhC,QAAQ,CAAC,KAAK,EAAE,YAAY;IAI5B,WAAW,CAAC,OAAO,EAAE,MAAM;IAI3B,OAAO,CAAC,YAAY;CAGrB;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,SAAS,CAAC,YAAY;CAGvB;AAED,eAAO,MAAM,aAAa,2EAKxB,CAAA"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { isHex32, removeUndefined, somePass, spec } from "@welshman/lib";
|
|
2
|
+
import { Address, BADGES } from "@welshman/util";
|
|
3
|
+
import { EventReader } from "../core/EventReader.js";
|
|
4
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
5
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
6
|
+
import { KindFactory } from "../core/Kind.js";
|
|
7
|
+
// NIP-58 fixes the identifier of a profile badges event, so there is only ever one
|
|
8
|
+
// per pubkey.
|
|
9
|
+
export const PROFILE_BADGES_IDENTIFIER = "profile_badges";
|
|
10
|
+
// A displayed badge is an `a` tag naming the definition immediately followed by an
|
|
11
|
+
// `e` tag naming the award, so badges are read positionally rather than by key.
|
|
12
|
+
const parseBadges = (tags) => {
|
|
13
|
+
const badges = [];
|
|
14
|
+
for (let i = 0; i < tags.length - 1; i++) {
|
|
15
|
+
const [key, address] = tags[i];
|
|
16
|
+
const [nextKey, awardId, relay] = tags[i + 1];
|
|
17
|
+
if (key === "a" && nextKey === "e" && Address.isAddress(address) && isHex32(awardId)) {
|
|
18
|
+
badges.push({ address, awardId, relay: relay || undefined });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return badges;
|
|
22
|
+
};
|
|
23
|
+
const renderBadge = ({ address, awardId, relay }) => [
|
|
24
|
+
["a", address],
|
|
25
|
+
removeUndefined(["e", awardId, relay]),
|
|
26
|
+
];
|
|
27
|
+
// NIP-58 kind-30008 profile badges — the badges a pubkey has accepted, in the
|
|
28
|
+
// order they should be displayed.
|
|
29
|
+
export class ProfileBadgesReader extends EventReader {
|
|
30
|
+
badges() {
|
|
31
|
+
return parseBadges(this.event.tags);
|
|
32
|
+
}
|
|
33
|
+
includes(address) {
|
|
34
|
+
return this.badges().some(badge => badge.address === address);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class ProfileBadgesWriter extends EventWriter {
|
|
38
|
+
constructor(kind, context, reader) {
|
|
39
|
+
super(kind, context, reader);
|
|
40
|
+
this.identifierTag = ["d", PROFILE_BADGES_IDENTIFIER];
|
|
41
|
+
}
|
|
42
|
+
setBadges(badges) {
|
|
43
|
+
return this.dropTags(somePass(spec(["a"]), spec(["e"]))).addTags(...badges.flatMap(renderBadge));
|
|
44
|
+
}
|
|
45
|
+
// Accepting a badge already displayed moves it to the end rather than listing it twice.
|
|
46
|
+
addBadge(badge) {
|
|
47
|
+
return this.setBadges([...this.withoutBadge(badge.address), badge]);
|
|
48
|
+
}
|
|
49
|
+
removeBadge(address) {
|
|
50
|
+
return this.setBadges(this.withoutBadge(address));
|
|
51
|
+
}
|
|
52
|
+
withoutBadge(address) {
|
|
53
|
+
return parseBadges(this.extraTags).filter(badge => badge.address !== address);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export class ProfileBadgesQuery extends EventQuery {
|
|
57
|
+
renderRoutes() {
|
|
58
|
+
return this.authorRoutes();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export const ProfileBadges = new KindFactory({
|
|
62
|
+
kind: BADGES,
|
|
63
|
+
reader: ProfileBadgesReader,
|
|
64
|
+
writer: ProfileBadgesWriter,
|
|
65
|
+
query: ProfileBadgesQuery,
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=ProfileBadges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileBadges.js","sourceRoot":"","sources":["../../../../../domain/src/kinds/ProfileBadges.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TrustedEvent } from "@welshman/util";
|
|
2
|
+
import { EventReader } from "../core/EventReader.js";
|
|
3
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
4
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
5
|
+
import { KindFactory } from "../core/Kind.js";
|
|
6
|
+
export type WikiVersion = {
|
|
7
|
+
address?: string;
|
|
8
|
+
id?: string;
|
|
9
|
+
relay: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const FORK = "fork";
|
|
12
|
+
export declare const DEFER = "defer";
|
|
13
|
+
export declare class WikiReader extends EventReader {
|
|
14
|
+
title(): string | undefined;
|
|
15
|
+
summary(): string | undefined;
|
|
16
|
+
fork(): WikiVersion | undefined;
|
|
17
|
+
deferral(): WikiVersion | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare class WikiWriter extends EventWriter<WikiReader> {
|
|
20
|
+
setName(name: string): this;
|
|
21
|
+
setTitle(title: string): this;
|
|
22
|
+
setSummary(summary: string): this;
|
|
23
|
+
setFork(event: TrustedEvent): this;
|
|
24
|
+
clearFork(): this;
|
|
25
|
+
setDeferral(event: TrustedEvent): this;
|
|
26
|
+
clearDeferral(): this;
|
|
27
|
+
private setVersion;
|
|
28
|
+
validate(): void;
|
|
29
|
+
}
|
|
30
|
+
export declare class WikiQuery extends EventQuery {
|
|
31
|
+
forName(...names: string[]): this;
|
|
32
|
+
protected renderRoutes(): import("@welshman/util").RelaySelection[];
|
|
33
|
+
}
|
|
34
|
+
export declare const Wiki: KindFactory<WikiReader, WikiWriter, WikiQuery>;
|
|
35
|
+
//# sourceMappingURL=Wiki.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Wiki.d.ts","sourceRoot":"","sources":["../../../../../domain/src/kinds/Wiki.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAA;AAK3C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,IAAI,SAAS,CAAA;AAE1B,eAAO,MAAM,KAAK,UAAU,CAAA;AAkB5B,qBAAa,UAAW,SAAQ,WAAW;IAGzC,KAAK;IAIL,OAAO;IAKP,IAAI;IAMJ,QAAQ;CAGT;AAED,qBAAa,UAAW,SAAQ,WAAW,CAAC,UAAU,CAAC;IAIrD,OAAO,CAAC,IAAI,EAAE,MAAM;IAIpB,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,UAAU,CAAC,OAAO,EAAE,MAAM;IAK1B,OAAO,CAAC,KAAK,EAAE,YAAY;IAI3B,SAAS;IAKT,WAAW,CAAC,KAAK,EAAE,YAAY;IAI/B,aAAa;IAMb,OAAO,CAAC,UAAU;IAmBlB,QAAQ;CAWT;AAED,qBAAa,SAAU,SAAQ,UAAU;IAGvC,OAAO,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE;IAI1B,SAAS,CAAC,YAAY;CAGvB;AAED,eAAO,MAAM,IAAI,gDAKf,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { nthEq, spec } from "@welshman/lib";
|
|
2
|
+
import { WIKI, addressTags, getAddress, hexTags, isNormalizedWikiName, matchTag, normalizeWikiName, outbox, tagSpec, tagValue, } from "@welshman/util";
|
|
3
|
+
import { EventReader } from "../core/EventReader.js";
|
|
4
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
5
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
6
|
+
import { KindFactory } from "../core/Kind.js";
|
|
7
|
+
export const FORK = "fork";
|
|
8
|
+
export const DEFER = "defer";
|
|
9
|
+
const getVersion = (marker, tags) => {
|
|
10
|
+
const marked = tags.filter(nthEq(3, marker));
|
|
11
|
+
const aTag = matchTag(addressTags("a"), marked);
|
|
12
|
+
const eTag = matchTag(hexTags("e"), marked);
|
|
13
|
+
if (!aTag && !eTag)
|
|
14
|
+
return undefined;
|
|
15
|
+
return { address: aTag?.[1], id: eTag?.[1], relay: aTag?.[2] || eTag?.[2] || "" };
|
|
16
|
+
};
|
|
17
|
+
const isVersionTag = (marker) => (tag) => ["a", "e"].includes(tag[0]) && tag[3] === marker;
|
|
18
|
+
// NIP-54 kind-30818 wiki article. The `d` tag is the subject in normalized form,
|
|
19
|
+
// which is how articles by different authors about the same thing find each
|
|
20
|
+
// other, and `content` is Djot.
|
|
21
|
+
export class WikiReader extends EventReader {
|
|
22
|
+
// The subject as the author wrote it, when it differs from the normalized
|
|
23
|
+
// identifier ("Bitcoin" vs "bitcoin").
|
|
24
|
+
title() {
|
|
25
|
+
return tagValue(tagSpec("title"), this.event.tags);
|
|
26
|
+
}
|
|
27
|
+
summary() {
|
|
28
|
+
return tagValue(tagSpec("summary"), this.event.tags);
|
|
29
|
+
}
|
|
30
|
+
// The version this article was forked from.
|
|
31
|
+
fork() {
|
|
32
|
+
return getVersion(FORK, this.event.tags);
|
|
33
|
+
}
|
|
34
|
+
// The version this article defers to as the better one. A stronger signal than
|
|
35
|
+
// a reaction — the author is pointing readers away from their own version.
|
|
36
|
+
deferral() {
|
|
37
|
+
return getVersion(DEFER, this.event.tags);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class WikiWriter extends EventWriter {
|
|
41
|
+
// The article's subject. The identifier is the normalized form, since that's
|
|
42
|
+
// what makes versions of a subject addressable together; the title keeps what
|
|
43
|
+
// the author actually typed.
|
|
44
|
+
setName(name) {
|
|
45
|
+
return this.setIdentifier(normalizeWikiName(name)).setTitle(name);
|
|
46
|
+
}
|
|
47
|
+
setTitle(title) {
|
|
48
|
+
return this.dropTags(spec(["title"])).addTags(["title", title]);
|
|
49
|
+
}
|
|
50
|
+
setSummary(summary) {
|
|
51
|
+
return this.dropTags(spec(["summary"])).addTags(["summary", summary]);
|
|
52
|
+
}
|
|
53
|
+
// `event` is the wiki article this one branched off of.
|
|
54
|
+
setFork(event) {
|
|
55
|
+
return this.setVersion(FORK, event);
|
|
56
|
+
}
|
|
57
|
+
clearFork() {
|
|
58
|
+
return this.dropTags(isVersionTag(FORK));
|
|
59
|
+
}
|
|
60
|
+
// `event` is the wiki article this one yields to.
|
|
61
|
+
setDeferral(event) {
|
|
62
|
+
return this.setVersion(DEFER, event);
|
|
63
|
+
}
|
|
64
|
+
clearDeferral() {
|
|
65
|
+
return this.dropTags(isVersionTag(DEFER));
|
|
66
|
+
}
|
|
67
|
+
// An article forks from, or defers to, one version at a time, so each marker
|
|
68
|
+
// replaces its own tag pair and leaves the other marker's alone.
|
|
69
|
+
setVersion(marker, event) {
|
|
70
|
+
this.dropTags(isVersionTag(marker));
|
|
71
|
+
const tags = [
|
|
72
|
+
["e", event.id, "", marker],
|
|
73
|
+
["a", getAddress(event), "", marker],
|
|
74
|
+
];
|
|
75
|
+
this.addTags(...tags);
|
|
76
|
+
this.hint(outbox(event.pubkey)).then(url => {
|
|
77
|
+
for (const tag of tags) {
|
|
78
|
+
tag[2] = url;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
validate() {
|
|
84
|
+
super.validate();
|
|
85
|
+
const name = this.identifierTag?.[1] ?? "";
|
|
86
|
+
if (!isNormalizedWikiName(name)) {
|
|
87
|
+
throw new Error(`A wiki article's d tag must be normalized (got "${name}", expected "${normalizeWikiName(name)}")`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export class WikiQuery extends EventQuery {
|
|
92
|
+
// Articles about a subject, whoever wrote them. Names are normalized on the way
|
|
93
|
+
// in, so a display title or a wikilink target can be passed as-is.
|
|
94
|
+
forName(...names) {
|
|
95
|
+
return this.addTag("d", names.map(normalizeWikiName));
|
|
96
|
+
}
|
|
97
|
+
renderRoutes() {
|
|
98
|
+
return [...this.authorRoutes(), ...this.mentionRoutes()];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export const Wiki = new KindFactory({
|
|
102
|
+
kind: WIKI,
|
|
103
|
+
reader: WikiReader,
|
|
104
|
+
writer: WikiWriter,
|
|
105
|
+
query: WikiQuery,
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=Wiki.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Wiki.js","sourceRoot":"","sources":["../../../../../domain/src/kinds/Wiki.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { TrustedEvent } from "@welshman/util";
|
|
2
|
+
import { EventReader } from "../core/EventReader.js";
|
|
3
|
+
import { EventWriter } from "../core/EventWriter.js";
|
|
4
|
+
import { EventQuery } from "../core/EventQuery.js";
|
|
5
|
+
import { KindFactory } from "../core/Kind.js";
|
|
6
|
+
export declare const SOURCE = "source";
|
|
7
|
+
export declare class WikiMergeRequestReader extends EventReader {
|
|
8
|
+
articleAddress(): string | undefined;
|
|
9
|
+
articleAuthor(): string | undefined;
|
|
10
|
+
baseId(): string | undefined;
|
|
11
|
+
sourceId(): string | undefined;
|
|
12
|
+
}
|
|
13
|
+
export declare class WikiMergeRequestWriter extends EventWriter<WikiMergeRequestReader> {
|
|
14
|
+
setArticle(event: TrustedEvent): this;
|
|
15
|
+
setSource(event: TrustedEvent): this;
|
|
16
|
+
validate(): void;
|
|
17
|
+
}
|
|
18
|
+
export declare class WikiMergeRequestQuery extends EventQuery {
|
|
19
|
+
articles: TrustedEvent[];
|
|
20
|
+
forArticle(event: TrustedEvent): this;
|
|
21
|
+
protected renderDomainFilters(): {
|
|
22
|
+
"#a": string[];
|
|
23
|
+
}[] | {}[];
|
|
24
|
+
protected renderRoutes(): import("@welshman/util").RelaySelection[];
|
|
25
|
+
}
|
|
26
|
+
export declare const WikiMergeRequest: KindFactory<WikiMergeRequestReader, WikiMergeRequestWriter, WikiMergeRequestQuery>;
|
|
27
|
+
//# sourceMappingURL=WikiMergeRequest.d.ts.map
|