Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
f3d8886
add Meeting object
Feb 9, 2026
fc6b44a
add meeting test
Feb 9, 2026
36dec9b
add test for unique non array values
Feb 9, 2026
8c76d4d
Merge pull request #1 from tgra/meeting-object
tgra Feb 9, 2026
bbf6a2c
start on Profile doc
Feb 9, 2026
7910e57
early commit of Profile.ts
Feb 9, 2026
1014dd7
Update src/mod.ts
tgra Feb 16, 2026
d4cf43b
Update src/vocabulary/mod.ts
tgra Feb 16, 2026
7bfd1c6
Update src/vocabulary/ical.ts
tgra Feb 16, 2026
569b956
Update src/solid/mod.ts
tgra Feb 16, 2026
a8f21f3
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
afa7837
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
ffdc508
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
338e9c2
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
8370142
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
06b70a1
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
e8f205d
Update src/solid/Meeting.ts
tgra Feb 16, 2026
998a568
Update src/solid/Meeting.ts
tgra Feb 16, 2026
273f23c
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
aa5a61b
Update src/solid/Meeting.ts
tgra Feb 16, 2026
fd67108
Update test/unit/meeting.test.ts
tgra Feb 16, 2026
fcd9ed4
move MeetingDataset to own file
Feb 16, 2026
9916e3d
add meeting test cases
Feb 16, 2026
3f6dac0
Merge pull request #2 from tgra/meeting-object
tgra Feb 16, 2026
5eb48d4
add Group and Person
Feb 16, 2026
914aaae
update spacing
Feb 16, 2026
5898e77
update Group and Person
Feb 16, 2026
dfb67d1
update meeting test
Feb 16, 2026
563b8ab
add addMember and deleteMember to group
Feb 16, 2026
2df46f3
modify group test
Feb 16, 2026
7fd2a48
add person and orgnization contacts
Feb 17, 2026
1645284
add org and person tests
Feb 17, 2026
cf6ba26
update personal profile object
Feb 19, 2026
7ffbdeb
add profile / merge main/contacts
Feb 19, 2026
ec4b922
Merge branch 'meeting-object'
Feb 19, 2026
2d1d260
Merge branch 'profile-object'
Feb 19, 2026
f8abd16
update unit tests
Feb 19, 2026
329cc73
Update src/solid/Group.ts
tgra Mar 3, 2026
4ec1936
Update src/solid/Organization.ts
tgra Mar 3, 2026
063e757
Update src/solid/Group.ts
tgra Mar 3, 2026
86c2212
Update src/solid/Group.ts
tgra Mar 3, 2026
f57ab58
Update src/solid/Group.ts
tgra Mar 3, 2026
4b06de9
Update src/solid/Group.ts
tgra Mar 3, 2026
d1d37dc
Update src/vocabulary/solid.ts
tgra Mar 3, 2026
2275e44
Update test/unit/group.test.ts
tgra Mar 3, 2026
7adf42d
Update test/unit/group.test.ts
tgra Mar 3, 2026
926dc51
Update test/unit/group.test.ts
tgra Mar 3, 2026
6dcfa62
Update src/solid/Organization.ts
tgra Mar 3, 2026
8eb1b9a
Update src/solid/Organization.ts
tgra Mar 3, 2026
a9de6aa
Update src/solid/Organization.ts
tgra Mar 3, 2026
9a8384e
Update src/solid/Person.ts
tgra Mar 3, 2026
a75c9d3
Update src/solid/Person.ts
tgra Mar 3, 2026
1513d6a
Update src/solid/Organization.ts
tgra Mar 3, 2026
9590428
Update src/solid/Profile.ts
tgra Mar 3, 2026
2bb2200
Update src/vocabulary/ical.ts
tgra Mar 3, 2026
3e103e7
Update src/vocabulary/soc.ts
tgra Mar 3, 2026
90ae206
Update src/vocabulary/owl.ts
tgra Mar 3, 2026
62fc4e0
Update src/vocabulary/schema.ts
tgra Mar 3, 2026
9bf4d9a
Update src/vocabulary/org.ts
tgra Mar 3, 2026
b8f12cf
update package.json
Mar 3, 2026
49f1d99
changes further to PR
Mar 3, 2026
bbebfa8
remove rdf-namespaces
Mar 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"@rdfjs/types": "^2",
"@types/n3": "^1",
"@types/node": "^24",
"@types/rdf-js": "^4.0.1",
"n3": "^1",
"typescript": "^5"
},
Expand Down
1 change: 1 addition & 0 deletions src/mod.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from "./acp/mod.js"
export * from "./solid/mod.js"
export * from "./webid/mod.js"

