@superbuilders/primer-tives 2.0.0 → 2.2.0

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 (39) hide show
  1. package/README.md +742 -540
  2. package/dist/client/create.d.ts +22 -6
  3. package/dist/client/create.d.ts.map +1 -1
  4. package/dist/client/index.js +89 -51
  5. package/dist/client/index.js.map +14 -11
  6. package/dist/client/session.d.ts +1 -1
  7. package/dist/client/session.d.ts.map +1 -1
  8. package/dist/client/transport.d.ts +4 -5
  9. package/dist/client/transport.d.ts.map +1 -1
  10. package/dist/contracts/index.d.ts +3 -2
  11. package/dist/contracts/index.d.ts.map +1 -1
  12. package/dist/contracts/index.js +42 -36
  13. package/dist/contracts/index.js.map +6 -5
  14. package/dist/contracts/pci-schemas.d.ts +24 -20
  15. package/dist/contracts/pci-schemas.d.ts.map +1 -1
  16. package/dist/contracts/pci.d.ts +26 -27
  17. package/dist/contracts/pci.d.ts.map +1 -1
  18. package/dist/contracts/validation.d.ts +34 -23
  19. package/dist/contracts/validation.d.ts.map +1 -1
  20. package/dist/errors.d.ts +2 -6
  21. package/dist/errors.d.ts.map +1 -1
  22. package/dist/errors.js +3 -11
  23. package/dist/errors.js.map +3 -3
  24. package/dist/server/create-server.d.ts +3 -33
  25. package/dist/server/create-server.d.ts.map +1 -1
  26. package/dist/server/exchange.d.ts +7 -14
  27. package/dist/server/exchange.d.ts.map +1 -1
  28. package/dist/server/index.d.ts +1 -3
  29. package/dist/server/index.d.ts.map +1 -1
  30. package/dist/server/index.js +31 -407
  31. package/dist/server/index.js.map +6 -9
  32. package/dist/subject-pcis.d.ts +13 -0
  33. package/dist/subject-pcis.d.ts.map +1 -0
  34. package/dist/version.d.ts +1 -1
  35. package/package.json +5 -1
  36. package/dist/server/hints.d.ts +0 -25
  37. package/dist/server/hints.d.ts.map +0 -1
  38. package/dist/server/students.d.ts +0 -12
  39. package/dist/server/students.d.ts.map +0 -1
