@timeback/sdk 0.1.9 → 0.1.10

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 (147) hide show
  1. package/dist/chunk-3mqpr9vx.js +2 -0
  2. package/dist/chunk-92nnwa7t.js +2 -0
  3. package/dist/{chunk-agpf1x3g.js → chunk-af3xwwsv.js} +1 -1
  4. package/dist/{chunk-07j8zre9.js → chunk-b8649tw4.js} +1 -1
  5. package/dist/{chunk-63afdp3y.js → chunk-bd09q1fw.js} +6 -6
  6. package/dist/chunk-js665z11.js +1 -0
  7. package/dist/chunk-nsr7a2dv.js +2 -0
  8. package/dist/chunk-sgcwg4j6.js +1 -0
  9. package/dist/{chunk-9se82640.js → chunk-txwjkpfz.js} +1 -1
  10. package/dist/client/adapters/react/hooks/types.d.ts +2 -29
  11. package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
  12. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
  13. package/dist/client/adapters/react/index.js +2 -2
  14. package/dist/client/adapters/solid/types.d.ts +2 -29
  15. package/dist/client/adapters/solid/types.d.ts.map +1 -1
  16. package/dist/client/adapters/solid/types.ts +2 -18
  17. package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -1
  18. package/dist/client/adapters/svelte/stores/client.ts +2 -9
  19. package/dist/client/adapters/svelte/stores/profile.d.ts +1 -1
  20. package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -1
  21. package/dist/client/adapters/svelte/stores/profile.ts +4 -11
  22. package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -1
  23. package/dist/client/adapters/svelte/stores/verification.ts +1 -10
  24. package/dist/client/adapters/svelte/types.d.ts +1 -29
  25. package/dist/client/adapters/svelte/types.d.ts.map +1 -1
  26. package/dist/client/adapters/vue/provider.d.ts.map +1 -1
  27. package/dist/client/adapters/vue/provider.ts +4 -11
  28. package/dist/client/adapters/vue/types.d.ts +2 -29
  29. package/dist/client/adapters/vue/types.d.ts.map +1 -1
  30. package/dist/client/adapters/vue/types.ts +2 -18
  31. package/dist/client/auth/types.d.ts +1 -1
  32. package/dist/client/index.d.ts +1 -1
  33. package/dist/client/lib/activity/activity.class.d.ts +130 -22
  34. package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
  35. package/dist/client/lib/activity/transport.d.ts +15 -0
  36. package/dist/client/lib/activity/transport.d.ts.map +1 -0
  37. package/dist/client/lib/activity/types.d.ts +53 -0
  38. package/dist/client/lib/activity/types.d.ts.map +1 -0
  39. package/dist/client/lib/utils.d.ts +18 -0
  40. package/dist/client/lib/utils.d.ts.map +1 -1
  41. package/dist/client/lib/utils.ts +109 -0
  42. package/dist/client/namespaces/activity.d.ts +45 -6
  43. package/dist/client/namespaces/activity.d.ts.map +1 -1
  44. package/dist/client/timeback-client.class.d.ts +7 -1
  45. package/dist/client/timeback-client.class.d.ts.map +1 -1
  46. package/dist/client.d.ts +1 -1
  47. package/dist/client.js +1 -1
  48. package/dist/edge.js +1 -1
  49. package/dist/identity.js +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +22 -22
  53. package/dist/server/adapters/express.d.ts.map +1 -1
  54. package/dist/server/adapters/express.js +1 -1
  55. package/dist/server/adapters/native.d.ts.map +1 -1
  56. package/dist/server/adapters/native.js +1 -1
  57. package/dist/server/adapters/nextjs.js +1 -1
  58. package/dist/server/adapters/nuxt.d.ts.map +1 -1
  59. package/dist/server/adapters/nuxt.js +1 -1
  60. package/dist/server/adapters/solid-start.d.ts.map +1 -1
  61. package/dist/server/adapters/solid-start.js +1 -1
  62. package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
  63. package/dist/server/adapters/svelte-kit.js +1 -1
  64. package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
  65. package/dist/server/adapters/tanstack-start.js +1 -1
  66. package/dist/server/adapters/utils.d.ts +1 -1
  67. package/dist/server/adapters/utils.d.ts.map +1 -1
  68. package/dist/server/handlers/activity/caliper.d.ts +50 -14
  69. package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
  70. package/dist/server/handlers/activity/heartbeat-handler.d.ts +15 -0
  71. package/dist/server/handlers/activity/heartbeat-handler.d.ts.map +1 -0
  72. package/dist/server/handlers/activity/index.d.ts +5 -3
  73. package/dist/server/handlers/activity/index.d.ts.map +1 -1
  74. package/dist/server/handlers/activity/progress.d.ts +2 -2
  75. package/dist/server/handlers/activity/progress.d.ts.map +1 -1
  76. package/dist/server/handlers/activity/schema.d.ts +40 -6
  77. package/dist/server/handlers/activity/schema.d.ts.map +1 -1
  78. package/dist/server/handlers/activity/submit-handler.d.ts +29 -0
  79. package/dist/server/handlers/activity/submit-handler.d.ts.map +1 -0
  80. package/dist/server/handlers/activity/submit.d.ts +44 -0
  81. package/dist/server/handlers/activity/submit.d.ts.map +1 -0
  82. package/dist/server/handlers/activity/types.d.ts +126 -5
  83. package/dist/server/handlers/activity/types.d.ts.map +1 -1
  84. package/dist/server/handlers/identity/handler.d.ts +23 -4
  85. package/dist/server/handlers/identity/handler.d.ts.map +1 -1
  86. package/dist/server/handlers/identity/index.d.ts +2 -2
  87. package/dist/server/handlers/identity/index.d.ts.map +1 -1
  88. package/dist/server/handlers/identity/oidc.d.ts.map +1 -1
  89. package/dist/server/handlers/identity/types.d.ts +0 -6
  90. package/dist/server/handlers/identity/types.d.ts.map +1 -1
  91. package/dist/server/handlers/index.d.ts +3 -3
  92. package/dist/server/handlers/index.d.ts.map +1 -1
  93. package/dist/server/handlers/user/handler.d.ts.map +1 -1
  94. package/dist/server/handlers/user/profile.d.ts.map +1 -1
  95. package/dist/server/handlers/user/types.d.ts +3 -0
  96. package/dist/server/handlers/user/types.d.ts.map +1 -1
  97. package/dist/server/handlers/user/verify.d.ts.map +1 -1
  98. package/dist/server/index.d.ts +1 -1
  99. package/dist/server/index.d.ts.map +1 -1
  100. package/dist/server/lib/hooks.d.ts +20 -0
  101. package/dist/server/lib/hooks.d.ts.map +1 -0
  102. package/dist/server/lib/index.d.ts +4 -2
  103. package/dist/server/lib/index.d.ts.map +1 -1
  104. package/dist/server/lib/logger.d.ts +36 -9
  105. package/dist/server/lib/logger.d.ts.map +1 -1
  106. package/dist/server/lib/resolve.d.ts +1 -1
  107. package/dist/server/lib/resolve.d.ts.map +1 -1
  108. package/dist/server/lib/utils.d.ts +19 -1
  109. package/dist/server/lib/utils.d.ts.map +1 -1
  110. package/dist/server/lib/validation.d.ts +55 -0
  111. package/dist/server/lib/validation.d.ts.map +1 -0
  112. package/dist/server/namespaces/activity/index.d.ts +8 -0
  113. package/dist/server/namespaces/activity/index.d.ts.map +1 -0
  114. package/dist/server/namespaces/activity/record.d.ts +49 -0
  115. package/dist/server/namespaces/activity/record.d.ts.map +1 -0
  116. package/dist/server/namespaces/activity/schema.d.ts +50 -0
  117. package/dist/server/namespaces/activity/schema.d.ts.map +1 -0
  118. package/dist/server/namespaces/user/get-profile.d.ts +32 -0
  119. package/dist/server/namespaces/user/get-profile.d.ts.map +1 -0
  120. package/dist/server/namespaces/user/index.d.ts +8 -0
  121. package/dist/server/namespaces/user/index.d.ts.map +1 -0
  122. package/dist/server/namespaces/user/verify.d.ts +28 -0
  123. package/dist/server/namespaces/user/verify.d.ts.map +1 -0
  124. package/dist/server/timeback.d.ts +1 -1
  125. package/dist/server/timeback.d.ts.map +1 -1
  126. package/dist/server/types.d.ts +394 -12
  127. package/dist/server/types.d.ts.map +1 -1
  128. package/dist/shared/constants.d.ts +7 -0
  129. package/dist/shared/constants.d.ts.map +1 -1
  130. package/dist/shared/constants.ts +51 -0
  131. package/dist/shared/index.d.ts +9 -0
  132. package/dist/shared/index.d.ts.map +1 -0
  133. package/dist/shared/schemas.d.ts +57 -0
  134. package/dist/shared/schemas.d.ts.map +1 -0
  135. package/dist/shared/types.d.ts +263 -10
  136. package/dist/shared/types.d.ts.map +1 -1
  137. package/dist/shared/types.ts +620 -0
  138. package/package.json +2 -2
  139. package/dist/chunk-5171mkp2.js +0 -2
  140. package/dist/chunk-8gg8n8v9.js +0 -2
  141. package/dist/chunk-hnf0tart.js +0 -2
  142. package/dist/chunk-qr0bbnsr.js +0 -1
  143. package/dist/chunk-x9gvef7q.js +0 -1
  144. package/dist/server/handlers/activity/handler.d.ts +0 -32
  145. package/dist/server/handlers/activity/handler.d.ts.map +0 -1
  146. package/dist/shared/xp-calculator.d.ts +0 -25
  147. package/dist/shared/xp-calculator.d.ts.map +0 -1