17 changes: 17 additions & 0 deletions src/solid/Group.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { TermMappings, ValueMappings, TermWrapper, ObjectMapping } from "rdfjs-wrapper"
import { VCARD } from "../vocabulary/mod.js"
import { Person } from "./Person.js"

export class Group extends TermWrapper {
get name(): string | undefined {
return this.singularNullable(VCARD.fn, ValueMappings.literalToString)
}

set name(value: string | undefined) {
this.overwriteNullable(VCARD.fn, value, TermMappings.stringToLiteral)
}

get members(): Set<Person> {
return this.objects(VCARD.member, ObjectMapping.as(Person), ObjectMapping.as(Person))
}
}
9 changes: 9 additions & 0 deletions src/solid/GroupDataset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { DatasetWrapper } from "rdfjs-wrapper"
import { VCARD } from "../vocabulary/mod.js"
import { Group } from "./Group.js"

export class GroupDataset extends DatasetWrapper {
get group(): Iterable<Group> {
return this.instancesOf(VCARD.Group, Group)
}
}
44 changes: 44 additions & 0 deletions src/solid/Meeting.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { TermMappings, ValueMappings, TermWrapper } from "rdfjs-wrapper"
import { ICAL } from "../vocabulary/mod.js"

export class Meeting extends TermWrapper {
get summary(): string | undefined {
return this.singularNullable(ICAL.summary, ValueMappings.literalToString)
}

set summary(value: string | undefined) {
this.overwriteNullable(ICAL.summary, value, TermMappings.stringToLiteral)
}

get location(): string | undefined {
return this.singularNullable(ICAL.location, ValueMappings.literalToString)
}

set location(value: string | undefined) {
this.overwriteNullable(ICAL.location, value, TermMappings.stringToLiteral)
}

get comment(): string | undefined {
return this.singularNullable(ICAL.comment, ValueMappings.literalToString)
}

set comment(value: string | undefined) {
this.overwriteNullable(ICAL.comment, value, TermMappings.stringToLiteral)
}

get startDate(): Date | undefined {
return this.singularNullable(ICAL.dtstart, ValueMappings.literalToDate)
}

set startDate(value: Date | undefined) {
this.overwriteNullable(ICAL.dtstart, value, TermMappings.dateToLiteral)
}

get endDate(): Date | undefined {
return this.singularNullable(ICAL.dtend, ValueMappings.literalToDate)
}

set endDate(value: Date | undefined) {
this.overwriteNullable(ICAL.dtend, value, TermMappings.dateToLiteral)
}
}
9 changes: 9 additions & 0 deletions src/solid/MeetingDataset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { DatasetWrapper } from "rdfjs-wrapper"
import { ICAL } from "../vocabulary/mod.js"
import { Meeting } from "./Meeting.js"

export class MeetingDataset extends DatasetWrapper {
get meeting(): Iterable<Meeting> {
return this.instancesOf(ICAL.Vevent, Meeting)
}
}
24 changes: 24 additions & 0 deletions src/solid/Organization.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { TermWrapper, ValueMappings, TermMappings } from "rdfjs-wrapper"
import { SCHEMA, RDF } from "../vocabulary/mod.js"