@@ -1,15 +1,12 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/errors.ts", "../src/grade-level.ts", "../src/server/exchange.ts", "../src/server/hints.ts", "../src/server/students.ts", "../src/server/create-server.ts"],
3
+ "sources": ["../src/errors.ts", "../src/server/exchange.ts", "../src/server/create-server.ts"],
4
4
  "sourcesContent": [
5
- "import * as errors from \"@superbuilders/errors\"\n\nconst ErrNetwork = errors.new(\"network\")\nconst ErrJsonParse = errors.new(\"json parse\")\nconst ErrUnsupportedPci = errors.new(\"unsupported pci\")\nconst ErrInvalidAccessToken = errors.new(\"invalid access token\")\nconst ErrMalformedAccessToken = errors.new(\"malformed access token\")\nconst ErrTokenExpired = errors.new(\"access token expired\")\nconst ErrBadRequest = errors.new(\"bad request\")\nconst ErrServerError = errors.new(\"server error\")\nconst ErrTimeout = errors.new(\"timeout\")\nconst ErrForbidden = errors.new(\"forbidden\")\nconst ErrNotFound = errors.new(\"not found\")\nconst ErrConflict = errors.new(\"conflict\")\nconst ErrExternalAuthorityRequired = errors.new(\"external authority required\")\nconst ErrRateLimited = errors.new(\"rate limited\")\nconst ErrServiceUnavailable = errors.new(\"service unavailable\")\nconst ErrNotSerializable = errors.new(\n\t\"PrimerState is live in-memory state and must not be serialized or stored\"\n)\nconst ErrInvalidSubmission = errors.new(\"invalid submission\")\n\nconst ErrInvalidSecretKey = errors.new(\"invalid secret key\")\nconst ErrStudentNotFound = errors.new(\"student not found\")\nconst ErrUnsupportedGrade = errors.new(\"unsupported grade\")\nconst ErrTimebackUnavailable = errors.new(\"timeback unavailable\")\nconst ErrNeedsHints = errors.new(\"student needs hints set before /advance\")\nconst ErrSdkUpgradeRequired = errors.new(\"sdk upgrade required\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrExternalAuthorityRequired,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrNeedsHints,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrSdkUpgradeRequired,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrStudentNotFound,\n\tErrTimebackUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedGrade,\n\tErrUnsupportedPci\n}\n",
6
- "const GRADE_LEVELS = [\"K\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"] as const\n\ntype GradeLevel = (typeof GRADE_LEVELS)[number]\n\nexport { GRADE_LEVELS }\nexport type { GradeLevel }\n",
7
- "import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrExternalAuthorityRequired,\n\tErrInvalidSecretKey,\n\tErrJsonParse,\n\tErrNetwork,\n\tErrServerError,\n\tErrStudentNotFound,\n\tErrTimebackUnavailable,\n\tErrTimeout,\n\tErrUnsupportedGrade\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\n\nconst STUDENT_EXCHANGE_PATH = \"/api/v0/auth/exchange\"\nconst TIMEBACK_EXCHANGE_PATH = \"/api/v0/auth/exchange/timeback\"\n\ninterface ExchangeConfig {\n\treadonly origin: string\n\treadonly secretKey: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger: PrimerLogger\n}\n\ninterface SessionToken {\n\treadonly accessToken: string\n\treadonly expiresInSeconds: number\n}\n\ninterface TimebackSession {\n\treadonly studentId: string\n\treadonly accessToken: string\n\treadonly expiresInSeconds: number\n}\n\ninterface SessionTokenSuccessBody {\n\taccess_token: string\n\ttoken_type: \"Bearer\"\n\texpires_in: number\n\tscope: string\n}\n\ninterface TimebackExchangeSuccessBody extends SessionTokenSuccessBody {\n\tstudent_id: string\n}\n\ninterface ExchangeErrorBody {\n\treadonly error?: string\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n\treturn typeof value === \"number\" && Number.isFinite(value)\n}\n\nfunction toExchangeErrorBody(data: unknown): ExchangeErrorBody {\n\tif (!isObjectRecord(data)) {\n\t\treturn {}\n\t}\n\treturn typeof data.error === \"string\" ? { error: data.error } : {}\n}\n\nfunction parseSessionTokenSuccessBody(data: unknown): SessionTokenSuccessBody | undefined {\n\tif (!isObjectRecord(data)) {\n\t\treturn undefined\n\t}\n\tif (typeof data.access_token !== \"string\") {\n\t\treturn undefined\n\t}\n\tif (data.token_type !== \"Bearer\") {\n\t\treturn undefined\n\t}\n\tif (!isFiniteNumber(data.expires_in)) {\n\t\treturn undefined\n\t}\n\tif (typeof data.scope !== \"string\") {\n\t\treturn undefined\n\t}\n\treturn {\n\t\taccess_token: data.access_token,\n\t\ttoken_type: data.token_type,\n\t\texpires_in: data.expires_in,\n\t\tscope: data.scope\n\t}\n}\n\nfunction parseTimebackExchangeSuccessBody(data: unknown): TimebackExchangeSuccessBody | undefined {\n\tconst session = parseSessionTokenSuccessBody(data)\n\tif (!session || !isObjectRecord(data) || typeof data.student_id !== \"string\") {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tstudent_id: data.student_id,\n\t\taccess_token: session.access_token,\n\t\ttoken_type: session.token_type,\n\t\texpires_in: session.expires_in,\n\t\tscope: session.scope\n\t}\n}\n\nfunction isAbortError(err: Error): boolean {\n\treturn err.name === \"AbortError\" || err.name === \"TimeoutError\"\n}\n\nfunction mapBadRequest(body: ExchangeErrorBody): Error {\n\tif (body.error === \"unsupported_grade\") {\n\t\treturn ErrUnsupportedGrade\n\t}\n\treturn ErrBadRequest\n}\n\nfunction httpSentinel(status: number, body: ExchangeErrorBody): Error {\n\tif (status === 400) {\n\t\treturn mapBadRequest(body)\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidSecretKey\n\t}\n\tif (status === 404) {\n\t\treturn ErrStudentNotFound\n\t}\n\tif (status === 409) {\n\t\tif (body.error === \"external_authority_required\") {\n\t\t\treturn ErrExternalAuthorityRequired\n\t\t}\n\t\treturn ErrConflict\n\t}\n\tif (status === 502) {\n\t\treturn ErrTimebackUnavailable\n\t}\n\treturn ErrServerError\n}\n\nasync function readErrorBody(res: Response): Promise<ExchangeErrorBody> {\n\tconst parsed = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail() {\n\t\t\treturn { ok: false } as const\n\t\t}\n\t)\n\tif (!parsed.ok) {\n\t\treturn {}\n\t}\n\treturn toExchangeErrorBody(parsed.data)\n}\n\nasync function sendExchangeRequest(\n\tconfig: ExchangeConfig,\n\tpath: string,\n\tbody: Record<string, unknown>,\n\tlogContext: Record<string, unknown>\n): Promise<Response> {\n\tconst logger = config.logger\n\tconst fetchFn = config.fetch ? config.fetch : globalThis.fetch\n\tconst signal = config.abort ? config.abort.signal : undefined\n\n\tconst url = `${config.origin}${path}`\n\tconst fetchResult = await fetchFn(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${config.secretKey}`\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal\n\t}).then(\n\t\tfunction ok(response: Response) {\n\t\t\treturn { ok: true, response } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!fetchResult.ok) {\n\t\tif (isAbortError(fetchResult.error)) {\n\t\t\tlogger.error(\"exchange timeout\", { path, ...logContext })\n\t\t\tthrow errors.wrap(ErrTimeout, fetchResult.error.message)\n\t\t}\n\t\tlogger.error(\"exchange network error\", { path, ...logContext, error: fetchResult.error })\n\t\tthrow errors.wrap(ErrNetwork, fetchResult.error.message)\n\t}\n\n\treturn fetchResult.response\n}\n\nasync function parseSessionTokenSuccess(\n\tconfig: ExchangeConfig,\n\tres: Response,\n\tlogContext: Record<string, unknown>\n): Promise<SessionToken> {\n\tconst logger = config.logger\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!jsonResult.ok) {\n\t\tlogger.error(\"exchange json parse failed\", { ...logContext, error: jsonResult.error })\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tconst body = parseSessionTokenSuccessBody(jsonResult.data)\n\tif (!body) {\n\t\tlogger.error(\"exchange success body had invalid shape\", {\n\t\t\t...logContext,\n\t\t\tbody: jsonResult.data\n\t\t})\n\t\tthrow errors.wrap(ErrJsonParse, \"exchange success body had invalid shape\")\n\t}\n\n\tlogger.debug(\"exchange success\", {\n\t\t...logContext,\n\t\texpiresIn: body.expires_in\n\t})\n\treturn {\n\t\taccessToken: body.access_token,\n\t\texpiresInSeconds: body.expires_in\n\t}\n}\n\nasync function parseTimebackSessionSuccess(\n\tconfig: ExchangeConfig,\n\tres: Response,\n\tsourcedId: string\n): Promise<TimebackSession> {\n\tconst logger = config.logger\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!jsonResult.ok) {\n\t\tlogger.error(\"timeback exchange json parse failed\", { sourcedId, error: jsonResult.error })\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tconst body = parseTimebackExchangeSuccessBody(jsonResult.data)\n\tif (!body) {\n\t\tlogger.error(\"timeback exchange success body had invalid shape\", {\n\t\t\tsourcedId,\n\t\t\tbody: jsonResult.data\n\t\t})\n\t\tthrow errors.wrap(ErrJsonParse, \"timeback exchange success body had invalid shape\")\n\t}\n\n\tlogger.debug(\"timeback exchange success\", {\n\t\tsourcedId,\n\t\tstudentId: body.student_id,\n\t\texpiresIn: body.expires_in\n\t})\n\treturn {\n\t\tstudentId: body.student_id,\n\t\taccessToken: body.access_token,\n\t\texpiresInSeconds: body.expires_in\n\t}\n}\n\nasync function exchangeStudent(config: ExchangeConfig, studentId: string): Promise<SessionToken> {\n\tconst logger = config.logger\n\tlogger.debug(\"exchange student request\", { studentId })\n\n\tconst res = await sendExchangeRequest(\n\t\tconfig,\n\t\tSTUDENT_EXCHANGE_PATH,\n\t\t{ student_id: studentId },\n\t\t{ studentId, exchangeKind: \"student_id\" }\n\t)\n\tif (!res.ok) {\n\t\tconst body = await readErrorBody(res)\n\t\tconst sentinel = httpSentinel(res.status, body)\n\t\tconst detail = body.error ? `${res.status} ${body.error}` : `${res.status}`\n\t\tlogger.error(\"exchange student http error\", { status: res.status, body, studentId })\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\treturn parseSessionTokenSuccess(config, res, { studentId, exchangeKind: \"student_id\" })\n}\n\nasync function exchangeTimebackStudent(\n\tconfig: ExchangeConfig,\n\tsourcedId: string\n): Promise<TimebackSession> {\n\tconst logger = config.logger\n\tlogger.debug(\"exchange timeback student request\", { sourcedId })\n\n\tconst res = await sendExchangeRequest(\n\t\tconfig,\n\t\tTIMEBACK_EXCHANGE_PATH,\n\t\t{ sourced_id: sourcedId },\n\t\t{ sourcedId, exchangeKind: \"timeback\" }\n\t)\n\tif (!res.ok) {\n\t\tconst body = await readErrorBody(res)\n\t\tconst sentinel = httpSentinel(res.status, body)\n\t\tconst detail = body.error ? `${res.status} ${body.error}` : `${res.status}`\n\t\tlogger.error(\"exchange timeback student http error\", { status: res.status, body, sourcedId })\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\treturn parseTimebackSessionSuccess(config, res, sourcedId)\n}\n\nexport type { ExchangeConfig, SessionToken, TimebackSession }\nexport { exchangeStudent, exchangeTimebackStudent }\n",
8
- "import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrInvalidSecretKey,\n\tErrJsonParse,\n\tErrNetwork,\n\tErrServerError,\n\tErrStudentNotFound,\n\tErrTimeout\n} from \"@superbuilders/primer-tives/errors\"\nimport { GRADE_LEVELS, type GradeLevel } from \"@superbuilders/primer-tives/grade-level\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\n\nconst STUDENTS_PATH = \"/api/v0/students\"\n\ninterface HintsConfig {\n\treadonly origin: string\n\treadonly secretKey: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger: PrimerLogger\n}\n\n/**\n * Partial update of a student's placement hints. Pass only the fields\n * you want to set; omitted fields are left untouched. The server\n * returns the persisted state after upsert.\n */\ninterface PlacementHints {\n\treadonly gradeLevel?: GradeLevel\n}\n\ninterface PlacementHintsResult {\n\treadonly studentId: string\n\treadonly gradeLevel: GradeLevel | null\n}\n\ninterface HintsErrorBody {\n\treadonly error?: string\n}\n\ninterface HintsSuccessWire {\n\treadonly student_id: string\n\treadonly grade_level: string | null\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction toHintsErrorBody(data: unknown): HintsErrorBody {\n\tif (!isObjectRecord(data)) {\n\t\treturn {}\n\t}\n\treturn typeof data.error === \"string\" ? { error: data.error } : {}\n}\n\nfunction parseHintsSuccess(data: unknown): HintsSuccessWire | undefined {\n\tif (!isObjectRecord(data)) {\n\t\treturn undefined\n\t}\n\tif (typeof data.student_id !== \"string\") {\n\t\treturn undefined\n\t}\n\tif (data.grade_level !== null && typeof data.grade_level !== \"string\") {\n\t\treturn undefined\n\t}\n\treturn {\n\t\tstudent_id: data.student_id,\n\t\tgrade_level: data.grade_level\n\t}\n}\n\nfunction isAbortError(err: Error): boolean {\n\treturn err.name === \"AbortError\" || err.name === \"TimeoutError\"\n}\n\nfunction httpSentinel(status: number): Error {\n\tif (status === 400) {\n\t\treturn ErrBadRequest\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidSecretKey\n\t}\n\tif (status === 404) {\n\t\treturn ErrStudentNotFound\n\t}\n\treturn ErrServerError\n}\n\nasync function readErrorBody(res: Response): Promise<HintsErrorBody> {\n\tconst parsed = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail() {\n\t\t\treturn { ok: false } as const\n\t\t}\n\t)\n\tif (!parsed.ok) {\n\t\treturn {}\n\t}\n\treturn toHintsErrorBody(parsed.data)\n}\n\nfunction buildRequestBody(hints: PlacementHints): string {\n\tconst body: Record<string, unknown> = {}\n\tif (hints.gradeLevel !== undefined) {\n\t\tbody.grade_level = hints.gradeLevel\n\t}\n\treturn JSON.stringify(body)\n}\n\nasync function sendSetHintsRequest(\n\tconfig: HintsConfig,\n\tstudentId: string,\n\thints: PlacementHints\n): Promise<Response> {\n\tconst logger = config.logger\n\tconst fetchFn = config.fetch ? config.fetch : globalThis.fetch\n\tconst signal = config.abort ? config.abort.signal : undefined\n\tconst url = `${config.origin}${STUDENTS_PATH}/${encodeURIComponent(studentId)}/hints`\n\n\tconst fetchResult = await fetchFn(url, {\n\t\tmethod: \"PATCH\",\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${config.secretKey}`,\n\t\t\t\"Content-Type\": \"application/json\"\n\t\t},\n\t\tbody: buildRequestBody(hints),\n\t\tsignal\n\t}).then(\n\t\tfunction ok(response: Response) {\n\t\t\treturn { ok: true, response } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!fetchResult.ok) {\n\t\tif (isAbortError(fetchResult.error)) {\n\t\t\tlogger.error(\"set student hints timeout\", { studentId })\n\t\t\tthrow errors.wrap(ErrTimeout, fetchResult.error.message)\n\t\t}\n\t\tlogger.error(\"set student hints network error\", {\n\t\t\tstudentId,\n\t\t\terror: fetchResult.error\n\t\t})\n\t\tthrow errors.wrap(ErrNetwork, fetchResult.error.message)\n\t}\n\n\treturn fetchResult.response\n}\n\nasync function parseHintsSuccessResponse(\n\tconfig: HintsConfig,\n\tres: Response\n): Promise<PlacementHintsResult> {\n\tconst logger = config.logger\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!jsonResult.ok) {\n\t\tlogger.error(\"set hints response parse failed\", { error: jsonResult.error })\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tconst body = parseHintsSuccess(jsonResult.data)\n\tif (!body) {\n\t\tlogger.error(\"set hints response had invalid shape\", { body: jsonResult.data })\n\t\tthrow errors.wrap(ErrJsonParse, \"set hints success body had invalid shape\")\n\t}\n\n\tlogger.debug(\"set hints response success\", {\n\t\tstudentId: body.student_id,\n\t\tgradeLevel: body.grade_level\n\t})\n\n\treturn {\n\t\tstudentId: body.student_id,\n\t\tgradeLevel: coerceGradeLevel(body.grade_level)\n\t}\n}\n\nfunction coerceGradeLevel(value: string | null): GradeLevel | null {\n\tif (value === null) {\n\t\treturn null\n\t}\n\tfor (const g of GRADE_LEVELS) {\n\t\tif (g === value) {\n\t\t\treturn g\n\t\t}\n\t}\n\treturn null\n}\n\nasync function setStudentHints(\n\tconfig: HintsConfig,\n\tstudentId: string,\n\thints: PlacementHints\n): Promise<PlacementHintsResult> {\n\tconst logger = config.logger\n\tlogger.debug(\"set student hints request\", { studentId, hints })\n\n\tconst res = await sendSetHintsRequest(config, studentId, hints)\n\tif (!res.ok) {\n\t\tconst body = await readErrorBody(res)\n\t\tconst sentinel = httpSentinel(res.status)\n\t\tconst detail = body.error ? `${res.status} ${body.error}` : `${res.status}`\n\t\tlogger.error(\"set student hints http error\", {\n\t\t\tstudentId,\n\t\t\tstatus: res.status,\n\t\t\tbody\n\t\t})\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\treturn parseHintsSuccessResponse(config, res)\n}\n\nexport type { HintsConfig, PlacementHints, PlacementHintsResult }\nexport { setStudentHints }\n",
9
- "import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrInvalidSecretKey,\n\tErrJsonParse,\n\tErrNetwork,\n\tErrServerError,\n\tErrTimeout\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\n\nconst STUDENTS_PATH = \"/api/v0/students\"\n\ninterface StudentsConfig {\n\treadonly origin: string\n\treadonly secretKey: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger: PrimerLogger\n}\n\ninterface StudentIdSuccessBody {\n\tstudent_id: string\n}\n\ninterface StudentsErrorBody {\n\treadonly error?: string\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction toStudentsErrorBody(data: unknown): StudentsErrorBody {\n\tif (!isObjectRecord(data)) {\n\t\treturn {}\n\t}\n\treturn typeof data.error === \"string\" ? { error: data.error } : {}\n}\n\nfunction parseStudentIdSuccessBody(data: unknown): StudentIdSuccessBody | undefined {\n\tif (!isObjectRecord(data)) {\n\t\treturn undefined\n\t}\n\tif (typeof data.student_id !== \"string\") {\n\t\treturn undefined\n\t}\n\treturn { student_id: data.student_id }\n}\n\nfunction isAbortError(err: Error): boolean {\n\treturn err.name === \"AbortError\" || err.name === \"TimeoutError\"\n}\n\nfunction httpSentinel(status: number): Error {\n\tif (status === 400) {\n\t\treturn ErrBadRequest\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidSecretKey\n\t}\n\tif (status === 409) {\n\t\treturn ErrConflict\n\t}\n\treturn ErrServerError\n}\n\nasync function readErrorBody(res: Response): Promise<StudentsErrorBody> {\n\tconst parsed = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail() {\n\t\t\treturn { ok: false } as const\n\t\t}\n\t)\n\tif (!parsed.ok) {\n\t\treturn {}\n\t}\n\treturn toStudentsErrorBody(parsed.data)\n}\n\nasync function sendCreateStudentRequest(config: StudentsConfig): Promise<Response> {\n\tconst logger = config.logger\n\tconst fetchFn = config.fetch ? config.fetch : globalThis.fetch\n\tconst signal = config.abort ? config.abort.signal : undefined\n\tconst url = `${config.origin}${STUDENTS_PATH}`\n\tconst fetchResult = await fetchFn(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${config.secretKey}`\n\t\t},\n\t\tsignal\n\t}).then(\n\t\tfunction ok(response: Response) {\n\t\t\treturn { ok: true, response } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!fetchResult.ok) {\n\t\tif (isAbortError(fetchResult.error)) {\n\t\t\tlogger.error(\"students timeout\", { path: STUDENTS_PATH })\n\t\t\tthrow errors.wrap(ErrTimeout, fetchResult.error.message)\n\t\t}\n\t\tlogger.error(\"students network error\", {\n\t\t\tpath: STUDENTS_PATH,\n\t\t\terror: fetchResult.error\n\t\t})\n\t\tthrow errors.wrap(ErrNetwork, fetchResult.error.message)\n\t}\n\n\treturn fetchResult.response\n}\n\nasync function parseStudentIdSuccess(config: StudentsConfig, res: Response): Promise<string> {\n\tconst logger = config.logger\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!jsonResult.ok) {\n\t\tlogger.error(\"student id response parse failed\", {\n\t\t\toperation: \"create student\",\n\t\t\terror: jsonResult.error\n\t\t})\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tconst body = parseStudentIdSuccessBody(jsonResult.data)\n\tif (!body) {\n\t\tlogger.error(\"student id response had invalid shape\", {\n\t\t\toperation: \"create student\",\n\t\t\tbody: jsonResult.data\n\t\t})\n\t\tthrow errors.wrap(ErrJsonParse, \"create student success body had invalid shape\")\n\t}\n\n\tlogger.debug(\"student id response success\", {\n\t\toperation: \"create student\",\n\t\tstudentId: body.student_id\n\t})\n\treturn body.student_id\n}\n\nasync function createStudent(config: StudentsConfig): Promise<string> {\n\tconst logger = config.logger\n\tlogger.debug(\"create student request\")\n\n\tconst res = await sendCreateStudentRequest(config)\n\tif (!res.ok) {\n\t\tconst body = await readErrorBody(res)\n\t\tconst sentinel = httpSentinel(res.status)\n\t\tconst detail = body.error ? `${res.status} ${body.error}` : `${res.status}`\n\t\tlogger.error(\"create student http error\", { status: res.status, body })\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\treturn parseStudentIdSuccess(config, res)\n}\n\nexport type { StudentsConfig }\nexport { createStudent }\n",
10
- "import type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\nimport {\n\ttype SessionToken,\n\ttype TimebackSession,\n\texchangeStudent,\n\texchangeTimebackStudent\n} from \"@superbuilders/primer-tives/server/exchange\"\n\nimport {\n\ttype PlacementHints,\n\ttype PlacementHintsResult,\n\tsetStudentHints\n} from \"@superbuilders/primer-tives/server/hints\"\nimport { createStudent } from \"@superbuilders/primer-tives/server/students\"\n\ninterface PrimerServerConfig {\n\treadonly origin: string\n\treadonly secretKey: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger: PrimerLogger\n}\n\ninterface PrimerServer {\n\t/**\n\t * Provisions a frontend-owned Primer student and returns the stable\n\t * student id you persist in your own DB keyed by your user. Pure\n\t * identity — the student has no hints and no placements yet. Call\n\t * `setStudentHints(studentId, { gradeLevel })` before the student's\n\t * first `/advance`. If a session calls `/advance` without hints set,\n\t * the server returns 412 `needs_hints` (surfaced as `ErrNeedsHints`\n\t * in the browser SDK).\n\t */\n\tcreateStudent(): Promise<string>\n\n\t/**\n\t * Partial update of a student's placement-routing hints. Pass only\n\t * the fields you want to set; omitted fields are left untouched.\n\t * Returns the persisted state after upsert. Today the only hint is\n\t * `gradeLevel`; future hint kinds (raw context, interests, etc.)\n\t * will appear as additional optional fields.\n\t */\n\tsetStudentHints(studentId: string, hints: PlacementHints): Promise<PlacementHintsResult>\n\n\t/**\n\t * Exchanges a frontend-owned native/manual student id for a short-lived\n\t * access token. Pass `accessToken` from the returned `SessionToken` to\n\t * `create()` on the browser SDK.\n\t */\n\texchangeStudentForAccessToken(studentId: string): Promise<SessionToken>\n\n\t/**\n\t * Verifies the learner against live Timeback authority, resolves or\n\t * provisions the corresponding frontend-owned Primer student, and\n\t * returns both the stable student id and a short-lived access token.\n\t */\n\texchangeTimebackStudentForAccessToken(sourcedId: string): Promise<TimebackSession>\n}\n\nfunction createPrimerServer(config: PrimerServerConfig): PrimerServer {\n\treturn {\n\t\tcreateStudent(): Promise<string> {\n\t\t\treturn createStudent(config)\n\t\t},\n\t\tsetStudentHints(studentId, hints): Promise<PlacementHintsResult> {\n\t\t\treturn setStudentHints(config, studentId, hints)\n\t\t},\n\t\texchangeStudentForAccessToken(studentId): Promise<SessionToken> {\n\t\t\treturn exchangeStudent(config, studentId)\n\t\t},\n\t\texchangeTimebackStudentForAccessToken(sourcedId): Promise<TimebackSession> {\n\t\t\treturn exchangeTimebackStudent(config, sourcedId)\n\t\t}\n\t}\n}\n\nexport type { PrimerServer, PrimerServerConfig }\nexport { createPrimerServer }\n"
5
+ "import * as errors from \"@superbuilders/errors\"\n\nconst ErrNetwork = errors.new(\"network\")\nconst ErrJsonParse = errors.new(\"json parse\")\nconst ErrUnsupportedPci = errors.new(\"unsupported pci\")\nconst ErrMissingRequiredPci = errors.new(\"missing required pci\")\nconst ErrInvalidAccessToken = errors.new(\"invalid access token\")\nconst ErrMalformedAccessToken = errors.new(\"malformed access token\")\nconst ErrTokenExpired = errors.new(\"access token expired\")\nconst ErrBadRequest = errors.new(\"bad request\")\nconst ErrServerError = errors.new(\"server error\")\nconst ErrTimeout = errors.new(\"timeout\")\nconst ErrForbidden = errors.new(\"forbidden\")\nconst ErrNotFound = errors.new(\"not found\")\nconst ErrConflict = errors.new(\"conflict\")\nconst ErrRateLimited = errors.new(\"rate limited\")\nconst ErrServiceUnavailable = errors.new(\"service unavailable\")\nconst ErrNotSerializable = errors.new(\n\t\"PrimerState is live in-memory state and must not be serialized or stored\"\n)\nconst ErrInvalidSubmission = errors.new(\"invalid submission\")\n\nconst ErrInvalidSecretKey = errors.new(\"invalid secret key\")\nconst ErrSdkUpgradeRequired = errors.new(\"sdk upgrade required\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrMissingRequiredPci,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrSdkUpgradeRequired,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedPci\n}\n",
6
+ "import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrInvalidSecretKey,\n\tErrJsonParse,\n\tErrNetwork,\n\tErrServerError,\n\tErrTimeout\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\n\nconst TOKEN_PATH = \"/api/v0/sessions\"\n\ninterface TokenConfig {\n\treadonly origin: string\n\treadonly secretKey: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger: PrimerLogger\n}\n\ntype GetTokenInput = {\n\treadonly verifiedEmail: string\n}\n\ninterface TokenSuccessBody {\n\taccess_token: string\n\ttoken_type: \"Bearer\"\n}\n\ninterface TokenErrorBody {\n\treadonly error?: string\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction toTokenErrorBody(data: unknown): TokenErrorBody {\n\tif (!isObjectRecord(data)) {\n\t\treturn {}\n\t}\n\treturn typeof data.error === \"string\" ? { error: data.error } : {}\n}\n\nfunction parseTokenSuccessBody(data: unknown): TokenSuccessBody | undefined {\n\tif (!isObjectRecord(data)) {\n\t\treturn undefined\n\t}\n\tif (typeof data.access_token !== \"string\" || data.token_type !== \"Bearer\") {\n\t\treturn undefined\n\t}\n\treturn {\n\t\taccess_token: data.access_token,\n\t\ttoken_type: \"Bearer\"\n\t}\n}\n\nfunction isAbortError(err: Error): boolean {\n\treturn err.name === \"AbortError\" || err.name === \"TimeoutError\"\n}\n\nfunction httpSentinel(status: number): Error {\n\tif (status === 400) {\n\t\treturn ErrBadRequest\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidSecretKey\n\t}\n\treturn ErrServerError\n}\n\nasync function readErrorBody(res: Response): Promise<TokenErrorBody> {\n\tconst parsed = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail() {\n\t\t\treturn { ok: false } as const\n\t\t}\n\t)\n\tif (!parsed.ok) {\n\t\treturn {}\n\t}\n\treturn toTokenErrorBody(parsed.data)\n}\n\nasync function sendTokenRequest(config: TokenConfig, input: GetTokenInput): Promise<Response> {\n\tconst logger = config.logger\n\tconst fetchFn = config.fetch ? config.fetch : globalThis.fetch\n\tconst signal = config.abort ? config.abort.signal : undefined\n\tconst url = `${config.origin}${TOKEN_PATH}`\n\n\tconst fetchResult = await fetchFn(url, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${config.secretKey}`\n\t\t},\n\t\tbody: JSON.stringify({ verified_email: input.verifiedEmail }),\n\t\tsignal\n\t}).then(\n\t\tfunction ok(response: Response) {\n\t\t\treturn { ok: true, response } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\n\tif (!fetchResult.ok) {\n\t\tif (isAbortError(fetchResult.error)) {\n\t\t\tlogger.error(\"token request timeout\")\n\t\t\tthrow errors.wrap(ErrTimeout, fetchResult.error.message)\n\t\t}\n\t\tlogger.error(\"token request network error\", { error: fetchResult.error })\n\t\tthrow errors.wrap(ErrNetwork, fetchResult.error.message)\n\t}\n\n\treturn fetchResult.response\n}\n\nasync function parseToken(config: TokenConfig, res: Response): Promise<string> {\n\tconst logger = config.logger\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: unknown) {\n\t\t\treturn { ok: true, data } as const\n\t\t},\n\t\tfunction fail(err: Error) {\n\t\t\treturn { ok: false, error: err } as const\n\t\t}\n\t)\n\tif (!jsonResult.ok) {\n\t\tlogger.error(\"token response json parse failed\", { error: jsonResult.error })\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tconst body = parseTokenSuccessBody(jsonResult.data)\n\tif (body === undefined) {\n\t\tlogger.error(\"token response had invalid shape\", { body: jsonResult.data })\n\t\tthrow errors.wrap(ErrJsonParse, \"token response had invalid shape\")\n\t}\n\n\tlogger.debug(\"token request success\")\n\treturn body.access_token\n}\n\nasync function getToken(config: TokenConfig, input: GetTokenInput): Promise<string> {\n\tconst logger = config.logger\n\tlogger.debug(\"token request\")\n\n\tconst res = await sendTokenRequest(config, input)\n\tif (!res.ok) {\n\t\tconst body = await readErrorBody(res)\n\t\tconst sentinel = httpSentinel(res.status)\n\t\tconst detail = body.error ? `${res.status} ${body.error}` : `${res.status}`\n\t\tlogger.error(\"token request http error\", { status: res.status, body })\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\treturn parseToken(config, res)\n}\n\nexport type { GetTokenInput, TokenConfig }\nexport { getToken }\n",
7
+ "import type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\nimport { type GetTokenInput, getToken } from \"@superbuilders/primer-tives/server/exchange\"\n\ninterface PrimerServerConfig {\n\treadonly origin: string\n\treadonly secretKey: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger: PrimerLogger\n}\n\ninterface PrimerServer {\n\tgetToken(input: GetTokenInput): Promise<string>\n}\n\nfunction createPrimerServer(config: PrimerServerConfig): PrimerServer {\n\treturn {\n\t\tgetToken(input): Promise<string> {\n\t\t\treturn getToken(config, input)\n\t\t}\n\t}\n}\n\nexport type { GetTokenInput, PrimerServer, PrimerServerConfig }\nexport { createPrimerServer }\n"
11
8
  ],
