solid-logic 1.3.17-f5eebe26 → 1.3.17-fca5749b

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.
Files changed (120) hide show
  1. package/lib/acl/aclLogic.d.ts +12 -30
  2. package/lib/acl/aclLogic.d.ts.map +1 -1
  3. package/lib/acl/aclLogic.js +152 -119
  4. package/lib/acl/aclLogic.js.map +1 -1
  5. package/lib/authn/SolidAuthnLogic.d.ts.map +1 -1
  6. package/lib/authn/SolidAuthnLogic.js +2 -2
  7. package/lib/authn/SolidAuthnLogic.js.map +1 -1
  8. package/lib/chat/chatLogic.d.ts +16 -0
  9. package/lib/chat/chatLogic.d.ts.map +1 -0
  10. package/lib/chat/{ChatLogic.js → chatLogic.js} +82 -87
  11. package/lib/chat/chatLogic.js.map +1 -0
  12. package/lib/inbox/inboxLogic.d.ts +7 -0
  13. package/lib/inbox/inboxLogic.d.ts.map +1 -0
  14. package/lib/inbox/{InboxLogic.js → inboxLogic.js} +58 -64
  15. package/lib/inbox/inboxLogic.js.map +1 -0
  16. package/lib/index.d.ts +18 -9
  17. package/lib/index.d.ts.map +1 -1
  18. package/lib/index.js +76 -22
  19. package/lib/index.js.map +1 -1
  20. package/lib/logic/CustomError.d.ts +4 -0
  21. package/lib/logic/CustomError.d.ts.map +1 -1
  22. package/lib/logic/CustomError.js +17 -1
  23. package/lib/logic/CustomError.js.map +1 -1
  24. package/lib/logic/SolidLogic.d.ts +8 -34
  25. package/lib/logic/SolidLogic.d.ts.map +1 -1
  26. package/lib/logic/SolidLogic.js +16 -250
  27. package/lib/logic/SolidLogic.js.map +1 -1
  28. package/lib/logic/solidLogicSingleton.js +1 -1
  29. package/lib/logic/solidLogicSingleton.js.map +1 -1
  30. package/lib/logic/solidLogicSingletonNew.d.ts +67 -0
  31. package/lib/logic/solidLogicSingletonNew.d.ts.map +1 -0
  32. package/lib/logic/solidLogicSingletonNew.js +219 -0
  33. package/lib/logic/solidLogicSingletonNew.js.map +1 -0
  34. package/lib/profile/profileLogic.d.ts +11 -0
  35. package/lib/profile/profileLogic.d.ts.map +1 -0
  36. package/lib/profile/profileLogic.js +246 -0
  37. package/lib/profile/profileLogic.js.map +1 -0
  38. package/lib/typeIndex/typeIndexLogic.d.ts +18 -21
  39. package/lib/typeIndex/typeIndexLogic.d.ts.map +1 -1
  40. package/lib/typeIndex/typeIndexLogic.js +304 -296
  41. package/lib/typeIndex/typeIndexLogic.js.map +1 -1
  42. package/lib/types.d.ts +17 -0
  43. package/lib/types.d.ts.map +1 -1
  44. package/lib/util/containerLogic.d.ts +11 -0
  45. package/lib/util/containerLogic.d.ts.map +1 -0
  46. package/lib/{profile/ProfileLogic.js → util/containerLogic.js} +53 -44
  47. package/lib/util/containerLogic.js.map +1 -0
  48. package/lib/util/ns.d.ts +2 -0
  49. package/lib/util/ns.d.ts.map +1 -0
  50. package/lib/util/ns.js +34 -0
  51. package/lib/util/ns.js.map +1 -0
  52. package/lib/util/utilityLogic.d.ts +15 -0
  53. package/lib/util/utilityLogic.d.ts.map +1 -0
  54. package/lib/util/utilityLogic.js +272 -0
  55. package/lib/util/utilityLogic.js.map +1 -0
  56. package/lib/util/utils.d.ts +8 -0
  57. package/lib/util/utils.d.ts.map +1 -0
  58. package/lib/util/utils.js +48 -0
  59. package/lib/util/utils.js.map +1 -0
  60. package/package.json +3 -1
  61. package/src/acl/aclLogic.ts +136 -118
  62. package/src/authn/SolidAuthnLogic.ts +3 -2
  63. package/src/chat/chatLogic.ts +225 -0
  64. package/src/inbox/inboxLogic.ts +57 -0
  65. package/src/index.ts +124 -20
  66. package/src/logic/CustomError.ts +5 -1
  67. package/src/logic/SolidLogic.ts +30 -211
  68. package/src/logic/solidLogicSingleton.ts +1 -1
  69. package/src/logic/solidLogicSingletonNew.ts +210 -0
  70. package/src/profile/profileLogic.ts +125 -0
  71. package/src/typeIndex/typeIndexLogic.ts +175 -182
  72. package/src/types.ts +7 -3
  73. package/src/util/containerLogic.ts +54 -0
  74. package/src/util/ns.ts +5 -0
  75. package/src/util/utilityLogic.ts +155 -0
  76. package/src/util/utils.ts +52 -0
  77. package/test/aclLogic.test.ts +13 -4
  78. package/test/chatLogic.test.ts +70 -71
  79. package/test/container.test.ts +56 -0
  80. package/test/helpers/dataSetup.ts +134 -0
  81. package/test/helpers/setup.ts +4 -0
  82. package/test/inboxLogic.test.ts +39 -38
  83. package/test/logic.test.ts +10 -9
  84. package/test/profileLogic.test.ts +246 -0
  85. package/test/typeIndexLogic.test.ts +487 -30
  86. package/test/utilityLogic.test.ts +172 -126
  87. package/test/utils.test.ts +32 -0
  88. package/lib/chat/ChatLogic.d.ts +0 -26
  89. package/lib/chat/ChatLogic.d.ts.map +0 -1
  90. package/lib/chat/ChatLogic.js.map +0 -1
  91. package/lib/chat/determineChatContainer.d.ts +0 -3
  92. package/lib/chat/determineChatContainer.d.ts.map +0 -1
  93. package/lib/chat/determineChatContainer.js +0 -12
  94. package/lib/chat/determineChatContainer.js.map +0 -1
  95. package/lib/discovery/discoveryLogic.d.ts +0 -37
  96. package/lib/discovery/discoveryLogic.d.ts.map +0 -1
  97. package/lib/discovery/discoveryLogic.js +0 -507
  98. package/lib/discovery/discoveryLogic.js.map +0 -1
  99. package/lib/inbox/InboxLogic.d.ts +0 -18
  100. package/lib/inbox/InboxLogic.d.ts.map +0 -1
  101. package/lib/inbox/InboxLogic.js.map +0 -1
  102. package/lib/profile/ProfileLogic.d.ts +0 -13
  103. package/lib/profile/ProfileLogic.d.ts.map +0 -1
  104. package/lib/profile/ProfileLogic.js.map +0 -1
  105. package/lib/util/UtilityLogic.d.ts +0 -33
  106. package/lib/util/UtilityLogic.d.ts.map +0 -1
  107. package/lib/util/UtilityLogic.js +0 -240
  108. package/lib/util/UtilityLogic.js.map +0 -1
  109. package/lib/util/uri.d.ts +0 -3
  110. package/lib/util/uri.d.ts.map +0 -1
  111. package/lib/util/uri.js +0 -9
  112. package/lib/util/uri.js.map +0 -1
  113. package/src/chat/ChatLogic.ts +0 -244
  114. package/src/chat/determineChatContainer.ts +0 -14
  115. package/src/discovery/discoveryLogic.ts +0 -288
  116. package/src/inbox/InboxLogic.ts +0 -66
  117. package/src/profile/ProfileLogic.ts +0 -44
  118. package/src/util/UtilityLogic.ts +0 -161
  119. package/src/util/uri.ts +0 -5
  120. package/test/discoveryLogic.test.ts +0 -712
