@happ-cli/sdk 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -27,6 +27,22 @@ export interface EvalResult {
27
27
  remaining?: number;
28
28
  effectiveSubscriberId?: string;
29
29
  }
30
+ export interface SubscribeOptions {
31
+ /** The subscriber's email address — stored in Happ for identification in the dashboard. */
32
+ email?: string;
33
+ }
34
+ export interface IdentifyOptions {
35
+ /** The subscriber's email address — updates or sets the email on their Happ record. */
36
+ email?: string;
37
+ }
38
+ export interface SubscriptionInfo {
39
+ /** The plan key as defined in happ.config.yaml (e.g. "free", "pro"). */
40
+ planKey: string;
41
+ /** The human-readable plan name (e.g. "Free", "Pro"). */
42
+ planName: string;
43
+ /** Subscription status — typically "active". */
44
+ status: string;
45
+ }
30
46
  /** Human-readable denial messages keyed by reason code from the Happ API. */
31
47
  export declare const DENIAL_MESSAGES: Record<string, string>;
32
48
  export declare class HappClient {
@@ -45,6 +61,30 @@ export declare class HappClient {
45
61
  * Fire-and-forget — never throws or blocks the response.
46
62
  */
47
63
  increment(featureKey: string, subscriberId: string): Promise<void>;
64
+ /**
65
+ * Provision a subscriber onto a plan.
66
+ * Call this after a user signs up or upgrades in your app.
67
+ * Fire-and-forget — never throws or blocks the response.
68
+ *
69
+ * @param subscriberId Your app's user ID (stable, opaque)
70
+ * @param planKey The Happ plan key (e.g. "free", "pro")
71
+ * @param options Optional metadata — `email` surfaces in the Happ dashboard
72
+ */
73
+ subscribe(subscriberId: string, planKey: string, options?: SubscribeOptions): Promise<void>;
74
+ /**
75
+ * Associate metadata (e.g. email) with an existing subscriber.
76
+ * Call this on sign-in so the Happ dashboard shows recognisable identities.
77
+ * Fire-and-forget — never throws or blocks the response.
78
+ *
79
+ * @param subscriberId Your app's user ID
80
+ * @param options Metadata to attach — `email` surfaces in the Happ dashboard
81
+ */
82
+ identify(subscriberId: string, options?: IdentifyOptions): Promise<void>;
83
+ /**
84
+ * Fetch the active subscription for a subscriber.
85
+ * Returns `null` if the subscriber has no active subscription or the API is unreachable.
86
+ */
87
+ getSubscription(subscriberId: string): Promise<SubscriptionInfo | null>;
48
88
  }
49
89
  /** Create a Happ client. Options default to HAPP_API_URL and HAPP_API_KEY env vars. */
50
90
  export declare function createHappClient(options?: HappClientOptions): HappClient;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,6EAA6E;AAC7E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMlD,CAAA;AAID,qBAAa,UAAU;IACrB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACjC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAErB,OAAO,GAAE,iBAAsB;IAK3C,oDAAoD;IACpD,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAW1E;;;OAGG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAYzE;;;OAGG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWzE;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAA;CACf;AAED,6EAA6E;AAC7E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMlD,CAAA;AAID,qBAAa,UAAU;IACrB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACjC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAErB,OAAO,GAAE,iBAAsB;IAK3C,oDAAoD;IACpD,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAW1E;;;OAGG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAYzE;;;OAGG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxE;;;;;;;;OAQG;IACG,SAAS,CACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAgBhB;;;;;;;OAOG;IACG,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAahB;;;OAGG;IACG,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAgB9E;AAED,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE"}
package/dist/index.js CHANGED
@@ -72,6 +72,73 @@ export class HappClient {
72
72
  // intentionally swallowed — usage tracking must never block the user
73
73
  }
74
74
  }