12
- "mappings": "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",
13
- "debugId": "ED126AFAB7F1033A64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "3E72DF6B026E0F7B64756E2164756E21",
14
11
  "names": []
15
12
  }
@@ -0,0 +1,13 @@
1
+ import type { PciId } from "./contracts/pci";
2
+ import { type Subject, type SubjectScope } from "./subject";
3
+ declare const REQUIRED_PCIS_BY_SUBJECT: {
4
+ readonly math: readonly ["urn:primer:pci:fraction-input"];
5
+ readonly vocabulary: readonly [];
6
+ readonly science: readonly [];
7
+ };
8
+ type RequiredPciForSubject<S extends SubjectScope> = S extends "all" ? (typeof REQUIRED_PCIS_BY_SUBJECT)[Subject][number] : S extends Subject ? (typeof REQUIRED_PCIS_BY_SUBJECT)[S][number] : never;
9
+ declare function requiredPcisForSubject(subject: SubjectScope): readonly PciId[];
10
+ declare function missingPcisForSubject(subject: SubjectScope, provided: readonly string[] | undefined): PciId[];
11
+ export { REQUIRED_PCIS_BY_SUBJECT, missingPcisForSubject, requiredPcisForSubject };
12
+ export type { RequiredPciForSubject };
13
+ //# sourceMappingURL=subject-pcis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subject-pcis.d.ts","sourceRoot":"","sources":["../src/subject-pcis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2CAA2C,CAAA;AACtE,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAE/F,QAAA,MAAM,wBAAwB;;;;CAIwB,CAAA;AAEtD,KAAK,qBAAqB,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,SAAS,KAAK,GACjE,CAAC,OAAO,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAClD,CAAC,SAAS,OAAO,GAChB,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAC5C,KAAK,CAAA;AAET,iBAAS,sBAAsB,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,KAAK,EAAE,CAavE;AAED,iBAAS,qBAAqB,CAC7B,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACrC,KAAK,EAAE,CAST;AAED,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAA;AAClF,YAAY,EAAE,qBAAqB,EAAE,CAAA"}
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- declare const SDK_VERSION = "2.0.0";
1
+ declare const SDK_VERSION = "2.2.0";
2
2
  declare const NPM_PACKAGE_URL = "https://www.npmjs.com/package/@superbuilders/primer-tives";
