@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.
Files changed (74) hide show
  1. package/README.md +172 -0
  2. package/dist/auth/index.d.mts +1 -0
  3. package/dist/auth/index.d.ts +1 -0
  4. package/dist/auth/index.js +12 -0
  5. package/dist/auth/index.js.map +1 -0
  6. package/dist/auth/index.mjs +3 -0
  7. package/dist/auth/index.mjs.map +1 -0
  8. package/dist/cache/index.d.mts +26 -0
  9. package/dist/cache/index.d.ts +26 -0
  10. package/dist/cache/index.js +63 -0
  11. package/dist/cache/index.js.map +1 -0
  12. package/dist/cache/index.mjs +60 -0
  13. package/dist/cache/index.mjs.map +1 -0
  14. package/dist/chunk-Q4UXELOU.mjs +284 -0
  15. package/dist/chunk-Q4UXELOU.mjs.map +1 -0
  16. package/dist/chunk-WWN77BBN.js +286 -0
  17. package/dist/chunk-WWN77BBN.js.map +1 -0
  18. package/dist/generated/admins/index.d.mts +2738 -0
  19. package/dist/generated/admins/index.d.ts +2738 -0
  20. package/dist/generated/admins/index.js +126 -0
  21. package/dist/generated/admins/index.js.map +1 -0
  22. package/dist/generated/admins/index.mjs +108 -0
  23. package/dist/generated/admins/index.mjs.map +1 -0
  24. package/dist/generated/agents/index.d.mts +1744 -0
  25. package/dist/generated/agents/index.d.ts +1744 -0
  26. package/dist/generated/agents/index.js +220 -0
  27. package/dist/generated/agents/index.js.map +1 -0
  28. package/dist/generated/agents/index.mjs +168 -0
  29. package/dist/generated/agents/index.mjs.map +1 -0
  30. package/dist/generated/developers/index.d.mts +748 -0
  31. package/dist/generated/developers/index.d.ts +748 -0
  32. package/dist/generated/developers/index.js +72 -0
  33. package/dist/generated/developers/index.js.map +1 -0
  34. package/dist/generated/developers/index.mjs +54 -0
  35. package/dist/generated/developers/index.mjs.map +1 -0
  36. package/dist/generated/parents/index.d.mts +2446 -0
  37. package/dist/generated/parents/index.d.ts +2446 -0
  38. package/dist/generated/parents/index.js +272 -0
  39. package/dist/generated/parents/index.js.map +1 -0
  40. package/dist/generated/parents/index.mjs +206 -0
  41. package/dist/generated/parents/index.mjs.map +1 -0
  42. package/dist/generated/play/index.d.mts +1740 -0
  43. package/dist/generated/play/index.d.ts +1740 -0
  44. package/dist/generated/play/index.js +173 -0
  45. package/dist/generated/play/index.js.map +1 -0
  46. package/dist/generated/play/index.mjs +139 -0
  47. package/dist/generated/play/index.mjs.map +1 -0
  48. package/dist/generated/public/index.d.mts +1126 -0
  49. package/dist/generated/public/index.d.ts +1126 -0
  50. package/dist/generated/public/index.js +58 -0
  51. package/dist/generated/public/index.js.map +1 -0
  52. package/dist/generated/public/index.mjs +46 -0
  53. package/dist/generated/public/index.mjs.map +1 -0
  54. package/dist/generated/teachers/index.d.mts +6205 -0
  55. package/dist/generated/teachers/index.d.ts +6205 -0
  56. package/dist/generated/teachers/index.js +353 -0
  57. package/dist/generated/teachers/index.js.map +1 -0
  58. package/dist/generated/teachers/index.mjs +282 -0
  59. package/dist/generated/teachers/index.mjs.map +1 -0
  60. package/dist/generated/translation-hub/index.d.mts +2018 -0
  61. package/dist/generated/translation-hub/index.d.ts +2018 -0
  62. package/dist/generated/translation-hub/index.js +186 -0
  63. package/dist/generated/translation-hub/index.js.map +1 -0
  64. package/dist/generated/translation-hub/index.mjs +135 -0
  65. package/dist/generated/translation-hub/index.mjs.map +1 -0
  66. package/dist/index-CYIBtoSV.d.mts +173 -0
  67. package/dist/index-CYIBtoSV.d.ts +173 -0
  68. package/dist/index.d.mts +154 -0
  69. package/dist/index.d.ts +154 -0
  70. package/dist/index.js +364 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/index.mjs +348 -0
  73. package/dist/index.mjs.map +1 -0
  74. 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,3 @@
1
+ export { createAuth } from '../chunk-Q4UXELOU.mjs';
2
+ //# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -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