@timeback/sdk 0.1.10 → 0.1.11

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 (51) hide show
  1. package/README.md +10 -8
  2. package/dist/chunk-1cqa51je.js +2 -0
  3. package/dist/chunk-3ew9vn2d.js +2 -0
  4. package/dist/chunk-6b0ppq9d.js +2 -0
  5. package/dist/{chunk-3mqpr9vx.js → chunk-bavxzt1k.js} +2 -2
  6. package/dist/chunk-c8pw96sp.js +10 -0
  7. package/dist/chunk-edk3nfj7.js +2 -0
  8. package/dist/chunk-g67efaph.js +4 -0
  9. package/dist/chunk-pd91g539.js +1 -0
  10. package/dist/client/namespaces/activity.d.ts +6 -3
  11. package/dist/client/namespaces/activity.d.ts.map +1 -1
  12. package/dist/identity.d.ts +2 -5
  13. package/dist/identity.d.ts.map +1 -1
  14. package/dist/identity.js +1 -1
  15. package/dist/index.d.ts +6 -2
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +16 -7
  18. package/dist/server/adapters/express.js +1 -1
  19. package/dist/server/adapters/native.js +2 -2
  20. package/dist/server/adapters/nextjs.js +1 -1
  21. package/dist/server/adapters/nuxt.js +1 -1
  22. package/dist/server/adapters/solid-start.js +1 -1
  23. package/dist/server/adapters/svelte-kit.js +1 -1
  24. package/dist/server/adapters/tanstack-start.js +1 -1
  25. package/dist/server/adapters/types.d.ts +16 -4
  26. package/dist/server/adapters/types.d.ts.map +1 -1
  27. package/dist/server/handlers/activity/attempts.d.ts +1 -1
  28. package/dist/server/handlers/activity/attempts.d.ts.map +1 -1
  29. package/dist/server/handlers/activity/caliper.d.ts +4 -2
  30. package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
  31. package/dist/server/lib/utils.d.ts +4 -1
  32. package/dist/server/lib/utils.d.ts.map +1 -1
  33. package/dist/server/timeback-identity.d.ts +3 -3
  34. package/dist/server/timeback.d.ts +4 -2
  35. package/dist/server/timeback.d.ts.map +1 -1
  36. package/dist/server/types.d.ts +18 -7
  37. package/dist/server/types.d.ts.map +1 -1
  38. package/dist/shared/types.d.ts +24 -8
  39. package/dist/shared/types.d.ts.map +1 -1
  40. package/dist/shared/types.ts +24 -8
  41. package/package.json +7 -10
  42. package/dist/chunk-af3xwwsv.js +0 -16
  43. package/dist/chunk-b8649tw4.js +0 -2
  44. package/dist/chunk-bd09q1fw.js +0 -8
  45. package/dist/chunk-js665z11.js +0 -1
  46. package/dist/chunk-nsr7a2dv.js +0 -2
  47. package/dist/chunk-txwjkpfz.js +0 -1
  48. package/dist/chunk-whc53e0y.js +0 -11
  49. package/dist/edge.d.ts +0 -13
  50. package/dist/edge.d.ts.map +0 -1
  51. package/dist/edge.js +0 -1