3
3
  export { NPM_PACKAGE_URL, SDK_VERSION };
4
4
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superbuilders/primer-tives",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./client": {
@@ -30,6 +30,10 @@
30
30
  "./subject": {
31
31
  "types": "./dist/subject.d.ts",
32
32
  "import": "./dist/subject.js"
33
+ },
34
+ "./subject-pcis": {
35
+ "types": "./dist/subject-pcis.d.ts",
36
+ "import": "./dist/subject-pcis.js"
33
37
  }
34
38
  },
35
39
  "files": [
@@ -1,25 +0,0 @@
1
- import { type GradeLevel } from "../grade-level";
2
- import type { PrimerLogger } from "../logger";
3
- interface HintsConfig {
4
- readonly origin: string;
5
- readonly secretKey: string;
6
- readonly fetch?: typeof globalThis.fetch;
7
- readonly abort?: AbortController;
8
- readonly logger: PrimerLogger;
9
- }
10
- /**
11
- * Partial update of a student's placement hints. Pass only the fields
12
- * you want to set; omitted fields are left untouched. The server
13
- * returns the persisted state after upsert.
14
- */
15
- interface PlacementHints {
16
- readonly gradeLevel?: GradeLevel;
17
- }
18
- interface PlacementHintsResult {
19
- readonly studentId: string;
20
- readonly gradeLevel: GradeLevel | null;
21
- }
22
- declare function setStudentHints(config: HintsConfig, studentId: string, hints: PlacementHints): Promise<PlacementHintsResult>;
23
- export type { HintsConfig, PlacementHints, PlacementHintsResult };
24
- export { setStudentHints };
25
- //# sourceMappingURL=hints.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hints.d.ts","sourceRoot":"","sources":["../../src/server/hints.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAItE,UAAU,WAAW;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B;AAED;;;;GAIG;AACH,UAAU,cAAc;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAChC;AAED,UAAU,oBAAoB;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;CACtC;AAwKD,iBAAe,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAkB/B;AAED,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -1,12 +0,0 @@
1
- import type { PrimerLogger } from "../logger";
2
- interface StudentsConfig {
3
- readonly origin: string;
4
- readonly secretKey: string;
5
- readonly fetch?: typeof globalThis.fetch;
6
- readonly abort?: AbortController;
7
- readonly logger: PrimerLogger;
8
- }
9
- declare function createStudent(config: StudentsConfig): Promise<string>;
10
- export type { StudentsConfig };
11
- export { createStudent };
12
- //# sourceMappingURL=students.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"students.d.ts","sourceRoot":"","sources":["../../src/server/students.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAItE,UAAU,cAAc;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B;AAqID,iBAAe,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAcpE;AAED,YAAY,EAAE,cAAc,EAAE,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,CAAA"}