@@ -1,133 +1,179 @@
1
- /* eslint-disable @typescript-eslint/no-non-null-assertion */
2
- import { UtilityLogic } from "../src/util/UtilityLogic";
3
- import solidNamespace from "solid-namespace";
4
- import * as rdf from "rdflib";
1
+ /**
2
+ * @jest-environment jsdom
3
+ *
4
+ */
5
5
  import fetchMock from "jest-fetch-mock";
6
- import { UpdateManager } from "rdflib";
7
- import { SolidNamespace } from "../src/types";
6
+ import { UpdateManager, sym, Fetcher, Store } from "rdflib";
7
+ import { createAclLogic } from "../src/acl/aclLogic";
8
+ import { WebOperationError } from "../src/logic/CustomError";
9
+ import { createContainerLogic } from "../src/util/containerLogic";
10
+ import { ns } from "../src/util/ns";
11
+ import { createUtilityLogic } from "../src/util/utilityLogic";
12
+ import { alice, AlicePhotoFolder, AlicePhotos, AlicePreferences, AlicePreferencesFile, AlicePrivateTypeIndex, AlicePrivateTypes, AliceProfile, AlicePublicTypeIndex, AlicePublicTypes, bob, BobProfile, club, ClubPreferences, ClubPreferencesFile, ClubPrivateTypeIndex, ClubPrivateTypes, ClubProfile, ClubPublicTypeIndex, ClubPublicTypes } from "./helpers/dataSetup";
8
13
 