export class Organization extends TermWrapper {
get name(): string | undefined {
return this.singularNullable(SCHEMA.name, ValueMappings.literalToString)
}

set name(value: string | undefined) {
this.overwriteNullable(SCHEMA.name, value, TermMappings.stringToLiteral)
}

get url(): string | undefined {
return this.singularNullable(SCHEMA.url, ValueMappings.iriToString)
}

set url(value: string | undefined) {
this.overwriteNullable(SCHEMA.url, value, TermMappings.stringToIri)
}

get types(): Set<string> {
return this.objects(RDF.type, ValueMappings.iriToString, TermMappings.stringToIri)
}
}
9 changes: 9 additions & 0 deletions src/solid/OrganizationDataset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { DatasetWrapper } from "rdfjs-wrapper"
import { VCARD } from "../vocabulary/mod.js"
import { Organization } from "./Organization.js"

export class OrganizationDataset extends DatasetWrapper {
get person(): Iterable<Organization> {
return this.instancesOf(VCARD.Individual, Organization)
}
}
37 changes: 37 additions & 0 deletions src/solid/Person.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { TermWrapper, ValueMappings, TermMappings } from "rdfjs-wrapper"
import { VCARD, OWL } from "../vocabulary/mod.js"

export class Person extends TermWrapper {
get name(): string | undefined {
return this.singularNullable(VCARD.fn, ValueMappings.literalToString)
}

set name(value: string | undefined) {
this.overwriteNullable(VCARD.fn, value, TermMappings.stringToLiteral)
}

get phone(): string | undefined {
return this.singularNullable(VCARD.phone, ValueMappings.literalToString)
}

set phone(value: string | undefined) {
this.overwriteNullable(VCARD.phone, value, TermMappings.stringToLiteral)
}

get email(): string | undefined {
return this.singularNullable(VCARD.email, ValueMappings.literalToString)
}

set email(value: string | undefined) {
this.overwriteNullable(VCARD.email, value, TermMappings.stringToLiteral)
}


get webId(): string | undefined {
return this.singularNullable(OWL.sameAs, ValueMappings.iriToString)
}

set webId(value: string | undefined) {
this.overwriteNullable(OWL.sameAs, value, TermMappings.stringToIri)
}
}
9 changes: 9 additions & 0 deletions src/solid/PersonDataset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { DatasetWrapper } from "rdfjs-wrapper"
import { VCARD } from "../vocabulary/mod.js"
import { Person } from "./Person.js"

export class PersonDataset extends DatasetWrapper {
get person(): Iterable<Person> {
return this.instancesOf(VCARD.Individual, Person)
}
}
63 changes: 63 additions & 0 deletions src/solid/Profile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { TermMappings, ValueMappings, TermWrapper, ObjectMapping } from "rdfjs-wrapper"
import { FOAF, SOLID, SCHEMA, ORG } from "../vocabulary/mod.js"
import { Person } from "./Person.js"


