@contractspec/example.integration-posthog 1.57.0 → 1.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.turbo/turbo-build.log +34 -33
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +13 -0
  4. package/dist/browser/docs/index.js +50 -0
  5. package/dist/browser/docs/integration-posthog.docblock.js +50 -0
  6. package/dist/browser/example.js +33 -0
  7. package/dist/browser/index.js +358 -0
  8. package/dist/browser/posthog.js +276 -0
  9. package/dist/browser/run.js +280 -0
  10. package/dist/docs/index.d.ts +2 -1
  11. package/dist/docs/index.d.ts.map +1 -0
  12. package/dist/docs/index.js +51 -1
  13. package/dist/docs/integration-posthog.docblock.d.ts +2 -1
  14. package/dist/docs/integration-posthog.docblock.d.ts.map +1 -0
  15. package/dist/docs/integration-posthog.docblock.js +25 -29
  16. package/dist/example.d.ts +2 -6
  17. package/dist/example.d.ts.map +1 -1
  18. package/dist/example.js +32 -43
  19. package/dist/index.d.ts +4 -3
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +358 -4
  22. package/dist/node/docs/index.js +50 -0
  23. package/dist/node/docs/integration-posthog.docblock.js +50 -0
  24. package/dist/node/example.js +33 -0
  25. package/dist/node/index.js +358 -0
  26. package/dist/node/posthog.js +276 -0
  27. package/dist/node/run.js +280 -0
  28. package/dist/posthog.d.ts +13 -17
  29. package/dist/posthog.d.ts.map +1 -1
  30. package/dist/posthog.js +241 -188
  31. package/dist/run.d.ts +2 -1
  32. package/dist/run.d.ts.map +1 -0
  33. package/dist/run.js +277 -8
  34. package/package.json +69 -26
  35. package/tsdown.config.js +1 -2
  36. package/.turbo/turbo-build$colon$bundle.log +0 -33
  37. package/dist/docs/integration-posthog.docblock.js.map +0 -1
  38. package/dist/example.js.map +0 -1
  39. package/dist/posthog.js.map +0 -1
  40. package/dist/run.js.map +0 -1
  41. package/tsconfig.tsbuildinfo +0 -1
package/dist/posthog.js CHANGED
@@ -1,224 +1,277 @@
1
+ // @bun
2
+ // src/posthog.ts
1
3
  import { PosthogAnalyticsProvider } from "@contractspec/integration.providers-impls/impls/posthog";
2
-
3
- //#region src/posthog.ts
4
4
  async function runPosthogExampleFromEnv() {
5
- const mode = resolvePosthogMode();
6
- const dryRun = resolveBooleanEnv("CONTRACTSPEC_POSTHOG_DRY_RUN", true);
7
- const allowWrites = resolveBooleanEnv("CONTRACTSPEC_POSTHOG_ALLOW_WRITES", false);
8
- const output = {
9
- mode,
10
- dryRun,
11
- allowWrites
12
- };
13
- if (dryRun) {
14
- if (mode === "capture" || mode === "all") output.capture = buildCapturePreview();
15
- if (mode === "query" || mode === "all") output.query = { query: buildHogQLQuery() };
16
- if (mode === "request" || mode === "all") output.request = buildRequestPreview();
17
- if (mode === "read" || mode === "all") output.read = buildReadPreview();
18
- if (process.env.POSTHOG_MCP_URL) output.mcp = buildMcpPreview();
19
- return output;
20
- }
21
- const provider = createProviderFromEnv();
22
- if (mode === "capture" || mode === "all") output.capture = await runCapture(provider, allowWrites);
23
- if (mode === "query" || mode === "all") output.query = await runHogQLQuery(provider);
24
- if (mode === "request" || mode === "all") output.request = await runApiRequests(provider, allowWrites);
25
- if (mode === "read" || mode === "all") output.read = await runReadOperations(provider);
26
- if (process.env.POSTHOG_MCP_URL) output.mcp = await runMcpToolCall(provider);
27
- return output;
5
+ const mode = resolvePosthogMode();
6
+ const dryRun = resolveBooleanEnv("CONTRACTSPEC_POSTHOG_DRY_RUN", true);
7
+ const allowWrites = resolveBooleanEnv("CONTRACTSPEC_POSTHOG_ALLOW_WRITES", false);
8
+ const output = { mode, dryRun, allowWrites };
9
+ if (dryRun) {
10
+ if (mode === "capture" || mode === "all") {
11
+ output.capture = buildCapturePreview();
12
+ }
13
+ if (mode === "query" || mode === "all") {
14
+ output.query = { query: buildHogQLQuery() };
15
+ }
16
+ if (mode === "request" || mode === "all") {
17
+ output.request = buildRequestPreview();
18
+ }
19
+ if (mode === "read" || mode === "all") {
20
+ output.read = buildReadPreview();
21
+ }
22
+ if (process.env.POSTHOG_MCP_URL) {
23
+ output.mcp = buildMcpPreview();
24
+ }
25
+ return output;
26
+ }
27
+ const provider = createProviderFromEnv();
28
+ if (mode === "capture" || mode === "all") {
29
+ output.capture = await runCapture(provider, allowWrites);
30
+ }
31
+ if (mode === "query" || mode === "all") {
32
+ output.query = await runHogQLQuery(provider);
33
+ }
34
+ if (mode === "request" || mode === "all") {
35
+ output.request = await runApiRequests(provider, allowWrites);
36
+ }
37
+ if (mode === "read" || mode === "all") {
38
+ output.read = await runReadOperations(provider);
39
+ }
40
+ if (process.env.POSTHOG_MCP_URL) {
41
+ output.mcp = await runMcpToolCall(provider);
42
+ }
43
+ return output;
28
44
  }