@@ -0,0 +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};
@@ -0,0 +1,2 @@
1
+ var A="/api/timeback",W={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"}},L=15000,B=600000;var M=3,I=[100,300,1000];function j(){return typeof window<"u"}function J(){if(!j())return;return`${window.location.origin}${A}`}function k(q){return new Promise((X)=>{setTimeout(X,q)})}function T(q,X){if(typeof q==="number")return q;return q[Math.min(X,q.length-1)]??1000}async function S(q,X,z){let $;for(let K=0;K<=X;K++)try{return await q()}catch(Z){if($=Z,K<X)await k(T(z,K))}throw $ instanceof Error?$:Error(String($))}function E(){if(typeof crypto<"u"&&crypto.randomUUID)return crypto.randomUUID();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(q)=>{let X=Math.random()*16|0;return(q==="x"?X:X&3|8).toString(16)})}class V{params;id;runId;_startedAt;_timeEnabled;_timeOptions;_callbacks;_windowStartMs;_activeSinceMs;_accumulatedActiveMs=0;_totalFlushedActiveMs=0;_isPaused=!1;_ended=!1;_ending=!1;_heartbeatTimer=null;_flushInFlight=null;_boundVisibilityHandler=null;_boundPageHideHandler=null;_hiddenTimeoutTimer=null;_timedOutWhileHidden=!1;constructor(q,X){this.params=q;this._callbacks=X;let z=Date.now();this.id=q.id,this.runId=q.runId??E(),this._startedAt=new Date(z),this._windowStartMs=z,this._timeEnabled=q.time!==!1;let $=q.time===!1?{}:q.time??{};if(this._timeOptions={flushIntervalMs:$.flushIntervalMs??L,visibilityAware:$.visibilityAware??!0,flushOnVisibilityHidden:$.flushOnVisibilityHidden??!0,flushOnPageHide:$.flushOnPageHide??!0,hiddenTimeoutMs:$.hiddenTimeoutMs??B,retryAttempts:$.retryAttempts??0,retryDelaysMs:$.retryDelaysMs??[...I]},this._timeEnabled)this._activeSinceMs=z,this._startHeartbeatTimer(),this._setupVisibilityHandlers();else this._activeSinceMs=null}_errorContext(q){return{type:q,activityId:this.params.id,runId:this.runId}}get startedAt(){return this._startedAt}get isPaused(){return this._isPaused}get isEnded(){return this._ended}get elapsedMs(){return this._getCurrentWindowActiveMs()}get totalActiveMs(){return this._totalFlushedActiveMs+this._getCurrentWindowActiveMs()}_getCurrentWindowActiveMs(){let q=this._accumulatedActiveMs;if(this._activeSinceMs!==null)q+=Date.now()-this._activeSinceMs;return Math.max(0,q)}_startHeartbeatTimer(){if(this._heartbeatTimer!==null)return;this._heartbeatTimer=setInterval(()=>{this.flushTimeSpent()},this._timeOptions.flushIntervalMs)}_stopHeartbeatTimer(){if(this._heartbeatTimer!==null)clearInterval(this._heartbeatTimer),this._heartbeatTimer=null}_restartHeartbeatTimer(){this._stopHeartbeatTimer(),this._startHeartbeatTimer()}_setupVisibilityHandlers(){if(typeof document>"u")return;if(this._timeOptions.visibilityAware||this._timeOptions.flushOnVisibilityHidden)this._boundVisibilityHandler=this._handleVisibilityChange.bind(this),document.addEventListener("visibilitychange",this._boundVisibilityHandler);if(this._timeOptions.flushOnPageHide&&typeof window<"u")this._boundPageHideHandler=this._handlePageHide.bind(this),window.addEventListener("pagehide",this._boundPageHideHandler)}_teardownVisibilityHandlers(){if(this._clearHiddenTimeout(),this._boundVisibilityHandler)document.removeEventListener("visibilitychange",this._boundVisibilityHandler),this._boundVisibilityHandler=null;if(this._boundPageHideHandler&&typeof window<"u")window.removeEventListener("pagehide",this._boundPageHideHandler),this._boundPageHideHandler=null}_handleVisibilityChange(){if(this._ended)return;if(document.visibilityState==="hidden"){if(this._timeOptions.visibilityAware&&this._activeSinceMs!==null)this._accumulatedActiveMs+=Date.now()-this._activeSinceMs,this._activeSinceMs=null;if(this._timeOptions.flushOnVisibilityHidden)this.flushTimeSpent();this._startHiddenTimeout()}else{if(this._clearHiddenTimeout(),this._timedOutWhileHidden){this._timedOutWhileHidden=!1;let X=Date.now();if(this._windowStartMs=X,this._accumulatedActiveMs=0,!this._isPaused)this.params.onResume?.()}if(this._restartHeartbeatTimer(),this._timeOptions.visibilityAware&&!this._isPaused&&this._activeSinceMs===null)this._activeSinceMs=Date.now()}}_startHiddenTimeout(){let q=this._timeOptions.hiddenTimeoutMs;if(q===null||!Number.isFinite(q))return;this._clearHiddenTimeout(),this._hiddenTimeoutTimer=setTimeout(()=>{if(this._hiddenTimeoutTimer=null,this._stopHeartbeatTimer(),this._timedOutWhileHidden=!0,!this._isPaused)this.params.onPause?.()},q)}_clearHiddenTimeout(){if(this._hiddenTimeoutTimer!==null)clearTimeout(this._hiddenTimeoutTimer),this._hiddenTimeoutTimer=null}_handlePageHide(){if(this._ended)return;let q=Date.now(),X=this._accumulatedActiveMs;if(this._activeSinceMs!==null)X+=q-this._activeSinceMs;if(X<=0)return;this._flushSync(q,X)}async _flushSync(q,X){let z=this._buildHeartbeatPayload(q,X);if(this._totalFlushedActiveMs+=X,this._windowStartMs=q,this._accumulatedActiveMs=0,this._activeSinceMs!==null)this._activeSinceMs=q;try{await this._callbacks.sendHeartbeatOnPageHide(z),this.params.onFlush?.(X)}catch($){let K=$ instanceof Error?$:Error(String($));this.params.onError?.(K,this._errorContext("timeSpent"))}}_buildHeartbeatPayload(q,X){let z=q-this._windowStartMs-X;return{id:this.params.id,name:this.params.name,course:this.params.course,runId:this.runId,startedAt:new Date(this._windowStartMs).toISOString(),endedAt:new Date(q).toISOString(),elapsedMs:Math.max(0,X),pausedMs:Math.max(0,z)}}async flushTimeSpent(){if(!this._timeEnabled)return;if(this._isPaused&&!this._ended&&!this._ending)return;if(this._flushInFlight){await this._flushInFlight;return}let q=Date.now(),X=this._accumulatedActiveMs;if(this._activeSinceMs!==null)X+=q-this._activeSinceMs;if(q-this._windowStartMs<=0)return;let $=this._buildHeartbeatPayload(q,X);if(this._totalFlushedActiveMs+=X,this._windowStartMs=q,this._accumulatedActiveMs=0,this._activeSinceMs!==null)this._activeSinceMs=q;let{retryAttempts:K,retryDelaysMs:Z}=this._timeOptions;this._flushInFlight=S(()=>this._callbacks.sendHeartbeat($),K,Z).then(()=>{this.params.onFlush?.(X)}).catch((H)=>{let C=H instanceof Error?H:Error(String(H));this.params.onError?.(C,this._errorContext("timeSpent"))}).finally(()=>{this._flushInFlight=null}),await this._flushInFlight}pause(){if(this._isPaused||this._ended)return;if(this._activeSinceMs!==null)this._accumulatedActiveMs+=Date.now()-this._activeSinceMs,this._activeSinceMs=null;this.flushTimeSpent(),this._isPaused=!0,this._stopHeartbeatTimer(),this.params.onPause?.()}resume(){if(!this._isPaused||this._ended)return;if(this._isPaused=!1,this._timeEnabled){let q=Date.now();if(this._windowStartMs=q,this._accumulatedActiveMs=0,!this._timeOptions.visibilityAware||document.visibilityState==="visible")this._activeSinceMs=q;this._startHeartbeatTimer()}this.params.onResume?.()}async end(q={}){if(this._ended||this._ending)return;this._ending=!0,this._stopHeartbeatTimer(),this._teardownVisibilityHandlers();let X=this._activeSinceMs!==null,z=this._activeSinceMs;if(this._activeSinceMs!==null)this._accumulatedActiveMs+=Date.now()-this._activeSinceMs,this._activeSinceMs=null;try{if(await this.flushTimeSpent(),q.totalQuestions!==void 0||q.correctQuestions!==void 0||q.xpEarned!==void 0||q.masteredUnits!==void 0||q.pctComplete!==void 0)await this._sendCompletion(q);this._ended=!0,this._ending=!1}catch($){if(this._ending=!1,X)this._activeSinceMs=z;if(this._timeEnabled)this._startHeartbeatTimer(),this._setupVisibilityHandlers();let K=$ instanceof Error?$:Error(String($));throw this.params.onError?.(K,this._errorContext("completion")),$}}async _sendCompletion(q){if(q.xpEarned===void 0)throw Error("Invalid activity completion: xpEarned is required. The SDK cannot auto-calculate XP because total elapsed time may span multiple browser sessions.");let X=new Date,z=q.totalQuestions!==void 0,$=q.correctQuestions!==void 0;if(z!==$)throw Error("Invalid activity metrics: totalQuestions and correctQuestions must be provided together.");if(z&&$&&q.correctQuestions>q.totalQuestions)throw Error("Invalid activity metrics: correctQuestions cannot exceed totalQuestions.");let K={xpEarned:q.xpEarned,...z?{totalQuestions:q.totalQuestions}:{},...$?{correctQuestions:q.correctQuestions}:{},...q.masteredUnits===void 0?{}:{masteredUnits:q.masteredUnits}},Z={id:this.params.id,name:this.params.name,course:this.params.course,runId:this.runId,endedAt:X.toISOString(),metrics:K,...q.pctComplete===void 0?{}:{pctComplete:q.pctComplete}};await this._callbacks.sendSubmit(Z)}}function R(){if(!(typeof globalThis>"u"?void 0:globalThis.fetch))return;return(X,z)=>globalThis.fetch(X,z)}function U(q){let{baseURL:X,fetch:z,canUseBeacon:$,credentials:K}=q,Z=`${X}${W.ACTIVITY_HEARTBEAT}`,H=`${X}${W.ACTIVITY_SUBMIT}`;function C(Q,G){if(!$)return!1;if(typeof navigator>"u")return!1;if(typeof navigator.sendBeacon!=="function")return!1;try{let N=new Blob([G],{type:"application/json"});return navigator.sendBeacon(Q,N)}catch{return!1}}function F(Q,G,N=!1){return z(Q,{method:"POST",headers:{"Content-Type":"application/json"},body:G,credentials:K,keepalive:N})}return{async sendHeartbeat(Q){let G=JSON.stringify(Q),N=await F(Z,G);if(!N.ok){let Y=await N.json().catch(()=>({error:{message:"Unknown error"}})),_=typeof Y.error==="object"?Y.error?.message:Y.error;throw Error(_??"Failed to send heartbeat")}},async sendHeartbeatOnPageHide(Q){let G=JSON.stringify(Q);if(C(Z,G))return;if(!(await F(Z,G,!0)).ok)throw Error("Failed to send heartbeat on page exit")},async sendSubmit(Q){let G=JSON.stringify(Q),N=await F(H,G);if(!N.ok){let Y=await N.json().catch(()=>({error:{message:"Unknown error"}})),_=typeof Y.error==="object"?Y.error?.message:Y.error;throw Error(_??"Failed to submit activity")}}}}class P{transport;_current=null;constructor(q){this.transport=U(q)}get current(){if(this._current?.isEnded)this._current=null;return this._current}start(q){if(this._current&&!this._current.isEnded)throw Error(`An activity is already active (id: "${this._current.id}"). End it before starting a new one.`);return this._current=new V(q,this.transport),this._current}}class x{getBaseURL;constructor(q){this.getBaseURL=q}signIn(){if(!j())throw Error("signIn() requires a browser environment");window.location.href=`${this.getBaseURL()}${W.IDENTITY.SIGNIN}`}}class O{getBaseURL;fetchImpl;constructor(q,X){this.getBaseURL=q;this.fetchImpl=X}async fetch(){if(!j())throw Error("user.fetch() requires a browser environment");let q=await this.fetchImpl(`${this.getBaseURL()}${W.USER.ME}`,{method:"GET",credentials:"include"});if(!q.ok){let X=await q.json().catch(()=>({error:"Unknown error"}));throw Error(X.error??"Failed to fetch user profile")}return q.json()}async verify(){if(!j())throw Error("user.verify() requires a browser environment");let q=await this.fetchImpl(`${this.getBaseURL()}${W.USER.VERIFY}`,{method:"GET",credentials:"include"});if(!q.ok){let z=await q.json().catch(()=>({error:"Unknown error"}));throw Error(z.error??"Failed to verify Timeback user")}let X=await q.json();if(X.verified&&X.timebackId)return{verified:!0,timebackId:X.timebackId};return{verified:!1}}}class D{activity;auth;user;_baseURL;_fetch;constructor(q={}){this._baseURL=q.baseURL;let X=q.fetch??R();if(!X)throw Error("TimebackClient requires a fetch implementation. Provide `fetch` in the constructor config for non-browser runtimes.");let z=q.plugins,$=Array.isArray(z)?z:z?[z]:[];this._fetch=$.reduce((K,Z)=>Z.wrapFetch(K),X),this.activity=new P({baseURL:this.baseURL,fetch:this._fetch,canUseBeacon:$.length===0,credentials:q.credentials??"include"}),this.auth=new x(()=>this.baseURL),this.user=new O(()=>this.baseURL,this._fetch)}get baseURL(){if(!this._baseURL){let q=J();if(!q)throw Error("Timeback client requires a browser environment for default baseURL. Provide an explicit baseURL for server-side usage.");this._baseURL=q}return this._baseURL}}function Wq(q={}){let X=q.baseURL??J();return new D({baseURL:X,fetch:q.fetch,plugins:q.plugins})}
2
+ export{M as a,I as b,k as c,T as d,V as e,D as f,Wq as g};
@@ -1,4 +1,4 @@
1
- import{c as P}from"./chunk-qr0bbnsr.js";import{v as c1,w as a1}from"./chunk-9se82640.js";import{M as B1,N as P1}from"./chunk-07j8zre9.js";var t=P1((Q3,T1)=>{var r={to(B,$){if(!$)return`\x1B[${B+1}G`;return`\x1B[${$+1};${B+1}H`},move(B,$){let x="";if(B<0)x+=`\x1B[${-B}D`;else if(B>0)x+=`\x1B[${B}C`;if($<0)x+=`\x1B[${-$}A`;else if($>0)x+=`\x1B[${$}B`;return x},up:(B=1)=>`\x1B[${B}A`,down:(B=1)=>`\x1B[${B}B`,forward:(B=1)=>`\x1B[${B}C`,backward:(B=1)=>`\x1B[${B}D`,nextLine:(B=1)=>"\x1B[E".repeat(B),prevLine:(B=1)=>"\x1B[F".repeat(B),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},p9={up:(B=1)=>"\x1B[S".repeat(B),down:(B=1)=>"\x1B[T".repeat(B)},l9={screen:"\x1B[2J",up:(B=1)=>"\x1B[1J".repeat(B),down:(B=1)=>"\x1B[J".repeat(B),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(B){let $="";for(let x=0;x<B;x++)$+=this.line+(x<B-1?r.up():"");if(B)$+=r.left;return $}};T1.exports={cursor:r,scroll:p9,erase:l9,beep:"\x07"}});var E1=P1((W3,e)=>{var l=process||{},y1=l.argv||[],p=l.env||{},d9=!(!!p.NO_COLOR||y1.includes("--no-color"))&&(!!p.FORCE_COLOR||y1.includes("--color")||l.platform==="win32"||(l.stdout||{}).isTTY&&p.TERM!=="dumb"||!!p.CI),D9=(B,$,x=B)=>(X)=>{let Q=""+X,W=Q.indexOf($,B.length);return~W?B+c9(Q,$,x,W)+$:B+Q+$},c9=(B,$,x,X)=>{let Q="",W=0;do Q+=B.substring(W,X)+x,W=X+$.length,X=B.indexOf($,W);while(~X);return Q+B.substring(W)},g1=(B=d9)=>{let $=B?D9:()=>String;return{isColorSupported:B,reset:$("\x1B[0m","\x1B[0m"),bold:$("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:$("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:$("\x1B[3m","\x1B[23m"),underline:$("\x1B[4m","\x1B[24m"),inverse:$("\x1B[7m","\x1B[27m"),hidden:$("\x1B[8m","\x1B[28m"),strikethrough:$("\x1B[9m","\x1B[29m"),black:$("\x1B[30m","\x1B[39m"),red:$("\x1B[31m","\x1B[39m"),green:$("\x1B[32m","\x1B[39m"),yellow:$("\x1B[33m","\x1B[39m"),blue:$("\x1B[34m","\x1B[39m"),magenta:$("\x1B[35m","\x1B[39m"),cyan:$("\x1B[36m","\x1B[39m"),white:$("\x1B[37m","\x1B[39m"),gray:$("\x1B[90m","\x1B[39m"),bgBlack:$("\x1B[40m","\x1B[49m"),bgRed:$("\x1B[41m","\x1B[49m"),bgGreen:$("\x1B[42m","\x1B[49m"),bgYellow:$("\x1B[43m","\x1B[49m"),bgBlue:$("\x1B[44m","\x1B[49m"),bgMagenta:$("\x1B[45m","\x1B[49m"),bgCyan:$("\x1B[46m","\x1B[49m"),bgWhite:$("\x1B[47m","\x1B[49m"),blackBright:$("\x1B[90m","\x1B[39m"),redBright:$("\x1B[91m","\x1B[39m"),greenBright:$("\x1B[92m","\x1B[39m"),yellowBright:$("\x1B[93m","\x1B[39m"),blueBright:$("\x1B[94m","\x1B[39m"),magentaBright:$("\x1B[95m","\x1B[39m"),cyanBright:$("\x1B[96m","\x1B[39m"),whiteBright:$("\x1B[97m","\x1B[39m"),bgBlackBright:$("\x1B[100m","\x1B[49m"),bgRedBright:$("\x1B[101m","\x1B[49m"),bgGreenBright:$("\x1B[102m","\x1B[49m"),bgYellowBright:$("\x1B[103m","\x1B[49m"),bgBlueBright:$("\x1B[104m","\x1B[49m"),bgMagentaBright:$("\x1B[105m","\x1B[49m"),bgCyanBright:$("\x1B[106m","\x1B[49m"),bgWhiteBright:$("\x1B[107m","\x1B[49m")}};e.exports=g1();e.exports.createColors=g1});import*as f from"tty";var{env:A={},argv:q1=[],platform:o1=""}=typeof process>"u"?{}:process,s1="NO_COLOR"in A||q1.includes("--no-color"),r1="FORCE_COLOR"in A||q1.includes("--color"),t1=o1==="win32",H1=A.TERM==="dumb",e1=f&&f.isatty&&f.isatty(1)&&A.TERM&&!H1,b9="CI"in A&&(("GITHUB_ACTIONS"in A)||("GITLAB_CI"in A)||("CIRCLECI"in A)),B9=!s1&&(r1||t1&&!H1||e1||b9),Y1=(B,$,x,X,Q=$.substring(0,B)+X,W=$.substring(B+x.length),b=W.indexOf(x))=>Q+(b<0?W:Y1(b,W,x,X)),$9=(B,$,x,X,Q)=>B<0?x+$+X:x+Y1(B,$,X,Q)+X,x9=(B,$,x=B,X=B.length+1)=>(Q)=>Q||!(Q===""||Q===void 0)?$9((""+Q).indexOf($,X),Q,B,$,x):"",q=(B,$,x)=>x9(`\x1B[${B}m`,`\x1B[${$}m`,x),W1={reset:q(0,0),bold:q(1,22,"\x1B[22m\x1B[1m"),dim:q(2,22,"\x1B[22m\x1B[2m"),italic:q(3,23),underline:q(4,24),inverse:q(7,27),hidden:q(8,28),strikethrough:q(9,29),black:q(30,39),red:q(31,39),green:q(32,39),yellow:q(33,39),blue:q(34,39),magenta:q(35,39),cyan:q(36,39),white:q(37,39),gray:q(90,39),bgBlack:q(40,49),bgRed:q(41,49),bgGreen:q(42,49),bgYellow:q(43,49),bgBlue:q(44,49),bgMagenta:q(45,49),bgCyan:q(46,49),bgWhite:q(47,49),blackBright:q(90,39),redBright:q(91,39),greenBright:q(92,39),yellowBright:q(93,39),blueBright:q(94,39),magentaBright:q(95,39),cyanBright:q(96,39),whiteBright:q(97,39),bgBlackBright:q(100,49),bgRedBright:q(101,49),bgGreenBright:q(102,49),bgYellowBright:q(103,49),bgBlueBright:q(104,49),bgMagentaBright:q(105,49),bgCyanBright:q(106,49),bgWhiteBright:q(107,49)},X9=({useColor:B=B9}={})=>B?W1:Object.keys(W1).reduce(($,x)=>({...$,[x]:String}),{}),{reset:Ab,bold:N,dim:w,italic:Cb,underline:Nb,inverse:wb,hidden:Pb,strikethrough:Tb,black:yb,red:g,green:Q9,yellow:O,blue:W9,magenta:gb,cyan:Eb,white:kb,gray:mb,bgBlack:Fb,bgRed:vb,bgGreen:hb,bgYellow:fb,bgBlue:pb,bgMagenta:lb,bgCyan:db,bgWhite:Db,blackBright:cb,redBright:ab,greenBright:Z1,yellowBright:ub,blueBright:ib,magentaBright:nb,cyanBright:ob,whiteBright:sb,bgBlackBright:rb,bgRedBright:tb,bgGreenBright:eb,bgYellowBright:b4,bgBlueBright:B4,bgMagentaBright:$4,bgCyanBright:x4,bgWhiteBright:X4}=X9();var q9=["playcademy.config.ts","playcademy.config.js","playcademy.config.json"];function H9(){return Promise.resolve({success:!1,error:"Playcademy config parser not yet implemented."})}function Y9(B){console.log(""),console.log(` ${g("✖")} ${N("Configuration Error")}`),console.log(""),console.log(` ${B}`),console.log(""),console.log(` ${w("Example playcademy.config.ts:")}`),console.log(""),console.log(` ${O("export default {")}`),console.log(` ${O(" name: 'My Playcademy App',")}`),console.log(` ${O(" // TODO: Define schema")}`),console.log(` ${O("}")}`),console.log("")}var c={name:"playcademy",filePatterns:q9,parse:H9,printError:Y9};import{readFile as I9}from"node:fs/promises";import{resolve as L9}from"node:path";import{homedir as J9,platform as G9}from"node:os";import{join as k}from"node:path";import{z as E}from"zod";var Z9=E.object({clientId:E.string().min(1,"Client ID is required"),clientSecret:E.string().min(1,"Client secret is required"),email:E.email("Valid email is required").optional()}),Y4=E.string().min(1,"Client ID is required").regex(/^[a-z0-9]+$/,"Client ID must contain only lowercase letters and numbers").length(26,"Client ID must be exactly 26 characters"),Z4=E.string().min(1,"Client secret is required").regex(/^[a-z0-9]+$/,"Client secret must contain only lowercase letters and numbers").max(53,"Client secret must be less than 53 characters");var J1=["staging","production"];function z9(){let B=J9();switch(G9()){case"darwin":return k(B,".timeback");case"win32":return k(process.env.APPDATA||k(B,"AppData","Roaming"),"timeback");default:return k(process.env.XDG_CONFIG_HOME||k(B,".config"),"timeback")}}var V9=z9(),O4=k(V9,"credentials.json");var R="timeback.config.json",G1="https://timeback.dev/schema.json",a="0.0.0",z1=2,V1=["$schema","name","launchUrl","sensor","defaults","courses"],K1=["subject","grade","courseCode","level","sensor","launchUrl","ids","metadata","overrides"],O1=["staging","production"],U1=["courseType","isSupplemental","isCustom","publishStatus","contactEmail","primaryApp","goals","metrics"],M1=["courseCode","level","metadata"],j1=["staging","production"],S1=["level","sensor","launchUrl","metadata"];import{existsSync as K9}from"node:fs";import{basename as I1,extname as O9,relative as U9,resolve as L1}from"node:path";import{loadConfig as M9}from"c12";function R1(B){return O9(B).toLowerCase()===".json"}async function u(B,$){if($&&!R1($))throw Error(`Config file must be JSON (.json): ${$}`);let x=await M9({cwd:B,name:"timeback",configFile:$??R,rcFile:!1,packageJson:!1,dotenv:!1,envName:!1,extend:!1,omit$Keys:!0,defaults:{},overrides:{}});if(!x.config||Object.keys(x.config).length===0)return null;let X=x.config;if("extends"in X)throw Error("The 'extends' feature is not supported in timeback.config.json. Please inline all configuration.");let{$schema:Q,...W}=X;return{config:W,configFile:x.configFile??L1(B,$??R)}}async function j9(B={}){let $=process.cwd();try{if(B.configPath&&!R1(B.configPath))return{success:!1,error:`Config file must be JSON (.json): ${B.configPath}`};if(B.configPath){let Q=L1($,B.configPath);if(!K9(Q))return{success:!1,error:`Config file not found: ${B.configPath}`}}let x=await u($,B.configPath);if(!x)return{success:!1,error:`No timeback config found. Run ${Z1("timeback init")} to create one.`};let X=P.safeParse(x.config);if(!X.success){let Q=X.error.issues.map((W)=>` - ${W.path.join(".")}: ${W.message}`).join(`
1
+ import{c as P}from"./chunk-sgcwg4j6.js";import{A as a1,z as c1}from"./chunk-txwjkpfz.js";import{Q as B1,R as P1}from"./chunk-b8649tw4.js";var t=P1((Q3,T1)=>{var r={to(B,$){if(!$)return`\x1B[${B+1}G`;return`\x1B[${$+1};${B+1}H`},move(B,$){let x="";if(B<0)x+=`\x1B[${-B}D`;else if(B>0)x+=`\x1B[${B}C`;if($<0)x+=`\x1B[${-$}A`;else if($>0)x+=`\x1B[${$}B`;return x},up:(B=1)=>`\x1B[${B}A`,down:(B=1)=>`\x1B[${B}B`,forward:(B=1)=>`\x1B[${B}C`,backward:(B=1)=>`\x1B[${B}D`,nextLine:(B=1)=>"\x1B[E".repeat(B),prevLine:(B=1)=>"\x1B[F".repeat(B),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},p9={up:(B=1)=>"\x1B[S".repeat(B),down:(B=1)=>"\x1B[T".repeat(B)},l9={screen:"\x1B[2J",up:(B=1)=>"\x1B[1J".repeat(B),down:(B=1)=>"\x1B[J".repeat(B),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(B){let $="";for(let x=0;x<B;x++)$+=this.line+(x<B-1?r.up():"");if(B)$+=r.left;return $}};T1.exports={cursor:r,scroll:p9,erase:l9,beep:"\x07"}});var E1=P1((W3,e)=>{var l=process||{},y1=l.argv||[],p=l.env||{},d9=!(!!p.NO_COLOR||y1.includes("--no-color"))&&(!!p.FORCE_COLOR||y1.includes("--color")||l.platform==="win32"||(l.stdout||{}).isTTY&&p.TERM!=="dumb"||!!p.CI),D9=(B,$,x=B)=>(X)=>{let Q=""+X,W=Q.indexOf($,B.length);return~W?B+c9(Q,$,x,W)+$:B+Q+$},c9=(B,$,x,X)=>{let Q="",W=0;do Q+=B.substring(W,X)+x,W=X+$.length,X=B.indexOf($,W);while(~X);return Q+B.substring(W)},g1=(B=d9)=>{let $=B?D9:()=>String;return{isColorSupported:B,reset:$("\x1B[0m","\x1B[0m"),bold:$("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:$("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:$("\x1B[3m","\x1B[23m"),underline:$("\x1B[4m","\x1B[24m"),inverse:$("\x1B[7m","\x1B[27m"),hidden:$("\x1B[8m","\x1B[28m"),strikethrough:$("\x1B[9m","\x1B[29m"),black:$("\x1B[30m","\x1B[39m"),red:$("\x1B[31m","\x1B[39m"),green:$("\x1B[32m","\x1B[39m"),yellow:$("\x1B[33m","\x1B[39m"),blue:$("\x1B[34m","\x1B[39m"),magenta:$("\x1B[35m","\x1B[39m"),cyan:$("\x1B[36m","\x1B[39m"),white:$("\x1B[37m","\x1B[39m"),gray:$("\x1B[90m","\x1B[39m"),bgBlack:$("\x1B[40m","\x1B[49m"),bgRed:$("\x1B[41m","\x1B[49m"),bgGreen:$("\x1B[42m","\x1B[49m"),bgYellow:$("\x1B[43m","\x1B[49m"),bgBlue:$("\x1B[44m","\x1B[49m"),bgMagenta:$("\x1B[45m","\x1B[49m"),bgCyan:$("\x1B[46m","\x1B[49m"),bgWhite:$("\x1B[47m","\x1B[49m"),blackBright:$("\x1B[90m","\x1B[39m"),redBright:$("\x1B[91m","\x1B[39m"),greenBright:$("\x1B[92m","\x1B[39m"),yellowBright:$("\x1B[93m","\x1B[39m"),blueBright:$("\x1B[94m","\x1B[39m"),magentaBright:$("\x1B[95m","\x1B[39m"),cyanBright:$("\x1B[96m","\x1B[39m"),whiteBright:$("\x1B[97m","\x1B[39m"),bgBlackBright:$("\x1B[100m","\x1B[49m"),bgRedBright:$("\x1B[101m","\x1B[49m"),bgGreenBright:$("\x1B[102m","\x1B[49m"),bgYellowBright:$("\x1B[103m","\x1B[49m"),bgBlueBright:$("\x1B[104m","\x1B[49m"),bgMagentaBright:$("\x1B[105m","\x1B[49m"),bgCyanBright:$("\x1B[106m","\x1B[49m"),bgWhiteBright:$("\x1B[107m","\x1B[49m")}};e.exports=g1();e.exports.createColors=g1});import*as f from"tty";var{env:A={},argv:q1=[],platform:o1=""}=typeof process>"u"?{}:process,s1="NO_COLOR"in A||q1.includes("--no-color"),r1="FORCE_COLOR"in A||q1.includes("--color"),t1=o1==="win32",H1=A.TERM==="dumb",e1=f&&f.isatty&&f.isatty(1)&&A.TERM&&!H1,b9="CI"in A&&(("GITHUB_ACTIONS"in A)||("GITLAB_CI"in A)||("CIRCLECI"in A)),B9=!s1&&(r1||t1&&!H1||e1||b9),Y1=(B,$,x,X,Q=$.substring(0,B)+X,W=$.substring(B+x.length),b=W.indexOf(x))=>Q+(b<0?W:Y1(b,W,x,X)),$9=(B,$,x,X,Q)=>B<0?x+$+X:x+Y1(B,$,X,Q)+X,x9=(B,$,x=B,X=B.length+1)=>(Q)=>Q||!(Q===""||Q===void 0)?$9((""+Q).indexOf($,X),Q,B,$,x):"",q=(B,$,x)=>x9(`\x1B[${B}m`,`\x1B[${$}m`,x),W1={reset:q(0,0),bold:q(1,22,"\x1B[22m\x1B[1m"),dim:q(2,22,"\x1B[22m\x1B[2m"),italic:q(3,23),underline:q(4,24),inverse:q(7,27),hidden:q(8,28),strikethrough:q(9,29),black:q(30,39),red:q(31,39),green:q(32,39),yellow:q(33,39),blue:q(34,39),magenta:q(35,39),cyan:q(36,39),white:q(37,39),gray:q(90,39),bgBlack:q(40,49),bgRed:q(41,49),bgGreen:q(42,49),bgYellow:q(43,49),bgBlue:q(44,49),bgMagenta:q(45,49),bgCyan:q(46,49),bgWhite:q(47,49),blackBright:q(90,39),redBright:q(91,39),greenBright:q(92,39),yellowBright:q(93,39),blueBright:q(94,39),magentaBright:q(95,39),cyanBright:q(96,39),whiteBright:q(97,39),bgBlackBright:q(100,49),bgRedBright:q(101,49),bgGreenBright:q(102,49),bgYellowBright:q(103,49),bgBlueBright:q(104,49),bgMagentaBright:q(105,49),bgCyanBright:q(106,49),bgWhiteBright:q(107,49)},X9=({useColor:B=B9}={})=>B?W1:Object.keys(W1).reduce(($,x)=>({...$,[x]:String}),{}),{reset:Ab,bold:N,dim:w,italic:Cb,underline:Nb,inverse:wb,hidden:Pb,strikethrough:Tb,black:yb,red:g,green:Q9,yellow:O,blue:W9,magenta:gb,cyan:Eb,white:kb,gray:mb,bgBlack:Fb,bgRed:vb,bgGreen:hb,bgYellow:fb,bgBlue:pb,bgMagenta:lb,bgCyan:db,bgWhite:Db,blackBright:cb,redBright:ab,greenBright:Z1,yellowBright:ub,blueBright:ib,magentaBright:nb,cyanBright:ob,whiteBright:sb,bgBlackBright:rb,bgRedBright:tb,bgGreenBright:eb,bgYellowBright:b4,bgBlueBright:B4,bgMagentaBright:$4,bgCyanBright:x4,bgWhiteBright:X4}=X9();var q9=["playcademy.config.ts","playcademy.config.js","playcademy.config.json"];function H9(){return Promise.resolve({success:!1,error:"Playcademy config parser not yet implemented."})}function Y9(B){console.log(""),console.log(` ${g("✖")} ${N("Configuration Error")}`),console.log(""),console.log(` ${B}`),console.log(""),console.log(` ${w("Example playcademy.config.ts:")}`),console.log(""),console.log(` ${O("export default {")}`),console.log(` ${O(" name: 'My Playcademy App',")}`),console.log(` ${O(" // TODO: Define schema")}`),console.log(` ${O("}")}`),console.log("")}var c={name:"playcademy",filePatterns:q9,parse:H9,printError:Y9};import{readFile as I9}from"node:fs/promises";import{resolve as L9}from"node:path";import{homedir as J9,platform as G9}from"node:os";import{join as k}from"node:path";import{z as E}from"zod";var Z9=E.object({clientId:E.string().min(1,"Client ID is required"),clientSecret:E.string().min(1,"Client secret is required"),email:E.email("Valid email is required").optional()}),Y4=E.string().min(1,"Client ID is required").regex(/^[a-z0-9]+$/,"Client ID must contain only lowercase letters and numbers").length(26,"Client ID must be exactly 26 characters"),Z4=E.string().min(1,"Client secret is required").regex(/^[a-z0-9]+$/,"Client secret must contain only lowercase letters and numbers").max(53,"Client secret must be less than 53 characters");var J1=["staging","production"];function z9(){let B=J9();switch(G9()){case"darwin":return k(B,".timeback");case"win32":return k(process.env.APPDATA||k(B,"AppData","Roaming"),"timeback");default:return k(process.env.XDG_CONFIG_HOME||k(B,".config"),"timeback")}}var V9=z9(),O4=k(V9,"credentials.json");var R="timeback.config.json",G1="https://timeback.dev/schema.json",a="0.0.0",z1=2,V1=["$schema","name","launchUrl","sensor","defaults","courses"],K1=["subject","grade","courseCode","level","sensor","launchUrl","ids","metadata","overrides"],O1=["staging","production"],U1=["courseType","isSupplemental","isCustom","publishStatus","contactEmail","primaryApp","goals","metrics"],M1=["courseCode","level","metadata"],j1=["staging","production"],S1=["level","sensor","launchUrl","metadata"];import{existsSync as K9}from"node:fs";import{basename as I1,extname as O9,relative as U9,resolve as L1}from"node:path";import{loadConfig as M9}from"c12";function R1(B){return O9(B).toLowerCase()===".json"}async function u(B,$){if($&&!R1($))throw Error(`Config file must be JSON (.json): ${$}`);let x=await M9({cwd:B,name:"timeback",configFile:$??R,rcFile:!1,packageJson:!1,dotenv:!1,envName:!1,extend:!1,omit$Keys:!0,defaults:{},overrides:{}});if(!x.config||Object.keys(x.config).length===0)return null;let X=x.config;if("extends"in X)throw Error("The 'extends' feature is not supported in timeback.config.json. Please inline all configuration.");let{$schema:Q,...W}=X;return{config:W,configFile:x.configFile??L1(B,$??R)}}async function j9(B={}){let $=process.cwd();try{if(B.configPath&&!R1(B.configPath))return{success:!1,error:`Config file must be JSON (.json): ${B.configPath}`};if(B.configPath){let Q=L1($,B.configPath);if(!K9(Q))return{success:!1,error:`Config file not found: ${B.configPath}`}}let x=await u($,B.configPath);if(!x)return{success:!1,error:`No timeback config found. Run ${Z1("timeback init")} to create one.`};let X=P.safeParse(x.config);if(!X.success){let Q=X.error.issues.map((W)=>` - ${W.path.join(".")}: ${W.message}`).join(`
2
2
  `);return{success:!1,error:`Invalid config in ${I1(x.configFile)}:
3
3
  ${Q}`}}return{success:!0,config:X.data,configPath:x.configFile}}catch(x){return{success:!1,error:`Failed to load ${B.configPath?I1(B.configPath):R}:
4
4
  ${x instanceof Error?x.message:String(x)}`}}}function S9(B){return U9(process.cwd(),B)}var R9=[R];function _9(B){let $={staging:[],production:[]};for(let x of J1)$[x]=B.courses.map((X)=>X.ids?.[x]).filter((X)=>!!X);return $}async function A9(B){try{let $=L9(B,"package.json");return JSON.parse(await I9($,"utf-8")).version??a}catch{return a}}async function C9(){let B=process.cwd();try{let $=await u(B);if(!$)return{success:!1,error:`No timeback config found. Create ${R}`};let x=P.safeParse($.config);if(!x.success){let W=x.error.issues.map((b)=>` - ${b.path.join(".")}: ${b.message}`).join(`
@@ -1,2 +1,2 @@
1
1
  import{createRequire as k}from"node:module";var g=Object.create;var{getPrototypeOf:h,defineProperty:f,getOwnPropertyNames:i}=Object;var j=Object.prototype.hasOwnProperty;var l=(a,b,c)=>{c=a!=null?g(h(a)):{};let d=b||!a||!a.__esModule?f(c,"default",{value:a,enumerable:!0}):c;for(let e of i(a))if(!j.call(d,e))f(d,e,{get:()=>a[e],enumerable:!0});return d};var m=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var o=k(import.meta.url);
2
- export{l as M,m as N,o as O};
2
+ export{l as Q,m as R,o as S};