@legendsoflearning/lol-sdk-core 0.0.2
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/README.md +172 -0
- package/dist/auth/index.d.mts +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.js +12 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +3 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/cache/index.d.mts +26 -0
- package/dist/cache/index.d.ts +26 -0
- package/dist/cache/index.js +63 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/index.mjs +60 -0
- package/dist/cache/index.mjs.map +1 -0
- package/dist/chunk-Q4UXELOU.mjs +284 -0
- package/dist/chunk-Q4UXELOU.mjs.map +1 -0
- package/dist/chunk-WWN77BBN.js +286 -0
- package/dist/chunk-WWN77BBN.js.map +1 -0
- package/dist/generated/admins/index.d.mts +2738 -0
- package/dist/generated/admins/index.d.ts +2738 -0
- package/dist/generated/admins/index.js +126 -0
- package/dist/generated/admins/index.js.map +1 -0
- package/dist/generated/admins/index.mjs +108 -0
- package/dist/generated/admins/index.mjs.map +1 -0
- package/dist/generated/agents/index.d.mts +1744 -0
- package/dist/generated/agents/index.d.ts +1744 -0
- package/dist/generated/agents/index.js +220 -0
- package/dist/generated/agents/index.js.map +1 -0
- package/dist/generated/agents/index.mjs +168 -0
- package/dist/generated/agents/index.mjs.map +1 -0
- package/dist/generated/developers/index.d.mts +748 -0
- package/dist/generated/developers/index.d.ts +748 -0
- package/dist/generated/developers/index.js +72 -0
- package/dist/generated/developers/index.js.map +1 -0
- package/dist/generated/developers/index.mjs +54 -0
- package/dist/generated/developers/index.mjs.map +1 -0
- package/dist/generated/parents/index.d.mts +2446 -0
- package/dist/generated/parents/index.d.ts +2446 -0
- package/dist/generated/parents/index.js +272 -0
- package/dist/generated/parents/index.js.map +1 -0
- package/dist/generated/parents/index.mjs +206 -0
- package/dist/generated/parents/index.mjs.map +1 -0
- package/dist/generated/play/index.d.mts +1740 -0
- package/dist/generated/play/index.d.ts +1740 -0
- package/dist/generated/play/index.js +173 -0
- package/dist/generated/play/index.js.map +1 -0
- package/dist/generated/play/index.mjs +139 -0
- package/dist/generated/play/index.mjs.map +1 -0
- package/dist/generated/public/index.d.mts +1126 -0
- package/dist/generated/public/index.d.ts +1126 -0
- package/dist/generated/public/index.js +58 -0
- package/dist/generated/public/index.js.map +1 -0
- package/dist/generated/public/index.mjs +46 -0
- package/dist/generated/public/index.mjs.map +1 -0
- package/dist/generated/teachers/index.d.mts +6205 -0
- package/dist/generated/teachers/index.d.ts +6205 -0
- package/dist/generated/teachers/index.js +353 -0
- package/dist/generated/teachers/index.js.map +1 -0
- package/dist/generated/teachers/index.mjs +282 -0
- package/dist/generated/teachers/index.mjs.map +1 -0
- package/dist/generated/translation-hub/index.d.mts +2018 -0
- package/dist/generated/translation-hub/index.d.ts +2018 -0
- package/dist/generated/translation-hub/index.js +186 -0
- package/dist/generated/translation-hub/index.js.map +1 -0
- package/dist/generated/translation-hub/index.mjs +135 -0
- package/dist/generated/translation-hub/index.mjs.map +1 -0
- package/dist/index-CYIBtoSV.d.mts +173 -0
- package/dist/index-CYIBtoSV.d.ts +173 -0
- package/dist/index.d.mts +154 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.js +364 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +348 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +121 -0
package/README.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# @legendsoflearning/lol-sdk-core
|
|
2
|
+
|
|
3
|
+
Core TypeScript SDK for Legends of Learning GraphQL APIs.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @legendsoflearning/lol-sdk-core @apollo/client graphql
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Available APIs
|
|
12
|
+
|
|
13
|
+
| API | Import Path | Description |
|
|
14
|
+
|-----|-------------|-------------|
|
|
15
|
+
| **Teachers** | `@legendsoflearning/lol-sdk-core/teachers` | Teacher portal - assignments, students, groups, games |
|
|
16
|
+
| **Public** | `@legendsoflearning/lol-sdk-core/public` | Public game access, search, questions |
|
|
17
|
+
| **Play** | `@legendsoflearning/lol-sdk-core/play` | Student gameplay - assignments, activities, progress |
|
|
18
|
+
| **Parents** | `@legendsoflearning/lol-sdk-core/parents` | Parent portal - children, subscriptions, progress |
|
|
19
|
+
| **Admins** | `@legendsoflearning/lol-sdk-core/admins` | Admin portal - districts, schools, users |
|
|
20
|
+
| **Developers** | `@legendsoflearning/lol-sdk-core/developers` | Developer portal - games, versions, uploads |
|
|
21
|
+
| **Agents** | `@legendsoflearning/lol-sdk-core/agents` | Internal agent management |
|
|
22
|
+
| **Translation Hub** | `@legendsoflearning/lol-sdk-core/translation-hub` | Translation management for games |
|
|
23
|
+
|
|
24
|
+
## Usage
|
|
25
|
+
|
|
26
|
+
### Import Types and Documents
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Import typed documents for queries
|
|
30
|
+
import {
|
|
31
|
+
GetAssignmentPlayDocument,
|
|
32
|
+
CompleteActivityDocument,
|
|
33
|
+
type GetAssignmentPlayQuery
|
|
34
|
+
} from '@legendsoflearning/lol-sdk-core/play'
|
|
35
|
+
|
|
36
|
+
import {
|
|
37
|
+
GetCurrentUserDocument,
|
|
38
|
+
ListChildrenDocument,
|
|
39
|
+
type ListChildrenQuery
|
|
40
|
+
} from '@legendsoflearning/lol-sdk-core/parents'
|
|
41
|
+
|
|
42
|
+
import {
|
|
43
|
+
GetDistrictsDocument,
|
|
44
|
+
type GetDistrictsQuery
|
|
45
|
+
} from '@legendsoflearning/lol-sdk-core/admins'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### With Apollo Client
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { useQuery, useMutation } from '@apollo/client'
|
|
52
|
+
import {
|
|
53
|
+
GetAssignmentPlayDocument,
|
|
54
|
+
CompleteActivityDocument
|
|
55
|
+
} from '@legendsoflearning/lol-sdk-core/play'
|
|
56
|
+
|
|
57
|
+
function AssignmentPlayer({ assignmentId }: { assignmentId: string }) {
|
|
58
|
+
const { data, loading } = useQuery(GetAssignmentPlayDocument, {
|
|
59
|
+
variables: { assignmentId, awakening: false }
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
const [completeActivity] = useMutation(CompleteActivityDocument)
|
|
63
|
+
|
|
64
|
+
// data is fully typed!
|
|
65
|
+
const play = data?.assignmentPlay
|
|
66
|
+
|
|
67
|
+
// ...
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Agents API
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import {
|
|
75
|
+
// Agent queries/mutations
|
|
76
|
+
GetAgentsDocument,
|
|
77
|
+
GetAgentDocument,
|
|
78
|
+
CreateAgentDocument,
|
|
79
|
+
UpdateAgentDocument,
|
|
80
|
+
// Tool queries/mutations
|
|
81
|
+
GetAgentsToolsDocument,
|
|
82
|
+
GetAgentsToolDocument,
|
|
83
|
+
AssignToolToAgentDocument,
|
|
84
|
+
// Schedule queries/mutations
|
|
85
|
+
GetAgentsSchedulesDocument,
|
|
86
|
+
CreateAgentsScheduleDocument,
|
|
87
|
+
// Conversation queries/mutations
|
|
88
|
+
GetAgentsConversationsDocument,
|
|
89
|
+
GetAgentsConversationDocument,
|
|
90
|
+
SendAgentsMessageDocument,
|
|
91
|
+
// Run queries/mutations
|
|
92
|
+
GetAgentsRunsDocument,
|
|
93
|
+
GetAgentsRunDocument,
|
|
94
|
+
CancelAgentsRunDocument,
|
|
95
|
+
// Usage queries
|
|
96
|
+
GetAgentsUsageStatsDocument,
|
|
97
|
+
GetAgentsUsageDailyDocument,
|
|
98
|
+
// Admin queries/mutations
|
|
99
|
+
GetAgentsCurrentAdminDocument,
|
|
100
|
+
// Types
|
|
101
|
+
type Agent,
|
|
102
|
+
type AgentRole,
|
|
103
|
+
type AgentStatus
|
|
104
|
+
} from '@legendsoflearning/lol-sdk-core/agents'
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## API Coverage
|
|
108
|
+
|
|
109
|
+
### Teachers API
|
|
110
|
+
- User management, groups, students
|
|
111
|
+
- Assignments and assignment sets
|
|
112
|
+
- Games and learning objectives
|
|
113
|
+
- Questions and assessments
|
|
114
|
+
- Review mode
|
|
115
|
+
|
|
116
|
+
### Public API
|
|
117
|
+
- Public game access (`GetPublicGame`)
|
|
118
|
+
- Game listings (`GetGames`)
|
|
119
|
+
- Search collections (`SearchCollections`)
|
|
120
|
+
- Questions (`GetQuestions`)
|
|
121
|
+
- Answer checking (`CheckAnswer`)
|
|
122
|
+
|
|
123
|
+
### Play API
|
|
124
|
+
- Assignment play (`GetAssignmentPlay`)
|
|
125
|
+
- Activity management (`CompleteActivity`, `AnswerQuestion`)
|
|
126
|
+
- Video progress (`ReportVideoLessonProgress`)
|
|
127
|
+
- Mini-game progress (`ReportMiniGameProgress`, `SaveMiniGameState`)
|
|
128
|
+
- Real-time subscriptions (`AssignmentPaused`, `AssignmentStopped`, etc.)
|
|
129
|
+
|
|
130
|
+
### Parents API
|
|
131
|
+
- Current user (`GetCurrentUser`, `GetMyAccountDetails`)
|
|
132
|
+
- Children management (`ListChildren`, `CreateStudent`, `ConnectToStudent`)
|
|
133
|
+
- Student details (`GetStudentDetails`, `GetAccountPageStudentDetails`)
|
|
134
|
+
- Progress tracking (`GetStandardProgression`, `GetFocusAreaParentStatuses`)
|
|
135
|
+
- Subscriptions (`GetSubscriptionPlans`, `SubscribePlayer`)
|
|
136
|
+
- Fluency facts (`GetFluencyFacts`, `GetFluencyFactProgressStatuses`)
|
|
137
|
+
|
|
138
|
+
### Admins API
|
|
139
|
+
- Districts (`GetDistricts`)
|
|
140
|
+
- States (`GetStates`)
|
|
141
|
+
- Schools (`GetSchools`)
|
|
142
|
+
- Users (`GetUsers`)
|
|
143
|
+
- District regions (`GetDistrictRegions`)
|
|
144
|
+
|
|
145
|
+
### Developers API
|
|
146
|
+
- Current developer (`GetCurrentDeveloper`)
|
|
147
|
+
- Games management (`GetDeveloperGames`, `GetDeveloperGame`, `UpdateGame`)
|
|
148
|
+
- Game versions (`CreateGameVersion`, `SubmitGameVersion`)
|
|
149
|
+
- File uploads (`RequestSignedUploadUrl`, `CompleteFileUpload`)
|
|
150
|
+
- User management (`CreateDeveloperUser`, `UpdateDeveloperPassword`)
|
|
151
|
+
|
|
152
|
+
## Development
|
|
153
|
+
|
|
154
|
+
### Building
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
pnpm build
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Updating Schemas
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
./scripts/sync-schemas.sh
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Adding New Documents
|
|
167
|
+
|
|
168
|
+
See `scripts/README.md` for detailed instructions on adding new APIs or updating documents.
|
|
169
|
+
|
|
170
|
+
## Changelog
|
|
171
|
+
|
|
172
|
+
See [CHANGELOG.md](./CHANGELOG.md) for release history.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { d as Auth, a as AuthConfig, g as AuthMode, k as createAuth } from '../index-CYIBtoSV.mjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { d as Auth, a as AuthConfig, g as AuthMode, k as createAuth } from '../index-CYIBtoSV.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkWWN77BBN_js = require('../chunk-WWN77BBN.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "createAuth", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkWWN77BBN_js.createAuth; }
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { InMemoryCacheConfig, TypePolicies } from '@apollo/client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cache utilities for the Legends SDK.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
interface CacheConfig extends InMemoryCacheConfig {
|
|
8
|
+
/**
|
|
9
|
+
* Enable persistent cache in localStorage.
|
|
10
|
+
*/
|
|
11
|
+
persist?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Key for persistent storage.
|
|
14
|
+
*/
|
|
15
|
+
persistKey?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Default type policies for Legends data.
|
|
19
|
+
*/
|
|
20
|
+
declare const defaultTypePolicies: TypePolicies;
|
|
21
|
+
/**
|
|
22
|
+
* Create cache configuration with sensible defaults.
|
|
23
|
+
*/
|
|
24
|
+
declare function createCacheConfig(config?: Partial<CacheConfig>): CacheConfig;
|
|
25
|
+
|
|
26
|
+
export { type CacheConfig, createCacheConfig, defaultTypePolicies };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { InMemoryCacheConfig, TypePolicies } from '@apollo/client';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cache utilities for the Legends SDK.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
interface CacheConfig extends InMemoryCacheConfig {
|
|
8
|
+
/**
|
|
9
|
+
* Enable persistent cache in localStorage.
|
|
10
|
+
*/
|
|
11
|
+
persist?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Key for persistent storage.
|
|
14
|
+
*/
|
|
15
|
+
persistKey?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Default type policies for Legends data.
|
|
19
|
+
*/
|
|
20
|
+
declare const defaultTypePolicies: TypePolicies;
|
|
21
|
+
/**
|
|
22
|
+
* Create cache configuration with sensible defaults.
|
|
23
|
+
*/
|
|
24
|
+
declare function createCacheConfig(config?: Partial<CacheConfig>): CacheConfig;
|
|
25
|
+
|
|
26
|
+
export { type CacheConfig, createCacheConfig, defaultTypePolicies };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/cache/index.ts
|
|
4
|
+
var defaultTypePolicies = {
|
|
5
|
+
Query: {
|
|
6
|
+
fields: {
|
|
7
|
+
// Pagination support for list queries
|
|
8
|
+
students: {
|
|
9
|
+
keyArgs: ["search", "filter"],
|
|
10
|
+
merge(existing, incoming, { args }) {
|
|
11
|
+
if (!args?.after) {
|
|
12
|
+
return incoming;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
...incoming,
|
|
16
|
+
edges: [...existing?.edges ?? [], ...incoming.edges]
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
rosters: {
|
|
21
|
+
keyArgs: ["archived"],
|
|
22
|
+
merge(existing, incoming, { args }) {
|
|
23
|
+
if (!args?.after) {
|
|
24
|
+
return incoming;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
...incoming,
|
|
28
|
+
edges: [...existing?.edges ?? [], ...incoming.edges]
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
Teacher: {
|
|
35
|
+
keyFields: ["id"]
|
|
36
|
+
},
|
|
37
|
+
Student: {
|
|
38
|
+
keyFields: ["id"]
|
|
39
|
+
},
|
|
40
|
+
Roster: {
|
|
41
|
+
keyFields: ["id"]
|
|
42
|
+
},
|
|
43
|
+
School: {
|
|
44
|
+
keyFields: ["id"]
|
|
45
|
+
},
|
|
46
|
+
District: {
|
|
47
|
+
keyFields: ["id"]
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function createCacheConfig(config = {}) {
|
|
51
|
+
return {
|
|
52
|
+
typePolicies: {
|
|
53
|
+
...defaultTypePolicies,
|
|
54
|
+
...config.typePolicies
|
|
55
|
+
},
|
|
56
|
+
...config
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
exports.createCacheConfig = createCacheConfig;
|
|
61
|
+
exports.defaultTypePolicies = defaultTypePolicies;
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cache/index.ts"],"names":[],"mappings":";;;AAqBO,IAAM,mBAAA,GAAoC;AAAA,EAC/C,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA;AAAA,MAEN,QAAA,EAAU;AAAA,QACR,OAAA,EAAS,CAAC,QAAA,EAAU,QAAQ,CAAA;AAAA,QAC5B,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,EAAE,MAAK,EAAG;AAClC,UAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,YAAA,OAAO,QAAA;AAAA,UACT;AACA,UAAA,OAAO;AAAA,YACL,GAAG,QAAA;AAAA,YACH,KAAA,EAAO,CAAC,GAAI,QAAA,EAAU,SAAS,EAAC,EAAI,GAAG,QAAA,CAAS,KAAK;AAAA,WACvD;AAAA,QACF;AAAA,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,CAAC,UAAU,CAAA;AAAA,QACpB,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,EAAE,MAAK,EAAG;AAClC,UAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,YAAA,OAAO,QAAA;AAAA,UACT;AACA,UAAA,OAAO;AAAA,YACL,GAAG,QAAA;AAAA,YACH,KAAA,EAAO,CAAC,GAAI,QAAA,EAAU,SAAS,EAAC,EAAI,GAAG,QAAA,CAAS,KAAK;AAAA,WACvD;AAAA,QACF;AAAA;AACF;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAA,EAAW,CAAC,IAAI;AAAA;AAEpB;AAKO,SAAS,iBAAA,CAAkB,MAAA,GAA+B,EAAC,EAAgB;AAChF,EAAA,OAAO;AAAA,IACL,YAAA,EAAc;AAAA,MACZ,GAAG,mBAAA;AAAA,MACH,GAAG,MAAA,CAAO;AAAA,KACZ;AAAA,IACA,GAAG;AAAA,GACL;AACF","file":"index.js","sourcesContent":["/**\n * Cache utilities for the Legends SDK.\n */\n\nimport type { InMemoryCacheConfig, TypePolicies } from '@apollo/client'\n\nexport interface CacheConfig extends InMemoryCacheConfig {\n /**\n * Enable persistent cache in localStorage.\n */\n persist?: boolean\n\n /**\n * Key for persistent storage.\n */\n persistKey?: string\n}\n\n/**\n * Default type policies for Legends data.\n */\nexport const defaultTypePolicies: TypePolicies = {\n Query: {\n fields: {\n // Pagination support for list queries\n students: {\n keyArgs: ['search', 'filter'],\n merge(existing, incoming, { args }) {\n if (!args?.after) {\n return incoming\n }\n return {\n ...incoming,\n edges: [...(existing?.edges ?? []), ...incoming.edges],\n }\n },\n },\n rosters: {\n keyArgs: ['archived'],\n merge(existing, incoming, { args }) {\n if (!args?.after) {\n return incoming\n }\n return {\n ...incoming,\n edges: [...(existing?.edges ?? []), ...incoming.edges],\n }\n },\n },\n },\n },\n Teacher: {\n keyFields: ['id'],\n },\n Student: {\n keyFields: ['id'],\n },\n Roster: {\n keyFields: ['id'],\n },\n School: {\n keyFields: ['id'],\n },\n District: {\n keyFields: ['id'],\n },\n}\n\n/**\n * Create cache configuration with sensible defaults.\n */\nexport function createCacheConfig(config: Partial<CacheConfig> = {}): CacheConfig {\n return {\n typePolicies: {\n ...defaultTypePolicies,\n ...config.typePolicies,\n },\n ...config,\n }\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// src/cache/index.ts
|
|
2
|
+
var defaultTypePolicies = {
|
|
3
|
+
Query: {
|
|
4
|
+
fields: {
|
|
5
|
+
// Pagination support for list queries
|
|
6
|
+
students: {
|
|
7
|
+
keyArgs: ["search", "filter"],
|
|
8
|
+
merge(existing, incoming, { args }) {
|
|
9
|
+
if (!args?.after) {
|
|
10
|
+
return incoming;
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
...incoming,
|
|
14
|
+
edges: [...existing?.edges ?? [], ...incoming.edges]
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
rosters: {
|
|
19
|
+
keyArgs: ["archived"],
|
|
20
|
+
merge(existing, incoming, { args }) {
|
|
21
|
+
if (!args?.after) {
|
|
22
|
+
return incoming;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
...incoming,
|
|
26
|
+
edges: [...existing?.edges ?? [], ...incoming.edges]
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
Teacher: {
|
|
33
|
+
keyFields: ["id"]
|
|
34
|
+
},
|
|
35
|
+
Student: {
|
|
36
|
+
keyFields: ["id"]
|
|
37
|
+
},
|
|
38
|
+
Roster: {
|
|
39
|
+
keyFields: ["id"]
|
|
40
|
+
},
|
|
41
|
+
School: {
|
|
42
|
+
keyFields: ["id"]
|
|
43
|
+
},
|
|
44
|
+
District: {
|
|
45
|
+
keyFields: ["id"]
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
function createCacheConfig(config = {}) {
|
|
49
|
+
return {
|
|
50
|
+
typePolicies: {
|
|
51
|
+
...defaultTypePolicies,
|
|
52
|
+
...config.typePolicies
|
|
53
|
+
},
|
|
54
|
+
...config
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { createCacheConfig, defaultTypePolicies };
|
|
59
|
+
//# sourceMappingURL=index.mjs.map
|
|
60
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cache/index.ts"],"names":[],"mappings":";AAqBO,IAAM,mBAAA,GAAoC;AAAA,EAC/C,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA;AAAA,MAEN,QAAA,EAAU;AAAA,QACR,OAAA,EAAS,CAAC,QAAA,EAAU,QAAQ,CAAA;AAAA,QAC5B,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,EAAE,MAAK,EAAG;AAClC,UAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,YAAA,OAAO,QAAA;AAAA,UACT;AACA,UAAA,OAAO;AAAA,YACL,GAAG,QAAA;AAAA,YACH,KAAA,EAAO,CAAC,GAAI,QAAA,EAAU,SAAS,EAAC,EAAI,GAAG,QAAA,CAAS,KAAK;AAAA,WACvD;AAAA,QACF;AAAA,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,CAAC,UAAU,CAAA;AAAA,QACpB,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,EAAE,MAAK,EAAG;AAClC,UAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,YAAA,OAAO,QAAA;AAAA,UACT;AACA,UAAA,OAAO;AAAA,YACL,GAAG,QAAA;AAAA,YACH,KAAA,EAAO,CAAC,GAAI,QAAA,EAAU,SAAS,EAAC,EAAI,GAAG,QAAA,CAAS,KAAK;AAAA,WACvD;AAAA,QACF;AAAA;AACF;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW,CAAC,IAAI;AAAA,GAClB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAA,EAAW,CAAC,IAAI;AAAA;AAEpB;AAKO,SAAS,iBAAA,CAAkB,MAAA,GAA+B,EAAC,EAAgB;AAChF,EAAA,OAAO;AAAA,IACL,YAAA,EAAc;AAAA,MACZ,GAAG,mBAAA;AAAA,MACH,GAAG,MAAA,CAAO;AAAA,KACZ;AAAA,IACA,GAAG;AAAA,GACL;AACF","file":"index.mjs","sourcesContent":["/**\n * Cache utilities for the Legends SDK.\n */\n\nimport type { InMemoryCacheConfig, TypePolicies } from '@apollo/client'\n\nexport interface CacheConfig extends InMemoryCacheConfig {\n /**\n * Enable persistent cache in localStorage.\n */\n persist?: boolean\n\n /**\n * Key for persistent storage.\n */\n persistKey?: string\n}\n\n/**\n * Default type policies for Legends data.\n */\nexport const defaultTypePolicies: TypePolicies = {\n Query: {\n fields: {\n // Pagination support for list queries\n students: {\n keyArgs: ['search', 'filter'],\n merge(existing, incoming, { args }) {\n if (!args?.after) {\n return incoming\n }\n return {\n ...incoming,\n edges: [...(existing?.edges ?? []), ...incoming.edges],\n }\n },\n },\n rosters: {\n keyArgs: ['archived'],\n merge(existing, incoming, { args }) {\n if (!args?.after) {\n return incoming\n }\n return {\n ...incoming,\n edges: [...(existing?.edges ?? []), ...incoming.edges],\n }\n },\n },\n },\n },\n Teacher: {\n keyFields: ['id'],\n },\n Student: {\n keyFields: ['id'],\n },\n Roster: {\n keyFields: ['id'],\n },\n School: {\n keyFields: ['id'],\n },\n District: {\n keyFields: ['id'],\n },\n}\n\n/**\n * Create cache configuration with sensible defaults.\n */\nexport function createCacheConfig(config: Partial<CacheConfig> = {}): CacheConfig {\n return {\n typePolicies: {\n ...defaultTypePolicies,\n ...config.typePolicies,\n },\n ...config,\n }\n}\n"]}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// src/auth/index.ts
|
|
2
|
+
var STORAGE_KEY = "lol_sdk_session";
|
|
3
|
+
var MemoryStorage = class {
|
|
4
|
+
data = {};
|
|
5
|
+
getItem(key) {
|
|
6
|
+
return this.data[key] ?? null;
|
|
7
|
+
}
|
|
8
|
+
setItem(key, value) {
|
|
9
|
+
this.data[key] = value;
|
|
10
|
+
}
|
|
11
|
+
removeItem(key) {
|
|
12
|
+
delete this.data[key];
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
var TEACHER_SIGN_IN_MUTATION = `
|
|
16
|
+
mutation TeacherSignIn($email: String!, $password: String!, $rememberMe: Boolean) {
|
|
17
|
+
teacherSignIn(email: $email, password: $password, rememberMe: $rememberMe) {
|
|
18
|
+
success
|
|
19
|
+
user { id }
|
|
20
|
+
teacher { id code email givenName familyName }
|
|
21
|
+
sessionToken
|
|
22
|
+
errors { field message }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
var API_AUTH_CONFIG = {
|
|
27
|
+
teachers: {
|
|
28
|
+
signInMutation: TEACHER_SIGN_IN_MUTATION,
|
|
29
|
+
signInField: "teacherSignIn",
|
|
30
|
+
oauthUrl: (baseUrl, provider) => {
|
|
31
|
+
if (provider === "google") {
|
|
32
|
+
return `${baseUrl}/oauth/google?role=lol_teacher&sign_in=true&frontend=v2`;
|
|
33
|
+
}
|
|
34
|
+
if (provider === "clever") {
|
|
35
|
+
return `${baseUrl}/clever/login`;
|
|
36
|
+
}
|
|
37
|
+
return `${baseUrl}/oauth/${provider}?role=lol_teacher`;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
parents: {
|
|
41
|
+
signInMutation: TEACHER_SIGN_IN_MUTATION.replace(/teacher/gi, "parent"),
|
|
42
|
+
signInField: "parentSignIn",
|
|
43
|
+
oauthUrl: (baseUrl, provider) => `${baseUrl}/oauth/${provider}?role=parent`
|
|
44
|
+
},
|
|
45
|
+
play: {
|
|
46
|
+
signInMutation: "",
|
|
47
|
+
signInField: "",
|
|
48
|
+
oauthUrl: (baseUrl, provider) => `${baseUrl}/oauth/${provider}?role=student`
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
function createAuth(config) {
|
|
52
|
+
const {
|
|
53
|
+
api,
|
|
54
|
+
baseUrl,
|
|
55
|
+
mode = "cookie",
|
|
56
|
+
storage = "localStorage",
|
|
57
|
+
autoRefresh = true,
|
|
58
|
+
clientId,
|
|
59
|
+
redirectUri = typeof window !== "undefined" ? `${window.location.origin}/auth/callback` : ""
|
|
60
|
+
} = config;
|
|
61
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
62
|
+
let refreshTimeout = null;
|
|
63
|
+
const apiAuthConfig = API_AUTH_CONFIG[api] || API_AUTH_CONFIG.teachers;
|
|
64
|
+
const storageAdapter = (() => {
|
|
65
|
+
if (typeof storage === "object") return storage;
|
|
66
|
+
if (typeof window === "undefined") return new MemoryStorage();
|
|
67
|
+
switch (storage) {
|
|
68
|
+
case "localStorage":
|
|
69
|
+
return window.localStorage;
|
|
70
|
+
case "sessionStorage":
|
|
71
|
+
return window.sessionStorage;
|
|
72
|
+
case "memory":
|
|
73
|
+
return new MemoryStorage();
|
|
74
|
+
default:
|
|
75
|
+
return window.localStorage;
|
|
76
|
+
}
|
|
77
|
+
})();
|
|
78
|
+
function notifyListeners(session) {
|
|
79
|
+
listeners.forEach((callback) => callback(session));
|
|
80
|
+
}
|
|
81
|
+
function saveSession(session) {
|
|
82
|
+
storageAdapter.setItem(STORAGE_KEY, JSON.stringify(session));
|
|
83
|
+
notifyListeners(session);
|
|
84
|
+
if (autoRefresh) {
|
|
85
|
+
scheduleRefresh(session);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function clearSession() {
|
|
89
|
+
storageAdapter.removeItem(STORAGE_KEY);
|
|
90
|
+
notifyListeners(null);
|
|
91
|
+
if (refreshTimeout) {
|
|
92
|
+
clearTimeout(refreshTimeout);
|
|
93
|
+
refreshTimeout = null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function scheduleRefresh(session) {
|
|
97
|
+
if (refreshTimeout) {
|
|
98
|
+
clearTimeout(refreshTimeout);
|
|
99
|
+
}
|
|
100
|
+
const expiresAt = new Date(session.expiresAt).getTime();
|
|
101
|
+
const now = Date.now();
|
|
102
|
+
const refreshIn = expiresAt - now - 6e4;
|
|
103
|
+
if (refreshIn > 0) {
|
|
104
|
+
refreshTimeout = setTimeout(() => {
|
|
105
|
+
auth.refreshToken();
|
|
106
|
+
}, refreshIn);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const auth = {
|
|
110
|
+
async signIn(credentials) {
|
|
111
|
+
const graphqlEndpoint = `${baseUrl}/api2/${api}/graphql`;
|
|
112
|
+
const headers = {
|
|
113
|
+
"Content-Type": "application/json"
|
|
114
|
+
};
|
|
115
|
+
const response = await fetch(graphqlEndpoint, {
|
|
116
|
+
method: "POST",
|
|
117
|
+
headers,
|
|
118
|
+
credentials: mode === "cookie" ? "include" : "omit",
|
|
119
|
+
body: JSON.stringify({
|
|
120
|
+
query: apiAuthConfig.signInMutation,
|
|
121
|
+
variables: {
|
|
122
|
+
email: credentials.email,
|
|
123
|
+
password: credentials.password,
|
|
124
|
+
rememberMe: credentials.rememberMe ?? false
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
const result = await response.json();
|
|
129
|
+
const data = result.data?.[apiAuthConfig.signInField];
|
|
130
|
+
if (!data?.success) {
|
|
131
|
+
const errorMessages = data?.errors?.map((e) => e.message).join(", ");
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
error: errorMessages || "Sign in failed"
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const session = {
|
|
138
|
+
user: {
|
|
139
|
+
id: data.user?.id || data.teacher?.id,
|
|
140
|
+
email: data.teacher?.email,
|
|
141
|
+
firstName: data.teacher?.givenName,
|
|
142
|
+
lastName: data.teacher?.familyName
|
|
143
|
+
},
|
|
144
|
+
token: data.sessionToken,
|
|
145
|
+
// Used for X-Session-Token header in token mode
|
|
146
|
+
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1e3)
|
|
147
|
+
// 7 days default
|
|
148
|
+
};
|
|
149
|
+
saveSession(session);
|
|
150
|
+
return { success: true, session };
|
|
151
|
+
},
|
|
152
|
+
async signUp(_input) {
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
error: "Please use the signup page at /sign-up"
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
async signInWithOAuth(provider) {
|
|
159
|
+
if (clientId && mode === "token") {
|
|
160
|
+
const params = new URLSearchParams({
|
|
161
|
+
client_id: clientId,
|
|
162
|
+
redirect_uri: redirectUri,
|
|
163
|
+
response_type: "code",
|
|
164
|
+
provider,
|
|
165
|
+
role: api === "teachers" ? "lol_teacher" : api === "parents" ? "parent" : "student"
|
|
166
|
+
});
|
|
167
|
+
window.location.href = `${baseUrl}/oauth/authorize?${params}`;
|
|
168
|
+
return new Promise(() => {
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const oauthUrl = apiAuthConfig.oauthUrl(baseUrl, provider);
|
|
172
|
+
window.location.href = oauthUrl;
|
|
173
|
+
return new Promise(() => {
|
|
174
|
+
});
|
|
175
|
+
},
|
|
176
|
+
async handleOAuthCallback(params) {
|
|
177
|
+
const { code, error } = params;
|
|
178
|
+
if (error) {
|
|
179
|
+
return { success: false, error };
|
|
180
|
+
}
|
|
181
|
+
if (!code) {
|
|
182
|
+
return { success: false, error: "No authorization code received" };
|
|
183
|
+
}
|
|
184
|
+
const response = await fetch(`${baseUrl}/oauth/token`, {
|
|
185
|
+
method: "POST",
|
|
186
|
+
headers: {
|
|
187
|
+
"Content-Type": "application/json"
|
|
188
|
+
},
|
|
189
|
+
body: JSON.stringify({
|
|
190
|
+
grant_type: "authorization_code",
|
|
191
|
+
code,
|
|
192
|
+
client_id: clientId,
|
|
193
|
+
redirect_uri: redirectUri
|
|
194
|
+
})
|
|
195
|
+
});
|
|
196
|
+
const data = await response.json();
|
|
197
|
+
if (!response.ok || data.error) {
|
|
198
|
+
return {
|
|
199
|
+
success: false,
|
|
200
|
+
error: data.error_description || data.error || "Token exchange failed"
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const session = {
|
|
204
|
+
user: {
|
|
205
|
+
id: data.user?.id,
|
|
206
|
+
email: data.user?.email,
|
|
207
|
+
firstName: data.user?.first_name,
|
|
208
|
+
lastName: data.user?.last_name
|
|
209
|
+
},
|
|
210
|
+
token: data.access_token || data.session_token,
|
|
211
|
+
expiresAt: new Date(Date.now() + (data.expires_in || 7 * 24 * 60 * 60) * 1e3)
|
|
212
|
+
};
|
|
213
|
+
saveSession(session);
|
|
214
|
+
return { success: true, session };
|
|
215
|
+
},
|
|
216
|
+
async signOut() {
|
|
217
|
+
const session = auth.getSession();
|
|
218
|
+
try {
|
|
219
|
+
const headers = {
|
|
220
|
+
"Content-Type": "application/json"
|
|
221
|
+
};
|
|
222
|
+
if (mode === "token" && session?.token) {
|
|
223
|
+
headers["X-Session-Token"] = session.token;
|
|
224
|
+
}
|
|
225
|
+
await fetch(`${baseUrl}/accounts/signout`, {
|
|
226
|
+
method: "POST",
|
|
227
|
+
headers,
|
|
228
|
+
credentials: mode === "cookie" ? "include" : "omit"
|
|
229
|
+
});
|
|
230
|
+
} catch {
|
|
231
|
+
}
|
|
232
|
+
clearSession();
|
|
233
|
+
},
|
|
234
|
+
getSession() {
|
|
235
|
+
const stored = storageAdapter.getItem(STORAGE_KEY);
|
|
236
|
+
if (!stored) return null;
|
|
237
|
+
try {
|
|
238
|
+
const session = JSON.parse(stored);
|
|
239
|
+
session.expiresAt = new Date(session.expiresAt);
|
|
240
|
+
if (session.expiresAt.getTime() < Date.now()) {
|
|
241
|
+
clearSession();
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
return session;
|
|
245
|
+
} catch {
|
|
246
|
+
clearSession();
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
getAuthHeaders() {
|
|
251
|
+
const session = auth.getSession();
|
|
252
|
+
const headers = {};
|
|
253
|
+
if (mode === "token" && session?.token) {
|
|
254
|
+
headers["X-Session-Token"] = session.token;
|
|
255
|
+
}
|
|
256
|
+
return headers;
|
|
257
|
+
},
|
|
258
|
+
getMode() {
|
|
259
|
+
return mode;
|
|
260
|
+
},
|
|
261
|
+
onAuthChange(callback) {
|
|
262
|
+
listeners.add(callback);
|
|
263
|
+
callback(auth.getSession());
|
|
264
|
+
return () => {
|
|
265
|
+
listeners.delete(callback);
|
|
266
|
+
};
|
|
267
|
+
},
|
|
268
|
+
async refreshToken() {
|
|
269
|
+
return auth.getSession();
|
|
270
|
+
},
|
|
271
|
+
_handleAuthError() {
|
|
272
|
+
clearSession();
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
const existingSession = auth.getSession();
|
|
276
|
+
if (existingSession && autoRefresh) {
|
|
277
|
+
scheduleRefresh(existingSession);
|
|
278
|
+
}
|
|
279
|
+
return auth;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export { createAuth };
|
|
283
|
+
//# sourceMappingURL=chunk-Q4UXELOU.mjs.map
|
|
284
|
+
//# sourceMappingURL=chunk-Q4UXELOU.mjs.map
|