29
45
  function resolvePosthogMode() {
30
- const raw = (process.env.CONTRACTSPEC_POSTHOG_MODE ?? "all").toLowerCase();
31
- if (raw === "capture" || raw === "query" || raw === "request" || raw === "read" || raw === "all") return raw;
32
- throw new Error(`Unsupported CONTRACTSPEC_POSTHOG_MODE: ${raw}. Use capture, query, request, read, or all.`);
46
+ const raw = (process.env.CONTRACTSPEC_POSTHOG_MODE ?? "all").toLowerCase();
47
+ if (raw === "capture" || raw === "query" || raw === "request" || raw === "read" || raw === "all") {
48
+ return raw;
49
+ }
50
+ throw new Error(`Unsupported CONTRACTSPEC_POSTHOG_MODE: ${raw}. Use capture, query, request, read, or all.`);
33
51
  }
34
52
  function createProviderFromEnv() {
35
- return new PosthogAnalyticsProvider({
36
- host: process.env.POSTHOG_HOST,
37
- projectId: process.env.POSTHOG_PROJECT_ID,
38
- projectApiKey: process.env.POSTHOG_PROJECT_API_KEY,
39
- personalApiKey: process.env.POSTHOG_PERSONAL_API_KEY,
40
- mcpUrl: process.env.POSTHOG_MCP_URL,
41
- requestTimeoutMs: 1e4
42
- });
53
+ return new PosthogAnalyticsProvider({
54
+ host: process.env.POSTHOG_HOST,
55
+ projectId: process.env.POSTHOG_PROJECT_ID,
56
+ projectApiKey: process.env.POSTHOG_PROJECT_API_KEY,
57
+ personalApiKey: process.env.POSTHOG_PERSONAL_API_KEY,
58
+ mcpUrl: process.env.POSTHOG_MCP_URL,
59
+ requestTimeoutMs: 1e4
60
+ });
43
61
  }
44
62
  async function runCapture(provider, allowWrites) {
45
- if (!allowWrites) return {
46
- skipped: true,
47
- reason: "Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to enable capture."
48
- };
49
- const event = buildCaptureEvent();
50
- if (provider.identify) await provider.identify({
51
- distinctId: event.distinctId,
52
- properties: {
53
- plan: "pro",
54
- source: "contractspec-example"
55
- }
56
- });
57
- await provider.capture(event);
58
- return {
59
- captured: true,
60
- event
61
- };
63
+ if (!allowWrites) {
64
+ return {
65
+ skipped: true,
66
+ reason: "Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to enable capture."
67
+ };
68
+ }
69
+ const event = buildCaptureEvent();
70
+ if (provider.identify) {
71
+ await provider.identify({
72
+ distinctId: event.distinctId,
73
+ properties: { plan: "pro", source: "contractspec-example" }
74
+ });
75
+ }
76
+ await provider.capture(event);
77
+ return { captured: true, event };
62
78
  }