export class Profile extends TermWrapper {
/* Nickname */
get nickname(): string | undefined {
return this.singularNullable(FOAF.nick, ValueMappings.literalToString)
}

set nickname(value: string | undefined) {
this.overwriteNullable(FOAF.nick, value, TermMappings.stringToLiteral)
}

/* Pronouns */
// Preferred pronoun for subject role (he/she/they
get preferredSubjectPronoun(): string | undefined {
return this.singularNullable(SOLID.preferredSubjectPronoun, ValueMappings.literalToString)
}

set preferredSubjectPronoun(value: string | undefined) {
this.overwriteNullable(SOLID.preferredSubjectPronoun, value, TermMappings.stringToLiteral)
}

// Preferred pronoun for object role (him/her/them)
get preferredObjectPronoun(): string | undefined {
return this.singularNullable(SOLID.preferredObjectPronoun, ValueMappings.literalToString)
}

set preferredObjectPronoun(value: string | undefined) {
this.overwriteNullable(SOLID.preferredObjectPronoun, value, TermMappings.stringToLiteral)
}

// Preferred relative pronoun (his/hers/theirs)
get preferredRelativePronoun(): string | undefined {
return this.singularNullable(SOLID.preferredRelativePronoun, ValueMappings.literalToString)
}

set preferredRelativePronoun(value: string | undefined) {
this.overwriteNullable(SOLID.preferredRelativePronoun, value, TermMappings.stringToLiteral)
}

/* Roles / Organization involvement */
get roles(): Set<Person> {
return this.objects(ORG.member, ObjectMapping.as(Person), ObjectMapping.as(Person))
}

/* Skills */
get skills(): Set<string> {
return this.objects(SCHEMA.skills, ValueMappings.iriToString, TermMappings.stringToIri)
}

/* Languages */
get languages(): Set<string> {
return this.objects(SCHEMA.knowsLanguage, ValueMappings.iriToString, TermMappings.stringToIri)
}

/* Online/ Social Media Accounts */
get accounts(): Set<string> {
return this.objects(FOAF.account, ValueMappings.iriToString, TermMappings.stringToIri)
}
}
10 changes: 10 additions & 0 deletions src/solid/ProfileDataset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { DatasetWrapper } from "rdfjs-wrapper"
import { FOAF } from "../vocabulary/mod.js"
import { Profile } from "./Profile.js"

export class ProfileDataset extends DatasetWrapper {
get profile(): Iterable<Profile> {
return this.instancesOf(FOAF.PersonalProfileDocument, Profile)
}
}

