@superbuilders/primer-tives 0.9.0 → 1.0.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.
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/server/exchange.ts", "../src/errors.ts", "../src/server/students.ts", "../src/server/create-server.ts", "../src/grade-level.ts"],
3
+ "sources": ["../src/server/exchange.ts", "../src/errors.ts", "../src/server/hints.ts", "../src/grade-level.ts", "../src/server/students.ts", "../src/server/create-server.ts"],
4
4
  "sourcesContent": [
5
- "import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\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 EXCHANGE_PATH = \"/api/v0/auth/exchange\"\n\ntype Provider = \"native\" | \"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 ExchangeSuccessBody {\n\taccess_token: string\n\ttoken_type: \"Bearer\"\n\texpires_in: number\n\tscope: string\n}\n\ninterface ExchangeErrorBody {\n\terror?: string\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\treturn true\n\t}\n\tif (err instanceof DOMException && err.name === \"TimeoutError\") {\n\t\treturn true\n\t}\n\treturn false\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 === 502) {\n\t\treturn ErrTimebackUnavailable\n\t}\n\tif (status >= 500 && status < 600) {\n\t\treturn ErrServerError\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: ExchangeErrorBody) {\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 parsed.data\n}\n\nasync function exchangeToken(\n\tconfig: ExchangeConfig,\n\tprovider: Provider,\n\tstudentId: string\n): Promise<SessionToken> {\n\tconst log = config.logger\n\tconst fetchFn = config.fetch ? config.fetch : globalThis.fetch\n\tconst signal = config.abort ? config.abort.signal : undefined\n\n\tlog?.debug(\"exchange request\", { provider })\n\n\tconst url = `${config.origin}${EXCHANGE_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({ provider, student_id: studentId }),\n\t\tsignal\n\t}).then(\n\t\tfunction ok(r: Response) {\n\t\t\treturn { ok: true, response: r } 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\tlog?.error(\"exchange timeout\", { provider })\n\t\t\t// biome-ignore lint/plugin: server SDK — log is optional config.logger, not slog\n\t\t\tthrow errors.wrap(ErrTimeout, fetchResult.error.message)\n\t\t}\n\t\tlog?.error(\"exchange network error\", { provider, error: fetchResult.error })\n\t\t// biome-ignore lint/plugin: server SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(ErrNetwork, fetchResult.error.message)\n\t}\n\n\tconst res = fetchResult.response\n\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\tlog?.error(\"exchange http error\", { provider, status: res.status, body })\n\t\t// biome-ignore lint/plugin: server SDK log is optional config.logger, not slog\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: ExchangeSuccessBody) {\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\tlog?.error(\"exchange json parse failed\", { provider, error: jsonResult.error })\n\t\t// biome-ignore lint/plugin: server SDK log is optional config.logger, not slog\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tlog?.debug(\"exchange success\", { provider, expiresIn: jsonResult.data.expires_in })\n\n\treturn {\n\t\taccessToken: jsonResult.data.access_token,\n\t\texpiresInSeconds: jsonResult.data.expires_in\n\t}\n}\n\nexport type { ExchangeConfig, SessionToken }\nexport { exchangeToken }\n",
6
- "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 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\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrStudentNotFound,\n\tErrTimebackUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedGrade,\n\tErrUnsupportedPci\n}\n",
7
- "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 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 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 CreateStudentSuccessBody {\n\tstudent_id: string\n}\n\ninterface StudentsErrorBody {\n\terror?: string\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\treturn true\n\t}\n\tif (err instanceof DOMException && err.name === \"TimeoutError\") {\n\t\treturn true\n\t}\n\treturn false\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<StudentsErrorBody> {\n\tconst parsed = await res.json().then(\n\t\tfunction ok(data: StudentsErrorBody) {\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 parsed.data\n}\n\nasync function sendStudentsRequest(\n\tconfig: StudentsConfig,\n\tpath: string,\n\tmethod: \"POST\" | \"PATCH\",\n\tbody: Record<string, unknown>\n): Promise<Response> {\n\tconst log = 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,\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(r: Response) {\n\t\t\treturn { ok: true, response: r } 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\tlog?.error(\"students timeout\", { path, method })\n\t\t\t// biome-ignore lint/plugin: server SDK — log is optional config.logger, not slog\n\t\t\tthrow errors.wrap(ErrTimeout, fetchResult.error.message)\n\t\t}\n\t\tlog?.error(\"students network error\", { path, method, error: fetchResult.error })\n\t\t// biome-ignore lint/plugin: server SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(ErrNetwork, fetchResult.error.message)\n\t}\n\n\treturn fetchResult.response\n}\n\nasync function createStudent(config: StudentsConfig, gradeLevel: GradeLevel): Promise<string> {\n\tconst log = config.logger\n\tlog?.debug(\"create student request\", { gradeLevel })\n\n\tconst res = await sendStudentsRequest(config, STUDENTS_PATH, \"POST\", {\n\t\tgrade_level: gradeLevel\n\t})\n\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\tlog?.error(\"create student http error\", { status: res.status, body })\n\t\t// biome-ignore lint/plugin: server SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\tconst jsonResult = await res.json().then(\n\t\tfunction ok(data: CreateStudentSuccessBody) {\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\tlog?.error(\"create student json parse failed\", { error: jsonResult.error })\n\t\t// biome-ignore lint/plugin: server SDK log is optional config.logger, not slog\n\t\tthrow errors.wrap(ErrJsonParse, jsonResult.error.message)\n\t}\n\n\tlog?.debug(\"create student success\", { studentId: jsonResult.data.student_id })\n\treturn jsonResult.data.student_id\n}\n\nasync function updateStudentGradeLevel(\n\tconfig: StudentsConfig,\n\tstudentId: string,\n\tgradeLevel: GradeLevel\n): Promise<void> {\n\tconst log = config.logger\n\tlog?.debug(\"update student grade request\", { studentId, gradeLevel })\n\n\tconst res = await sendStudentsRequest(\n\t\tconfig,\n\t\t`${STUDENTS_PATH}/${encodeURIComponent(studentId)}`,\n\t\t\"PATCH\",\n\t\t{ gradeLevel }\n\t)\n\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\tlog?.error(\"update student http error\", { status: res.status, body })\n\t\t// biome-ignore lint/plugin: server SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(sentinel, detail)\n\t}\n\n\tlog?.debug(\"update student success\", { studentId })\n}\n\nexport type { StudentsConfig }\nexport { createStudent, updateStudentGradeLevel }\n",
8
- "import type { GradeLevel } from \"@superbuilders/primer-tives/grade-level\"\nimport type { PrimerLogger } from \"@superbuilders/primer-tives/logger\"\nimport { type SessionToken, exchangeToken } from \"@superbuilders/primer-tives/server/exchange\"\nimport { createStudent, updateStudentGradeLevel } 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 * Native only: provision a new Primer-owned student. Returns a stable\n\t * studentId string you persist in your own DB keyed by your user. Pair\n\t * this value with `exchangeNativeStudentForAccessToken` on every\n\t * session start. Timeback integrations do NOT call this — they\n\t * provision automatically on exchange.\n\t */\n\tcreateNativeStudent(gradeLevel: GradeLevel): Promise<string>\n\n\t/**\n\t * Native only: update an existing Primer student's grade level. For\n\t * Timeback, grade changes flow from the SIS — do not call this.\n\t */\n\tupdateNativeStudentGradeLevel(studentId: string, gradeLevel: GradeLevel): Promise<void>\n\n\t/**\n\t * Native only: exchange a Primer-minted studentId 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\texchangeNativeStudentForAccessToken(studentId: string): Promise<SessionToken>\n\n\t/**\n\t * Timeback only: exchange a OneRoster sourcedId for a short-lived\n\t * access token. The underlying Primer student is auto-provisioned on\n\t * first exchange. Pass `accessToken` from the returned `SessionToken`\n\t * to `create()` on the browser SDK.\n\t */\n\texchangeTimebackStudentForAccessToken(sourcedId: string): Promise<SessionToken>\n}\n\nfunction createPrimerServer(config: PrimerServerConfig): PrimerServer {\n\treturn {\n\t\tcreateNativeStudent(gradeLevel): Promise<string> {\n\t\t\treturn createStudent(config, gradeLevel)\n\t\t},\n\t\tupdateNativeStudentGradeLevel(studentId, gradeLevel): Promise<void> {\n\t\t\treturn updateStudentGradeLevel(config, studentId, gradeLevel)\n\t\t},\n\t\texchangeNativeStudentForAccessToken(studentId): Promise<SessionToken> {\n\t\t\treturn exchangeToken(config, \"native\", studentId)\n\t\t},\n\t\texchangeTimebackStudentForAccessToken(sourcedId): Promise<SessionToken> {\n\t\t\treturn exchangeToken(config, \"timeback\", sourcedId)\n\t\t}\n\t}\n}\n\nexport type { PrimerServer, PrimerServerConfig }\nexport { createPrimerServer }\n",
9
- "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"
5
+ "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",
6
+ "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\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrExternalAuthorityRequired,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrStudentNotFound,\n\tErrTimebackUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedGrade,\n\tErrUnsupportedPci\n}\n",
7
+ "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",
8
+ "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",
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\"\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. Native\n\t * students are created hint-less; call `setStudentHints` at least\n\t * once (with a `gradeLevel`) before the student's first session, or\n\t * the first `/advance` call will 500.\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"
10
11
  ],