9
- const ns: SolidNamespace = solidNamespace(rdf);
14
+ window.$SolidTestEnvironment = { username: alice.uri }
15
+ const prefixes = Object.keys(ns).map(prefix => `@prefix ${prefix}: ${ns[prefix]('')}.\n`).join('') // In turtle
10
16
 
11
- const alice = rdf.sym("https://alice.example/profile/card#me");
12
- const bob = rdf.sym("https://bob.example/profile/card#me");
17
+ describe("utilityLogic", () => {
18
+ let store;
19
+ let options;
20
+ let web = {}
21
+ let requests = []
22
+ let statustoBeReturned = 200
23
+ let utilityLogic
24
+ beforeEach(() => {
25
+ fetchMock.resetMocks();
26
+ fetchMock.mockResponse("Not Found", {
27
+ status: 404,
28
+ });
29
+ requests = []
30
+ statustoBeReturned = 200
31
+ const init = { headers: { "Content-Type": "text/turtle" } } // Fetch options tend to be called this
13
32
 
14
- describe("Utility logic", () => {
15
- let util;
16
- let store;
17
- let fetcher;
18
- beforeEach(() => {
19
- fetchMock.resetMocks();
20
- fetchMock.mockResponse("Not Found", {
21
- status: 404,
22
- });
23
- fetcher = { fetch: fetchMock };
24
- store = rdf.graph();
25
- store.fetcher = rdf.fetcher(store, fetcher);
26
- store.updater = new UpdateManager(store);
27
- util = new UtilityLogic(store, ns, fetcher);
28
- });
33
+ fetchMock.mockIf(/^https?.*$/, async req => {
29
34
 
30
- describe("getArchiveUrl", () => {
31
- it("produces the right URL in February", () => {
32
- const url = util.getArchiveUrl('https://example.com/inbox/asdf-qwer-asdf-qwer', new Date('7 Feb 2062 UTC'));
33
- expect(url).toEqual('https://example.com/inbox/archive/2062/02/07/asdf-qwer-asdf-qwer');
34
- });
35
- it("produces the right URL in November", () => {
36
- const url = util.getArchiveUrl('https://example.com/inbox/asdf-qwer-asdf-qwer', new Date('12 Nov 2012 UTC'));
37
- expect(url).toEqual('https://example.com/inbox/archive/2012/11/12/asdf-qwer-asdf-qwer');
38
- });
39
- });
40
- describe("getContainerMembers", () => {
41
- describe("When container is empty", () => {
42
- let result;
43
- beforeEach(async () => {
44
- containerIsEmpty();
45
- result = await util.getContainerMembers('https://container.com/');
46
- });
47
- it("Resolves to an empty array", () => {
48
- expect(result).toEqual([]);
49
- });
50
- });
51
- describe("When container has some containment triples", () => {
52
- let result;
53
- beforeEach(async () => {
54
- containerHasSomeContainmentTriples();
55
- result = await util.getContainerMembers('https://container.com/');
56
- });
57
- it("Resolves to an array with some URLs", () => {
58
- expect(result.sort()).toEqual([
59
- 'https://container.com/foo.txt',
60
- 'https://container.com/bar/'
61
- ].sort());
62
- });
63
- });
64
- });
65
- describe("setSinglePeerAccess", () => {
66
- beforeEach(() => {
67
- fetchMock.mockOnceIf(
68
- "https://owner.com/some/resource",
69
- "hello", {
70
- headers: {
71
- Link: '<https://owner.com/some/acl>; rel="acl"'
72
- }
73
- });
74
- fetchMock.mockOnceIf(
75
- "https://owner.com/some/acl",
76
- "Created", {
77
- status: 201
78
- });
79
- });
80
- it("Creates the right ACL doc", async () => {
81
- await util.setSinglePeerAccess({
82
- ownerWebId: "https://owner.com/#me",
83
- peerWebId: "https://peer.com/#me",
84
- accessToModes: "acl:Read, acl:Control",
85
- defaultModes: "acl:Write",
86
- target: "https://owner.com/some/resource"
87
- });
88
- expect(fetchMock.mock.calls).toEqual([
89
- [ "https://owner.com/some/resource", fetchMock.mock.calls[0][1] ],
90
- [ "https://owner.com/some/acl", {
91
- body: '@prefix acl: <http://www.w3.org/ns/auth/acl#>.\n' +
92
- '\n' +
93
- '<#alice> a acl:Authorization;\n' +
94
- ' acl:agent <https://owner.com/#me>;\n' +
95
- ' acl:accessTo <https://owner.com/some/resource>;\n' +
96
- ' acl:default <https://owner.com/some/resource>;\n' +
97
- ' acl:mode acl:Read, acl:Write, acl:Control.\n' +
98
- '<#bobAccessTo> a acl:Authorization;\n' +
99
- ' acl:agent <https://peer.com/#me>;\n' +
100
- ' acl:accessTo <https://owner.com/some/resource>;\n' +
101
- ' acl:mode acl:Read, acl:Control.\n' +
102
- '<#bobDefault> a acl:Authorization;\n' +
103
- ' acl:agent <https://peer.com/#me>;\n' +
104
- ' acl:default <https://owner.com/some/resource>;\n' +
105
- ' acl:mode acl:Write.\n',
106
- headers: [
107
- ["Content-Type", "text/turtle"]
108
- ],
109
- method: "PUT"
110
- }]
111
- ]);
35
+ if (req.method !== 'GET') {
36
+ requests.push(req)
37
+ if (req.method === 'PUT') {
38
+ const contents = await req.text()
39
+ web[req.url] = contents // Update our dummy web
40
+ console.log(`Tetst: Updated ${req.url} on PUT to <<<${web[req.url]}>>>`)
41
+ }
42
+ return { status: statustoBeReturned }
43
+ }
44
+ const contents = web[req.url]
45
+ if (contents !== undefined) { //
46
+ return {
47
+ body: prefixes + contents, // Add namespaces to anything
48
+ status: 200,
49
+ headers: {
50
+ "Content-Type": "text/turtle",
51
+ "WAC-Allow": 'user="write", public="read"',
52
+ "Accept-Patch": "application/sparql-update"
53
+ }
54
+ }
55
+ } // if contents
56
+ return {
57
+ status: 404,
58
+ body: 'Not Found'
59
+ }
60
+ })
61
+ web = {}
62
+ web[alice.doc().uri] = AliceProfile
63
+ web[AlicePreferencesFile.uri] = AlicePreferences
64
+ web[AlicePrivateTypeIndex.uri] = AlicePrivateTypes
65
+ web[AlicePublicTypeIndex.uri] = AlicePublicTypes
66
+ web[AlicePhotoFolder.uri] = AlicePhotos
67
+ web[bob.doc().uri] = BobProfile
68
+
69
+ web[club.doc().uri] = ClubProfile
70
+ web[ClubPreferencesFile.uri] = ClubPreferences
71
+ web[ClubPrivateTypeIndex.uri] = ClubPrivateTypes
72
+ web[ClubPublicTypeIndex.uri] = ClubPublicTypes
73
+
74
+ options = { fetch: fetch };
75
+ store = new Store()
76
+ store.fetcher = new Fetcher(store, options);
77
+ store.updater = new UpdateManager(store);
78
+ requests = []
79
+ utilityLogic = createUtilityLogic(store, createAclLogic(store), createContainerLogic(store))
112
80
  });
113
- });
114
- function containerIsEmpty() {
115
- fetchMock.mockOnceIf(
116
- "https://container.com/",
117
- " ", // FIXME: https://github.com/jefflau/jest-fetch-mock/issues/189
118
- {
119
- headers: { "Content-Type": "text/turtle" },
120
- }
121
- );
122
- }
123
81
 
124
- function containerHasSomeContainmentTriples() {
125
- fetchMock.mockOnceIf(
126
- "https://container.com/",
127
- "<.> <http://www.w3.org/ns/ldp#contains> <./foo.txt>, <./bar/> .",
128
- {
129
- headers: { "Content-Type": "text/turtle" },
130
- }
131
- );
132
- }
133
- });
82
+ describe('loadOrCreateIfNotExists', () => {
83
+ it('exists', () => {
84
+ expect(utilityLogic.loadOrCreateIfNotExists).toBeInstanceOf(Function)
85
+ })
86
+ it('does nothing if existing file', async () => {
87
+ const result = await utilityLogic.loadOrCreateIfNotExists(alice.doc())
88
+ expect(requests).toEqual([])
89
+
90
+ })
91
+ it('creates empty file if did not exist', async () => {
92
+ const suggestion = 'https://bob.example.com/settings/prefsSuggestion.ttl'
93
+ const result = await utilityLogic.loadOrCreateIfNotExists(sym(suggestion))
94
+ expect(requests[0].method).toEqual('PUT')
95
+ expect(requests[0].url).toEqual(suggestion)
96
+ })
97
+ })
98
+
99
+ describe('followOrCreateLink', () => {
100
+ it('exists', () => {
101
+ expect(utilityLogic.followOrCreateLink).toBeInstanceOf(Function)
102
+ })
103
+ it('follows existing link', async () => {
104
+ const suggestion = 'https://alice.example.com/settings/prefsSuggestion.ttl'
105
+ const result = await utilityLogic.followOrCreateLink(alice, ns.space('preferencesFile'), sym(suggestion), alice.doc())
106
+ expect(result).toEqual(AlicePreferencesFile)
107
+
108
+ })
109
+ it('creates empty file if did not exist and new link', async () => {
110
+ const suggestion = 'https://bob.example.com/settings/prefsSuggestion.ttl'
111
+ const result = await utilityLogic.followOrCreateLink(bob, ns.space('preferencesFile'), sym(suggestion), bob.doc())
112
+ expect(result).toEqual(sym(suggestion))
113
+ expect(requests[0].method).toEqual('PATCH')
114
+ expect(requests[0].url).toEqual(bob.doc().uri)
115
+ expect(requests[1].method).toEqual('PUT')
116
+ expect(requests[1].url).toEqual(suggestion)
117
+ expect(store.holds(bob, ns.space('preferencesFile'), sym(suggestion), bob.doc())).toEqual(true)
118
+ })
119
+ //
120
+ it('returns null if it cannot create the new file', async () => {
121
+ const suggestion = 'https://bob.example.com/settings/prefsSuggestion.ttl'
122
+ statustoBeReturned = 403 // Unauthorized
123
+ expect(async () => {
124
+ await utilityLogic.followOrCreateLink(bob, ns.space('preferencesFile'), sym(suggestion), bob.doc())
125
+ }).rejects.toThrow(WebOperationError)
126
+ })
127
+
128
+ })
129
+ describe("setSinglePeerAccess", () => {
130
+ beforeEach(() => {
131
+ fetchMock.mockOnceIf(
132
+ "https://owner.com/some/resource",
133
+ "hello", {
134
+ headers: {
135
+ Link: '<https://owner.com/some/acl>; rel="acl"'
136
+ }
137
+ });
138
+ fetchMock.mockOnceIf(
139
+ "https://owner.com/some/acl",
140
+ "Created", {
141
+ status: 201
142
+ });
143
+ });
144
+ it("Creates the right ACL doc", async () => {
145
+ await utilityLogic.setSinglePeerAccess({
146
+ ownerWebId: "https://owner.com/#me",
147
+ peerWebId: "https://peer.com/#me",
148
+ accessToModes: "acl:Read, acl:Control",
149
+ defaultModes: "acl:Write",
150
+ target: "https://owner.com/some/resource"
151
+ });
152
+ expect(fetchMock.mock.calls).toEqual([
153
+ [ "https://owner.com/some/resource", fetchMock.mock.calls[0][1] ],
154
+ [ "https://owner.com/some/acl", {
155
+ body: '@prefix acl: <http://www.w3.org/ns/auth/acl#>.\n' +
156
+ '\n' +
157
+ '<#alice> a acl:Authorization;\n' +
158
+ ' acl:agent <https://owner.com/#me>;\n' +
159
+ ' acl:accessTo <https://owner.com/some/resource>;\n' +
160
+ ' acl:default <https://owner.com/some/resource>;\n' +
161
+ ' acl:mode acl:Read, acl:Write, acl:Control.\n' +
162
+ '<#bobAccessTo> a acl:Authorization;\n' +
163
+ ' acl:agent <https://peer.com/#me>;\n' +
164
+ ' acl:accessTo <https://owner.com/some/resource>;\n' +
165
+ ' acl:mode acl:Read, acl:Control.\n' +
166
+ '<#bobDefault> a acl:Authorization;\n' +
167
+ ' acl:agent <https://peer.com/#me>;\n' +
168
+ ' acl:default <https://owner.com/some/resource>;\n' +
169
+ ' acl:mode acl:Write.\n',
170
+ headers: [
171
+ ["Content-Type", "text/turtle"]
172
+ ],
173
+ method: "PUT"
174
+ }]
175
+ ]);
176
+ });
177
+ });
178
+
179
+ })
@@ -0,0 +1,32 @@
1
+ import * as rdf from "rdflib";
2
+ import { getArchiveUrl, uniqueNodes } from '../src/util/utils';
3
+
4
+ describe('utils', () => {
5
+ describe('uniqueNodes', () => {
6
+ it('exists', () => {
7
+ expect(uniqueNodes).toBeInstanceOf(Function)
8
+ })
9
+ it('removed duplicates', async () => {
10
+ const input = [ rdf.sym('https://a.com/'), rdf.sym('https://b.com/'), rdf.sym('https://a.com/'), rdf.sym('https://a.com/'), rdf.sym('https://c.com/'), ]
11
+ const expected = [ rdf.sym('https://a.com/'), rdf.sym('https://b.com/'), rdf.sym('https://c.com/'), ]
12
+ const result = uniqueNodes(input)
13
+ expect(result).toEqual(expected)
14
+
15
+ })
16
+ it('handles an empty array', async () => {
17
+ const result = await uniqueNodes([])
18
+ expect(result).toEqual([])
19
+ })
20
+ })
21
+
22
+ describe("getArchiveUrl", () => {
23
+ it("produces the right URL in February", () => {
24
+ const url = getArchiveUrl('https://example.com/inbox/asdf-qwer-asdf-qwer', new Date('7 Feb 2062 UTC'));
25
+ expect(url).toEqual('https://example.com/inbox/archive/2062/02/07/asdf-qwer-asdf-qwer');
26
+ });
27
+ it("produces the right URL in November", () => {
28
+ const url = getArchiveUrl('https://example.com/inbox/asdf-qwer-asdf-qwer', new Date('12 Nov 2012 UTC'));
29
+ expect(url).toEqual('https://example.com/inbox/archive/2012/11/12/asdf-qwer-asdf-qwer');
30
+ });
31
+ })
32
+ })
@@ -1,26 +0,0 @@
1
- import { NamedNode, LiveStore } from "rdflib";
2
- import { ProfileLogic } from "../profile/ProfileLogic";
3
- import { SolidNamespace } from "../types";
4
- /**
5
- * Chat-related logic
6
- */
7
- export declare class ChatLogic {
8
- store: LiveStore;
9
- ns: SolidNamespace;
10
- profile: ProfileLogic;
11
- constructor(store: LiveStore, ns: SolidNamespace, profile: ProfileLogic);
12
- setAcl(chatContainer: NamedNode, me: NamedNode, invitee: NamedNode): Promise<void>;
13
- private addToPrivateTypeIndex;
14
- private findChat;
15
- private createChatThing;
16
- private mintNew;
17
- /**
18
- * Find (and optionally create) an individual chat between the current user and the given invitee
19
- * @param invitee - The person to chat with
20
- * @param createIfMissing - Whether the chat should be created, if missing
21
- * @returns null if missing, or a node referring to an already existing chat, or the newly created chat
22
- */
23
- getChat(invitee: NamedNode, createIfMissing?: boolean): Promise<NamedNode | null>;
24
- private sendInvite;
25
- }
26
- //# sourceMappingURL=ChatLogic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatLogic.d.ts","sourceRoot":"","sources":["../../src/chat/ChatLogic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgB1C;;GAEG;AACH,qBAAa,SAAS;IACpB,KAAK,EAAE,SAAS,CAAC;IACjB,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;gBAEV,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY;IAMjE,MAAM,CACV,aAAa,EAAE,SAAS,EACxB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,IAAI,CAAC;YAsCF,qBAAqB;YAqCrB,QAAQ;YAeR,eAAe;IAW7B,OAAO,CAAC,OAAO;IAoDf;;;;;OAKG;IACG,OAAO,CACX,OAAO,EAAE,SAAS,EAClB,eAAe,UAAO,GACrB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YAgBd,UAAU;CA6BzB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChatLogic.js","sourceRoot":"","sources":["../../src/chat/ChatLogic.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { NamedNode } from "rdflib";
2
- export declare function determineChatContainer(invitee: NamedNode, podRoot: NamedNode): NamedNode;
3
- //# sourceMappingURL=determineChatContainer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"determineChatContainer.d.ts","sourceRoot":"","sources":["../../src/chat/determineChatContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,SAAS,GACjB,SAAS,CAQX"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.determineChatContainer = void 0;
4
- var rdflib_1 = require("rdflib");
5
- function determineChatContainer(invitee, podRoot) {
6
- // Create chat
7
- // See https://gitter.im/solid/chat-app?at=5f3c800f855be416a23ae74a
8
- var chatContainerStr = new URL("IndividualChats/".concat(new URL(invitee.value).host, "/"), podRoot.value).toString();
9
- return new rdflib_1.NamedNode(chatContainerStr);
10
- }
11
- exports.determineChatContainer = determineChatContainer;
12
- //# sourceMappingURL=determineChatContainer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"determineChatContainer.js","sourceRoot":"","sources":["../../src/chat/determineChatContainer.ts"],"names":[],"mappings":";;;AAAA,iCAAmC;AAEnC,SAAgB,sBAAsB,CACpC,OAAkB,EAClB,OAAkB;IAElB,cAAc;IACd,mEAAmE;IACnE,IAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,0BAAmB,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,MAAG,EACjD,OAAO,CAAC,KAAK,CACd,CAAC,QAAQ,EAAE,CAAC;IACb,OAAO,IAAI,kBAAS,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC;AAXD,wDAWC"}
@@ -1,37 +0,0 @@
1
- import * as $rdf from 'rdflib';
2
- import { LiveStore, NamedNode } from 'rdflib';
3
- declare type TypeIndexScope = {
4
- label: string;
5
- index: NamedNode;
6
- agent: NamedNode;
7
- };
8
- declare type ScopedApp = {
9
- instance: NamedNode;
10
- scope: TypeIndexScope;
11
- };
12
- /**
13
- * Create a resource if it really does not exist
14
- * Be absolutely sure something does not exist before creating a new empty file
15
- * as otherwise existing could be deleted.
16
- * @param doc {NamedNode} - The resource
17
- */
18
- export declare function loadOrCreateIfNotExists(store: LiveStore, doc: NamedNode): Promise<any>;
19
- export declare function suggestPreferencesFile(me: NamedNode): $rdf.NamedNode;
20
- export declare function suggestPublicTypeIndex(me: NamedNode): $rdf.NamedNode;
21
- export declare function suggestPrivateTypeIndex(preferencesFile: NamedNode): $rdf.NamedNode;
22
- export declare function followOrCreateLink(store: LiveStore, subject: NamedNode, predicate: NamedNode, object: NamedNode, doc: NamedNode): Promise<NamedNode | null>;
23
- export declare function loadProfile(store: LiveStore, user: NamedNode): Promise<$rdf.NamedNode>;
24
- export declare function loadPreferences(store: LiveStore, user: NamedNode): Promise<NamedNode | undefined>;
25
- export declare function loadTypeIndexesFor(store: LiveStore, user: NamedNode): Promise<Array<TypeIndexScope>>;
26
- export declare function loadCommunityTypeIndexes(store: LiveStore, user: NamedNode): Promise<TypeIndexScope[][]>;
27
- export declare function loadAllTypeIndexes(store: LiveStore, user: NamedNode): Promise<TypeIndexScope[]>;
28
- export declare function uniqueNodes(arr: NamedNode[]): NamedNode[];
29
- export declare function getScopedAppsfromIndex(store: any, scope: any, theClass: NamedNode): Promise<{
30
- instance: $rdf.NamedNode;
31
- scope: any;
32
- }[]>;
33
- export declare function getScopedAppInstances(store: LiveStore, klass: NamedNode, user: NamedNode): Promise<ScopedApp[]>;
34
- export declare function getAppInstances(store: LiveStore, klass: NamedNode): Promise<NamedNode[]>;
35
- export declare function registerInstanceInTypeIndex(store: LiveStore, instance: NamedNode, index: NamedNode, theClass: NamedNode): Promise<NamedNode | null>;
36
- export {};
37
- //# sourceMappingURL=discoveryLogic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discoveryLogic.d.ts","sourceRoot":"","sources":["../../src/discovery/discoveryLogic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAW,MAAM,QAAQ,CAAA;AAStD,aAAK,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAA;AAC3E,aAAK,SAAS,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAA;AAE/D;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,gBAyB9E;AAED,wBAAgB,sBAAsB,CAAE,EAAE,EAAC,SAAS,kBAMnD;AAED,wBAAgB,sBAAsB,CAAE,EAAE,EAAC,SAAS,kBAEnD;AAGD,wBAAgB,uBAAuB,CAAE,eAAe,EAAC,SAAS,kBAEjE;AAMD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EACjG,MAAM,EAAE,SAAS,EAAE,GAAG,EAAC,SAAS,GAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CA4B5D;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,2BAWlE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAE,SAAS,GAAG,SAAS,CAAE,CAsBzG;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CA6CzG;AAED,wBAAsB,wBAAwB,CAAE,KAAK,EAAC,SAAS,EAAE,IAAI,EAAC,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAc5G;AAED,wBAAsB,kBAAkB,CAAE,KAAK,EAAC,SAAS,EAAE,IAAI,EAAC,SAAS,6BAExE;AAGD,wBAAgB,WAAW,CAAE,GAAG,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAM1D;AAED,wBAAsB,sBAAsB,CAAE,KAAK,KAAA,EAAE,KAAK,KAAA,EAAE,QAAQ,EAAE,SAAS;;;KAwB9E;AAED,wBAAsB,qBAAqB,CAAE,KAAK,EAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CASpH;AAKD,wBAAsB,eAAe,CAAE,KAAK,EAAC,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAK9F;AAOD,wBAAsB,2BAA2B,CAC/C,KAAK,EAAC,SAAS,EACf,QAAQ,EAAE,SAAS,EACnB,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,SAAS,GAElB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiB3B"}