solid-logic 6.0.0 → 6.0.1-1
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/_virtual/_rolldown/runtime.cjs.js +1 -1
- package/dist/acl/accessControlSubjects.cjs.js +2 -0
- package/dist/acl/accessControlSubjects.cjs.js.map +1 -0
- package/dist/acl/accessControlSubjects.d.ts +8 -0
- package/dist/acl/accessControlSubjects.d.ts.map +1 -0
- package/dist/acl/accessControlSubjects.esm.js +75 -0
- package/dist/acl/accessControlSubjects.esm.js.map +1 -0
- package/dist/acl/aclLogic.cjs.js +1 -1
- package/dist/acl/aclLogic.cjs.js.map +1 -1
- package/dist/acl/aclLogic.d.ts +10 -0
- package/dist/acl/aclLogic.d.ts.map +1 -0
- package/dist/acl/aclLogic.esm.js +128 -26
- package/dist/acl/aclLogic.esm.js.map +1 -1
- package/dist/authSession/authSession.cjs.js.map +1 -1
- package/dist/authSession/authSession.d.ts +42 -0
- package/dist/authSession/authSession.d.ts.map +1 -0
- package/dist/authSession/authSession.esm.js.map +1 -1
- package/dist/authSession/events.cjs.js.map +1 -1
- package/dist/authSession/events.d.ts +25 -0
- package/dist/authSession/events.d.ts.map +1 -0
- package/dist/authSession/events.esm.js.map +1 -1
- package/dist/authSession/flagAuthorizationOnTransitions.cjs.js +1 -1
- package/dist/authSession/flagAuthorizationOnTransitions.cjs.js.map +1 -1
- package/dist/authSession/flagAuthorizationOnTransitions.d.ts +76 -0
- package/dist/authSession/flagAuthorizationOnTransitions.d.ts.map +1 -0
- package/dist/authSession/flagAuthorizationOnTransitions.esm.js +1 -1
- package/dist/authSession/flagAuthorizationOnTransitions.esm.js.map +1 -1
- package/dist/authSession/identityState.cjs.js +1 -1
- package/dist/authSession/identityState.cjs.js.map +1 -1
- package/dist/authSession/identityState.d.ts +199 -0
- package/dist/authSession/identityState.d.ts.map +1 -0
- package/dist/authSession/identityState.esm.js +1 -1
- package/dist/authSession/identityState.esm.js.map +1 -1
- package/dist/authSession/issuer.d.ts +8 -0
- package/dist/authSession/issuer.d.ts.map +1 -0
- package/dist/authSession/session.cjs.js +1 -1
- package/dist/authSession/session.cjs.js.map +1 -1
- package/dist/authSession/session.d.ts +45 -0
- package/dist/authSession/session.d.ts.map +1 -0
- package/dist/authSession/session.esm.js +1 -1
- package/dist/authSession/session.esm.js.map +1 -1
- package/dist/authn/SolidAuthnLogic.cjs.js.map +1 -1
- package/dist/authn/SolidAuthnLogic.d.ts +61 -0
- package/dist/authn/SolidAuthnLogic.d.ts.map +1 -0
- package/dist/authn/SolidAuthnLogic.esm.js.map +1 -1
- package/dist/authn/authUtil.cjs.js.map +1 -1
- package/dist/authn/authUtil.d.ts +17 -0
- package/dist/authn/authUtil.d.ts.map +1 -0
- package/dist/authn/serverLogout.d.ts +6 -0
- package/dist/authn/serverLogout.d.ts.map +1 -0
- package/dist/chat/chatLogic.cjs.js +1 -1
- package/dist/chat/chatLogic.cjs.js.map +1 -1
- package/dist/chat/chatLogic.d.ts +3 -0
- package/dist/chat/chatLogic.d.ts.map +1 -0
- package/dist/chat/chatLogic.esm.js +5 -5
- package/dist/chat/chatLogic.esm.js.map +1 -1
- package/dist/directory/catalogDirectory.cjs.js +2 -0
- package/dist/directory/catalogDirectory.cjs.js.map +1 -0
- package/dist/directory/catalogDirectory.d.ts +5 -0
- package/dist/directory/catalogDirectory.d.ts.map +1 -0
- package/dist/directory/catalogDirectory.esm.js +54 -0
- package/dist/directory/catalogDirectory.esm.js.map +1 -0
- package/dist/directory/contactsDirectory.cjs.js +2 -0
- package/dist/directory/contactsDirectory.cjs.js.map +1 -0
- package/dist/directory/contactsDirectory.d.ts +7 -0
- package/dist/directory/contactsDirectory.d.ts.map +1 -0
- package/dist/directory/contactsDirectory.esm.js +91 -0
- package/dist/directory/contactsDirectory.esm.js.map +1 -0
- package/dist/directory/directoryHelpers.cjs.js +2 -0
- package/dist/directory/directoryHelpers.cjs.js.map +1 -0
- package/dist/directory/directoryHelpers.d.ts +18 -0
- package/dist/directory/directoryHelpers.d.ts.map +1 -0
- package/dist/directory/directoryHelpers.esm.js +89 -0
- package/dist/directory/directoryHelpers.esm.js.map +1 -0
- package/dist/directory/directoryLogic.cjs.js +2 -0
- package/dist/directory/directoryLogic.cjs.js.map +1 -0
- package/dist/directory/directoryLogic.d.ts +6 -0
- package/dist/directory/directoryLogic.d.ts.map +1 -0
- package/dist/directory/directoryLogic.esm.js +41 -0
- package/dist/directory/directoryLogic.esm.js.map +1 -0
- package/dist/directory/friendsDirectory.cjs.js +2 -0
- package/dist/directory/friendsDirectory.cjs.js.map +1 -0
- package/dist/directory/friendsDirectory.d.ts +6 -0
- package/dist/directory/friendsDirectory.d.ts.map +1 -0
- package/dist/directory/friendsDirectory.esm.js +58 -0
- package/dist/directory/friendsDirectory.esm.js.map +1 -0
- package/dist/inbox/inboxLogic.d.ts +3 -0
- package/dist/inbox/inboxLogic.d.ts.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +10 -9
- package/dist/index.esm.js.map +1 -1
- package/dist/issuer/issuerLogic.d.ts +8 -0
- package/dist/issuer/issuerLogic.d.ts.map +1 -0
- package/dist/logic/CustomError.cjs.js.map +1 -1
- package/dist/logic/CustomError.d.ts +21 -0
- package/dist/logic/CustomError.d.ts.map +1 -0
- package/dist/logic/CustomError.esm.js.map +1 -1
- package/dist/logic/solidLogic.cjs.js +1 -1
- package/dist/logic/solidLogic.cjs.js.map +1 -1
- package/dist/logic/solidLogic.d.ts +6 -0
- package/dist/logic/solidLogic.d.ts.map +1 -0
- package/dist/logic/solidLogic.esm.js +29 -27
- package/dist/logic/solidLogic.esm.js.map +1 -1
- package/dist/logic/solidLogicSingleton.cjs.js +1 -1
- package/dist/logic/solidLogicSingleton.cjs.js.map +1 -1
- package/dist/logic/solidLogicSingleton.d.ts +4 -0
- package/dist/logic/solidLogicSingleton.d.ts.map +1 -0
- package/dist/logic/solidLogicSingleton.esm.js +2 -1
- package/dist/logic/solidLogicSingleton.esm.js.map +1 -1
- package/dist/profile/profileAclDocuments.d.ts +2 -0
- package/dist/profile/profileAclDocuments.d.ts.map +1 -0
- package/dist/profile/profileDocuments.d.ts +2 -0
- package/dist/profile/profileDocuments.d.ts.map +1 -0
- package/dist/profile/profileLogic.cjs.js.map +1 -1
- package/dist/profile/profileLogic.d.ts +3 -0
- package/dist/profile/profileLogic.d.ts.map +1 -0
- package/dist/profile/profileLogic.esm.js +2 -1
- package/dist/profile/profileLogic.esm.js.map +1 -1
- package/dist/resource/resourceHttp.d.ts +5 -0
- package/dist/resource/resourceHttp.d.ts.map +1 -0
- package/dist/resource/resourceLogic.cjs.js +1 -1
- package/dist/resource/resourceLogic.cjs.js.map +1 -1
- package/dist/resource/resourceLogic.d.ts +4 -0
- package/dist/resource/resourceLogic.d.ts.map +1 -0
- package/dist/resource/resourceLogic.esm.js +36 -26
- package/dist/resource/resourceLogic.esm.js.map +1 -1
- package/dist/resource/resourceMetadata.d.ts +5 -0
- package/dist/resource/resourceMetadata.d.ts.map +1 -0
- package/dist/typeIndex/typeIndexAclDocuments.d.ts +2 -0
- package/dist/typeIndex/typeIndexAclDocuments.d.ts.map +1 -0
- package/dist/typeIndex/typeIndexDocuments.d.ts +3 -0
- package/dist/typeIndex/typeIndexDocuments.d.ts.map +1 -0
- package/dist/typeIndex/typeIndexLogic.cjs.js.map +1 -1
- package/dist/typeIndex/typeIndexLogic.d.ts +3 -0
- package/dist/typeIndex/typeIndexLogic.d.ts.map +1 -0
- package/dist/typeIndex/typeIndexLogic.esm.js +10 -5
- package/dist/typeIndex/typeIndexLogic.esm.js.map +1 -1
- package/dist/types.d.ts +192 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/util/containerLogic.cjs.js.map +1 -1
- package/dist/util/containerLogic.d.ts +12 -0
- package/dist/util/containerLogic.d.ts.map +1 -0
- package/dist/util/containerLogic.esm.js.map +1 -1
- package/dist/util/debug.d.ts +5 -0
- package/dist/util/debug.d.ts.map +1 -0
- package/dist/util/ns.cjs.js.map +1 -1
- package/dist/util/ns.d.ts +2 -0
- package/dist/util/ns.d.ts.map +1 -0
- package/dist/util/utilityLogic.cjs.js +1 -1
- package/dist/util/utilityLogic.cjs.js.map +1 -1
- package/dist/util/utilityLogic.d.ts +16 -0
- package/dist/util/utilityLogic.d.ts.map +1 -0
- package/dist/util/utilityLogic.esm.js +6 -2
- package/dist/util/utilityLogic.esm.js.map +1 -1
- package/dist/util/utils.cjs.js +1 -1
- package/dist/util/utils.cjs.js.map +1 -1
- package/dist/util/utils.d.ts +8 -0
- package/dist/util/utils.d.ts.map +1 -0
- package/dist/util/utils.esm.js +5 -3
- package/dist/util/utils.esm.js.map +1 -1
- package/package.json +6 -4
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ns as e } from "../util/ns.esm.js";
|
|
2
|
+
import { isHttpUri as t, labelForNode as n, loadDocumentSilently as r, uniqueNamedNodes as i } from "./directoryHelpers.esm.js";
|
|
3
|
+
//#region src/directory/contactsDirectory.ts
|
|
4
|
+
var a = 8;
|
|
5
|
+
function o(o, s) {
|
|
6
|
+
let c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map();
|
|
7
|
+
async function u(t) {
|
|
8
|
+
let n = c.get(t.value);
|
|
9
|
+
if (n) return n;
|
|
10
|
+
let r = (async () => {
|
|
11
|
+
let n = await s.loadTypeIndexesFor(t), r = [];
|
|
12
|
+
for (let t of n) {
|
|
13
|
+
let n = await s.getScopedAppsFromIndex(t, e.vcard("AddressBook"));
|
|
14
|
+
r = r.concat(n);
|
|
15
|
+
}
|
|
16
|
+
return i(r.map((e) => e.instance));
|
|
17
|
+
})().catch((e) => {
|
|
18
|
+
throw c.delete(t.value), e;
|
|
19
|
+
});
|
|
20
|
+
return c.set(t.value, r), r;
|
|
21
|
+
}
|
|
22
|
+
async function d(t) {
|
|
23
|
+
let n = l.get(t.value);
|
|
24
|
+
if (n) return n;
|
|
25
|
+
let i = (async () => {
|
|
26
|
+
if (!await r(o, t)) return null;
|
|
27
|
+
let n = o.each(t, e.vcard("url"), null, t.doc());
|
|
28
|
+
for (let e of n) {
|
|
29
|
+
let n = f(e, t.doc());
|
|
30
|
+
if (n) return n;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
})().catch((e) => {
|
|
34
|
+
throw l.delete(t.value), e;
|
|
35
|
+
});
|
|
36
|
+
return l.set(t.value, i), i;
|
|
37
|
+
}
|
|
38
|
+
function f(n, r) {
|
|
39
|
+
if (!o.holds(n, e.rdf("type"), e.vcard("WebID"), r)) return null;
|
|
40
|
+
let i = o.any(n, e.vcard("value"), null, r)?.value || "";
|
|
41
|
+
return t(i) ? i : null;
|
|
42
|
+
}
|
|
43
|
+
async function p(t, i) {
|
|
44
|
+
let s = await u(t);
|
|
45
|
+
for (let t of s) if (await r(o, t)) {
|
|
46
|
+
let s = o.any(t, e.vcard("nameEmailIndex"), null, t.doc());
|
|
47
|
+
if (s && await r(o, s)) {
|
|
48
|
+
let r = o.each(void 0, e.vcard("inAddressBook"), t, s);
|
|
49
|
+
for (let t = 0; t < r.length; t += a) {
|
|
50
|
+
let c = r.slice(t, t + a), l = await Promise.all(c.map(async (t) => {
|
|
51
|
+
let r = await d(t);
|
|
52
|
+
return r ? {
|
|
53
|
+
kind: "person",
|
|
54
|
+
uri: r,
|
|
55
|
+
label: o.anyValue(t, e.vcard("fn"), null, s) || n(o, t),
|
|
56
|
+
subjectType: "agent",
|
|
57
|
+
relationshipLabel: "Contact",
|
|
58
|
+
sources: ["contacts"]
|
|
59
|
+
} : null;
|
|
60
|
+
}));
|
|
61
|
+
for (let e of l.filter((e) => !!e)) await i(e);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function m(t, a) {
|
|
67
|
+
let s = await u(t);
|
|
68
|
+
for (let t of s) if (await r(o, t)) {
|
|
69
|
+
let s = o.any(t, e.vcard("groupIndex"), null, t.doc());
|
|
70
|
+
if (s && await r(o, s)) {
|
|
71
|
+
let c = i([...o.each(t, e.vcard("includesGroup"), null, s), ...o.each(t, e.vcard("includesGroup"), null, t.doc())]);
|
|
72
|
+
for (let e of c) await r(o, e), await a({
|
|
73
|
+
kind: "group",
|
|
74
|
+
uri: e.value,
|
|
75
|
+
label: n(o, e),
|
|
76
|
+
subjectType: "agentGroup",
|
|
77
|
+
relationshipLabel: "Group",
|
|
78
|
+
sources: ["groups"]
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
discoverAddressBookContacts: p,
|
|
85
|
+
discoverAddressBookGroups: m
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { o as createContactsDirectoryDiscovery };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=contactsDirectory.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contactsDirectory.esm.js","names":[],"sources":["../../src/directory/contactsDirectory.ts"],"sourcesContent":["import { type DirectoryEntry, type DirectorySource, type TypeIndexLogic } from '../types'\nimport { type LiveStore, NamedNode } from 'rdflib'\nimport { ns } from '../util/ns'\nimport { isHttpUri, labelForNode, loadDocumentSilently, uniqueNamedNodes } from './directoryHelpers'\n\nconst CONTACT_CARD_CONCURRENCY = 8\n\nexport function createContactsDirectoryDiscovery (\n store: LiveStore,\n typeIndexLogic: TypeIndexLogic\n) {\n const personalAddressBooksCache = new Map<string, Promise<NamedNode[]>>()\n const contactWebIdCache = new Map<string, Promise<string | null>>()\n\n async function loadPersonalAddressBooks (user: NamedNode): Promise<NamedNode[]> {\n const cached = personalAddressBooksCache.get(user.value)\n if (cached) {\n return cached\n }\n\n const promise = (async () => {\n const scopes = await typeIndexLogic.loadTypeIndexesFor(user)\n let scopedApps = [] as Awaited<ReturnType<TypeIndexLogic['getScopedAppsFromIndex']>>\n\n for (const scope of scopes) {\n const apps = await typeIndexLogic.getScopedAppsFromIndex(scope, ns.vcard('AddressBook'))\n scopedApps = scopedApps.concat(apps)\n }\n\n return uniqueNamedNodes(scopedApps.map(app => app.instance))\n })().catch(error => {\n personalAddressBooksCache.delete(user.value)\n throw error\n })\n\n personalAddressBooksCache.set(user.value, promise)\n return promise\n }\n\n async function webIdForAddressBookContact (contact: NamedNode): Promise<string | null> {\n const cached = contactWebIdCache.get(contact.value)\n if (cached) {\n return cached\n }\n\n const promise = (async () => {\n if (!await loadDocumentSilently(store, contact)) {\n return null\n }\n\n const urlNodes = store.each(contact, ns.vcard('url'), null, contact.doc()) as NamedNode[]\n for (const urlNode of urlNodes) {\n const webId = resolveWebIdFromAddressBookUrlNode(urlNode, contact.doc())\n if (webId) {\n return webId\n }\n }\n\n return null\n })().catch(error => {\n contactWebIdCache.delete(contact.value)\n throw error\n })\n\n contactWebIdCache.set(contact.value, promise)\n return promise\n }\n\n function resolveWebIdFromAddressBookUrlNode (urlNode: NamedNode, doc: NamedNode): string | null {\n if (!store.holds(urlNode, ns.rdf('type'), ns.vcard('WebID'), doc)) {\n return null\n }\n\n const valueNode = store.any(urlNode, ns.vcard('value'), null, doc)\n const webId = valueNode?.value || ''\n return isHttpUri(webId) ? webId : null\n }\n\n async function discoverAddressBookContacts (\n user: NamedNode,\n onEntry: (entry: DirectoryEntry) => void | Promise<void>\n ): Promise<void> {\n const books = await loadPersonalAddressBooks(user)\n\n for (const book of books) {\n if (await loadDocumentSilently(store, book)) {\n const nameEmailIndex = store.any(book, ns.vcard('nameEmailIndex'), null, book.doc()) as NamedNode | null\n if (nameEmailIndex) {\n if (await loadDocumentSilently(store, nameEmailIndex)) {\n const contacts = store.each(undefined, ns.vcard('inAddressBook'), book, nameEmailIndex) as NamedNode[]\n for (let index = 0; index < contacts.length; index += CONTACT_CARD_CONCURRENCY) {\n const batch = contacts.slice(index, index + CONTACT_CARD_CONCURRENCY)\n const entries = await Promise.all(batch.map(async contact => {\n const webId = await webIdForAddressBookContact(contact)\n if (!webId) {\n return null\n }\n\n return {\n kind: 'person' as const,\n uri: webId,\n label: store.anyValue(contact, ns.vcard('fn'), null, nameEmailIndex) || labelForNode(store, contact),\n subjectType: 'agent' as const,\n relationshipLabel: 'Contact' as const,\n sources: ['contacts'] as DirectorySource[]\n }\n }))\n\n for (const entry of entries.filter((entry): entry is NonNullable<typeof entry> => Boolean(entry))) {\n await onEntry(entry)\n }\n }\n }\n }\n }\n }\n }\n\n async function discoverAddressBookGroups (\n user: NamedNode,\n onEntry: (entry: DirectoryEntry) => void | Promise<void>\n ): Promise<void> {\n const books = await loadPersonalAddressBooks(user)\n\n for (const book of books) {\n if (await loadDocumentSilently(store, book)) {\n const groupIndex = store.any(book, ns.vcard('groupIndex'), null, book.doc()) as NamedNode | null\n if (groupIndex) {\n if (await loadDocumentSilently(store, groupIndex)) {\n const groups = uniqueNamedNodes([\n ...(store.each(book, ns.vcard('includesGroup'), null, groupIndex) as NamedNode[]),\n ...(store.each(book, ns.vcard('includesGroup'), null, book.doc()) as NamedNode[])\n ])\n\n for (const group of groups) {\n await loadDocumentSilently(store, group)\n\n await onEntry({\n kind: 'group',\n uri: group.value,\n label: labelForNode(store, group),\n subjectType: 'agentGroup',\n relationshipLabel: 'Group',\n sources: ['groups']\n })\n }\n }\n }\n }\n }\n }\n\n return {\n discoverAddressBookContacts,\n discoverAddressBookGroups\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../util/ns.cjs.js");var t=[`contacts`,`groups`,`friends`,`catalog`];function n(e){return e.toLowerCase().trim().split(/\s+/).filter(Boolean)}function r(e,t){let r=n(t);if(r.length===0)return!0;let i=e.flatMap(e=>n(e)),a=e.join(` `).toLowerCase();return r.every(e=>i.some(t=>t.includes(e))||a.includes(e))}function i(e){return Array.from(e).sort((e,t)=>e.label.localeCompare(t.label,void 0,{sensitivity:`base`}))}function a(e,t){let n=d(t),r=e.get(n);if(r){let i=o(r,t),a=l(i.label,[...r.searchableLabels??[r.label],...t.searchableLabels??[t.label]]),s={...r,label:i.label,relationshipLabel:u(r.relationshipLabel,t.relationshipLabel),sources:c([...r.sources,...t.sources]),searchableLabels:a};return e.set(n,s),s}let i={...t,sources:c(t.sources),searchableLabels:t.searchableLabels??[t.label]};return e.set(n,i),i}function o(e,t){return s(t)<s(e)?t:e}function s(e){let n=e.sources.map(e=>t.indexOf(e));return n.length?Math.min(...n):t.length}function c(e){return t.filter(t=>e.includes(t))}function l(e,t){return p(t).sort((t,n)=>t===e?-1:n===e?1:t.localeCompare(n,void 0,{sensitivity:`base`}))}function u(e,t){return e===`Contact`||t===`Contact`?`Contact`:e===`Friend`||t===`Friend`?`Friend`:e===`Group`||t===`Group`?`Group`:`People`}function d(e){return`${e.kind}:${e.uri}`}function f(e){let t=new Set;return e.filter(e=>!t.has(e.value)&&(t.add(e.value),!0))}function p(e){return[...new Set(e)]}function m(e){return!!e&&(e.startsWith(`https://`)||e.startsWith(`http://`))}function h(e){let t=e.split(`#`)[0],n=e.includes(`#`)?e.slice(e.indexOf(`#`)+1):``,r=n&&n!==`this`&&n!==`me`?n:t.slice(t.lastIndexOf(`/`)+1);return decodeURIComponent(r||e).replace(/[_-]+/g,` `)}function g(t,n){return t.anyValue(n,e.ns.vcard(`fn`))||t.anyValue(n,e.ns.foaf(`name`))||t.anyValue(n,e.ns.schema(`name`))||t.anyValue(n,e.ns.rdfs(`label`))||null}function _(e,t){return g(e,t)||h(t.value)}async function v(e,t){try{return await e.fetcher.load(t.doc()),!0}catch{return!1}}exports.bestRelationshipLabel=u,exports.canonicalizeDirectorySources=c,exports.directoryEntryKey=d,exports.fallbackLabel=h,exports.isHttpUri=m,exports.labelForNode=_,exports.loadDocumentSilently=v,exports.matchesAnyLabel=r,exports.mergeDirectoryEntry=a,exports.sortEntries=i,exports.storedLabelForNode=g,exports.tokenizeQuery=n,exports.uniqueNamedNodes=f,exports.uniqueStrings=p;
|
|
2
|
+
//# sourceMappingURL=directoryHelpers.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryHelpers.cjs.js","names":[],"sources":["../../src/directory/directoryHelpers.ts"],"sourcesContent":["import type { LiveStore, NamedNode } from 'rdflib'\nimport type { DirectoryEntry, DirectoryRelationshipLabel, DirectorySource } from '../types'\nimport { ns } from '../util/ns'\n\nconst DIRECTORY_SOURCE_PRIORITY: DirectorySource[] = ['contacts', 'groups', 'friends', 'catalog']\n\nexport function tokenizeQuery (query: string): string[] {\n return query\n .toLowerCase()\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n}\n\nexport function matchesQuery (label: string, query: string): boolean {\n return matchesAnyLabel([label], query)\n}\n\nexport function matchesAnyLabel (labels: string[], query: string): boolean {\n const queryWords = tokenizeQuery(query)\n if (queryWords.length === 0) return true\n\n const labelWords = labels.flatMap(label => tokenizeQuery(label))\n const fallbackHaystack = labels.join(' ').toLowerCase()\n return queryWords.every(word =>\n labelWords.some(labelWord => labelWord.includes(word)) || fallbackHaystack.includes(word)\n )\n}\n\nexport function sortEntries (entries: Iterable<DirectoryEntry>): DirectoryEntry[] {\n return Array.from(entries)\n .sort((left, right) => left.label.localeCompare(right.label, undefined, { sensitivity: 'base' }))\n}\n\nexport function mergeDirectoryEntry (\n discoveredEntries: Map<string, DirectoryEntry>,\n entry: DirectoryEntry\n): DirectoryEntry {\n const key = directoryEntryKey(entry)\n const existing = discoveredEntries.get(key)\n if (existing) {\n const preferred = preferredDirectoryEntry(existing, entry)\n const labels = canonicalizeSearchableLabels(\n preferred.label,\n [...(existing.searchableLabels ?? [existing.label]), ...(entry.searchableLabels ?? [entry.label])]\n )\n const merged = {\n ...existing,\n label: preferred.label,\n relationshipLabel: bestRelationshipLabel(existing.relationshipLabel, entry.relationshipLabel),\n sources: canonicalizeDirectorySources([...existing.sources, ...entry.sources]),\n searchableLabels: labels\n }\n discoveredEntries.set(key, merged)\n return merged\n }\n\n const normalized = {\n ...entry,\n sources: canonicalizeDirectorySources(entry.sources),\n searchableLabels: entry.searchableLabels ?? [entry.label]\n }\n discoveredEntries.set(key, normalized)\n return normalized\n}\n\nfunction preferredDirectoryEntry (current: DirectoryEntry, incoming: DirectoryEntry): DirectoryEntry {\n return directoryEntrySourcePriority(incoming) < directoryEntrySourcePriority(current) ? incoming : current\n}\n\nfunction directoryEntrySourcePriority (entry: DirectoryEntry): number {\n const priorities = entry.sources.map(source => DIRECTORY_SOURCE_PRIORITY.indexOf(source))\n return priorities.length ? Math.min(...priorities) : DIRECTORY_SOURCE_PRIORITY.length\n}\n\nexport function canonicalizeDirectorySources (sources: DirectorySource[]): DirectorySource[] {\n return DIRECTORY_SOURCE_PRIORITY.filter(source => sources.includes(source))\n}\n\nfunction canonicalizeSearchableLabels (preferredLabel: string, labels: string[]): string[] {\n return uniqueStrings(labels).sort((left, right) => {\n if (left === preferredLabel) return -1\n if (right === preferredLabel) return 1\n return left.localeCompare(right, undefined, { sensitivity: 'base' })\n })\n}\n\nexport function bestRelationshipLabel (\n current: DirectoryRelationshipLabel | undefined,\n incoming: DirectoryRelationshipLabel\n): DirectoryRelationshipLabel {\n if (current === 'Contact' || incoming === 'Contact') return 'Contact'\n if (current === 'Friend' || incoming === 'Friend') return 'Friend'\n if (current === 'Group' || incoming === 'Group') return 'Group'\n return 'People'\n}\n\nexport function directoryEntryKey (entry: DirectoryEntry): string {\n return `${entry.kind}:${entry.uri}`\n}\n\nexport function uniqueNamedNodes (nodes: NamedNode[]): NamedNode[] {\n const seen = new Set<string>()\n return nodes.filter(node => {\n if (seen.has(node.value)) return false\n seen.add(node.value)\n return true\n })\n}\n\nexport function uniqueStrings<T extends string> (values: T[]): T[] {\n return [...new Set(values)]\n}\n\nexport function isHttpUri (value: string | null | undefined): boolean {\n return !!value && (value.startsWith('https://') || value.startsWith('http://'))\n}\n\nexport function fallbackLabel (uri: string): string {\n const withoutFragment = uri.split('#')[0]\n const fragment = uri.includes('#') ? uri.slice(uri.indexOf('#') + 1) : ''\n const base = fragment && fragment !== 'this' && fragment !== 'me'\n ? fragment\n : withoutFragment.slice(withoutFragment.lastIndexOf('/') + 1)\n return decodeURIComponent(base || uri).replace(/[_-]+/g, ' ')\n}\n\nexport function storedLabelForNode (store: LiveStore, node: NamedNode): string | null {\n return store.anyValue(node, ns.vcard('fn')) ||\n store.anyValue(node, ns.foaf('name')) ||\n store.anyValue(node, ns.schema('name')) ||\n store.anyValue(node, ns.rdfs('label')) ||\n null\n}\n\nexport function labelForNode (store: LiveStore, node: NamedNode): string {\n return storedLabelForNode(store, node) || fallbackLabel(node.value)\n}\n\nexport async function loadDocumentSilently (store: LiveStore, node: NamedNode): Promise<boolean> {\n try {\n await store.fetcher.load(node.doc())\n return true\n } catch (_error) {\n return false\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LiveStore, NamedNode } from 'rdflib';
|
|
2
|
+
import type { DirectoryEntry, DirectoryRelationshipLabel, DirectorySource } from '../types';
|
|
3
|
+
export declare function tokenizeQuery(query: string): string[];
|
|
4
|
+
export declare function matchesQuery(label: string, query: string): boolean;
|
|
5
|
+
export declare function matchesAnyLabel(labels: string[], query: string): boolean;
|
|
6
|
+
export declare function sortEntries(entries: Iterable<DirectoryEntry>): DirectoryEntry[];
|
|
7
|
+
export declare function mergeDirectoryEntry(discoveredEntries: Map<string, DirectoryEntry>, entry: DirectoryEntry): DirectoryEntry;
|
|
8
|
+
export declare function canonicalizeDirectorySources(sources: DirectorySource[]): DirectorySource[];
|
|
9
|
+
export declare function bestRelationshipLabel(current: DirectoryRelationshipLabel | undefined, incoming: DirectoryRelationshipLabel): DirectoryRelationshipLabel;
|
|
10
|
+
export declare function directoryEntryKey(entry: DirectoryEntry): string;
|
|
11
|
+
export declare function uniqueNamedNodes(nodes: NamedNode[]): NamedNode[];
|
|
12
|
+
export declare function uniqueStrings<T extends string>(values: T[]): T[];
|
|
13
|
+
export declare function isHttpUri(value: string | null | undefined): boolean;
|
|
14
|
+
export declare function fallbackLabel(uri: string): string;
|
|
15
|
+
export declare function storedLabelForNode(store: LiveStore, node: NamedNode): string | null;
|
|
16
|
+
export declare function labelForNode(store: LiveStore, node: NamedNode): string;
|
|
17
|
+
export declare function loadDocumentSilently(store: LiveStore, node: NamedNode): Promise<boolean>;
|
|
18
|
+
//# sourceMappingURL=directoryHelpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryHelpers.d.ts","sourceRoot":"","sources":["../../src/directory/directoryHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAK3F,wBAAgB,aAAa,CAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAMtD;AAED,wBAAgB,YAAY,CAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,eAAe,CAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CASzE;AAED,wBAAgB,WAAW,CAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,cAAc,EAAE,CAGhF;AAED,wBAAgB,mBAAmB,CACjC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAC9C,KAAK,EAAE,cAAc,GACpB,cAAc,CA2BhB;AAWD,wBAAgB,4BAA4B,CAAE,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAE3F;AAUD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,0BAA0B,GAAG,SAAS,EAC/C,QAAQ,EAAE,0BAA0B,GACnC,0BAA0B,CAK5B;AAED,wBAAgB,iBAAiB,CAAE,KAAK,EAAE,cAAc,GAAG,MAAM,CAEhE;AAED,wBAAgB,gBAAgB,CAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAOjE;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAG,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEjE;AAED,wBAAgB,SAAS,CAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED,wBAAgB,aAAa,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED,wBAAgB,YAAY,CAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAEvE;AAED,wBAAsB,oBAAoB,CAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/F"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { ns as e } from "../util/ns.esm.js";
|
|
2
|
+
//#region src/directory/directoryHelpers.ts
|
|
3
|
+
var t = [
|
|
4
|
+
"contacts",
|
|
5
|
+
"groups",
|
|
6
|
+
"friends",
|
|
7
|
+
"catalog"
|
|
8
|
+
];
|
|
9
|
+
function n(e) {
|
|
10
|
+
return e.toLowerCase().trim().split(/\s+/).filter(Boolean);
|
|
11
|
+
}
|
|
12
|
+
function r(e, t) {
|
|
13
|
+
let r = n(t);
|
|
14
|
+
if (r.length === 0) return !0;
|
|
15
|
+
let i = e.flatMap((e) => n(e)), a = e.join(" ").toLowerCase();
|
|
16
|
+
return r.every((e) => i.some((t) => t.includes(e)) || a.includes(e));
|
|
17
|
+
}
|
|
18
|
+
function i(e) {
|
|
19
|
+
return Array.from(e).sort((e, t) => e.label.localeCompare(t.label, void 0, { sensitivity: "base" }));
|
|
20
|
+
}
|
|
21
|
+
function a(e, t) {
|
|
22
|
+
let n = d(t), r = e.get(n);
|
|
23
|
+
if (r) {
|
|
24
|
+
let i = o(r, t), a = l(i.label, [...r.searchableLabels ?? [r.label], ...t.searchableLabels ?? [t.label]]), s = {
|
|
25
|
+
...r,
|
|
26
|
+
label: i.label,
|
|
27
|
+
relationshipLabel: u(r.relationshipLabel, t.relationshipLabel),
|
|
28
|
+
sources: c([...r.sources, ...t.sources]),
|
|
29
|
+
searchableLabels: a
|
|
30
|
+
};
|
|
31
|
+
return e.set(n, s), s;
|
|
32
|
+
}
|
|
33
|
+
let i = {
|
|
34
|
+
...t,
|
|
35
|
+
sources: c(t.sources),
|
|
36
|
+
searchableLabels: t.searchableLabels ?? [t.label]
|
|
37
|
+
};
|
|
38
|
+
return e.set(n, i), i;
|
|
39
|
+
}
|
|
40
|
+
function o(e, t) {
|
|
41
|
+
return s(t) < s(e) ? t : e;
|
|
42
|
+
}
|
|
43
|
+
function s(e) {
|
|
44
|
+
let n = e.sources.map((e) => t.indexOf(e));
|
|
45
|
+
return n.length ? Math.min(...n) : t.length;
|
|
46
|
+
}
|
|
47
|
+
function c(e) {
|
|
48
|
+
return t.filter((t) => e.includes(t));
|
|
49
|
+
}
|
|
50
|
+
function l(e, t) {
|
|
51
|
+
return p(t).sort((t, n) => t === e ? -1 : n === e ? 1 : t.localeCompare(n, void 0, { sensitivity: "base" }));
|
|
52
|
+
}
|
|
53
|
+
function u(e, t) {
|
|
54
|
+
return e === "Contact" || t === "Contact" ? "Contact" : e === "Friend" || t === "Friend" ? "Friend" : e === "Group" || t === "Group" ? "Group" : "People";
|
|
55
|
+
}
|
|
56
|
+
function d(e) {
|
|
57
|
+
return `${e.kind}:${e.uri}`;
|
|
58
|
+
}
|
|
59
|
+
function f(e) {
|
|
60
|
+
let t = /* @__PURE__ */ new Set();
|
|
61
|
+
return e.filter((e) => !t.has(e.value) && (t.add(e.value), !0));
|
|
62
|
+
}
|
|
63
|
+
function p(e) {
|
|
64
|
+
return [...new Set(e)];
|
|
65
|
+
}
|
|
66
|
+
function m(e) {
|
|
67
|
+
return !!e && (e.startsWith("https://") || e.startsWith("http://"));
|
|
68
|
+
}
|
|
69
|
+
function h(e) {
|
|
70
|
+
let t = e.split("#")[0], n = e.includes("#") ? e.slice(e.indexOf("#") + 1) : "", r = n && n !== "this" && n !== "me" ? n : t.slice(t.lastIndexOf("/") + 1);
|
|
71
|
+
return decodeURIComponent(r || e).replace(/[_-]+/g, " ");
|
|
72
|
+
}
|
|
73
|
+
function g(t, n) {
|
|
74
|
+
return t.anyValue(n, e.vcard("fn")) || t.anyValue(n, e.foaf("name")) || t.anyValue(n, e.schema("name")) || t.anyValue(n, e.rdfs("label")) || null;
|
|
75
|
+
}
|
|
76
|
+
function _(e, t) {
|
|
77
|
+
return g(e, t) || h(t.value);
|
|
78
|
+
}
|
|
79
|
+
async function v(e, t) {
|
|
80
|
+
try {
|
|
81
|
+
return await e.fetcher.load(t.doc()), !0;
|
|
82
|
+
} catch {
|
|
83
|
+
return !1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { u as bestRelationshipLabel, c as canonicalizeDirectorySources, d as directoryEntryKey, h as fallbackLabel, m as isHttpUri, _ as labelForNode, v as loadDocumentSilently, r as matchesAnyLabel, a as mergeDirectoryEntry, i as sortEntries, g as storedLabelForNode, n as tokenizeQuery, f as uniqueNamedNodes, p as uniqueStrings };
|
|
88
|
+
|
|
89
|
+
//# sourceMappingURL=directoryHelpers.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryHelpers.esm.js","names":[],"sources":["../../src/directory/directoryHelpers.ts"],"sourcesContent":["import type { LiveStore, NamedNode } from 'rdflib'\nimport type { DirectoryEntry, DirectoryRelationshipLabel, DirectorySource } from '../types'\nimport { ns } from '../util/ns'\n\nconst DIRECTORY_SOURCE_PRIORITY: DirectorySource[] = ['contacts', 'groups', 'friends', 'catalog']\n\nexport function tokenizeQuery (query: string): string[] {\n return query\n .toLowerCase()\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n}\n\nexport function matchesQuery (label: string, query: string): boolean {\n return matchesAnyLabel([label], query)\n}\n\nexport function matchesAnyLabel (labels: string[], query: string): boolean {\n const queryWords = tokenizeQuery(query)\n if (queryWords.length === 0) return true\n\n const labelWords = labels.flatMap(label => tokenizeQuery(label))\n const fallbackHaystack = labels.join(' ').toLowerCase()\n return queryWords.every(word =>\n labelWords.some(labelWord => labelWord.includes(word)) || fallbackHaystack.includes(word)\n )\n}\n\nexport function sortEntries (entries: Iterable<DirectoryEntry>): DirectoryEntry[] {\n return Array.from(entries)\n .sort((left, right) => left.label.localeCompare(right.label, undefined, { sensitivity: 'base' }))\n}\n\nexport function mergeDirectoryEntry (\n discoveredEntries: Map<string, DirectoryEntry>,\n entry: DirectoryEntry\n): DirectoryEntry {\n const key = directoryEntryKey(entry)\n const existing = discoveredEntries.get(key)\n if (existing) {\n const preferred = preferredDirectoryEntry(existing, entry)\n const labels = canonicalizeSearchableLabels(\n preferred.label,\n [...(existing.searchableLabels ?? [existing.label]), ...(entry.searchableLabels ?? [entry.label])]\n )\n const merged = {\n ...existing,\n label: preferred.label,\n relationshipLabel: bestRelationshipLabel(existing.relationshipLabel, entry.relationshipLabel),\n sources: canonicalizeDirectorySources([...existing.sources, ...entry.sources]),\n searchableLabels: labels\n }\n discoveredEntries.set(key, merged)\n return merged\n }\n\n const normalized = {\n ...entry,\n sources: canonicalizeDirectorySources(entry.sources),\n searchableLabels: entry.searchableLabels ?? [entry.label]\n }\n discoveredEntries.set(key, normalized)\n return normalized\n}\n\nfunction preferredDirectoryEntry (current: DirectoryEntry, incoming: DirectoryEntry): DirectoryEntry {\n return directoryEntrySourcePriority(incoming) < directoryEntrySourcePriority(current) ? incoming : current\n}\n\nfunction directoryEntrySourcePriority (entry: DirectoryEntry): number {\n const priorities = entry.sources.map(source => DIRECTORY_SOURCE_PRIORITY.indexOf(source))\n return priorities.length ? Math.min(...priorities) : DIRECTORY_SOURCE_PRIORITY.length\n}\n\nexport function canonicalizeDirectorySources (sources: DirectorySource[]): DirectorySource[] {\n return DIRECTORY_SOURCE_PRIORITY.filter(source => sources.includes(source))\n}\n\nfunction canonicalizeSearchableLabels (preferredLabel: string, labels: string[]): string[] {\n return uniqueStrings(labels).sort((left, right) => {\n if (left === preferredLabel) return -1\n if (right === preferredLabel) return 1\n return left.localeCompare(right, undefined, { sensitivity: 'base' })\n })\n}\n\nexport function bestRelationshipLabel (\n current: DirectoryRelationshipLabel | undefined,\n incoming: DirectoryRelationshipLabel\n): DirectoryRelationshipLabel {\n if (current === 'Contact' || incoming === 'Contact') return 'Contact'\n if (current === 'Friend' || incoming === 'Friend') return 'Friend'\n if (current === 'Group' || incoming === 'Group') return 'Group'\n return 'People'\n}\n\nexport function directoryEntryKey (entry: DirectoryEntry): string {\n return `${entry.kind}:${entry.uri}`\n}\n\nexport function uniqueNamedNodes (nodes: NamedNode[]): NamedNode[] {\n const seen = new Set<string>()\n return nodes.filter(node => {\n if (seen.has(node.value)) return false\n seen.add(node.value)\n return true\n })\n}\n\nexport function uniqueStrings<T extends string> (values: T[]): T[] {\n return [...new Set(values)]\n}\n\nexport function isHttpUri (value: string | null | undefined): boolean {\n return !!value && (value.startsWith('https://') || value.startsWith('http://'))\n}\n\nexport function fallbackLabel (uri: string): string {\n const withoutFragment = uri.split('#')[0]\n const fragment = uri.includes('#') ? uri.slice(uri.indexOf('#') + 1) : ''\n const base = fragment && fragment !== 'this' && fragment !== 'me'\n ? fragment\n : withoutFragment.slice(withoutFragment.lastIndexOf('/') + 1)\n return decodeURIComponent(base || uri).replace(/[_-]+/g, ' ')\n}\n\nexport function storedLabelForNode (store: LiveStore, node: NamedNode): string | null {\n return store.anyValue(node, ns.vcard('fn')) ||\n store.anyValue(node, ns.foaf('name')) ||\n store.anyValue(node, ns.schema('name')) ||\n store.anyValue(node, ns.rdfs('label')) ||\n null\n}\n\nexport function labelForNode (store: LiveStore, node: NamedNode): string {\n return storedLabelForNode(store, node) || fallbackLabel(node.value)\n}\n\nexport async function loadDocumentSilently (store: LiveStore, node: NamedNode): Promise<boolean> {\n try {\n await store.fetcher.load(node.doc())\n return true\n } catch (_error) {\n return false\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./directoryHelpers.cjs.js"),t=require("./contactsDirectory.cjs.js"),n=require("./friendsDirectory.cjs.js"),r=require("./catalogDirectory.cjs.js");var i=3,a=`https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl`,o=[`contacts`,`friends`,`catalog`,`groups`];function s(a,s,c){let l=t.createContactsDirectoryDiscovery(a,c),u=n.createFriendsDirectoryDiscovery(a),d=r.createCatalogDirectoryDiscovery();async function f(t){let n=new Map,r=[],i=t=>{e.mergeDirectoryEntry(n,t)};if(t.sources.includes(`catalog`)&&r.push(d.discoverCatalogEntries(t.catalogUrl,i)),t.user&&(t.sources.includes(`contacts`)&&r.push(l.discoverAddressBookContacts(t.user,i)),t.sources.includes(`groups`)&&r.push(l.discoverAddressBookGroups(t.user,i)),t.sources.includes(`friends`)&&r.push(u.discoverFoafPeople(t.user,t.maxFoafDistance,i))),!r.length)return[];if((await Promise.allSettled(r)).every(e=>e.status===`rejected`))throw Error(`Unable to load directory entries.`);return e.sortEntries(n.values())}async function p(t={}){let n=m(t);return(await f(n)).filter(t=>e.matchesAnyLabel([t.label,...t.searchableLabels??[]],n.query))}return{search:p};function m(e={}){let t=e.sources===void 0?[...o]:[...e.sources];return{query:e.query??``,sources:t,catalogUrl:e.catalogUrl??`https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl`,user:e.user??s.currentUser(),maxFoafDistance:e.maxFoafDistance??i}}}exports.DEFAULT_DIRECTORY_CATALOG_URL=a,exports.DEFAULT_DIRECTORY_SOURCES=o,exports.createDirectoryLogic=s;
|
|
2
|
+
//# sourceMappingURL=directoryLogic.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryLogic.cjs.js","names":[],"sources":["../../src/directory/directoryLogic.ts"],"sourcesContent":["import { type AuthnLogic, type DirectoryEntry, type DirectoryLogic, type DirectorySearchOptions, type DirectorySource, type TypeIndexLogic } from '../types'\nimport { type LiveStore } from 'rdflib'\nimport { createContactsDirectoryDiscovery } from './contactsDirectory'\nimport { createFriendsDirectoryDiscovery } from './friendsDirectory'\nimport { createCatalogDirectoryDiscovery } from './catalogDirectory'\nimport { matchesAnyLabel, mergeDirectoryEntry, sortEntries } from './directoryHelpers'\n\nconst DEFAULT_FOAF_DISTANCE = 3\n\nexport const DEFAULT_DIRECTORY_CATALOG_URL = 'https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl'\nexport const DEFAULT_DIRECTORY_SOURCES: DirectorySource[] = ['contacts', 'friends', 'catalog', 'groups']\n\nexport function createDirectoryLogic (\n store: LiveStore,\n authn: AuthnLogic,\n typeIndexLogic: TypeIndexLogic\n): DirectoryLogic {\n const contactsDiscovery = createContactsDirectoryDiscovery(store, typeIndexLogic)\n const friendsDiscovery = createFriendsDirectoryDiscovery(store)\n const catalogDiscovery = createCatalogDirectoryDiscovery()\n\n async function discoverWithNormalizedOptions (\n normalized: ReturnType<typeof normalizeOptions>\n ): Promise<DirectoryEntry[]> {\n const discoveredEntries = new Map<string, DirectoryEntry>()\n const discoveryTasks: Promise<void>[] = []\n\n const mergeEntry = (entry: DirectoryEntry): void => {\n mergeDirectoryEntry(discoveredEntries, entry)\n }\n\n if (normalized.sources.includes('catalog')) {\n discoveryTasks.push(catalogDiscovery.discoverCatalogEntries(normalized.catalogUrl, mergeEntry))\n }\n\n if (normalized.user) {\n if (normalized.sources.includes('contacts')) {\n discoveryTasks.push(contactsDiscovery.discoverAddressBookContacts(normalized.user, mergeEntry))\n }\n\n if (normalized.sources.includes('groups')) {\n discoveryTasks.push(contactsDiscovery.discoverAddressBookGroups(normalized.user, mergeEntry))\n }\n\n if (normalized.sources.includes('friends')) {\n discoveryTasks.push(friendsDiscovery.discoverFoafPeople(normalized.user, normalized.maxFoafDistance, mergeEntry))\n }\n }\n\n if (!discoveryTasks.length) {\n return []\n }\n\n const results = await Promise.allSettled(discoveryTasks)\n if (results.every(result => result.status === 'rejected')) {\n throw new Error('Unable to load directory entries.')\n }\n\n return sortEntries(discoveredEntries.values())\n }\n\n async function search (options: DirectorySearchOptions = {}): Promise<DirectoryEntry[]> {\n const normalized = normalizeOptions(options)\n const entries = await discoverWithNormalizedOptions(normalized)\n return entries.filter(entry => matchesAnyLabel([entry.label, ...(entry.searchableLabels ?? [])], normalized.query))\n }\n\n return {\n search\n }\n\n function normalizeOptions (options: DirectorySearchOptions = {}) {\n const sources = options.sources === undefined ? [...DEFAULT_DIRECTORY_SOURCES] : [...options.sources]\n return {\n query: options.query ?? '',\n sources,\n catalogUrl: options.catalogUrl ?? DEFAULT_DIRECTORY_CATALOG_URL,\n user: options.user ?? authn.currentUser(),\n maxFoafDistance: options.maxFoafDistance ?? DEFAULT_FOAF_DISTANCE\n }\n }\n}\n"],"mappings":"mKAOA,IAAM,EAAwB,EAEjB,EAAgC,mFAChC,EAA+C,CAAC,WAAY,UAAW,UAAW,QAAQ,EAEvG,SAAgB,EACd,EACA,EACA,EACgB,CAChB,IAAM,EAAoB,EAAA,iCAAiC,EAAO,CAAc,EAC1E,EAAmB,EAAA,gCAAgC,CAAK,EACxD,EAAmB,EAAA,gCAAgC,EAEzD,eAAe,EACb,EAC2B,CAC3B,IAAM,EAAoB,IAAI,IACxB,EAAkC,CAAC,EAEnC,EAAc,GAAgC,CAClD,EAAA,oBAAoB,EAAmB,CAAK,CAC9C,EAoBA,GAlBI,EAAW,QAAQ,SAAS,SAAS,GACvC,EAAe,KAAK,EAAiB,uBAAuB,EAAW,WAAY,CAAU,CAAC,EAG5F,EAAW,OACT,EAAW,QAAQ,SAAS,UAAU,GACxC,EAAe,KAAK,EAAkB,4BAA4B,EAAW,KAAM,CAAU,CAAC,EAG5F,EAAW,QAAQ,SAAS,QAAQ,GACtC,EAAe,KAAK,EAAkB,0BAA0B,EAAW,KAAM,CAAU,CAAC,EAG1F,EAAW,QAAQ,SAAS,SAAS,GACvC,EAAe,KAAK,EAAiB,mBAAmB,EAAW,KAAM,EAAW,gBAAiB,CAAU,CAAC,GAIhH,CAAC,EAAe,OAClB,MAAO,CAAC,EAIV,IAAI,MADkB,QAAQ,WAAW,CAAc,EAAA,CAC3C,MAAM,GAAU,EAAO,SAAW,UAAU,EACtD,MAAU,MAAM,mCAAmC,EAGrD,OAAO,EAAA,YAAY,EAAkB,OAAO,CAAC,CAC/C,CAEA,eAAe,EAAQ,EAAkC,CAAC,EAA8B,CACtF,IAAM,EAAa,EAAiB,CAAO,EAE3C,OAAO,MADe,EAA8B,CAAU,EAAA,CAC/C,OAAO,GAAS,EAAA,gBAAgB,CAAC,EAAM,MAAO,GAAI,EAAM,kBAAoB,CAAC,CAAE,EAAG,EAAW,KAAK,CAAC,CACpH,CAEA,MAAO,CACL,QACF,EAEA,SAAS,EAAkB,EAAkC,CAAC,EAAG,CAC/D,IAAM,EAAU,EAAQ,UAAY,IAAA,GAAY,CAAC,GAAG,CAAyB,EAAI,CAAC,GAAG,EAAQ,OAAO,EACpG,MAAO,CACL,MAAO,EAAQ,OAAS,GACxB,UACA,WAAY,EAAQ,YAAA,mFACpB,KAAM,EAAQ,MAAQ,EAAM,YAAY,EACxC,gBAAiB,EAAQ,iBAAmB,CAC9C,CACF,CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AuthnLogic, type DirectoryLogic, type DirectorySource, type TypeIndexLogic } from '../types';
|
|
2
|
+
import { type LiveStore } from 'rdflib';
|
|
3
|
+
export declare const DEFAULT_DIRECTORY_CATALOG_URL = "https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl";
|
|
4
|
+
export declare const DEFAULT_DIRECTORY_SOURCES: DirectorySource[];
|
|
5
|
+
export declare function createDirectoryLogic(store: LiveStore, authn: AuthnLogic, typeIndexLogic: TypeIndexLogic): DirectoryLogic;
|
|
6
|
+
//# sourceMappingURL=directoryLogic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryLogic.d.ts","sourceRoot":"","sources":["../../src/directory/directoryLogic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAuB,KAAK,cAAc,EAA+B,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAC5J,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAA;AAQvC,eAAO,MAAM,6BAA6B,qFAAqF,CAAA;AAC/H,eAAO,MAAM,yBAAyB,EAAE,eAAe,EAAiD,CAAA;AAExG,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,UAAU,EACjB,cAAc,EAAE,cAAc,GAC7B,cAAc,CAiEhB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { matchesAnyLabel as e, mergeDirectoryEntry as t, sortEntries as n } from "./directoryHelpers.esm.js";
|
|
2
|
+
import { createContactsDirectoryDiscovery as r } from "./contactsDirectory.esm.js";
|
|
3
|
+
import { createFriendsDirectoryDiscovery as i } from "./friendsDirectory.esm.js";
|
|
4
|
+
import { createCatalogDirectoryDiscovery as a } from "./catalogDirectory.esm.js";
|
|
5
|
+
//#region src/directory/directoryLogic.ts
|
|
6
|
+
var o = 3, s = "https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl", c = [
|
|
7
|
+
"contacts",
|
|
8
|
+
"friends",
|
|
9
|
+
"catalog",
|
|
10
|
+
"groups"
|
|
11
|
+
];
|
|
12
|
+
function l(s, l, u) {
|
|
13
|
+
let d = r(s, u), f = i(s), p = a();
|
|
14
|
+
async function m(e) {
|
|
15
|
+
let r = /* @__PURE__ */ new Map(), i = [], a = (e) => {
|
|
16
|
+
t(r, e);
|
|
17
|
+
};
|
|
18
|
+
if (e.sources.includes("catalog") && i.push(p.discoverCatalogEntries(e.catalogUrl, a)), e.user && (e.sources.includes("contacts") && i.push(d.discoverAddressBookContacts(e.user, a)), e.sources.includes("groups") && i.push(d.discoverAddressBookGroups(e.user, a)), e.sources.includes("friends") && i.push(f.discoverFoafPeople(e.user, e.maxFoafDistance, a))), !i.length) return [];
|
|
19
|
+
if ((await Promise.allSettled(i)).every((e) => e.status === "rejected")) throw Error("Unable to load directory entries.");
|
|
20
|
+
return n(r.values());
|
|
21
|
+
}
|
|
22
|
+
async function h(t = {}) {
|
|
23
|
+
let n = g(t);
|
|
24
|
+
return (await m(n)).filter((t) => e([t.label, ...t.searchableLabels ?? []], n.query));
|
|
25
|
+
}
|
|
26
|
+
return { search: h };
|
|
27
|
+
function g(e = {}) {
|
|
28
|
+
let t = e.sources === void 0 ? [...c] : [...e.sources];
|
|
29
|
+
return {
|
|
30
|
+
query: e.query ?? "",
|
|
31
|
+
sources: t,
|
|
32
|
+
catalogUrl: e.catalogUrl ?? "https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl",
|
|
33
|
+
user: e.user ?? l.currentUser(),
|
|
34
|
+
maxFoafDistance: e.maxFoafDistance ?? o
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { s as DEFAULT_DIRECTORY_CATALOG_URL, c as DEFAULT_DIRECTORY_SOURCES, l as createDirectoryLogic };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=directoryLogic.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directoryLogic.esm.js","names":[],"sources":["../../src/directory/directoryLogic.ts"],"sourcesContent":["import { type AuthnLogic, type DirectoryEntry, type DirectoryLogic, type DirectorySearchOptions, type DirectorySource, type TypeIndexLogic } from '../types'\nimport { type LiveStore } from 'rdflib'\nimport { createContactsDirectoryDiscovery } from './contactsDirectory'\nimport { createFriendsDirectoryDiscovery } from './friendsDirectory'\nimport { createCatalogDirectoryDiscovery } from './catalogDirectory'\nimport { matchesAnyLabel, mergeDirectoryEntry, sortEntries } from './directoryHelpers'\n\nconst DEFAULT_FOAF_DISTANCE = 3\n\nexport const DEFAULT_DIRECTORY_CATALOG_URL = 'https://raw.githubusercontent.com/solid/catalog/refs/heads/main/catalog-data.ttl'\nexport const DEFAULT_DIRECTORY_SOURCES: DirectorySource[] = ['contacts', 'friends', 'catalog', 'groups']\n\nexport function createDirectoryLogic (\n store: LiveStore,\n authn: AuthnLogic,\n typeIndexLogic: TypeIndexLogic\n): DirectoryLogic {\n const contactsDiscovery = createContactsDirectoryDiscovery(store, typeIndexLogic)\n const friendsDiscovery = createFriendsDirectoryDiscovery(store)\n const catalogDiscovery = createCatalogDirectoryDiscovery()\n\n async function discoverWithNormalizedOptions (\n normalized: ReturnType<typeof normalizeOptions>\n ): Promise<DirectoryEntry[]> {\n const discoveredEntries = new Map<string, DirectoryEntry>()\n const discoveryTasks: Promise<void>[] = []\n\n const mergeEntry = (entry: DirectoryEntry): void => {\n mergeDirectoryEntry(discoveredEntries, entry)\n }\n\n if (normalized.sources.includes('catalog')) {\n discoveryTasks.push(catalogDiscovery.discoverCatalogEntries(normalized.catalogUrl, mergeEntry))\n }\n\n if (normalized.user) {\n if (normalized.sources.includes('contacts')) {\n discoveryTasks.push(contactsDiscovery.discoverAddressBookContacts(normalized.user, mergeEntry))\n }\n\n if (normalized.sources.includes('groups')) {\n discoveryTasks.push(contactsDiscovery.discoverAddressBookGroups(normalized.user, mergeEntry))\n }\n\n if (normalized.sources.includes('friends')) {\n discoveryTasks.push(friendsDiscovery.discoverFoafPeople(normalized.user, normalized.maxFoafDistance, mergeEntry))\n }\n }\n\n if (!discoveryTasks.length) {\n return []\n }\n\n const results = await Promise.allSettled(discoveryTasks)\n if (results.every(result => result.status === 'rejected')) {\n throw new Error('Unable to load directory entries.')\n }\n\n return sortEntries(discoveredEntries.values())\n }\n\n async function search (options: DirectorySearchOptions = {}): Promise<DirectoryEntry[]> {\n const normalized = normalizeOptions(options)\n const entries = await discoverWithNormalizedOptions(normalized)\n return entries.filter(entry => matchesAnyLabel([entry.label, ...(entry.searchableLabels ?? [])], normalized.query))\n }\n\n return {\n search\n }\n\n function normalizeOptions (options: DirectorySearchOptions = {}) {\n const sources = options.sources === undefined ? [...DEFAULT_DIRECTORY_SOURCES] : [...options.sources]\n return {\n query: options.query ?? '',\n sources,\n catalogUrl: options.catalogUrl ?? DEFAULT_DIRECTORY_CATALOG_URL,\n user: options.user ?? authn.currentUser(),\n maxFoafDistance: options.maxFoafDistance ?? DEFAULT_FOAF_DISTANCE\n }\n }\n}\n"],"mappings":";;;;;AAOA,IAAM,IAAwB,GAEjB,IAAgC,oFAChC,IAA+C;CAAC;CAAY;CAAW;CAAW;AAAQ;AAEvG,SAAgB,EACd,GACA,GACA,GACgB;CAChB,IAAM,IAAoB,EAAiC,GAAO,CAAc,GAC1E,IAAmB,EAAgC,CAAK,GACxD,IAAmB,EAAgC;CAEzD,eAAe,EACb,GAC2B;EAC3B,IAAM,oBAAoB,IAAI,IAA4B,GACpD,IAAkC,CAAC,GAEnC,KAAc,MAAgC;GAClD,EAAoB,GAAmB,CAAK;EAC9C;EAoBA,IAlBI,EAAW,QAAQ,SAAS,SAAS,KACvC,EAAe,KAAK,EAAiB,uBAAuB,EAAW,YAAY,CAAU,CAAC,GAG5F,EAAW,SACT,EAAW,QAAQ,SAAS,UAAU,KACxC,EAAe,KAAK,EAAkB,4BAA4B,EAAW,MAAM,CAAU,CAAC,GAG5F,EAAW,QAAQ,SAAS,QAAQ,KACtC,EAAe,KAAK,EAAkB,0BAA0B,EAAW,MAAM,CAAU,CAAC,GAG1F,EAAW,QAAQ,SAAS,SAAS,KACvC,EAAe,KAAK,EAAiB,mBAAmB,EAAW,MAAM,EAAW,iBAAiB,CAAU,CAAC,IAIhH,CAAC,EAAe,QAClB,OAAO,CAAC;EAIV,KAAI,MADkB,QAAQ,WAAW,CAAc,EAAA,CAC3C,OAAM,MAAU,EAAO,WAAW,UAAU,GACtD,MAAU,MAAM,mCAAmC;EAGrD,OAAO,EAAY,EAAkB,OAAO,CAAC;CAC/C;CAEA,eAAe,EAAQ,IAAkC,CAAC,GAA8B;EACtF,IAAM,IAAa,EAAiB,CAAO;EAE3C,QAAO,MADe,EAA8B,CAAU,EAAA,CAC/C,QAAO,MAAS,EAAgB,CAAC,EAAM,OAAO,GAAI,EAAM,oBAAoB,CAAC,CAAE,GAAG,EAAW,KAAK,CAAC;CACpH;CAEA,OAAO,EACL,UACF;CAEA,SAAS,EAAkB,IAAkC,CAAC,GAAG;EAC/D,IAAM,IAAU,EAAQ,YAAY,KAAA,IAAY,CAAC,GAAG,CAAyB,IAAI,CAAC,GAAG,EAAQ,OAAO;EACpG,OAAO;GACL,OAAO,EAAQ,SAAS;GACxB;GACA,YAAY,EAAQ,cAAA;GACpB,MAAM,EAAQ,QAAQ,EAAM,YAAY;GACxC,iBAAiB,EAAQ,mBAAmB;EAC9C;CACF;AACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../util/ns.cjs.js"),t=require("./directoryHelpers.cjs.js");var n=6;function r(r){function i(e){return e===1?`Friend`:`People`}async function a(e,n,a){let o=t.storedLabelForNode(r,e);o&&await a({kind:`person`,uri:e.value,label:o,subjectType:`agent`,relationshipLabel:i(n),sources:[`friends`]})}async function o(i,o,s){let c=new Set([i.value]),l=new Set,u=new Set,d=[{person:i,depth:0}],f=async n=>{let{person:d,depth:f}=n,p=d.doc().value;if(u.has(p)||(u.add(p),await t.loadDocumentSilently(r,d)),d.value!==i.value&&(l.has(d.value)||(l.add(d.value),await a(d,f,s))),f>=o)return[];let m=[],h=r.each(d,e.ns.foaf(`knows`));for(let e of h)if(e.termType===`NamedNode`){let n=t.storedLabelForNode(r,e);e.value!==i.value&&n&&!l.has(e.value)&&(l.add(e.value),await s({kind:`person`,uri:e.value,label:n,subjectType:`agent`,relationshipLabel:f===0?`Friend`:`People`,sources:[`friends`]})),c.has(e.value)||(c.add(e.value),m.push({person:e,depth:f+1}))}return m};for(;d.length>0;){let e=[];for(let t=0;t<d.length;t+=n){let r=d.slice(t,t+n);(await Promise.all(r.map(f))).forEach(t=>e.push(...t))}d=e}}return{discoverFoafPeople:o}}exports.createFriendsDirectoryDiscovery=r;
|
|
2
|
+
//# sourceMappingURL=friendsDirectory.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsDirectory.cjs.js","names":[],"sources":["../../src/directory/friendsDirectory.ts"],"sourcesContent":["import { type DirectoryEntry } from '../types'\nimport { type LiveStore, NamedNode } from 'rdflib'\nimport { ns } from '../util/ns'\nimport { loadDocumentSilently, storedLabelForNode } from './directoryHelpers'\n\nconst PEOPLE_SEARCH_CONCURRENCY = 6\n\nexport function createFriendsDirectoryDiscovery (store: LiveStore) {\n function relationshipLabelForDepth (depth: number) {\n return depth === 1 ? 'Friend' : 'People'\n }\n\n async function emitPersonEntry (\n person: NamedNode,\n depth: number,\n onEntry: (entry: DirectoryEntry) => void | Promise<void>\n ): Promise<void> {\n const personName = storedLabelForNode(store, person)\n if (!personName) return\n\n await onEntry({\n kind: 'person',\n uri: person.value,\n label: personName,\n subjectType: 'agent',\n relationshipLabel: relationshipLabelForDepth(depth),\n sources: ['friends']\n })\n }\n\n async function discoverFoafPeople (\n user: NamedNode,\n maxFoafDistance: number,\n onEntry: (entry: DirectoryEntry) => void | Promise<void>\n ): Promise<void> {\n const visited = new Set<string>([user.value])\n const emitted = new Set<string>()\n const loadedDocs = new Set<string>()\n let queue: Array<{ person: NamedNode, depth: number }> = [{ person: user, depth: 0 }]\n\n const processPerson = async (currentEntry: { person: NamedNode, depth: number }) => {\n const { person: current, depth } = currentEntry\n const currentDoc = current.doc().value\n if (!loadedDocs.has(currentDoc)) {\n loadedDocs.add(currentDoc)\n await loadDocumentSilently(store, current)\n }\n\n if (current.value !== user.value) {\n if (!emitted.has(current.value)) {\n emitted.add(current.value)\n await emitPersonEntry(current, depth, onEntry)\n }\n }\n\n if (depth >= maxFoafDistance) {\n return [] as Array<{ person: NamedNode, depth: number }>\n }\n\n const nextPeople: Array<{ person: NamedNode, depth: number }> = []\n const contacts = store.each(current, ns.foaf('knows')) as NamedNode[]\n for (const contact of contacts) {\n if (contact.termType === 'NamedNode') {\n const contactName = storedLabelForNode(store, contact)\n if (contact.value !== user.value && contactName && !emitted.has(contact.value)) {\n emitted.add(contact.value)\n await onEntry({\n kind: 'person',\n uri: contact.value,\n label: contactName,\n subjectType: 'agent',\n relationshipLabel: depth === 0 ? 'Friend' : 'People',\n sources: ['friends']\n })\n }\n\n if (!visited.has(contact.value)) {\n visited.add(contact.value)\n nextPeople.push({ person: contact, depth: depth + 1 })\n }\n }\n }\n\n return nextPeople\n }\n\n while (queue.length > 0) {\n const nextQueue: Array<{ person: NamedNode, depth: number }> = []\n\n for (let index = 0; index < queue.length; index += PEOPLE_SEARCH_CONCURRENCY) {\n const batch = queue.slice(index, index + PEOPLE_SEARCH_CONCURRENCY)\n const nested = await Promise.all(batch.map(processPerson))\n nested.forEach(entries => nextQueue.push(...entries))\n }\n\n queue = nextQueue\n }\n }\n\n return {\n discoverFoafPeople\n }\n}\n"],"mappings":"4EAKA,IAAM,EAA4B,EAElC,SAAgB,EAAiC,EAAkB,CACjE,SAAS,EAA2B,EAAe,CACjD,OAAO,IAAU,EAAI,SAAW,QAClC,CAEA,eAAe,EACb,EACA,EACA,EACe,CACf,IAAM,EAAa,EAAA,mBAAmB,EAAO,CAAM,EAC9C,GAEL,MAAM,EAAQ,CACZ,KAAM,SACN,IAAK,EAAO,MACZ,MAAO,EACP,YAAa,QACb,kBAAmB,EAA0B,CAAK,EAClD,QAAS,CAAC,SAAS,CACrB,CAAC,CACH,CAEA,eAAe,EACb,EACA,EACA,EACe,CACf,IAAM,EAAU,IAAI,IAAY,CAAC,EAAK,KAAK,CAAC,EACtC,EAAU,IAAI,IACd,EAAa,IAAI,IACnB,EAAqD,CAAC,CAAE,OAAQ,EAAM,MAAO,CAAE,CAAC,EAE9E,EAAgB,KAAO,IAAuD,CAClF,GAAM,CAAE,OAAQ,EAAS,SAAU,EAC7B,EAAa,EAAQ,IAAI,CAAC,CAAC,MAajC,GAZK,EAAW,IAAI,CAAU,IAC5B,EAAW,IAAI,CAAU,EACzB,MAAM,EAAA,qBAAqB,EAAO,CAAO,GAGvC,EAAQ,QAAU,EAAK,QACpB,EAAQ,IAAI,EAAQ,KAAK,IAC5B,EAAQ,IAAI,EAAQ,KAAK,EACzB,MAAM,EAAgB,EAAS,EAAO,CAAO,IAI7C,GAAS,EACX,MAAO,CAAC,EAGV,IAAM,EAA0D,CAAC,EAC3D,EAAW,EAAM,KAAK,EAAS,EAAA,GAAG,KAAK,OAAO,CAAC,EACrD,IAAK,IAAM,KAAW,EACpB,GAAI,EAAQ,WAAa,YAAa,CACpC,IAAM,EAAc,EAAA,mBAAmB,EAAO,CAAO,EACjD,EAAQ,QAAU,EAAK,OAAS,GAAe,CAAC,EAAQ,IAAI,EAAQ,KAAK,IAC3E,EAAQ,IAAI,EAAQ,KAAK,EACzB,MAAM,EAAQ,CACZ,KAAM,SACN,IAAK,EAAQ,MACb,MAAO,EACP,YAAa,QACb,kBAAmB,IAAU,EAAI,SAAW,SAC5C,QAAS,CAAC,SAAS,CACrB,CAAC,GAGE,EAAQ,IAAI,EAAQ,KAAK,IAC5B,EAAQ,IAAI,EAAQ,KAAK,EACzB,EAAW,KAAK,CAAE,OAAQ,EAAS,MAAO,EAAQ,CAAE,CAAC,EAEzD,CAGF,OAAO,CACT,EAEA,KAAO,EAAM,OAAS,GAAG,CACvB,IAAM,EAAyD,CAAC,EAEhE,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EAA2B,CAC5E,IAAM,EAAQ,EAAM,MAAM,EAAO,EAAQ,CAAyB,GAElE,MADqB,QAAQ,IAAI,EAAM,IAAI,CAAa,CAAC,EAAA,CAClD,QAAQ,GAAW,EAAU,KAAK,GAAG,CAAO,CAAC,CACtD,CAEA,EAAQ,CACV,CACF,CAEA,MAAO,CACL,oBACF,CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type DirectoryEntry } from '../types';
|
|
2
|
+
import { type LiveStore, NamedNode } from 'rdflib';
|
|
3
|
+
export declare function createFriendsDirectoryDiscovery(store: LiveStore): {
|
|
4
|
+
discoverFoafPeople: (user: NamedNode, maxFoafDistance: number, onEntry: (entry: DirectoryEntry) => void | Promise<void>) => Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=friendsDirectory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsDirectory.d.ts","sourceRoot":"","sources":["../../src/directory/friendsDirectory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAMlD,wBAAgB,+BAA+B,CAAE,KAAK,EAAE,SAAS;+BAwBvD,SAAS,mBACE,MAAM,WACd,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KACvD,OAAO,CAAC,IAAI,CAAC;EAoEjB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ns as e } from "../util/ns.esm.js";
|
|
2
|
+
import { loadDocumentSilently as t, storedLabelForNode as n } from "./directoryHelpers.esm.js";
|
|
3
|
+
//#region src/directory/friendsDirectory.ts
|
|
4
|
+
var r = 6;
|
|
5
|
+
function i(i) {
|
|
6
|
+
function a(e) {
|
|
7
|
+
return e === 1 ? "Friend" : "People";
|
|
8
|
+
}
|
|
9
|
+
async function o(e, t, r) {
|
|
10
|
+
let o = n(i, e);
|
|
11
|
+
o && await r({
|
|
12
|
+
kind: "person",
|
|
13
|
+
uri: e.value,
|
|
14
|
+
label: o,
|
|
15
|
+
subjectType: "agent",
|
|
16
|
+
relationshipLabel: a(t),
|
|
17
|
+
sources: ["friends"]
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function s(a, s, c) {
|
|
21
|
+
let l = /* @__PURE__ */ new Set([a.value]), u = /* @__PURE__ */ new Set(), d = /* @__PURE__ */ new Set(), f = [{
|
|
22
|
+
person: a,
|
|
23
|
+
depth: 0
|
|
24
|
+
}], p = async (r) => {
|
|
25
|
+
let { person: f, depth: p } = r, m = f.doc().value;
|
|
26
|
+
if (d.has(m) || (d.add(m), await t(i, f)), f.value !== a.value && (u.has(f.value) || (u.add(f.value), await o(f, p, c))), p >= s) return [];
|
|
27
|
+
let h = [], g = i.each(f, e.foaf("knows"));
|
|
28
|
+
for (let e of g) if (e.termType === "NamedNode") {
|
|
29
|
+
let t = n(i, e);
|
|
30
|
+
e.value !== a.value && t && !u.has(e.value) && (u.add(e.value), await c({
|
|
31
|
+
kind: "person",
|
|
32
|
+
uri: e.value,
|
|
33
|
+
label: t,
|
|
34
|
+
subjectType: "agent",
|
|
35
|
+
relationshipLabel: p === 0 ? "Friend" : "People",
|
|
36
|
+
sources: ["friends"]
|
|
37
|
+
})), l.has(e.value) || (l.add(e.value), h.push({
|
|
38
|
+
person: e,
|
|
39
|
+
depth: p + 1
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
return h;
|
|
43
|
+
};
|
|
44
|
+
for (; f.length > 0;) {
|
|
45
|
+
let e = [];
|
|
46
|
+
for (let t = 0; t < f.length; t += r) {
|
|
47
|
+
let n = f.slice(t, t + r);
|
|
48
|
+
(await Promise.all(n.map(p))).forEach((t) => e.push(...t));
|
|
49
|
+
}
|
|
50
|
+
f = e;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { discoverFoafPeople: s };
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { i as createFriendsDirectoryDiscovery };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=friendsDirectory.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"friendsDirectory.esm.js","names":[],"sources":["../../src/directory/friendsDirectory.ts"],"sourcesContent":["import { type DirectoryEntry } from '../types'\nimport { type LiveStore, NamedNode } from 'rdflib'\nimport { ns } from '../util/ns'\nimport { loadDocumentSilently, storedLabelForNode } from './directoryHelpers'\n\nconst PEOPLE_SEARCH_CONCURRENCY = 6\n\nexport function createFriendsDirectoryDiscovery (store: LiveStore) {\n function relationshipLabelForDepth (depth: number) {\n return depth === 1 ? 'Friend' : 'People'\n }\n\n async function emitPersonEntry (\n person: NamedNode,\n depth: number,\n onEntry: (entry: DirectoryEntry) => void | Promise<void>\n ): Promise<void> {\n const personName = storedLabelForNode(store, person)\n if (!personName) return\n\n await onEntry({\n kind: 'person',\n uri: person.value,\n label: personName,\n subjectType: 'agent',\n relationshipLabel: relationshipLabelForDepth(depth),\n sources: ['friends']\n })\n }\n\n async function discoverFoafPeople (\n user: NamedNode,\n maxFoafDistance: number,\n onEntry: (entry: DirectoryEntry) => void | Promise<void>\n ): Promise<void> {\n const visited = new Set<string>([user.value])\n const emitted = new Set<string>()\n const loadedDocs = new Set<string>()\n let queue: Array<{ person: NamedNode, depth: number }> = [{ person: user, depth: 0 }]\n\n const processPerson = async (currentEntry: { person: NamedNode, depth: number }) => {\n const { person: current, depth } = currentEntry\n const currentDoc = current.doc().value\n if (!loadedDocs.has(currentDoc)) {\n loadedDocs.add(currentDoc)\n await loadDocumentSilently(store, current)\n }\n\n if (current.value !== user.value) {\n if (!emitted.has(current.value)) {\n emitted.add(current.value)\n await emitPersonEntry(current, depth, onEntry)\n }\n }\n\n if (depth >= maxFoafDistance) {\n return [] as Array<{ person: NamedNode, depth: number }>\n }\n\n const nextPeople: Array<{ person: NamedNode, depth: number }> = []\n const contacts = store.each(current, ns.foaf('knows')) as NamedNode[]\n for (const contact of contacts) {\n if (contact.termType === 'NamedNode') {\n const contactName = storedLabelForNode(store, contact)\n if (contact.value !== user.value && contactName && !emitted.has(contact.value)) {\n emitted.add(contact.value)\n await onEntry({\n kind: 'person',\n uri: contact.value,\n label: contactName,\n subjectType: 'agent',\n relationshipLabel: depth === 0 ? 'Friend' : 'People',\n sources: ['friends']\n })\n }\n\n if (!visited.has(contact.value)) {\n visited.add(contact.value)\n nextPeople.push({ person: contact, depth: depth + 1 })\n }\n }\n }\n\n return nextPeople\n }\n\n while (queue.length > 0) {\n const nextQueue: Array<{ person: NamedNode, depth: number }> = []\n\n for (let index = 0; index < queue.length; index += PEOPLE_SEARCH_CONCURRENCY) {\n const batch = queue.slice(index, index + PEOPLE_SEARCH_CONCURRENCY)\n const nested = await Promise.all(batch.map(processPerson))\n nested.forEach(entries => nextQueue.push(...entries))\n }\n\n queue = nextQueue\n }\n }\n\n return {\n discoverFoafPeople\n }\n}\n"],"mappings":";;;AAKA,IAAM,IAA4B;AAElC,SAAgB,EAAiC,GAAkB;CACjE,SAAS,EAA2B,GAAe;EACjD,OAAO,MAAU,IAAI,WAAW;CAClC;CAEA,eAAe,EACb,GACA,GACA,GACe;EACf,IAAM,IAAa,EAAmB,GAAO,CAAM;EACnD,AAAK,KAEL,MAAM,EAAQ;GACZ,MAAM;GACN,KAAK,EAAO;GACZ,OAAO;GACP,aAAa;GACb,mBAAmB,EAA0B,CAAK;GAClD,SAAS,CAAC,SAAS;EACrB,CAAC;CACH;CAEA,eAAe,EACb,GACA,GACA,GACe;EACf,IAAM,oBAAU,IAAI,IAAY,CAAC,EAAK,KAAK,CAAC,GACtC,oBAAU,IAAI,IAAY,GAC1B,oBAAa,IAAI,IAAY,GAC/B,IAAqD,CAAC;GAAE,QAAQ;GAAM,OAAO;EAAE,CAAC,GAE9E,IAAgB,OAAO,MAAuD;GAClF,IAAM,EAAE,QAAQ,GAAS,aAAU,GAC7B,IAAa,EAAQ,IAAI,CAAC,CAAC;GAajC,IAZK,EAAW,IAAI,CAAU,MAC5B,EAAW,IAAI,CAAU,GACzB,MAAM,EAAqB,GAAO,CAAO,IAGvC,EAAQ,UAAU,EAAK,UACpB,EAAQ,IAAI,EAAQ,KAAK,MAC5B,EAAQ,IAAI,EAAQ,KAAK,GACzB,MAAM,EAAgB,GAAS,GAAO,CAAO,KAI7C,KAAS,GACX,OAAO,CAAC;GAGV,IAAM,IAA0D,CAAC,GAC3D,IAAW,EAAM,KAAK,GAAS,EAAG,KAAK,OAAO,CAAC;GACrD,KAAK,IAAM,KAAW,GACpB,IAAI,EAAQ,aAAa,aAAa;IACpC,IAAM,IAAc,EAAmB,GAAO,CAAO;IAarD,AAZI,EAAQ,UAAU,EAAK,SAAS,KAAe,CAAC,EAAQ,IAAI,EAAQ,KAAK,MAC3E,EAAQ,IAAI,EAAQ,KAAK,GACzB,MAAM,EAAQ;KACZ,MAAM;KACN,KAAK,EAAQ;KACb,OAAO;KACP,aAAa;KACb,mBAAmB,MAAU,IAAI,WAAW;KAC5C,SAAS,CAAC,SAAS;IACrB,CAAC,IAGE,EAAQ,IAAI,EAAQ,KAAK,MAC5B,EAAQ,IAAI,EAAQ,KAAK,GACzB,EAAW,KAAK;KAAE,QAAQ;KAAS,OAAO,IAAQ;IAAE,CAAC;GAEzD;GAGF,OAAO;EACT;EAEA,OAAO,EAAM,SAAS,IAAG;GACvB,IAAM,IAAyD,CAAC;GAEhE,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAM,QAAQ,KAAS,GAA2B;IAC5E,IAAM,IAAQ,EAAM,MAAM,GAAO,IAAQ,CAAyB;IAElE,CAAA,MADqB,QAAQ,IAAI,EAAM,IAAI,CAAa,CAAC,EAAA,CAClD,SAAQ,MAAW,EAAU,KAAK,GAAG,CAAO,CAAC;GACtD;GAEA,IAAQ;EACV;CACF;CAEA,OAAO,EACL,sBACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inboxLogic.d.ts","sourceRoot":"","sources":["../../src/inbox/inboxLogic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAGrC,wBAAgB,gBAAgB,CAAC,KAAK,KAAA,EAAE,YAAY,KAAA,EAAE,YAAY,KAAA,EAAE,cAAc,KAAA,EAAE,QAAQ,KAAA,GAAG,UAAU,CAqDxG"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./authSession/identityState.cjs.js"),t=require("./acl/aclLogic.cjs.js"),n=require("./authn/authUtil.cjs.js"),r=require("./logic/CustomError.cjs.js"),i=require("./typeIndex/typeIndexLogic.cjs.js"),a=require("./logic/solidLogicSingleton.cjs.js"),
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./authSession/identityState.cjs.js"),t=require("./acl/aclLogic.cjs.js"),n=require("./authn/authUtil.cjs.js"),r=require("./logic/CustomError.cjs.js"),i=require("./typeIndex/typeIndexLogic.cjs.js"),a=require("./directory/directoryLogic.cjs.js"),o=require("./logic/solidLogicSingleton.cjs.js"),s=require("./authn/serverLogout.cjs.js"),c=require("./issuer/issuerLogic.cjs.js");let l=require("@dokieli/web-access-control");var u=o.solidLogicSingleton.authn,d=o.solidLogicSingleton.authn.authSession,f=o.solidLogicSingleton.store;exports.ACCESS_ROLES=t.ACCESS_ROLES,exports.ACL_LINK=t.ACL_LINK,Object.defineProperty(exports,"Authenticated",{enumerable:!0,get:function(){return l.Authenticated}}),exports.CrossOriginForbiddenError=r.CrossOriginForbiddenError,exports.DEFAULT_DIRECTORY_CATALOG_URL=a.DEFAULT_DIRECTORY_CATALOG_URL,exports.DEFAULT_DIRECTORY_SOURCES=a.DEFAULT_DIRECTORY_SOURCES,exports.FetchError=r.FetchError,exports.NotEditableError=r.NotEditableError,exports.NotFoundError=r.NotFoundError,exports.PUBLIC_ACCESS_ROLES=t.PUBLIC_ACCESS_ROLES,Object.defineProperty(exports,"Public",{enumerable:!0,get:function(){return l.Public}}),exports.SameOriginForbiddenError=r.SameOriginForbiddenError,exports.UnauthorizedError=r.UnauthorizedError,exports.WebOperationError=r.WebOperationError,exports.appContext=n.appContext,exports.authSession=d,exports.authn=u,exports.createDirectoryLogic=a.createDirectoryLogic,exports.createTypeIndexLogic=i.createTypeIndexLogic,exports.getSuggestedIssuers=c.getSuggestedIssuers,exports.offlineTestID=n.offlineTestID,exports.performServerSideLogout=s.performServerSideLogout,exports.reloadOnIdentityReplaced=e.reloadOnIdentityReplaced,exports.solidLogicSingleton=o.solidLogicSingleton,exports.store=f;
|
|
2
2
|
//# sourceMappingURL=index.cjs.js.map
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["// Make these variables directly accessible as it is what you need most of the time\n// This also makes these variable globaly accesible in mashlib\nimport { solidLogicSingleton } from './logic/solidLogicSingleton'\n\nconst authn = solidLogicSingleton.authn\nconst authSession = solidLogicSingleton.authn.authSession\nconst store = solidLogicSingleton.store\n\nexport { ACL_LINK } from './acl/aclLogic'\nexport { offlineTestID, appContext } from './authn/authUtil'\nexport { performServerSideLogout } from './authn/serverLogout'\nexport { reloadOnIdentityReplaced } from './authSession/identityState'\nexport { getSuggestedIssuers } from './issuer/issuerLogic'\nexport { createTypeIndexLogic } from './typeIndex/typeIndexLogic'\nexport type { AppDetails, SolidNamespace, AuthenticationContext, SolidLogic, ChatLogic } from './types'\nexport { UnauthorizedError, CrossOriginForbiddenError, SameOriginForbiddenError, NotFoundError, FetchError, NotEditableError, WebOperationError } from './logic/CustomError'\n\nexport {\n solidLogicSingleton, // solidLogicSingleton is exported entirely because it is used in solid-panes\n store,\n authn,\n authSession\n}\n
|
|
1
|
+
{"version":3,"file":"index.cjs.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["// Make these variables directly accessible as it is what you need most of the time\n// This also makes these variable globaly accesible in mashlib\nimport { solidLogicSingleton } from './logic/solidLogicSingleton'\n\nconst authn = solidLogicSingleton.authn\nconst authSession = solidLogicSingleton.authn.authSession\nconst store = solidLogicSingleton.store\n\nexport { ACL_LINK, ACCESS_ROLES, PUBLIC_ACCESS_ROLES, Authenticated, Public } from './acl/aclLogic'\nexport type { AccessRole, PublicAccessRole } from './acl/aclLogic'\nexport { offlineTestID, appContext } from './authn/authUtil'\nexport { performServerSideLogout } from './authn/serverLogout'\nexport { reloadOnIdentityReplaced } from './authSession/identityState'\nexport { getSuggestedIssuers } from './issuer/issuerLogic'\nexport { createTypeIndexLogic } from './typeIndex/typeIndexLogic'\nexport { createDirectoryLogic, DEFAULT_DIRECTORY_CATALOG_URL, DEFAULT_DIRECTORY_SOURCES } from './directory/directoryLogic'\nexport type { AccessControlSubjectKind, AccessControlSubject } from './acl/accessControlSubjects'\nexport type { ACLContext, AccessMode, AccessSubject, Authorization, PatchPlan } from './types'\nexport type { AppDetails, SolidNamespace, AuthenticationContext, SolidLogic, ChatLogic, DirectoryLogic, DirectoryEntry, DirectorySearchOptions, DirectoryRelationshipLabel, DirectorySource } from './types'\nexport { UnauthorizedError, CrossOriginForbiddenError, SameOriginForbiddenError, NotFoundError, FetchError, NotEditableError, WebOperationError } from './logic/CustomError'\n\nexport {\n solidLogicSingleton, // solidLogicSingleton is exported entirely because it is used in solid-panes\n store,\n authn,\n authSession\n}\n"],"mappings":"sfAIA,IAAM,EAAQ,EAAA,oBAAoB,MAC5B,EAAc,EAAA,oBAAoB,MAAM,YACxC,EAAQ,EAAA,oBAAoB"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { solidLogicSingleton } from './logic/solidLogicSingleton';
|
|
2
|
+
declare const authn: import("./types").AuthnLogic;
|
|
3
|
+
declare const authSession: import("./authSession/authSession").SessionWithLegacyEvents;
|
|
4
|
+
declare const store: import("rdflib").LiveStore;
|
|
5
|
+
export { ACL_LINK, ACCESS_ROLES, PUBLIC_ACCESS_ROLES, Authenticated, Public } from './acl/aclLogic';
|
|
6
|
+
export type { AccessRole, PublicAccessRole } from './acl/aclLogic';
|
|
7
|
+
export { offlineTestID, appContext } from './authn/authUtil';
|
|
8
|
+
export { performServerSideLogout } from './authn/serverLogout';
|
|
9
|
+
export { reloadOnIdentityReplaced } from './authSession/identityState';
|
|
10
|
+
export { getSuggestedIssuers } from './issuer/issuerLogic';
|
|
11
|
+
export { createTypeIndexLogic } from './typeIndex/typeIndexLogic';
|
|
12
|
+
export { createDirectoryLogic, DEFAULT_DIRECTORY_CATALOG_URL, DEFAULT_DIRECTORY_SOURCES } from './directory/directoryLogic';
|
|
13
|
+
export type { AccessControlSubjectKind, AccessControlSubject } from './acl/accessControlSubjects';
|
|
14
|
+
export type { ACLContext, AccessMode, AccessSubject, Authorization, PatchPlan } from './types';
|
|
15
|
+
export type { AppDetails, SolidNamespace, AuthenticationContext, SolidLogic, ChatLogic, DirectoryLogic, DirectoryEntry, DirectorySearchOptions, DirectoryRelationshipLabel, DirectorySource } from './types';
|
|
16
|
+
export { UnauthorizedError, CrossOriginForbiddenError, SameOriginForbiddenError, NotFoundError, FetchError, NotEditableError, WebOperationError } from './logic/CustomError';
|
|
17
|
+
export { solidLogicSingleton, // solidLogicSingleton is exported entirely because it is used in solid-panes
|
|
18
|
+
store, authn, authSession };
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,QAAA,MAAM,KAAK,8BAA4B,CAAA;AACvC,QAAA,MAAM,WAAW,6DAAwC,CAAA;AACzD,QAAA,MAAM,KAAK,4BAA4B,CAAA;AAEvC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACnG,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAC3H,YAAY,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACjG,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC9F,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,qBAAqB,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC5M,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5K,OAAO,EACL,mBAAmB,EAAE,6EAA6E;AAClG,KAAK,EACL,KAAK,EACL,WAAW,EACZ,CAAA"}
|
package/dist/index.esm.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { reloadOnIdentityReplaced as e } from "./authSession/identityState.esm.js";
|
|
2
|
-
import {
|
|
3
|
-
import { appContext as
|
|
4
|
-
import { CrossOriginForbiddenError as
|
|
5
|
-
import { createTypeIndexLogic as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { ACCESS_ROLES as t, ACL_LINK as n, Authenticated as r, PUBLIC_ACCESS_ROLES as i, Public as a } from "./acl/aclLogic.esm.js";
|
|
3
|
+
import { appContext as o, offlineTestID as s } from "./authn/authUtil.esm.js";
|
|
4
|
+
import { CrossOriginForbiddenError as c, FetchError as l, NotEditableError as u, NotFoundError as d, SameOriginForbiddenError as f, UnauthorizedError as p, WebOperationError as m } from "./logic/CustomError.esm.js";
|
|
5
|
+
import { createTypeIndexLogic as h } from "./typeIndex/typeIndexLogic.esm.js";
|
|
6
|
+
import { DEFAULT_DIRECTORY_CATALOG_URL as g, DEFAULT_DIRECTORY_SOURCES as _, createDirectoryLogic as v } from "./directory/directoryLogic.esm.js";
|
|
7
|
+
import { solidLogicSingleton as y } from "./logic/solidLogicSingleton.esm.js";
|
|
8
|
+
import { performServerSideLogout as b } from "./authn/serverLogout.esm.js";
|
|
9
|
+
import { getSuggestedIssuers as x } from "./issuer/issuerLogic.esm.js";
|
|
9
10
|
//#region src/index.ts
|
|
10
|
-
var
|
|
11
|
+
var S = y.authn, C = y.authn.authSession, w = y.store;
|
|
11
12
|
//#endregion
|
|
12
|
-
export { t as ACL_LINK,
|
|
13
|
+
export { t as ACCESS_ROLES, n as ACL_LINK, r as Authenticated, c as CrossOriginForbiddenError, g as DEFAULT_DIRECTORY_CATALOG_URL, _ as DEFAULT_DIRECTORY_SOURCES, l as FetchError, u as NotEditableError, d as NotFoundError, i as PUBLIC_ACCESS_ROLES, a as Public, f as SameOriginForbiddenError, p as UnauthorizedError, m as WebOperationError, o as appContext, C as authSession, S as authn, v as createDirectoryLogic, h as createTypeIndexLogic, x as getSuggestedIssuers, s as offlineTestID, b as performServerSideLogout, e as reloadOnIdentityReplaced, y as solidLogicSingleton, w as store };
|
|
13
14
|
|
|
14
15
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["// Make these variables directly accessible as it is what you need most of the time\n// This also makes these variable globaly accesible in mashlib\nimport { solidLogicSingleton } from './logic/solidLogicSingleton'\n\nconst authn = solidLogicSingleton.authn\nconst authSession = solidLogicSingleton.authn.authSession\nconst store = solidLogicSingleton.store\n\nexport { ACL_LINK } from './acl/aclLogic'\nexport { offlineTestID, appContext } from './authn/authUtil'\nexport { performServerSideLogout } from './authn/serverLogout'\nexport { reloadOnIdentityReplaced } from './authSession/identityState'\nexport { getSuggestedIssuers } from './issuer/issuerLogic'\nexport { createTypeIndexLogic } from './typeIndex/typeIndexLogic'\nexport type { AppDetails, SolidNamespace, AuthenticationContext, SolidLogic, ChatLogic } from './types'\nexport { UnauthorizedError, CrossOriginForbiddenError, SameOriginForbiddenError, NotFoundError, FetchError, NotEditableError, WebOperationError } from './logic/CustomError'\n\nexport {\n solidLogicSingleton, // solidLogicSingleton is exported entirely because it is used in solid-panes\n store,\n authn,\n authSession\n}\n
|
|
1
|
+
{"version":3,"file":"index.esm.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["// Make these variables directly accessible as it is what you need most of the time\n// This also makes these variable globaly accesible in mashlib\nimport { solidLogicSingleton } from './logic/solidLogicSingleton'\n\nconst authn = solidLogicSingleton.authn\nconst authSession = solidLogicSingleton.authn.authSession\nconst store = solidLogicSingleton.store\n\nexport { ACL_LINK, ACCESS_ROLES, PUBLIC_ACCESS_ROLES, Authenticated, Public } from './acl/aclLogic'\nexport type { AccessRole, PublicAccessRole } from './acl/aclLogic'\nexport { offlineTestID, appContext } from './authn/authUtil'\nexport { performServerSideLogout } from './authn/serverLogout'\nexport { reloadOnIdentityReplaced } from './authSession/identityState'\nexport { getSuggestedIssuers } from './issuer/issuerLogic'\nexport { createTypeIndexLogic } from './typeIndex/typeIndexLogic'\nexport { createDirectoryLogic, DEFAULT_DIRECTORY_CATALOG_URL, DEFAULT_DIRECTORY_SOURCES } from './directory/directoryLogic'\nexport type { AccessControlSubjectKind, AccessControlSubject } from './acl/accessControlSubjects'\nexport type { ACLContext, AccessMode, AccessSubject, Authorization, PatchPlan } from './types'\nexport type { AppDetails, SolidNamespace, AuthenticationContext, SolidLogic, ChatLogic, DirectoryLogic, DirectoryEntry, DirectorySearchOptions, DirectoryRelationshipLabel, DirectorySource } from './types'\nexport { UnauthorizedError, CrossOriginForbiddenError, SameOriginForbiddenError, NotFoundError, FetchError, NotEditableError, WebOperationError } from './logic/CustomError'\n\nexport {\n solidLogicSingleton, // solidLogicSingleton is exported entirely because it is used in solid-panes\n store,\n authn,\n authSession\n}\n"],"mappings":";;;;;;;;;;AAIA,IAAM,IAAQ,EAAoB,OAC5B,IAAc,EAAoB,MAAM,aACxC,IAAQ,EAAoB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issuerLogic.d.ts","sourceRoot":"","sources":["../../src/issuer/issuerLogic.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,wBAAgB,mBAAmB,IAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAYpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomError.cjs.js","names":[],"sources":["../../src/logic/CustomError.ts"],"sourcesContent":["class CustomError extends Error {\n constructor(message?: string) {\n super(message)\n // see: typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html\n Object.setPrototypeOf(this, new.target.prototype) // restore prototype chain\n this.name = new.target.name // stack traces display correctly now\n }\n}\n\nexport class UnauthorizedError extends CustomError {}\n\nexport class CrossOriginForbiddenError extends CustomError {}\n\nexport class SameOriginForbiddenError extends CustomError {}\n\nexport class NotFoundError extends CustomError {}\n\nexport class NotEditableError extends CustomError { }\n\nexport class WebOperationError extends CustomError {}\n\nexport class FetchError extends CustomError {\n status: number\n\n constructor(status: number, message?: string) {\n super(message)\n this.status = status\n }\n}"],"mappings":"AAAA,IAAM,EAAN,cAA0B,KAAM,CAC5B,YAAY,EAAkB,CAC1B,MAAM,CAAO,EAEb,OAAO,eAAe,KAAM,
|
|
1
|
+
{"version":3,"file":"CustomError.cjs.js","names":[],"sources":["../../src/logic/CustomError.ts"],"sourcesContent":["class CustomError extends Error {\n constructor(message?: string) {\n super(message)\n // see: typescriptlang.org/docs/handbook/release-notes/typescript-2-2.html\n Object.setPrototypeOf(this, new.target.prototype) // restore prototype chain\n this.name = new.target.name // stack traces display correctly now\n }\n}\n\nexport class UnauthorizedError extends CustomError {}\n\nexport class CrossOriginForbiddenError extends CustomError {}\n\nexport class SameOriginForbiddenError extends CustomError {}\n\nexport class NotFoundError extends CustomError {}\n\nexport class NotEditableError extends CustomError { }\n\nexport class WebOperationError extends CustomError {}\n\nexport class FetchError extends CustomError {\n status: number\n\n constructor(status: number, message?: string) {\n super(message)\n this.status = status\n }\n}"],"mappings":"AAAA,IAAM,EAAN,cAA0B,KAAM,CAC5B,YAAY,EAAkB,CAC1B,MAAM,CAAO,EAEb,OAAO,eAAe,KAAM,WAAW,SAAS,EAChD,KAAK,KAAO,WAAW,IAC3B,CACJ,EAEa,EAAb,cAAuC,CAAY,CAAC,EAEvC,EAAb,cAA+C,CAAY,CAAC,EAE/C,EAAb,cAA8C,CAAY,CAAC,EAE9C,EAAb,cAAmC,CAAY,CAAC,EAEnC,EAAb,cAAsC,CAAY,CAAE,EAEvC,EAAb,cAAuC,CAAY,CAAC,EAEvC,EAAb,cAAgC,CAAY,CAGxC,YAAY,EAAgB,EAAkB,CAC1C,MAAM,CAAO,EACb,KAAK,OAAS,CAClB,CACJ"}
|