11
- "mappings": "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",
12
- "debugId": "3128BCEC46D85F5764756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "7C586B84376F4E7C64756E2164756E21",
13
14
  "names": []
14
15
  }
@@ -1,14 +1,12 @@
1
- import type { GradeLevel } from "../grade-level";
2
1
  import type { PrimerLogger } from "../logger";
3
2
  interface StudentsConfig {
4
3
  readonly origin: string;
5
4
  readonly secretKey: string;
6
5
  readonly fetch?: typeof globalThis.fetch;
7
6
  readonly abort?: AbortController;
8
- readonly logger?: PrimerLogger;
7
+ readonly logger: PrimerLogger;
9
8
  }
10
- declare function createStudent(config: StudentsConfig, gradeLevel: GradeLevel): Promise<string>;
11
- declare function updateStudentGradeLevel(config: StudentsConfig, studentId: string, gradeLevel: GradeLevel): Promise<void>;
9
+ declare function createStudent(config: StudentsConfig): Promise<string>;
12
10
  export type { StudentsConfig };
13
- export { createStudent, updateStudentGradeLevel };
11
+ export { createStudent };
14
12
  //# sourceMappingURL=students.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"students.d.ts","sourceRoot":"","sources":["../../src/server/students.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACzE,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,CAAC,EAAE,YAAY,CAAA;CAC9B;AA0FD,iBAAe,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAkC5F;AAED,iBAAe,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,GACpB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,YAAY,EAAE,cAAc,EAAE,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,CAAA"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superbuilders/primer-tives",
3
- "version": "0.9.0",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./client": {