63
79
  async function runHogQLQuery(provider) {
64
- if (!provider.queryHogQL) throw new Error("Analytics provider does not support HogQL queries.");
65
- const query = buildHogQLQuery();
66
- return provider.queryHogQL({ query });
80
+ if (!provider.queryHogQL) {
81
+ throw new Error("Analytics provider does not support HogQL queries.");
82
+ }
83
+ const query = buildHogQLQuery();
84
+ return provider.queryHogQL({ query });
67
85
  }
68
86
  async function runApiRequests(provider, allowWrites) {
69
- const projectId = requireEnv("POSTHOG_PROJECT_ID");
70
- const listRequest = {
71
- method: "GET",
72
- path: `/api/projects/${projectId}/feature_flags/`,
73
- query: { limit: 5 }
74
- };
75
- const output = { list: (await provider.request(listRequest)).data };
76
- if (!allowWrites) {
77
- output.writeGuard = "Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to create/delete feature flags.";
78
- return output;
79
- }
80
- const flagKey = `contractspec-example-${Date.now()}`;
81
- const createResponse = await provider.request({
82
- method: "POST",
83
- path: `/api/projects/${projectId}/feature_flags/`,
84
- body: {
85
- name: "ContractSpec Example Flag",
86
- key: flagKey,
87
- active: true,
88
- filters: { groups: [{
89
- properties: [],
90
- rollout_percentage: 100
91
- }] }
92
- }
93
- });
94
- output.created = createResponse.data;
95
- const createdId = extractId(createResponse);
96
- if (createdId) output.deleted = (await provider.request({
97
- method: "DELETE",
98
- path: `/api/projects/${projectId}/feature_flags/${createdId}`
99
- })).status;
100
- else output.deleted = "Skipped delete: response did not include an id.";
101
- return output;
87
+ const projectId = requireEnv("POSTHOG_PROJECT_ID");
88
+ const listRequest = {
89
+ method: "GET",
90
+ path: `/api/projects/${projectId}/feature_flags/`,
91
+ query: { limit: 5 }
92
+ };
93
+ const listResponse = await provider.request(listRequest);
94
+ const output = {
95
+ list: listResponse.data
96
+ };
97
+ if (!allowWrites) {
98
+ output.writeGuard = "Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to create/delete feature flags.";
99
+ return output;
100
+ }
101
+ const flagKey = `contractspec-example-${Date.now()}`;
102
+ const createResponse = await provider.request({
103
+ method: "POST",
104
+ path: `/api/projects/${projectId}/feature_flags/`,
105
+ body: {
106
+ name: "ContractSpec Example Flag",
107
+ key: flagKey,
108
+ active: true,
109
+ filters: {
110
+ groups: [
111
+ {
112
+ properties: [],
113
+ rollout_percentage: 100
114
+ }
115
+ ]
116
+ }
117
+ }
118
+ });
119
+ output.created = createResponse.data;
120
+ const createdId = extractId(createResponse);
121
+ if (createdId) {
122
+ const deleteResponse = await provider.request({
123
+ method: "DELETE",
124
+ path: `/api/projects/${projectId}/feature_flags/${createdId}`
125
+ });
126
+ output.deleted = deleteResponse.status;
127
+ } else {
128
+ output.deleted = "Skipped delete: response did not include an id.";
129
+ }
130
+ return output;
102
131
  }
103
132
  async function runReadOperations(provider) {
104
- const now = /* @__PURE__ */ new Date();
105
- const from = /* @__PURE__ */ new Date(now.getTime() - 1440 * 60 * 1e3);
106
- const dateRange = {
107
- from,
108
- to: now
109
- };
110
- const output = { window: {
111
- from: from.toISOString(),
112
- to: now.toISOString()
113
- } };
114
- if (provider.getEvents) output.events = await provider.getEvents({
115
- dateRange,
116
- limit: 5
117
- });
118
- else output.events = "Provider does not support getEvents.";
119
- if (provider.getPersons) output.persons = await provider.getPersons({ limit: 5 });
120
- else output.persons = "Provider does not support getPersons.";
121
- if (provider.getInsights) output.insights = await provider.getInsights({ limit: 5 });
122
- else output.insights = "Provider does not support getInsights.";
123
- if (provider.getFeatureFlags) output.featureFlags = await provider.getFeatureFlags({ limit: 5 });
124
- else output.featureFlags = "Provider does not support getFeatureFlags.";
125
- return output;
133
+ const now = new Date;
134
+ const from = new Date(now.getTime() - 24 * 60 * 60 * 1000);
135
+ const dateRange = { from, to: now };
136
+ const output = {
137
+ window: { from: from.toISOString(), to: now.toISOString() }
138
+ };
139
+ if (provider.getEvents) {
140
+ output.events = await provider.getEvents({ dateRange, limit: 5 });
141
+ } else {
142
+ output.events = "Provider does not support getEvents.";
143
+ }
144
+ if (provider.getPersons) {
145
+ output.persons = await provider.getPersons({ limit: 5 });
146
+ } else {
147
+ output.persons = "Provider does not support getPersons.";
148
+ }
149
+ if (provider.getInsights) {
150
+ output.insights = await provider.getInsights({ limit: 5 });
151
+ } else {
152
+ output.insights = "Provider does not support getInsights.";
153
+ }
154
+ if (provider.getFeatureFlags) {
155
+ output.featureFlags = await provider.getFeatureFlags({ limit: 5 });
156
+ } else {
157
+ output.featureFlags = "Provider does not support getFeatureFlags.";
158
+ }
159
+ return output;
126
160
  }