75
+ /**
76
+ * Provision a subscriber onto a plan.
77
+ * Call this after a user signs up or upgrades in your app.
78
+ * Fire-and-forget — never throws or blocks the response.
79
+ *
80
+ * @param subscriberId Your app's user ID (stable, opaque)
81
+ * @param planKey The Happ plan key (e.g. "free", "pro")
82
+ * @param options Optional metadata — `email` surfaces in the Happ dashboard
83
+ */
84
+ async subscribe(subscriberId, planKey, options = {}) {
85
+ try {
86
+ await this.request("/api/subscriptions", {
87
+ method: "PUT",
88
+ headers: { "Content-Type": "application/json" },
89
+ body: JSON.stringify({
90
+ subscriberId,
91
+ planKey,
92
+ ...(options.email ? { subscriberEmail: options.email } : {}),
93
+ }),
94
+ });
95
+ }
96
+ catch {
97
+ // intentionally swallowed — provisioning failure must never block signup
98
+ }
99
+ }
100
+ /**
101
+ * Associate metadata (e.g. email) with an existing subscriber.
102
+ * Call this on sign-in so the Happ dashboard shows recognisable identities.
103
+ * Fire-and-forget — never throws or blocks the response.
104
+ *
105
+ * @param subscriberId Your app's user ID
106
+ * @param options Metadata to attach — `email` surfaces in the Happ dashboard
107
+ */
108
+ async identify(subscriberId, options = {}) {
109
+ if (!options.email)
110
+ return; // nothing to send
111
+ try {
112
+ await this.request(`/api/subscriptions/${encodeURIComponent(subscriberId)}`, {
113
+ method: "PATCH",
114
+ headers: { "Content-Type": "application/json" },
115
+ body: JSON.stringify({ subscriberEmail: options.email }),
116
+ });
117
+ }
118
+ catch {
119
+ // intentionally swallowed — identify must never block sign-in
120
+ }
121
+ }
122
+ /**
123
+ * Fetch the active subscription for a subscriber.
124
+ * Returns `null` if the subscriber has no active subscription or the API is unreachable.
125
+ */
126
+ async getSubscription(subscriberId) {
127
+ try {
128
+ const res = await this.request(`/api/subscriptions/${encodeURIComponent(subscriberId)}`);
129
+ if (!res.ok)
130
+ return null;
131
+ const data = await res.json();
132
+ return {
133
+ planKey: data.plan.key,
134
+ planName: data.plan.name,
135
+ status: data.status,
136
+ };
137
+ }
138
+ catch {
139
+ return null;
140
+ }
141
+ }
75
142
  }
76
143
  /** Create a Happ client. Options default to HAPP_API_URL and HAPP_API_KEY env vars. */
77
144
  export function createHappClient(options) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,eAAe,GAAG,sCAAsC,CAAA;AAkB9D,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,cAAc,EAAQ,8DAA8D;IACpF,eAAe,EAAO,+BAA+B;IACrD,WAAW,EAAW,oDAAoD;IAC1E,gBAAgB,EAAM,oCAAoC;IAC1D,oBAAoB,EAAE,gCAAgC;CACvD,CAAA;AAED,iFAAiF;AAEjF,MAAM,OAAO,UAAU;IAIrB,YAAY,UAA6B,EAAE;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,eAAe,CAAA;QAC9E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;IACnE,CAAC;IAED,oDAAoD;IAC1C,OAAO,CAAC,IAAY,EAAE,OAAoB,EAAE;QACpD,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YACpC,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACtC,GAAG,IAAI,CAAC,OAAO;aAChB;YACD,KAAK,EAAE,UAA0B;SAClC,CAAC,CAAA;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,YAAoB;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAC5B,aAAa,UAAU,iBAAiB,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAC3E,CAAA;YACD,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA,CAAC,yBAAyB;YAC/D,OAAO,GAAG,CAAC,IAAI,EAAyB,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA,CAAC,6BAA6B;QACxD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,YAAoB;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,UAAU,YAAY,EAAE;gBACtD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;aACvC,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;IACH,CAAC;CACF;AAED,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,OAA2B;IAC1D,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happ-cli/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Happ feature entitlement SDK — framework-agnostic core",
5
5
  "license": "MIT",
6
6
  "type": "module",