package/README.md CHANGED
@@ -400,9 +400,10 @@ function MyComponent() {
400
400
  #### Profile Primitive
401
401
 
402
402
  ```tsx
403
- import { createTimebackProfile } from '@timeback/sdk/solid'
404
403
  import { Show } from 'solid-js'
405
404
 
405
+ import { createTimebackProfile } from '@timeback/sdk/solid'
406
+
406
407
  function ProfileButton() {
407
408
  const { state, canFetch, fetchProfile } = createTimebackProfile()
408
409
 
@@ -516,18 +517,19 @@ If you only need Timeback SSO authentication without activity tracking or Timeba
516
517
 
517
518
  **Note:** Unlike `createTimeback()`, the identity-only callback returns raw OIDC user info (`sub`, `email`, `name`, etc.) without resolving a Timeback user. Use `createTimeback()` if you need the canonical `timebackId`.
518
519
 
519
- ### Cloudflare Workers / workerd compatibility
520
+ ### Edge Runtime Compatibility
520
521
 
521
- `createTimebackIdentity()` is runtime-agnostic, but the main `timeback` entrypoint also includes
522
- Node-oriented functionality (notably config loading via `c12`). Some edge runtimes
523
- (Cloudflare Workers / workerd) do not support the Node modules that `c12` depends on.
524
-
525
- If you're deploying identity-only SSO on Workers/workerd, import from the worker-safe entrypoint:
522
+ The main `@timeback/sdk` entrypoint is edge-compatible and works in Cloudflare Workers,
523
+ Vercel Edge, Bun, Deno, and Node.js. No separate entrypoint is needed:
526
524
 
527
525
  ```ts
528
- import { createTimebackIdentity, toNativeHandler } from '@timeback/sdk/edge'
526
+ import { createTimebackIdentity, toNativeHandler } from '@timeback/sdk'
529
527
  ```
530
528
 
529
+ > **Note:** `createTimeback()` (the full SDK) uses `c12` for config file loading, which is lazily
530
+ > imported at runtime. On edge runtimes where `c12` isn't available, `createTimeback()` will fail
531
+ > at call time — use `createTimebackIdentity()` for edge deployments.
532
+
531
533
  ### Server Setup
532
534
 
533
535
  ```typescript
@@ -0,0 +1,2 @@
1
+ import{o as W,p as $,q as w,r as x,s as z,t as A,u as D,v as F,w as M,x as P}from"./chunk-6b0ppq9d.js";import{G as T,H as Y,J as X}from"./chunk-3ew9vn2d.js";async function j(H,G,O){return await F({req:H,env:G,clientId:O.clientId,issuer:O.issuer,redirectUri:O.redirectUri,buildState:O.buildState})}async function U(H,G,O,K,V,B){try{let J=B.issuer??$(V),N=P(G,B.redirectUri);W.debug("Exchanging auth code for tokens (identity-only)",{issuer:J,clientId:B.clientId});let _=await w({issuer:J,clientId:B.clientId,clientSecret:B.clientSecret,code:H,redirectUri:N}),Q=await x({issuer:J,accessToken:_.access_token}),E=typeof Q.identities==="string"?JSON.parse(Q.identities):Q.identities;W.debug("SSO completed (identity-only)",{user:{...Q,identities:E}});let S={tokens:_,user:Q,state:O,req:K,redirect:X,json:Y};return B.onCallbackSuccess(S)}catch(J){let N=J instanceof Error?J:Error("Unknown error");if(W.error("Token exchange failed (identity-only)",{error:N.message}),B.onCallbackError)return B.onCallbackError(z(N,void 0,O,K));return Y({error:N.message},500)}}async function L(H,G,O){let{url:K,code:V,errorParam:B,state:J}=M(H);if(B)return A(B,K,J,H,O.onCallbackError);if(!V)return D(J,H,O.onCallbackError);return await U(V,K,J,H,G,O)}function Z(H){let{env:G,identity:O}=H;if(O.mode!=="sso")throw Error('Identity-only mode requires identity.mode === "sso"');return{signIn:(K)=>j(K,G,O),callback:(K)=>L(K,G,O),signOut:()=>X("/")}}function u(H){let G=Z({env:T(H.env),identity:H.identity});return{config:H,handle:{identity:G}}}
2
+ export{u as d};
@@ -0,0 +1,2 @@
1
+ function F(q){return{course:q,component:`${q}-component`,resource:`${q}-resource`,componentResource:`${q}-cr`}}async function G(q){let w=new TextEncoder().encode(q),z=await crypto.subtle.digest("SHA-256",w);return Array.from(new Uint8Array(z)).map((A)=>A.toString(16).padStart(2,"0")).join("")}function J(q){if(q==="local"||q==="staging")return"staging";return"production"}function K(q){if(q==="production"||q==="local"||q==="staging")return q;return"staging"}function C(q,w=200,z){let A=new Headers(z);return A.set("Content-Type","application/json"),new Response(JSON.stringify(q),{status:w,headers:A})}function L(q,w,z,A){let B={code:q,message:w};if(A?.details!==void 0)B.details=A.details;return C({...A?.fields,error:B},z)}function M(q,w){let z=new Headers(w);return z.set("Location",q),new Response(null,{status:302,headers:z})}function N(q){let w=JSON.stringify(q);return btoa(w).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function O(q){let w=q.replace(/-/g,"+").replace(/_/g,"/"),z=atob(w);return JSON.parse(z)}var Q={ACTIVITY:"/activity",ACTIVITY_HEARTBEAT:"/activity/heartbeat",ACTIVITY_SUBMIT:"/activity/submit",IDENTITY:{SIGNIN:"/identity/signin",SIGNOUT:"/identity/signout",CALLBACK:"/identity/callback"},USER:{ME:"/user/me",VERIFY:"/user/verify"}};
2
+ export{F as D,G as E,J as F,K as G,C as H,L as I,M as J,N as K,O as L,Q as M};
@@ -0,0 +1,2 @@
1
+ import{H as w,J as S,K as u,L as i,M as B}from"./chunk-3ew9vn2d.js";import{N as x,P as f}from"./chunk-edk3nfj7.js";var X=null,I=!1,T=!1;function E(K){let Z=K.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${Z}$`)}function n(){if(X!==null)return;if(X=[],typeof process>"u"||!process.env?.DEBUG){T=!1;return}T=!0;let K=process.env.DEBUG.trim();if(K==="1"||K==="true"||K==="*"){I=!0;return}let Q=K.split(",").map(($)=>$.trim()).filter(Boolean);for(let $ of Q)if($.startsWith("-"))X.push({regex:E($.slice(1)),exclude:!0});else X.push({regex:E($),exclude:!1});if(!X.some(($)=>!$.exclude)&&X.length>0)I=!0}function h(K){if(n(),!T)return!0;if(I){if(K){for(let Q of X)if(Q.exclude&&Q.regex.test(K))return!1}return!0}if(!K)return!1;for(let Q of X)if(Q.exclude&&Q.regex.test(K))return!1;for(let Q of X)if(!Q.exclude&&Q.regex.test(K))return!0;return!1}function k(){return typeof globalThis<"u"&&"window"in globalThis}function _(){if(k())return"browser";if(typeof process<"u"&&process.env){if(process.env.CI||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.JENKINS_URL||process.env.BUILDKITE)return"ci"}return"terminal"}var D;if(!k())try{D=(await import("./chunk-c8pw96sp.js")).inspect}catch{}var Y={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",yellow:"\x1B[33m",blue:"\x1B[34m",cyan:"\x1B[36m"};function a(K){switch(K){case"debug":return Y.blue;case"info":return Y.cyan;case"warn":return Y.yellow;case"error":return Y.red}}function s(K){switch(K){case"debug":return console.debug;case"info":return console.info;case"warn":return console.warn;case"error":return console.error}}function o(K){if(D)return D(K,{depth:null,colors:!0,breakLength:80,compact:!1});return JSON.stringify(K,null,2)}var A=(K)=>{let Q=a(K.level),Z=s(K.level),$=K.level.toUpperCase().padEnd(5),z=K.timestamp.toISOString().replace(/\.\d{3}Z$/,""),W=`${Y.dim}[${z}]${Y.reset}`,F=`${Q}${$}${Y.reset}`,H=K.scope?`${Y.bold}[${K.scope}]${Y.reset} `:"",j=`${W} ${F} ${H}${K.message}`;if(K.context&&Object.keys(K.context).length>0)Z(j,o(K.context));else Z(j)};var t={debug:"[DEBUG]",info:"[INFO]",warn:"[WARN]",error:"[ERROR]"};function r(K){return Object.entries(K).map(([Q,Z])=>`${Q}=${e(Z)}`).join(" ")}function e(K){if(typeof K==="string")return K;if(typeof K==="number")return String(K);if(typeof K==="boolean")return String(K);if(K===null)return"null";if(K===void 0)return"undefined";return JSON.stringify(K)}var M=(K)=>{let Q=[];if(Q.push(K.timestamp.toISOString()),Q.push(t[K.level]),K.scope)Q.push(`[${K.scope}]`);if(Q.push(K.message),K.context&&Object.keys(K.context).length>0)Q.push(r(K.context));console.log(Q.join(" "))};var V=(K)=>{let Q={timestamp:K.timestamp.toISOString(),level:K.level,...K.scope&&{scope:K.scope},msg:K.message};if(K.context&&Object.keys(K.context).length>0)Object.assign(Q,K.context);console.log(JSON.stringify(Q))};var KK={debug:"color: gray",info:"color: #0ea5e9",warn:"color: #f59e0b",error:"color: #ef4444; font-weight: bold"},QK={debug:"log",info:"info",warn:"warn",error:"error"},q=(K)=>{let Q=QK[K.level],Z=KK[K.level],z=`%c${K.scope?`[${K.scope}]`:""} ${K.message}`;if(K.context&&Object.keys(K.context).length>0)console[Q](z,Z,K.context);else console[Q](z,Z)};var b=["debug","info","warn","error"];function ZK(K){switch(K){case"terminal":return A;case"ci":return M;case"production":return V;case"browser":return q;case"test":return()=>{}}}function $K(){if(typeof process<"u"&&process.env?.DEBUG)return"debug";return"info"}function zK(K,Q){return b.indexOf(K)>=b.indexOf(Q)}class G{scope;minLevel;environment;formatter;defaultContext;constructor(K={}){this.scope=K.scope,this.minLevel=K.minLevel??$K(),this.defaultContext=K.defaultContext??{},this.environment=K.environment??_(),this.formatter=ZK(this.environment)}child(K){let Q=this.scope?`${this.scope}:${K}`:K;return new G({scope:Q,minLevel:this.minLevel,environment:this.environment,defaultContext:{...this.defaultContext}})}withContext(K){return new G({scope:this.scope,minLevel:this.minLevel,environment:this.environment,defaultContext:{...this.defaultContext,...K}})}debug(K,Q){this.log("debug",K,Q)}info(K,Q){this.log("info",K,Q)}warn(K,Q){this.log("warn",K,Q)}error(K,Q){this.log("error",K,Q)}log(K,Q,Z){if(K==="debug"&&!h(this.scope))return;if(!zK(K,this.minLevel))return;let $={level:K,message:Q,scope:this.scope,context:Z||Object.keys(this.defaultContext).length>0?{...this.defaultContext,...Z}:void 0,timestamp:new Date};this.formatter($)}}function P(K={}){return new G(K)}var R,L,WK={debug(){},info(){},warn(){},error(){}};function XK(){try{let K=typeof process>"u"?void 0:process.env.DEBUG;return K==="1"||K==="true"}catch{return!1}}var U=new Map;function YK(K,Q){let Z=`[${Q}]`;return{debug:(...$)=>K.debug(`${Z} ${$[0]}`,...$.slice(1)),info:(...$)=>K.info(`${Z} ${$[0]}`,...$.slice(1)),warn:(...$)=>K.warn(`${Z} ${$[0]}`,...$.slice(1)),error:(...$)=>K.error(`${Z} ${$[0]}`,...$.slice(1))}}function O(K){let Q=U.get(K);if(Q)return Q;if(R)Q=YK(R,K);else{let Z=L??(XK()?"debug":"warn");if(Z==="silent")Q=WK;else Q=P({scope:K,minLevel:Z})}return U.set(K,Q),Q}function hK(K){R=K.logger,L=K.logLevel,U.clear()}function v(K){let Q=`timeback:${K}`;return{debug(Z,...$){O(Q).debug(Z,...$)},info(Z,...$){O(Q).info(Z,...$)},warn(Z,...$){O(Q).warn(Z,...$)},error(Z,...$){O(Q).error(Z,...$)}}}var J=v("sso"),N=v("oidc");var m=new Map;async function C(K){let Q=m.get(K);if(Q)return Q;let Z=`${K}/.well-known/openid-configuration`,$=await fetch(Z);if(!$.ok)throw N.error("Discovery fetch failed",{status:$.status}),Error(`Failed to fetch OIDC discovery: ${$.statusText}`);let z=await $.json();return N.debug("Fetched OIDC discovery document",{authEndpoint:z.authorization_endpoint,tokenEndpoint:z.token_endpoint}),m.set(K,z),z}function y(K){switch(K){case"production":return"https://cognito-idp.us-east-1.amazonaws.com/us-east-1_3uhuoRM3R";case"staging":return"https://cognito-idp.us-east-1.amazonaws.com/us-east-1_5EUwTP9XD";case"local":throw Error("Local environment is not yet supported for OIDC")}}async function d(K){let Q=await C(K.issuer),Z=new URL(Q.authorization_endpoint);return Z.searchParams.set("response_type","code"),Z.searchParams.set("client_id",K.clientId),Z.searchParams.set("redirect_uri",K.redirectUri),Z.searchParams.set("scope","openid profile email"),Z.searchParams.set("state",K.state),Z.toString()}async function bK(K){let Q=await C(K.issuer),Z=await fetch(Q.token_endpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:K.clientId,client_secret:K.clientSecret,code:K.code,redirect_uri:K.redirectUri})});if(!Z.ok){let z=await Z.text();throw N.error("Token exchange failed",{status:Z.status,body:z}),Error(`Token exchange failed: ${Z.status} ${z}`)}let $=await Z.json();return N.debug("Received tokens from IdP",{expiresIn:$.expires_in}),$}async function LK(K){let Q=await C(K.issuer),Z=await fetch(Q.userinfo_endpoint,{headers:{Authorization:`Bearer ${K.accessToken}`}});if(!Z.ok)throw Error(`UserInfo request failed: ${Z.statusText}`);return Z.json()}function p(K,Q,Z,$){return{error:K,errorCode:Q,state:Z,req:$,redirect:S,json:w}}function FK(K){try{return i(K)}catch{J.warn("Failed to decode state");return}}function iK(K,Q,Z,$,z){let W=Q.searchParams.get("error_description");J.error("IdP returned error",{error:K,description:W});let F=Error(W??K);if(z)return z(p(F,K,Z,$));return w({error:K},400)}function pK(K,Q,Z){J.error("Missing authorization code in callback");let $=Error("Missing authorization code");if(Z)return Z(p($,"missing_code",K,Q));return w({error:"Missing authorization code"},400)}async function gK(K){let{req:Q,env:Z,clientId:$,buildState:z}=K,W=K.issuer??y(Z),F=new URL(Q.url),H=K.redirectUri;if(!H){let l=F.pathname.replace(B.IDENTITY.SIGNIN,"");H=`${F.origin}${l}${B.IDENTITY.CALLBACK}`}J.debug("SSO sign-in initiated",{env:Z,issuer:W,clientId:$,redirectUri:H});let j=z?z({req:Q,url:F}):{},g=u(j),c=await d({issuer:W,clientId:$,redirectUri:H,state:g});return S(c)}function cK(K){let Q=new URL(K.url),Z=Q.searchParams.get("code"),$=Q.searchParams.get("error"),z=Q.searchParams.get("state");J.debug("Received callback from IdP",{hasCode:!!Z,error:$});let W=z?FK(z):void 0;return{url:Q,code:Z,errorParam:$,state:W}}function lK(K,Q){if(Q)return Q;let Z=K.pathname.replace(B.IDENTITY.CALLBACK,"");return`${K.origin}${Z}${B.IDENTITY.CALLBACK}`}
2
+ export{hK as m,v as n,J as o,y as p,bK as q,LK as r,p as s,iK as t,pK as u,gK as v,cK as w,lK as x};
@@ -1,2 +1,2 @@
1
- import{P as F}from"./chunk-nsr7a2dv.js";function M(j){let g=j.trim();if(g==="")return"/";let A=g.indexOf("?");if(A===-1)return g;let L=g.slice(0,A);if(L==="")return"/";return L}function X(j){let g=M(j);if(g!==""&&!g.startsWith("/"))g=`/${g}`;if(g==="/"||g==="")return"";if(g.endsWith("/"))return g.slice(0,-1);return g}function Z(j){let g=j.method.toUpperCase(),A=M(j.pathname),L=j.callbackPath?M(j.callbackPath):void 0;if(L&&A===L)return g==="GET"?"identity.callback":null;let N=j.basePath,Q=N!==void 0,J=Q?X(N):void 0,V=(G)=>{if(g==="GET"){if(G===F.IDENTITY.SIGNIN)return"identity.signIn";if(G===F.IDENTITY.CALLBACK)return"identity.callback";if(G===F.IDENTITY.SIGNOUT)return"identity.signOut";if(G===F.USER.ME)return"user.me";if(G===F.USER.VERIFY)return"user.verify"}if(g==="POST"){if(G===F.ACTIVITY_HEARTBEAT)return"activity.heartbeat";if(G===F.ACTIVITY_SUBMIT)return"activity.submit"}return null};if(Q&&J!==void 0){if(J!==""&&A===J)return null;if(J!==""&&!A.startsWith(`${J}/`))return null;let G=J===""?A:A.slice(J.length),W=G.startsWith("/")?G:`/${G}`;return V(W)}if(g==="GET"){if(A.endsWith(F.IDENTITY.SIGNIN))return"identity.signIn";if(A.endsWith(F.IDENTITY.CALLBACK))return"identity.callback";if(A.endsWith(F.IDENTITY.SIGNOUT))return"identity.signOut";if(A.endsWith(F.USER.ME))return"user.me";if(A.endsWith(F.USER.VERIFY))return"user.verify"}if(g==="POST"){if(A.endsWith(F.ACTIVITY_HEARTBEAT))return"activity.heartbeat";if(A.endsWith(F.ACTIVITY_SUBMIT))return"activity.submit"}return null}function _(j){return"handle"in j?j.handle:j}function $(j){return"activity"in j}function C(j){return"user"in j}
2
- export{M as B,Z as C,_ as D,$ as E,C as F};
1
+ import{M as F}from"./chunk-3ew9vn2d.js";function M(j){let g=j.trim();if(g==="")return"/";let A=g.indexOf("?");if(A===-1)return g;let L=g.slice(0,A);if(L==="")return"/";return L}function X(j){let g=M(j);if(g!==""&&!g.startsWith("/"))g=`/${g}`;if(g==="/"||g==="")return"";if(g.endsWith("/"))return g.slice(0,-1);return g}function Z(j){let g=j.method.toUpperCase(),A=M(j.pathname),L=j.callbackPath?M(j.callbackPath):void 0;if(L&&A===L)return g==="GET"?"identity.callback":null;let N=j.basePath,Q=N!==void 0,J=Q?X(N):void 0,V=(G)=>{if(g==="GET"){if(G===F.IDENTITY.SIGNIN)return"identity.signIn";if(G===F.IDENTITY.CALLBACK)return"identity.callback";if(G===F.IDENTITY.SIGNOUT)return"identity.signOut";if(G===F.USER.ME)return"user.me";if(G===F.USER.VERIFY)return"user.verify"}if(g==="POST"){if(G===F.ACTIVITY_HEARTBEAT)return"activity.heartbeat";if(G===F.ACTIVITY_SUBMIT)return"activity.submit"}return null};if(Q&&J!==void 0){if(J!==""&&A===J)return null;if(J!==""&&!A.startsWith(`${J}/`))return null;let G=J===""?A:A.slice(J.length),W=G.startsWith("/")?G:`/${G}`;return V(W)}if(g==="GET"){if(A.endsWith(F.IDENTITY.SIGNIN))return"identity.signIn";if(A.endsWith(F.IDENTITY.CALLBACK))return"identity.callback";if(A.endsWith(F.IDENTITY.SIGNOUT))return"identity.signOut";if(A.endsWith(F.USER.ME))return"user.me";if(A.endsWith(F.USER.VERIFY))return"user.verify"}if(g==="POST"){if(A.endsWith(F.ACTIVITY_HEARTBEAT))return"activity.heartbeat";if(A.endsWith(F.ACTIVITY_SUBMIT))return"activity.submit"}return null}function _(j){return"handle"in j?j.handle:j}function $(j){return"activity"in j}function C(j){return"user"in j}
2
+ export{M as y,Z as z,_ as A,$ as B,C};
@@ -0,0 +1,10 @@
1
+ import"./chunk-edk3nfj7.js";var F=/%[sdj%]/g;function D(e,...t){if(!P(e)){var n=[e];for(var r=0;r<t.length;r++)n.push(l(t[r]));return n.join(" ")}var r=0,s=t.length,o=String(e).replace(F,function(f){if(f==="%%")return"%";if(r>=s)return f;switch(f){case"%s":return String(t[r++]);case"%d":return Number(t[r++]);case"%j":try{return JSON.stringify(t[r++])}catch(c){return"[Circular]"}default:return f}});for(var i=t[r];r<s;i=t[++r])if(w(i)||!y(i))o+=" "+i;else o+=" "+l(i);return o}function X(e,t){if(typeof process>"u"||process?.noDeprecation===!0)return e;var n=!1;function r(...s){if(!n){if(process.throwDeprecation)throw Error(t);else if(process.traceDeprecation)console.trace(t);else console.error(t);n=!0}return e.apply(this,...s)}return r}var Y=((e={},t={},n)=>((n=typeof process<"u"&&!1)&&(n=n.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".*").replace(/,/g,"$|^").toUpperCase()),t=new RegExp("^"+n+"$","i"),(r)=>{if(r=r.toUpperCase(),!e[r])if(t.test(r))e[r]=function(...s){console.error("%s: %s",r,pid,D.apply(null,...s))};else e[r]=function(){};return e[r]}))(),l=((e)=>(e.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},e.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},e.custom=Symbol.for("nodejs.util.inspect.custom"),e))(function(e,t,...n){var r={seen:[],stylize:H};if(n.length>=1)r.depth=n[0];if(n.length>=2)r.colors=n[1];if(C(t))r.showHidden=t;else if(t)T(r,t);if(p(r.showHidden))r.showHidden=!1;if(p(r.depth))r.depth=2;if(p(r.colors))r.colors=!1;if(r.colors)r.stylize=R;return m(r,e,r.depth)});function R(e,t){var n=l.styles[t];if(n)return"\x1B["+l.colors[n][0]+"m"+e+"\x1B["+l.colors[n][1]+"m";else return e}function H(e,t){return e}function J(e){var t={};return e.forEach(function(n,r){t[n]=!0}),t}function m(e,t,n){if(e.customInspect&&t&&O(t.inspect)&&t.inspect!==l&&!(t.constructor&&t.constructor.prototype===t)){var r=t.inspect(n,e);if(!P(r))r=m(e,r,n);return r}var s=_(e,t);if(s)return s;var o=Object.keys(t),i=J(o);if(e.showHidden)o=Object.getOwnPropertyNames(t);if(g(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return b(t);if(o.length===0){if(O(t)){var f=t.name?": "+t.name:"";return e.stylize("[Function"+f+"]","special")}if(h(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(E(t))return e.stylize(Date.prototype.toString.call(t),"date");if(g(t))return b(t)}var c="",u=!1,a=["{","}"];if(M(t))u=!0,a=["[","]"];if(O(t)){var $=t.name?": "+t.name:"";c=" [Function"+$+"]"}if(h(t))c=" "+RegExp.prototype.toString.call(t);if(E(t))c=" "+Date.prototype.toUTCString.call(t);if(g(t))c=" "+b(t);if(o.length===0&&(!u||t.length==0))return a[0]+c+a[1];if(n<0)if(h(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");else return e.stylize("[Object]","special");e.seen.push(t);var d;if(u)d=B(e,t,n,i,o);else d=o.map(function(A){return S(e,t,n,i,A,u)});return e.seen.pop(),U(d,c,a)}function _(e,t){if(p(t))return e.stylize("undefined","undefined");if(P(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}if(G(t))return e.stylize(""+t,"number");if(C(t))return e.stylize(""+t,"boolean");if(w(t))return e.stylize("null","null")}function b(e){return"["+Error.prototype.toString.call(e)+"]"}function B(e,t,n,r,s){var o=[];for(var i=0,f=t.length;i<f;++i)if(k(t,String(i)))o.push(S(e,t,n,r,String(i),!0));else o.push("");return s.forEach(function(c){if(!c.match(/^\d+$/))o.push(S(e,t,n,r,c,!0))}),o}function S(e,t,n,r,s,o){var i,f,c;if(c=Object.getOwnPropertyDescriptor(t,s)||{value:t[s]},c.get)if(c.set)f=e.stylize("[Getter/Setter]","special");else f=e.stylize("[Getter]","special");else if(c.set)f=e.stylize("[Setter]","special");if(!k(r,s))i="["+s+"]";if(!f)if(e.seen.indexOf(c.value)<0){if(w(n))f=m(e,c.value,null);else f=m(e,c.value,n-1);if(f.indexOf(`
2
+ `)>-1)if(o)f=f.split(`
3
+ `).map(function(u){return" "+u}).join(`
4
+ `).slice(2);else f=`
5
+ `+f.split(`
6
+ `).map(function(u){return" "+u}).join(`
7
+ `)}else f=e.stylize("[Circular]","special");if(p(i)){if(o&&s.match(/^\d+$/))return f;if(i=JSON.stringify(""+s),i.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/))i=i.slice(1,-1),i=e.stylize(i,"name");else i=i.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),i=e.stylize(i,"string")}return i+": "+f}function U(e,t,n){var r=0,s=e.reduce(function(o,i){if(r++,i.indexOf(`
8
+ `)>=0)r++;return o+i.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(s>60)return n[0]+(t===""?"":t+`
9
+ `)+" "+e.join(`,
10
+ `)+" "+n[1];return n[0]+t+" "+e.join(", ")+" "+n[1]}var v=()=>{};function M(e){return Array.isArray(e)}function C(e){return typeof e==="boolean"}function w(e){return e===null}function x(e){return e==null}function G(e){return typeof e==="number"}function P(e){return typeof e==="string"}function ee(e){return typeof e==="symbol"}function p(e){return e===void 0}function h(e){return y(e)&&z(e)==="[object RegExp]"}function y(e){return typeof e==="object"&&e!==null}function E(e){return y(e)&&z(e)==="[object Date]"}function g(e){return y(e)&&(z(e)==="[object Error]"||e instanceof Error)}function O(e){return typeof e==="function"}function te(e){return e===null||typeof e==="boolean"||typeof e==="number"||typeof e==="string"||typeof e==="symbol"||typeof e>"u"}function re(e){return e instanceof Buffer}function z(e){return Object.prototype.toString.call(e)}function j(e){return e<10?"0"+e.toString(10):e.toString(10)}var Z=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function I(){var e=new Date,t=[j(e.getHours()),j(e.getMinutes()),j(e.getSeconds())].join(":");return[e.getDate(),Z[e.getMonth()],t].join(" ")}function L(...e){console.log("%s - %s",I(),D.apply(null,e))}function V(e,t){if(t)e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}function T(e,t){if(!t||!y(t))return e;var n=Object.keys(t),r=n.length;while(r--)e[n[r]]=t[n[r]];return e}function k(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var W=((e)=>(e.custom=Symbol.for("nodejs.util.promisify.custom"),e))(function(e){if(typeof e!=="function")throw TypeError('The "original" argument must be of type Function');if(kCustomPromisifiedSymbol&&e[kCustomPromisifiedSymbol]){var t=e[kCustomPromisifiedSymbol];if(typeof t!=="function")throw TypeError('The "nodejs.util.promisify.custom" argument must be of type Function');return Object.defineProperty(t,kCustomPromisifiedSymbol,{value:t,enumerable:!1,writable:!1,configurable:!0}),t}function t(...n){var r,s,o=new Promise(function(i,f){r=i,s=f});n.push(function(i,f){if(i)s(i);else r(f)});try{e.apply(this,n)}catch(i){s(i)}return o}if(Object.setPrototypeOf(t,Object.getPrototypeOf(e)),kCustomPromisifiedSymbol)Object.defineProperty(t,kCustomPromisifiedSymbol,{value:t,enumerable:!1,writable:!1,configurable:!0});return Object.defineProperties(t,Object.getOwnPropertyDescriptors(e))});function N(e,t){if(!e){var n=Error("Promise was rejected with a falsy value");n.reason=e,e=n}return t(e)}function q(e){if(typeof e!=="function")throw TypeError('The "original" argument must be of type Function');function t(...n){var r=n.pop();if(typeof r!=="function")throw TypeError("The last argument must be of type Function");var s=this,o=function(...i){return r.apply(s,...i)};e.apply(this,n).then(function(i){process.nextTick(o.bind(null,null,i))},function(i){process.nextTick(N.bind(null,i,o))})}return Object.setPrototypeOf(t,Object.getPrototypeOf(e)),Object.defineProperties(t,Object.getOwnPropertyDescriptors(e)),t}var{TextEncoder:K,TextDecoder:Q}=globalThis,ne={TextEncoder:K,TextDecoder:Q,promisify:W,log:L,inherits:V,_extend:T,callbackifyOnRejected:N,callbackify:q};export{v as types,W as promisify,L as log,p as isUndefined,ee as isSymbol,P as isString,h as isRegExp,te as isPrimitive,y as isObject,G as isNumber,x as isNullOrUndefined,w as isNull,O as isFunction,g as isError,E as isDate,re as isBuffer,C as isBoolean,M as isArray,l as inspect,V as inherits,D as format,X as deprecate,ne as default,Y as debuglog,N as callbackifyOnRejected,q as callbackify,T as _extend,K as TextEncoder,Q as TextDecoder};
@@ -0,0 +1,2 @@
1
+ var g=Object.create;var{getPrototypeOf:h,defineProperty:f,getOwnPropertyNames:i}=Object;var j=Object.prototype.hasOwnProperty;var k=(a,c,b)=>{b=a!=null?g(h(a)):{};let d=c||!a||!a.__esModule?f(b,"default",{value:a,enumerable:!0}):b;for(let e of i(a))if(!j.call(d,e))f(d,e,{get:()=>a[e],enumerable:!0});return d};var l=(a,c)=>{for(var b in c)f(a,b,{get:c[b],enumerable:!0,configurable:!0,set:(d)=>c[b]=()=>d})};var m=((a)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(c,b)=>(typeof require<"u"?require:c)[b]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});
2
+ export{k as N,l as O,m as P};
@@ -0,0 +1,4 @@
1
+ import{c as Y}from"./chunk-sgcwg4j6.js";import{O as V}from"./chunk-edk3nfj7.js";var{existsSync:ie}=(()=>({}));function b(e){if(typeof e!=="string")throw TypeError("Path must be a string. Received "+JSON.stringify(e))}function R(e,r){var i="",t=0,l=-1,n=0,s;for(var f=0;f<=e.length;++f){if(f<e.length)s=e.charCodeAt(f);else if(s===47)break;else s=47;if(s===47){if(l===f-1||n===1);else if(l!==f-1&&n===2){if(i.length<2||t!==2||i.charCodeAt(i.length-1)!==46||i.charCodeAt(i.length-2)!==46){if(i.length>2){var o=i.lastIndexOf("/");if(o!==i.length-1){if(o===-1)i="",t=0;else i=i.slice(0,o),t=i.length-1-i.lastIndexOf("/");l=f,n=0;continue}}else if(i.length===2||i.length===1){i="",t=0,l=f,n=0;continue}}if(r){if(i.length>0)i+="/..";else i="..";t=2}}else{if(i.length>0)i+="/"+e.slice(l+1,f);else i=e.slice(l+1,f);t=f-l-1}l=f,n=0}else if(s===46&&n!==-1)++n;else n=-1}return i}function E(e,r){var i=r.dir||r.root,t=r.base||(r.name||"")+(r.ext||"");if(!i)return t;if(i===r.root)return i+t;return i+e+t}function d(){var e="",r=!1,i;for(var t=arguments.length-1;t>=-1&&!r;t--){var l;if(t>=0)l=arguments[t];else{if(i===void 0)i=process.cwd();l=i}if(b(l),l.length===0)continue;e=l+"/"+e,r=l.charCodeAt(0)===47}if(e=R(e,!r),r)if(e.length>0)return"/"+e;else return"/";else if(e.length>0)return e;else return"."}function w(e){if(b(e),e.length===0)return".";var r=e.charCodeAt(0)===47,i=e.charCodeAt(e.length-1)===47;if(e=R(e,!r),e.length===0&&!r)e=".";if(e.length>0&&i)e+="/";if(r)return"/"+e;return e}function G(e){return b(e),e.length>0&&e.charCodeAt(0)===47}function $(){if(arguments.length===0)return".";var e;for(var r=0;r<arguments.length;++r){var i=arguments[r];if(b(i),i.length>0)if(e===void 0)e=i;else e+="/"+i}if(e===void 0)return".";return w(e)}function y(e,r){if(b(e),b(r),e===r)return"";if(e=d(e),r=d(r),e===r)return"";var i=1;for(;i<e.length;++i)if(e.charCodeAt(i)!==47)break;var t=e.length,l=t-i,n=1;for(;n<r.length;++n)if(r.charCodeAt(n)!==47)break;var s=r.length,f=s-n,o=l<f?l:f,a=-1,u=0;for(;u<=o;++u){if(u===o){if(f>o){if(r.charCodeAt(n+u)===47)return r.slice(n+u+1);else if(u===0)return r.slice(n+u)}else if(l>o){if(e.charCodeAt(i+u)===47)a=u;else if(u===0)a=0}break}var k=e.charCodeAt(i+u),M=r.charCodeAt(n+u);if(k!==M)break;else if(k===47)a=u}var m="";for(u=i+a+1;u<=t;++u)if(u===t||e.charCodeAt(u)===47)if(m.length===0)m+="..";else m+="/..";if(m.length>0)return m+r.slice(n+a);else{if(n+=a,r.charCodeAt(n)===47)++n;return r.slice(n)}}function z(e){return e}function H(e){if(b(e),e.length===0)return".";var r=e.charCodeAt(0),i=r===47,t=-1,l=!0;for(var n=e.length-1;n>=1;--n)if(r=e.charCodeAt(n),r===47){if(!l){t=n;break}}else l=!1;if(t===-1)return i?"/":".";if(i&&t===1)return"//";return e.slice(0,t)}function h(e,r){if(r!==void 0&&typeof r!=="string")throw TypeError('"ext" argument must be a string');b(e);var i=0,t=-1,l=!0,n;if(r!==void 0&&r.length>0&&r.length<=e.length){if(r.length===e.length&&r===e)return"";var s=r.length-1,f=-1;for(n=e.length-1;n>=0;--n){var o=e.charCodeAt(n);if(o===47){if(!l){i=n+1;break}}else{if(f===-1)l=!1,f=n+1;if(s>=0)if(o===r.charCodeAt(s)){if(--s===-1)t=n}else s=-1,t=f}}if(i===t)t=f;else if(t===-1)t=e.length;return e.slice(i,t)}else{for(n=e.length-1;n>=0;--n)if(e.charCodeAt(n)===47){if(!l){i=n+1;break}}else if(t===-1)l=!1,t=n+1;if(t===-1)return"";return e.slice(i,t)}}function C(e){b(e);var r=-1,i=0,t=-1,l=!0,n=0;for(var s=e.length-1;s>=0;--s){var f=e.charCodeAt(s);if(f===47){if(!l){i=s+1;break}continue}if(t===-1)l=!1,t=s+1;if(f===46){if(r===-1)r=s;else if(n!==1)n=1}else if(r!==-1)n=-1}if(r===-1||t===-1||n===0||n===1&&r===t-1&&r===i+1)return"";return e.slice(r,t)}function U(e){if(e===null||typeof e!=="object")throw TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return E("/",e)}function q(e){b(e);var r={root:"",dir:"",base:"",ext:"",name:""};if(e.length===0)return r;var i=e.charCodeAt(0),t=i===47,l;if(t)r.root="/",l=1;else l=0;var n=-1,s=0,f=-1,o=!0,a=e.length-1,u=0;for(;a>=l;--a){if(i=e.charCodeAt(a),i===47){if(!o){s=a+1;break}continue}if(f===-1)o=!1,f=a+1;if(i===46){if(n===-1)n=a;else if(u!==1)u=1}else if(n!==-1)u=-1}if(n===-1||f===-1||u===0||u===1&&n===f-1&&n===s+1){if(f!==-1)if(s===0&&t)r.base=r.name=e.slice(1,f);else r.base=r.name=e.slice(s,f)}else{if(s===0&&t)r.name=e.slice(1,n),r.base=e.slice(1,f);else r.name=e.slice(s,n),r.base=e.slice(s,f);r.ext=e.slice(n,f)}if(s>0)r.dir=e.slice(0,s-1);else if(t)r.dir="/";return r}var K="/",Q=":",le=((e)=>(e.posix=e,e))({resolve:d,normalize:w,isAbsolute:G,join:$,relative:y,_makeLong:z,dirname:H,basename:h,extname:C,format:U,parse:q,sep:K,delimiter:Q,win32:null,posix:null});import{loadConfig as ne}from"c12";var A={};V(A,{isatty:()=>B,default:()=>X,WriteStream:()=>S,ReadStream:()=>T});var B=()=>!1;function S(){throw Error("tty.WriteStream is not implemented for browsers")}function T(){throw Error("tty.ReadStream is not implemented for browsers")}var X={ReadStream:T,WriteStream:S,isatty:B};var{env:c={},argv:W=[],platform:Z=""}=typeof process>"u"?{}:process,I="NO_COLOR"in c||W.includes("--no-color"),J="FORCE_COLOR"in c||W.includes("--color"),j=Z==="win32",_=c.TERM==="dumb",F=A&&B&&B(1)&&c.TERM&&!_,N="CI"in c&&(("GITHUB_ACTIONS"in c)||("GITLAB_CI"in c)||("CIRCLECI"in c)),P=!I&&(J||j&&!_||F||N),L=(e,r,i,t,l=r.substring(0,e)+t,n=r.substring(e+i.length),s=n.indexOf(i))=>l+(s<0?n:L(s,n,i,t)),p=(e,r,i,t,l)=>e<0?i+r+t:i+L(e,r,t,l)+t,ee=(e,r,i=e,t=e.length+1)=>(l)=>l||!(l===""||l===void 0)?p((""+l).indexOf(r,t),l,e,r,i):"",g=(e,r,i)=>ee(`\x1B[${e}m`,`\x1B[${r}m`,i),D={reset:g(0,0),bold:g(1,22,"\x1B[22m\x1B[1m"),dim:g(2,22,"\x1B[22m\x1B[2m"),italic:g(3,23),underline:g(4,24),inverse:g(7,27),hidden:g(8,28),strikethrough:g(9,29),black:g(30,39),red:g(31,39),green:g(32,39),yellow:g(33,39),blue:g(34,39),magenta:g(35,39),cyan:g(36,39),white:g(37,39),gray:g(90,39),bgBlack:g(40,49),bgRed:g(41,49),bgGreen:g(42,49),bgYellow:g(43,49),bgBlue:g(44,49),bgMagenta:g(45,49),bgCyan:g(46,49),bgWhite:g(47,49),blackBright:g(90,39),redBright:g(91,39),greenBright:g(92,39),yellowBright:g(93,39),blueBright:g(94,39),magentaBright:g(95,39),cyanBright:g(96,39),whiteBright:g(97,39),bgBlackBright:g(100,49),bgRedBright:g(101,49),bgGreenBright:g(102,49),bgYellowBright:g(103,49),bgBlueBright:g(104,49),bgMagentaBright:g(105,49),bgCyanBright:g(106,49),bgWhiteBright:g(107,49)},re=({useColor:e=P}={})=>e?D:Object.keys(D).reduce((r,i)=>({...r,[i]:String}),{}),{reset:fe,bold:se,dim:ue,italic:oe,underline:ae,inverse:be,hidden:ce,strikethrough:de,black:me,red:Be,green:he,yellow:ve,blue:ye,magenta:Ce,cyan:Ae,white:ke,gray:Re,bgBlack:we,bgRed:Se,bgGreen:Te,bgYellow:De,bgBlue:We,bgMagenta:_e,bgCyan:Le,bgWhite:Oe,blackBright:Ye,redBright:xe,greenBright:O,yellowBright:Me,blueBright:Ee,magentaBright:Ge,cyanBright:$e,whiteBright:ze,bgBlackBright:He,bgRedBright:Ue,bgGreenBright:qe,bgYellowBright:Ke,bgBlueBright:Qe,bgMagentaBright:Ve,bgCyanBright:Xe,bgWhiteBright:Ze}=re();var v="timeback.config.json";function x(e){return C(e).toLowerCase()===".json"}async function te(e,r){if(r&&!x(r))throw Error(`Config file must be JSON (.json): ${r}`);let i=await ne({cwd:e,name:"timeback",configFile:r??v,rcFile:!1,packageJson:!1,dotenv:!1,envName:!1,extend:!1,omit$Keys:!0,defaults:{},overrides:{}});if(!i.config||Object.keys(i.config).length===0)return null;let t=i.config;if("extends"in t)throw Error("The 'extends' feature is not supported in timeback.config.json. Please inline all configuration.");let{$schema:l,...n}=t;return{config:n,configFile:i.configFile??d(e,r??v)}}async function rr(e={}){let r=process.cwd();try{if(e.configPath&&!x(e.configPath))return{success:!1,error:`Config file must be JSON (.json): ${e.configPath}`};if(e.configPath){let l=d(r,e.configPath);if(!ie(l))return{success:!1,error:`Config file not found: ${e.configPath}`}}let i=await te(r,e.configPath);if(!i)return{success:!1,error:`No timeback config found. Run ${O("timeback init")} to create one.`};let t=Y.safeParse(i.config);if(!t.success){let l=t.error.issues.map((n)=>` - ${n.path.join(".")}: ${n.message}`).join(`
2
+ `);return{success:!1,error:`Invalid config in ${h(i.configFile)}:
3
+ ${l}`}}return{success:!0,config:t.data,configPath:i.configFile}}catch(i){return{success:!1,error:`Failed to load ${e.configPath?h(e.configPath):v}:
4
+ ${i instanceof Error?i.message:String(i)}`}}}function ir(e){return y(process.cwd(),e)}export{te as loadWithC12,rr as loadConfig,ir as getRelativeConfigPath};
@@ -0,0 +1 @@
1
+ import{n as _}from"./chunk-6b0ppq9d.js";import{F as V}from"./chunk-3ew9vn2d.js";import{TimebackClient as P}from"@timeback/core";function Z(...x){return x.map((Q)=>Q?.trim()).filter((Q)=>Boolean(Q)).join(" ")||void 0}function M(x){let $=x.lastIndexOf("@");if($<=0)return"<redacted>";let Q=x.slice(0,$),B=x.slice($+1);return`${Q.slice(0,1)}***@${B}`}var S=_("resolve");class J extends Error{code;constructor(x,$){super(x);this.code=$;this.name="TimebackUserResolutionError"}}function z(x){switch(x.code){case"timeback_user_ambiguous":return 409;case"timeback_user_not_found":return 404;default:return 502}}function L(x){return{sub:x.sub,email:x.email,firstName:x.given_name,lastName:x.family_name,pictureUrl:x.picture}}async function D(x,$){let B=(await x.oneroster.users.list({where:{email:$},limit:2})).data;if(B.length===0)throw S.warn("No Timeback user found for email",{email:M($)}),new J(`No Timeback user found with email: ${$}`,"timeback_user_not_found");if(B.length>1)throw S.error("Multiple Timeback users found for email",{email:M($),count:B.length}),new J(`Multiple Timeback users found with email: ${$}`,"timeback_user_ambiguous");let K=B[0];if(!K.sourcedId)throw new J("Timeback user is missing sourcedId","timeback_user_lookup_failed");return K}async function O(x){let{env:$,apiCredentials:Q,userInfo:B}=x;if(!B.email)throw S.error("Missing email in IdP user info",{sub:B.sub}),new J("IdP did not return an email address, which is required to resolve Timeback identity","missing_email");let K=B.email;S.debug("Resolving Timeback user by email",{email:M(K),env:$});let H=x.client,X=H??new P({env:V($),auth:{clientId:Q.clientId,clientSecret:Q.clientSecret}});try{let G=await D(X,K);return{...{id:G.sourcedId,email:G.email??K,name:Z(G.givenName,G.familyName),school:G.primaryOrg?{id:G.primaryOrg.sourcedId,name:G.primaryOrg.name??G.primaryOrg.sourcedId}:void 0,grade:G.grades?.length?Math.max(...G.grades):void 0},claims:L(B)}}catch(G){if(G instanceof J)throw G;let Y=G instanceof Error?G.message:"Unknown error";throw S.error("Failed to lookup Timeback user",{email:M(K),error:Y}),new J(`Failed to lookup Timeback user: ${Y}`,"timeback_user_lookup_failed")}finally{if(!H)X.close()}}async function F(x){let{email:$,client:Q}=x;S.debug("Looking up Timeback user ID by email",{email:M($)});try{return(await D(Q,$)).sourcedId}catch(B){if(B instanceof J)throw B;let K=B instanceof Error?B.message:"Unknown error";throw S.error("Failed to lookup Timeback user",{email:M($),error:K}),new J(`Failed to lookup Timeback user: ${K}`,"timeback_user_lookup_failed")}}function W(x,$){let Q=x.totalQuestions!==void 0,B=x.correctQuestions!==void 0;if(Q!==B){$.addIssue({code:"custom",message:"totalQuestions and correctQuestions must be provided together."});return}if(Q&&B){let{correctQuestions:K,totalQuestions:H}=x;if(K>H)$.addIssue({code:"custom",message:"correctQuestions cannot exceed totalQuestions."})}}function A(x,$,Q){let B=V(Q),K=$.overrides?.[B]?.sensor??$.sensor??x.sensor;if(!K){let H=$.overrides?.[B]?.launchUrl??$.launchUrl??x.launchUrl;if(H)try{K=new URL(H).origin}catch{}}return K}function N(x,$,Q){if(!$?.onRequestStart&&!$?.onRequestEnd)return Q;return async(B)=>{await $.onRequestStart?.({handler:x});let K=Date.now(),H;try{H=await Q(B)}catch(X){throw await $.onRequestEnd?.({handler:x,durationMs:Date.now()-K,status:500}),X}return await $.onRequestEnd?.({handler:x,durationMs:Date.now()-K,status:H.status}),H}}export{J as f,z as g,O as h,F as i,W as j,A as k,N as l};
@@ -40,8 +40,9 @@ export declare class ActivityManager {
40
40
  * @returns Started activity instance
41
41
  * @throws If an activity is already active
42
42
  *
43
- * @example Basic usage
43
+ * @example
44
44
  * ```typescript
45
+ * // Basic usage
45
46
  * const activity = timeback.activity.start({
46
47
  * id: 'lesson-1',
47
48
  * name: 'Intro',
@@ -56,8 +57,9 @@ export declare class ActivityManager {
56
57
  * })
57
58
  * ```
58
59
  *
59
- * @example Resume from previous session
60
+ * @example
60
61
  * ```typescript
62
+ * // Resume from previous session
61
63
  * // Use the same runId from a previous session to correlate events
62
64
  * const activity = timeback.activity.start({
63
65
  * id: 'lesson-1',
@@ -67,8 +69,9 @@ export declare class ActivityManager {
67
69
  * })
68
70
  * ```
69
71
  *
70
- * @example Custom heartbeat interval
72
+ * @example
71
73
  * ```typescript
74
+ * // Custom heartbeat interval
72
75
  * const activity = timeback.activity.start({
73
76
  * id: 'lesson-1',
74
77
  * name: 'Intro',
@@ -1 +1 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/client/namespaces/activity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEpE;;;;;;GAMG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAA;IAC1B,OAAO,CAAC,QAAQ,CAAwB;IAExC;;;;OAIG;IACH,YAAY,MAAM,EAAE,uBAAuB,EAE1C;IAED;;;;OAIG;IACH,IAAI,OAAO,IAAI,QAAQ,GAAG,IAAI,CAK7B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACH,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAUtC;CACD"}
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/client/namespaces/activity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEpE;;;;;;GAMG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAA;IAC1B,OAAO,CAAC,QAAQ,CAAwB;IAExC;;;;OAIG;IACH,YAAY,MAAM,EAAE,uBAAuB,EAE1C;IAED;;;;OAIG;IACH,IAAI,OAAO,IAAI,QAAQ,GAAG,IAAI,CAK7B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmDG;IACH,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAUtC;CACD"}
@@ -3,11 +3,8 @@
3
3
  *
4
4
  * This entrypoint is intentionally minimal: identity-only SSO, with types.
5
5
  *
6
- * For edge runtimes like Cloudflare Workers / workerd, prefer `timeback/edge`,
7
- * which includes edge-safe helpers (like `toNativeHandler`) alongside identity-only.
8
- *
9
- * If you're running in a Node.js server runtime, prefer importing from `timeback`
10
- * to get the full SDK (including `createTimeback()` and `timeback.api`).
6
+ * If you need `toNativeHandler`, `ROUTES`, or the full SDK, import from
7
+ * `@timeback/sdk` instead the main entry is edge-compatible.
11
8
  */
12
9
  export { createTimebackIdentity } from './server/timeback-identity';
13
10
  export type { IdentityOnlyConfig, IdentityOnlyInstance, IdentityOnlyHandlers } from './server';
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AACnE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA"}
package/dist/identity.js CHANGED
@@ -1 +1 @@
1
- import{c as e}from"./chunk-bd09q1fw.js";import"./chunk-whc53e0y.js";export{e as createTimebackIdentity};
1
+ import{d as e}from"./chunk-1cqa51je.js";import"./chunk-6b0ppq9d.js";import"./chunk-3ew9vn2d.js";import"./chunk-edk3nfj7.js";export{e as createTimebackIdentity};
package/dist/index.d.ts CHANGED
@@ -3,8 +3,9 @@
3
3
  *
4
4
  * Server-side exports for the Timeback SDK.
5
5
  *
6
- * @example Full SDK (activity tracking + identity)
6
+ * @example
7
7
  * ```typescript
8
+ * // Full SDK (activity tracking + identity)
8
9
  * import { createTimeback } from '@timeback/sdk'
9
10
  *
10
11
  * export const timeback = await createTimeback({
@@ -20,8 +21,9 @@
20
21
  * })
21
22
  * ```
22
23
  *
23
- * @example Identity-only (SSO without activity tracking)
24
+ * @example
24
25
  * ```typescript
26
+ * // Identity-only (SSO without activity tracking)
25
27
  * import { createTimebackIdentity } from '@timeback/sdk'
26
28
  *
27
29
  * export const timeback = createTimebackIdentity({
@@ -38,6 +40,8 @@
38
40
  * ```
39
41
  */
40
42
  export { createTimeback, createTimebackIdentity } from './server';
43
+ export { toNativeHandler } from './server/adapters/native';
44
+ export { ROUTES } from './shared/constants';
41
45
  export { TimebackClient } from '@timeback/core';
42
46
  export type { ApiCredentials, CustomIdentityConfig, Environment, IdentityConfig, SsoIdentityConfig, TimebackConfig, TimebackInstance, IdentityOnlyConfig, IdentityOnlyInstance, IdentityOnlyHandlers, BuildStateContext, CallbackSuccessContext, IdentityOnlyCallbackSuccessContext, CallbackErrorContext, OIDCTokens, OIDCUserInfo, IdpData, ActivityBeforeSendData, TimeSpentBeforeSendData, TimebackUserResolutionErrorCode, } from './server';
43
47
  export type { TimebackIdentity, TimebackProfile, TimebackSessionUser, IdentityClaims, TimebackAuthUser, ActivityParams, ActivityMetrics, } from './shared/types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,YAAY,EACX,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,kCAAkC,EAClC,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,GAC/B,MAAM,UAAU,CAAA;AAEjB,YAAY,EACX,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,GACf,MAAM,gBAAgB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,YAAY,EACX,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,kCAAkC,EAClC,oBAAoB,EACpB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,sBAAsB,EACtB,uBAAuB,EACvB,+BAA+B,GAC/B,MAAM,UAAU,CAAA;AAEjB,YAAY,EACX,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,GACf,MAAM,gBAAgB,CAAA"}