127
161
  async function runMcpToolCall(provider) {
128
- if (!provider.callMcpTool) throw new Error("Analytics provider does not support MCP tool calls.");
129
- const name = process.env.POSTHOG_MCP_TOOL_NAME ?? "posthog.query";
130
- const argumentsValue = parseOptionalJsonEnv("POSTHOG_MCP_TOOL_ARGS", { query: buildHogQLQuery() });
131
- return provider.callMcpTool({
132
- name,
133
- arguments: argumentsValue
134
- });
162
+ if (!provider.callMcpTool) {
163
+ throw new Error("Analytics provider does not support MCP tool calls.");
164
+ }
165
+ const name = process.env.POSTHOG_MCP_TOOL_NAME ?? "posthog.query";
166
+ const argumentsValue = parseOptionalJsonEnv("POSTHOG_MCP_TOOL_ARGS", {
167
+ query: buildHogQLQuery()
168
+ });
169
+ return provider.callMcpTool({ name, arguments: argumentsValue });
135
170
  }
136
171
  function buildCaptureEvent() {
137
- return {
138
- distinctId: process.env.POSTHOG_DISTINCT_ID ?? "contractspec-demo",
139
- event: process.env.POSTHOG_EVENT_NAME ?? "contractspec.example.event",
140
- properties: {
141
- source: "contractspec-example",
142
- environment: process.env.NODE_ENV ?? "development"
143
- },
144
- timestamp: /* @__PURE__ */ new Date()
145
- };
172
+ const distinctId = process.env.POSTHOG_DISTINCT_ID ?? "contractspec-demo";
173
+ const event = process.env.POSTHOG_EVENT_NAME ?? "contractspec.example.event";
174
+ return {
175
+ distinctId,
176
+ event,
177
+ properties: {
178
+ source: "contractspec-example",
179
+ environment: "development"
180
+ },
181
+ timestamp: new Date
182
+ };
146
183
  }
147
184
  function buildHogQLQuery() {
148
- return "select event, count() as count from events where timestamp >= now() - interval 1 day group by event order by count desc limit 5";
185
+ return "select event, count() as count " + "from events " + "where timestamp >= now() - interval 1 day " + "group by event " + "order by count desc " + "limit 5";
149
186
  }
150
187
  function buildCapturePreview() {
151
- return {
152
- event: buildCaptureEvent(),
153
- hint: "Dry run enabled. Set CONTRACTSPEC_POSTHOG_DRY_RUN=false."
154
- };
188
+ return {
189
+ event: buildCaptureEvent(),
190
+ hint: "Dry run enabled. Set CONTRACTSPEC_POSTHOG_DRY_RUN=false."
191
+ };
155
192
  }
156
193
  function buildRequestPreview() {
157
- const projectId = process.env.POSTHOG_PROJECT_ID ?? "PROJECT_ID";
158
- return {
159
- listRequest: {
160
- method: "GET",
161
- path: `/api/projects/${projectId}/feature_flags/`,
162
- query: { limit: 5 }
163
- },
164
- writeRequests: {
165
- create: {
166
- method: "POST",
167
- path: `/api/projects/${projectId}/feature_flags/`
168
- },
169
- delete: {
170
- method: "DELETE",
171
- path: `/api/projects/${projectId}/feature_flags/{id}`
172
- }
173
- }
174
- };
194
+ const projectId = process.env.POSTHOG_PROJECT_ID ?? "PROJECT_ID";
195
+ return {
196
+ listRequest: {
197
+ method: "GET",
198
+ path: `/api/projects/${projectId}/feature_flags/`,
199
+ query: { limit: 5 }
200
+ },
201
+ writeRequests: {
202
+ create: {
203
+ method: "POST",
204
+ path: `/api/projects/${projectId}/feature_flags/`
205
+ },
206
+ delete: {
207
+ method: "DELETE",
208
+ path: `/api/projects/${projectId}/feature_flags/{id}`
209
+ }
210
+ }
211
+ };
175
212
  }