10 changes: 10 additions & 0 deletions src/solid/mod.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
export * from "./Container.js"
export * from "./ContainerDataset.js"
export * from "./Group.js"
export * from "./GroupDataset.js"
export * from "./Meeting.js"
export * from "./MeetingDataset.js"
export * from "./Organization.js"
export * from "./OrganizationDataset.js"
export * from "./Person.js"
export * from "./PersonDataset.js"
export * from "./Profile.js"
export * from "./ProfileDataset.js"
export * from "./Resource.js"
15 changes: 12 additions & 3 deletions src/vocabulary/foaf.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
export const FOAF = {
isPrimaryTopicOf: "http://xmlns.com/foaf/0.1/isPrimaryTopicOf",
primaryTopic: "http://xmlns.com/foaf/0.1/primaryTopic",
name: "http://xmlns.com/foaf/0.1/name",
account: "http://xmlns.com/foaf/0.1/account",
accountName: "http://xmlns.com/foaf/0.1/accountName",
email: "http://xmlns.com/foaf/0.1/email",
homepage: "http://xmlns.com/foaf/0.1/homepage",
icon: "http://xmlns.com/foaf/0.1/icon",
isPrimaryTopicOf: "http://xmlns.com/foaf/0.1/isPrimaryTopicOf",
knows: "http://xmlns.com/foaf/0.1/knows",
maker: "http://xmlns.com/foaf/0.1/maker",
name: "http://xmlns.com/foaf/0.1/name",
nick: "http://xmlns.com/foaf/0.1/nick",
primaryTopic: "http://xmlns.com/foaf/0.1/primaryTopic",
Account: "http://xmlns.com/foaf/0.1/Account",
OnlineAccount: "http://xmlns.com/foaf/0.1/OnlineAccount",
Person: "http://xmlns.com/foaf/0.1/Person",
PersonalProfileDocument: "http://xmlns.com/foaf/0.1/PersonalProfileDocument",
} as const;
1 change: 1 addition & 0 deletions src/vocabulary/ical.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export const ICAL = {
dtstart: "http://www.w3.org/2002/12/cal/ical#dtstart",
location: "http://www.w3.org/2002/12/cal/ical#location",
summary: "http://www.w3.org/2002/12/cal/ical#summary",
Vevent: "http://www.w3.org/2002/12/cal/ical#Vevent",
} as const;
4 changes: 4 additions & 0 deletions src/vocabulary/mod.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
export * from "./acp.js"
export * from "./dc.js"
export * from "./foaf.js"
export * from "./ical.js"
export * from "./ldp.js"
export * from "./owl.js"
export * from "./pim.js"
export * from "./posix.js"
export * from "./rdf.js"
export * from "./rdfs.js"
export * from "./solid.js"
export * from "./vcard.js"
export * from "./schema.js"
export * from "./org.js"
5 changes: 5 additions & 0 deletions src/vocabulary/org.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const ORG = {
member: "http://www.w3.org/ns/org#member",
organization: "http://www.w3.org/ns/org#organization",
role: "http://www.w3.org/ns/org#role"
} as const
3 changes: 3 additions & 0 deletions src/vocabulary/owl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const OWL = {
sameAs: "http://www.w3.org/2002/07/owl#",
} as const
18 changes: 18 additions & 0 deletions src/vocabulary/schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
export const SCHEMA = {
knowsLanguage: "https://schema.org/knowsLanguage",
skills: "https://schema.org/skills",
startDate: "https://schema.org/startDate",
endDate: "https://schema.org/endDate",
description: "https://schema.org/description",
name: "https://schema.org/name",
uri: "https://schema.org/uri",
url: "https://schema.org/url",
Corporation: "https://schema.org/Corporation",
EducationalOrganization: "https://schema.org/EducationalOrganization",
GovernmentOrganization: "https://schema.org/GovernmentOrganization",
NGO: "https://schema.org/NGO",
Organization: "https://schema.org/Organization",
PerformingGroup: "https://schema.org/PerformingGroup",
Project: "https://schema.org/Project",
SportsOrganization: "https://schema.org/SportsOrganization",
} as const
21 changes: 21 additions & 0 deletions src/vocabulary/soc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export const SOC = {
BlueSkyAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#BlueSkyAccount",
Digg: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#Digg",
FacebookAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#FacebookAccount",
GithubAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#GithubAccount",
InstagramAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#InstagramAccount",
LinkedInAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#LinkedInAccount",
MastodonAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#MastodonAccount",
MatrixAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#MatrixAccount",
MediumAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#MediumAccount",
NostrAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#NostrAccount",
OrcidAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#OrcidAccount",
PinterestAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#PinterestAccount",
RedditAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#RedditAccount",
SnapchatAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#SnapchatAccount",
StravaAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#StravaAccount",
TiktokAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#TiktokAccount",
TumblrAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#TumblrAccount",
TwitterAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#TwitterAccount",
OtherAccount: "https://solidos.github.io/profile-pane/src/ontology/socialMedia.ttl#OtherAccount",
}
13 changes: 12 additions & 1 deletion src/vocabulary/solid.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
export const SOLID = {
oidcIssuer: "http://www.w3.org/ns/solid/terms#oidcIssuer",
storage: "http://www.w3.org/ns/solid/terms#storage",
} as const;
preferredSubjectPronoun: "http://www.w3.org/ns/solid/terms#preferredSubjectPronoun",
preferredObjectPronoun: "http://www.w3.org/ns/solid/terms#preferredObjectPronoun",
preferredRelativePronoun: "http://www.w3.org/ns/solid/terms#preferredRelativePronoun",
publicId: "http://www.w3.org/ns/solid/terms#publicId",

// the following terms are not defined but are present in https://github.com/SolidOS/profile-pane/blob/main/src/ontology/profileForm.ttl
Role: "http://www.w3.org/ns/solid/terms#Role",
CurrentRole: "http://www.w3.org/ns/solid/terms#CurrentRole",
FormerRole: "http://www.w3.org/ns/solid/terms#FormerRole",
FutureRole: "http://www.w3.org/ns/solid/terms#FutureRole",
} as const

Loading