176
213
  function buildReadPreview() {
177
- return {
178
- events: {
179
- dateRange: "last_24_hours",
180
- limit: 5
181
- },
182
- persons: { limit: 5 },
183
- insights: { limit: 5 },
184
- featureFlags: { limit: 5 }
185
- };
214
+ return {
215
+ events: {
216
+ dateRange: "last_24_hours",
217
+ limit: 5
218
+ },
219
+ persons: {
220
+ limit: 5
221
+ },
222
+ insights: {
223
+ limit: 5
224
+ },
225
+ featureFlags: {
226
+ limit: 5
227
+ }
228
+ };
186
229
  }
187
230
  function buildMcpPreview() {
188
- return {
189
- url: process.env.POSTHOG_MCP_URL,
190
- toolName: process.env.POSTHOG_MCP_TOOL_NAME ?? "posthog.query",
191
- arguments: parseOptionalJsonEnv("POSTHOG_MCP_TOOL_ARGS", { query: buildHogQLQuery() })
192
- };
231
+ return {
232
+ url: process.env.POSTHOG_MCP_URL,
233
+ toolName: process.env.POSTHOG_MCP_TOOL_NAME ?? "posthog.query",
234
+ arguments: parseOptionalJsonEnv("POSTHOG_MCP_TOOL_ARGS", {
235
+ query: buildHogQLQuery()
236
+ })
237
+ };
193
238
  }
194
239
  function extractId(response) {
195
- if (!response || typeof response !== "object") return null;
196
- const data = response.data;
197
- if (data && (typeof data.id === "string" || typeof data.id === "number")) return data.id;
198
- return null;
240
+ if (!response || typeof response !== "object")
241
+ return null;
242
+ const data = response.data;
243
+ if (data && (typeof data.id === "string" || typeof data.id === "number")) {
244
+ return data.id;
245
+ }
246
+ return null;
199
247
  }
200
248
  function resolveBooleanEnv(key, defaultValue) {
201
- const value = process.env[key];
202
- if (value === void 0) return defaultValue;
203
- return value.toLowerCase() === "true";
249
+ const value = process.env[key];
250
+ if (value === undefined)
251
+ return defaultValue;
252
+ return value.toLowerCase() === "true";
204
253
  }
205
254
  function requireEnv(key) {
206
- const value = process.env[key];
207
- if (!value) throw new Error(`Missing required env var: ${key}`);
208
- return value;
255
+ const value = process.env[key];
256
+ if (!value) {
257
+ throw new Error(`Missing required env var: ${key}`);
258
+ }
259
+ return value;
209
260
  }
210
261
  function parseOptionalJsonEnv(key, fallback) {
211
- const raw = process.env[key];
212
- if (!raw) return fallback;
213
- try {
214
- const parsed = JSON.parse(raw);
215
- if (parsed && typeof parsed === "object") return parsed;
216
- } catch {
217
- throw new Error(`Invalid JSON in ${key}`);
218
- }
219
- return fallback;
220
- }
221
-
222
- //#endregion
223
- export { resolvePosthogMode, runPosthogExampleFromEnv };
224
- //# sourceMappingURL=posthog.js.map
262
+ const raw = process.env[key];
263
+ if (!raw)
264
+ return fallback;
265
+ try {
266
+ const parsed = JSON.parse(raw);
267
+ if (parsed && typeof parsed === "object")
268
+ return parsed;
269
+ } catch {
270
+ throw new Error(`Invalid JSON in ${key}`);
271
+ }
272
+ return fallback;
273
+ }
274
+ export {
275
+ runPosthogExampleFromEnv,
276
+ resolvePosthogMode
277
+ };
package/dist/run.d.ts CHANGED
@@ -1 +1,2 @@
1
- export { };
1
+ export {};
2
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":""}