@contractspec/example.integration-posthog 1.57.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.
@@ -0,0 +1,33 @@
1
+ $ tsdown
2
+ ℹ tsdown v0.20.3 powered by rolldown v1.0.0-rc.3
3
+ ℹ config file: /home/runner/work/contractspec/contractspec/packages/examples/integration-posthog/tsdown.config.js
4
+ ℹ entry: src/example.ts, src/index.ts, src/posthog.ts, src/run.ts, src/docs/index.ts, src/docs/integration-posthog.docblock.ts
5
+ ℹ target: esnext
6
+ ℹ tsconfig: tsconfig.json
7
+ ℹ Build start
8
+ ℹ Cleaning 19 files
9
+ ℹ dist/posthog.js  7.59 kB │ gzip: 2.32 kB
10
+ ℹ dist/docs/integration-posthog.docblock.js  1.97 kB │ gzip: 0.94 kB
11
+ ℹ dist/example.js  0.99 kB │ gzip: 0.52 kB
12
+ ℹ dist/run.js  0.29 kB │ gzip: 0.22 kB
13
+ ℹ dist/index.js  0.20 kB │ gzip: 0.13 kB
14
+ ℹ dist/docs/index.js  0.04 kB │ gzip: 0.06 kB
15
+ ℹ dist/posthog.js.map 14.43 kB │ gzip: 4.14 kB
16
+ ℹ dist/docs/integration-posthog.docblock.js.map  2.50 kB │ gzip: 1.13 kB
17
+ ℹ dist/example.js.map  1.46 kB │ gzip: 0.71 kB
18
+ ℹ dist/run.js.map  0.49 kB │ gzip: 0.33 kB
19
+ ℹ dist/posthog.d.ts.map  0.33 kB │ gzip: 0.21 kB
20
+ ℹ dist/example.d.ts.map  0.13 kB │ gzip: 0.13 kB
21
+ ℹ dist/posthog.d.ts  0.74 kB │ gzip: 0.36 kB
22
+ ℹ dist/index.d.ts  0.26 kB │ gzip: 0.12 kB
23
+ ℹ dist/example.d.ts  0.25 kB │ gzip: 0.17 kB
24
+ ℹ dist/docs/index.d.ts  0.01 kB │ gzip: 0.03 kB
25
+ ℹ dist/docs/integration-posthog.docblock.d.ts  0.01 kB │ gzip: 0.03 kB
26
+ ℹ dist/run.d.ts  0.01 kB │ gzip: 0.03 kB
27
+ ℹ 18 files, total: 31.72 kB
28
+ [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
29
+ - rolldown-plugin-dts:generate (56%)
30
+ - tsdown:external (42%)
31
+ See https://rolldown.rs/options/checks#plugintimings for more details.
32
+
33
+ ✔ Build complete in 19320ms
@@ -0,0 +1,34 @@
1
+ $ bun build:types && bun build:bundle
2
+ $ tsc --noEmit
3
+ $ tsdown
4
+ ℹ tsdown v0.20.3 powered by rolldown v1.0.0-rc.3
5
+ ℹ config file: /home/runner/work/contractspec/contractspec/packages/examples/integration-posthog/tsdown.config.js
6
+ ℹ entry: src/example.ts, src/index.ts, src/posthog.ts, src/run.ts, src/docs/index.ts, src/docs/integration-posthog.docblock.ts
7
+ ℹ target: esnext
8
+ ℹ tsconfig: tsconfig.json
9
+ ℹ Build start
10
+ ℹ dist/posthog.js  7.59 kB │ gzip: 2.32 kB
11
+ ℹ dist/docs/integration-posthog.docblock.js  1.97 kB │ gzip: 0.94 kB
12
+ ℹ dist/example.js  0.99 kB │ gzip: 0.52 kB
13
+ ℹ dist/run.js  0.29 kB │ gzip: 0.22 kB
14
+ ℹ dist/index.js  0.20 kB │ gzip: 0.13 kB
15
+ ℹ dist/docs/index.js  0.04 kB │ gzip: 0.06 kB
16
+ ℹ dist/posthog.js.map 14.43 kB │ gzip: 4.14 kB
17
+ ℹ dist/docs/integration-posthog.docblock.js.map  2.50 kB │ gzip: 1.13 kB
18
+ ℹ dist/example.js.map  1.46 kB │ gzip: 0.71 kB
19
+ ℹ dist/run.js.map  0.49 kB │ gzip: 0.33 kB
20
+ ℹ dist/posthog.d.ts.map  0.33 kB │ gzip: 0.21 kB
21
+ ℹ dist/example.d.ts.map  0.13 kB │ gzip: 0.13 kB
22
+ ℹ dist/posthog.d.ts  0.74 kB │ gzip: 0.36 kB
23
+ ℹ dist/index.d.ts  0.26 kB │ gzip: 0.12 kB
24
+ ℹ dist/example.d.ts  0.25 kB │ gzip: 0.17 kB
25
+ ℹ dist/docs/index.d.ts  0.01 kB │ gzip: 0.03 kB
26
+ ℹ dist/docs/integration-posthog.docblock.d.ts  0.01 kB │ gzip: 0.03 kB
27
+ ℹ dist/run.d.ts  0.01 kB │ gzip: 0.03 kB
28
+ ℹ 18 files, total: 31.72 kB
29
+ [PLUGIN_TIMINGS] Warning: Your build spent significant time in plugins. Here is a breakdown:
30
+ - rolldown-plugin-dts:generate (55%)
31
+ - tsdown:external (41%)
32
+ See https://rolldown.rs/options/checks#plugintimings for more details.
33
+
34
+ ✔ Build complete in 20615ms
package/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # @contractspec/example.integration-posthog
2
+
3
+ ## 1.57.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 8ecf3c1: Add typed PostHog read APIs and readers across contracts, providers, metering, evolution, analytics, observability, and examples.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [8ecf3c1]
12
+ - Updated dependencies [47c48c2]
13
+ - Updated dependencies [a119963]
14
+ - Updated dependencies [4651e06]
15
+ - Updated dependencies [ad9d10a]
16
+ - Updated dependencies [11a5a05]
17
+ - @contractspec/lib.contracts@1.57.0
18
+ - @contractspec/integration.providers-impls@1.57.0
19
+
20
+ ## 1.56.1
21
+
22
+ ### Minor Changes
23
+
24
+ - Initial PostHog analytics integration example.
25
+
26
+ ### Patch Changes
27
+
28
+ - Updated dependencies
29
+ - @contractspec/integration.providers-impls@1.56.1
30
+ - @contractspec/lib.contracts@1.56.1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Chaman Ventures, SASU
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ ### Integration Example - PostHog Analytics
2
+
3
+ Website: https://contractspec.io/
4
+
5
+ This example shows how to use the PostHog AnalyticsProvider implementation to:
6
+
7
+ - Capture product events and identify users.
8
+ - Run HogQL queries.
9
+ - Perform generic REST API requests (feature flag list/create/delete).
10
+ - Read events, persons, insights, and feature flags.
11
+ - Optionally call a PostHog MCP tool via JSON-RPC.
12
+
13
+ Files included:
14
+
15
+ - `example.ts` - example metadata for the catalog.
16
+ - `posthog.ts` - PostHog integration flow and helpers.
17
+ - `run.ts` - runnable entrypoint for the example.
18
+ - `docs/integration-posthog.docblock.ts` - documentation blocks for MCP/docs.
19
+
20
+ Usage:
21
+
22
+ ```bash
23
+ export CONTRACTSPEC_POSTHOG_MODE="all" # capture | query | request | read | all
24
+ export CONTRACTSPEC_POSTHOG_DRY_RUN="true" # set to false for real calls
25
+ export CONTRACTSPEC_POSTHOG_ALLOW_WRITES="false" # set true to capture/create/delete
26
+
27
+ export POSTHOG_HOST="https://app.posthog.com" # optional
28
+ export POSTHOG_PROJECT_ID="12345" # required for queries and API requests
29
+ export POSTHOG_PROJECT_API_KEY="phc_..." # required for capture/identify
30
+ export POSTHOG_PERSONAL_API_KEY="phx_..." # required for queries and API requests
31
+
32
+ export POSTHOG_MCP_URL="http://localhost:3000/mcp" # optional
33
+ export POSTHOG_MCP_TOOL_NAME="posthog.query" # optional
34
+ export POSTHOG_MCP_TOOL_ARGS='{"query":"select 1"}' # optional JSON
35
+
36
+ bun tsx packages/examples/integration-posthog/src/run.ts
37
+ ```
38
+
39
+ Quick run examples:
40
+
41
+ Dry-run preview (safe):
42
+
43
+ ```bash
44
+ export CONTRACTSPEC_POSTHOG_MODE="all"
45
+ export CONTRACTSPEC_POSTHOG_DRY_RUN="true"
46
+ export CONTRACTSPEC_POSTHOG_ALLOW_WRITES="false"
47
+
48
+ bun tsx packages/examples/integration-posthog/src/run.ts
49
+ ```
50
+
51
+ Capture only:
52
+
53
+ ```bash
54
+ export CONTRACTSPEC_POSTHOG_MODE="capture"
55
+ export CONTRACTSPEC_POSTHOG_DRY_RUN="false"
56
+ export CONTRACTSPEC_POSTHOG_ALLOW_WRITES="true"
57
+
58
+ export POSTHOG_PROJECT_API_KEY="phc_..."
59
+
60
+ bun tsx packages/examples/integration-posthog/src/run.ts
61
+ ```
62
+
63
+ HogQL query:
64
+
65
+ ```bash
66
+ export CONTRACTSPEC_POSTHOG_MODE="query"
67
+ export CONTRACTSPEC_POSTHOG_DRY_RUN="false"
68
+
69
+ export POSTHOG_PROJECT_ID="12345"
70
+ export POSTHOG_PERSONAL_API_KEY="phx_..."
71
+
72
+ bun tsx packages/examples/integration-posthog/src/run.ts
73
+ ```
74
+
75
+ Feature flags list/create/delete:
76
+
77
+ ```bash
78
+ export CONTRACTSPEC_POSTHOG_MODE="request"
79
+ export CONTRACTSPEC_POSTHOG_DRY_RUN="false"
80
+ export CONTRACTSPEC_POSTHOG_ALLOW_WRITES="true"
81
+
82
+ export POSTHOG_PROJECT_ID="12345"
83
+ export POSTHOG_PERSONAL_API_KEY="phx_..."
84
+
85
+ bun tsx packages/examples/integration-posthog/src/run.ts
86
+ ```
87
+
88
+ Read events/persons/insights/flags:
89
+
90
+ ```bash
91
+ export CONTRACTSPEC_POSTHOG_MODE="read"
92
+ export CONTRACTSPEC_POSTHOG_DRY_RUN="false"
93
+
94
+ export POSTHOG_PROJECT_ID="12345"
95
+ export POSTHOG_PERSONAL_API_KEY="phx_..."
96
+
97
+ bun tsx packages/examples/integration-posthog/src/run.ts
98
+ ```
99
+
100
+ Notes:
101
+
102
+ - HogQL queries and API requests require a PostHog personal API key.
103
+ - Capturing events requires a project API key and `CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true`.
104
+ - Feature flag writes are guarded and auto-cleaned after creation.
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1 @@
1
+ import "./integration-posthog.docblock.js";
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,55 @@
1
+ import { registerDocBlocks } from "@contractspec/lib.contracts/docs";
2
+
3
+ //#region src/docs/integration-posthog.docblock.ts
4
+ registerDocBlocks([{
5
+ id: "docs.examples.integration-posthog",
6
+ title: "Integration Example — PostHog Analytics",
7
+ summary: "Capture events, run HogQL, and manage feature flags using the PostHog analytics provider.",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/examples/integration-posthog",
11
+ tags: [
12
+ "posthog",
13
+ "analytics",
14
+ "hogql",
15
+ "example"
16
+ ],
17
+ body: `## What this example shows
18
+ - Capture product events and identify users.
19
+ - Run HogQL queries through the analytics provider.
20
+ - Perform generic REST API requests (feature flag list/create/delete).
21
+ - Read events, persons, insights, and feature flags using typed reader methods.
22
+ - Optionally call a PostHog MCP tool via JSON-RPC.
23
+
24
+ ## Guardrails
25
+ - Use dry-run while validating credentials.
26
+ - Writes are gated behind CONTRACTSPEC_POSTHOG_ALLOW_WRITES.
27
+ - Keep API keys in secret storage.`
28
+ }, {
29
+ id: "docs.examples.integration-posthog.usage",
30
+ title: "PostHog Integration Example — Usage",
31
+ summary: "How to run the PostHog example with env-driven settings.",
32
+ kind: "usage",
33
+ visibility: "public",
34
+ route: "/docs/examples/integration-posthog/usage",
35
+ tags: ["posthog", "usage"],
36
+ body: `## Usage
37
+ - Set CONTRACTSPEC_POSTHOG_MODE to capture | query | request | read | all.
38
+ - Set CONTRACTSPEC_POSTHOG_DRY_RUN=true for a safe preview.
39
+ - Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to enable capture and create/delete.
40
+
41
+ ## Required env vars
42
+ - POSTHOG_PROJECT_ID for queries and REST requests.
43
+ - POSTHOG_PROJECT_API_KEY for capture/identify.
44
+ - POSTHOG_PERSONAL_API_KEY for HogQL queries and REST requests.
45
+
46
+ ## MCP
47
+ - Set POSTHOG_MCP_URL to call tools/call.
48
+ - Optionally set POSTHOG_MCP_TOOL_NAME and POSTHOG_MCP_TOOL_ARGS (JSON).
49
+
50
+ ## Example
51
+ - Call runPosthogExampleFromEnv() from run.ts to execute the flow.`
52
+ }]);
53
+
54
+ //#endregion
55
+ //# sourceMappingURL=integration-posthog.docblock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-posthog.docblock.js","names":[],"sources":["../../src/docs/integration-posthog.docblock.ts"],"sourcesContent":["import type { DocBlock } from '@contractspec/lib.contracts/docs';\nimport { registerDocBlocks } from '@contractspec/lib.contracts/docs';\n\nconst blocks: DocBlock[] = [\n {\n id: 'docs.examples.integration-posthog',\n title: 'Integration Example — PostHog Analytics',\n summary:\n 'Capture events, run HogQL, and manage feature flags using the PostHog analytics provider.',\n kind: 'reference',\n visibility: 'public',\n route: '/docs/examples/integration-posthog',\n tags: ['posthog', 'analytics', 'hogql', 'example'],\n body: `## What this example shows\n- Capture product events and identify users.\n- Run HogQL queries through the analytics provider.\n- Perform generic REST API requests (feature flag list/create/delete).\n- Read events, persons, insights, and feature flags using typed reader methods.\n- Optionally call a PostHog MCP tool via JSON-RPC.\n\n## Guardrails\n- Use dry-run while validating credentials.\n- Writes are gated behind CONTRACTSPEC_POSTHOG_ALLOW_WRITES.\n- Keep API keys in secret storage.`,\n },\n {\n id: 'docs.examples.integration-posthog.usage',\n title: 'PostHog Integration Example — Usage',\n summary: 'How to run the PostHog example with env-driven settings.',\n kind: 'usage',\n visibility: 'public',\n route: '/docs/examples/integration-posthog/usage',\n tags: ['posthog', 'usage'],\n body: `## Usage\n- Set CONTRACTSPEC_POSTHOG_MODE to capture | query | request | read | all.\n- Set CONTRACTSPEC_POSTHOG_DRY_RUN=true for a safe preview.\n- Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to enable capture and create/delete.\n\n## Required env vars\n- POSTHOG_PROJECT_ID for queries and REST requests.\n- POSTHOG_PROJECT_API_KEY for capture/identify.\n- POSTHOG_PERSONAL_API_KEY for HogQL queries and REST requests.\n\n## MCP\n- Set POSTHOG_MCP_URL to call tools/call.\n- Optionally set POSTHOG_MCP_TOOL_NAME and POSTHOG_MCP_TOOL_ARGS (JSON).\n\n## Example\n- Call runPosthogExampleFromEnv() from run.ts to execute the flow.`,\n },\n];\n\nregisterDocBlocks(blocks);\n"],"mappings":";;;AAoDA,kBAjD2B,CACzB;CACE,IAAI;CACJ,OAAO;CACP,SACE;CACF,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAW;EAAa;EAAS;EAAU;CAClD,MAAM;;;;;;;;;;;CAWP,EACD;CACE,IAAI;CACJ,OAAO;CACP,SAAS;CACT,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM,CAAC,WAAW,QAAQ;CAC1B,MAAM;;;;;;;;;;;;;;;;CAgBP,CACF,CAEwB"}
@@ -0,0 +1,7 @@
1
+ import * as _contractspec_lib_contracts0 from "@contractspec/lib.contracts";
2
+
3
+ //#region src/example.d.ts
4
+ declare const example: _contractspec_lib_contracts0.ExampleSpec;
5
+ //#endregion
6
+ export { example as default };
7
+ //# sourceMappingURL=example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.d.ts","names":[],"sources":["../src/example.ts"],"mappings":";;;cAEM,OAAA,EA2BJ,4BAAA,CA3BW,WAAA"}
@@ -0,0 +1,45 @@
1
+ import { defineExample } from "@contractspec/lib.contracts";
2
+
3
+ //#region src/example.ts
4
+ const example = defineExample({
5
+ meta: {
6
+ key: "integration-posthog",
7
+ version: "1.0.0",
8
+ title: "Integration — PostHog Analytics",
9
+ description: "Capture events, run HogQL, and manage PostHog assets via AnalyticsProvider.",
10
+ kind: "integration",
11
+ visibility: "public",
12
+ stability: "experimental",
13
+ owners: ["@platform.integrations"],
14
+ tags: [
15
+ "posthog",
16
+ "analytics",
17
+ "hogql",
18
+ "integration"
19
+ ]
20
+ },
21
+ docs: {
22
+ rootDocId: "docs.examples.integration-posthog",
23
+ usageDocId: "docs.examples.integration-posthog.usage"
24
+ },
25
+ entrypoints: {
26
+ packageName: "@contractspec/example.integration-posthog",
27
+ docs: "./docs"
28
+ },
29
+ surfaces: {
30
+ templates: true,
31
+ sandbox: {
32
+ enabled: true,
33
+ modes: ["markdown", "specs"]
34
+ },
35
+ studio: {
36
+ enabled: true,
37
+ installable: true
38
+ },
39
+ mcp: { enabled: true }
40
+ }
41
+ });
42
+
43
+ //#endregion
44
+ export { example as default };
45
+ //# sourceMappingURL=example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"example.js","names":[],"sources":["../src/example.ts"],"sourcesContent":["import { defineExample } from '@contractspec/lib.contracts';\n\nconst example = defineExample({\n meta: {\n key: 'integration-posthog',\n version: '1.0.0',\n title: 'Integration — PostHog Analytics',\n description:\n 'Capture events, run HogQL, and manage PostHog assets via AnalyticsProvider.',\n kind: 'integration',\n visibility: 'public',\n stability: 'experimental',\n owners: ['@platform.integrations'],\n tags: ['posthog', 'analytics', 'hogql', 'integration'],\n },\n docs: {\n rootDocId: 'docs.examples.integration-posthog',\n usageDocId: 'docs.examples.integration-posthog.usage',\n },\n entrypoints: {\n packageName: '@contractspec/example.integration-posthog',\n docs: './docs',\n },\n surfaces: {\n templates: true,\n sandbox: { enabled: true, modes: ['markdown', 'specs'] },\n studio: { enabled: true, installable: true },\n mcp: { enabled: true },\n },\n});\n\nexport default example;\n"],"mappings":";;;AAEA,MAAM,UAAU,cAAc;CAC5B,MAAM;EACJ,KAAK;EACL,SAAS;EACT,OAAO;EACP,aACE;EACF,MAAM;EACN,YAAY;EACZ,WAAW;EACX,QAAQ,CAAC,yBAAyB;EAClC,MAAM;GAAC;GAAW;GAAa;GAAS;GAAc;EACvD;CACD,MAAM;EACJ,WAAW;EACX,YAAY;EACb;CACD,aAAa;EACX,aAAa;EACb,MAAM;EACP;CACD,UAAU;EACR,WAAW;EACX,SAAS;GAAE,SAAS;GAAM,OAAO,CAAC,YAAY,QAAQ;GAAE;EACxD,QAAQ;GAAE,SAAS;GAAM,aAAa;GAAM;EAC5C,KAAK,EAAE,SAAS,MAAM;EACvB;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import example from "./example.js";
2
+ import { PosthogExampleMode, PosthogExampleOutput, resolvePosthogMode, runPosthogExampleFromEnv } from "./posthog.js";
3
+ export { PosthogExampleMode, PosthogExampleOutput, example, resolvePosthogMode, runPosthogExampleFromEnv };
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import example from "./example.js";
2
+ import { resolvePosthogMode, runPosthogExampleFromEnv } from "./posthog.js";
3
+ import "./docs/index.js";
4
+
5
+ export { example, resolvePosthogMode, runPosthogExampleFromEnv };
@@ -0,0 +1,19 @@
1
+ import { AnalyticsQueryResult } from "@contractspec/integration.providers-impls/analytics";
2
+
3
+ //#region src/posthog.d.ts
4
+ type PosthogExampleMode = 'capture' | 'query' | 'request' | 'read' | 'all';
5
+ interface PosthogExampleOutput {
6
+ mode: PosthogExampleMode;
7
+ dryRun: boolean;
8
+ allowWrites: boolean;
9
+ capture?: unknown;
10
+ query?: AnalyticsQueryResult | unknown;
11
+ request?: Record<string, unknown>;
12
+ read?: Record<string, unknown>;
13
+ mcp?: unknown;
14
+ }
15
+ declare function runPosthogExampleFromEnv(): Promise<PosthogExampleOutput>;
16
+ declare function resolvePosthogMode(): PosthogExampleMode;
17
+ //#endregion
18
+ export { PosthogExampleMode, PosthogExampleOutput, resolvePosthogMode, runPosthogExampleFromEnv };
19
+ //# sourceMappingURL=posthog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posthog.d.ts","names":[],"sources":["../src/posthog.ts"],"mappings":";;;KASY,kBAAA;AAAA,UAOK,oBAAA;EACf,IAAA,EAAM,kBAAA;EACN,MAAA;EACA,WAAA;EACA,OAAA;EACA,KAAA,GAAQ,oBAAA;EACR,OAAA,GAAU,MAAA;EACV,IAAA,GAAO,MAAA;EACP,GAAA;AAAA;AAAA,iBAGoB,wBAAA,CAAA,GAA4B,OAAA,CAAQ,oBAAA;AAAA,iBAqD1C,kBAAA,CAAA,GAAsB,kBAAA"}
@@ -0,0 +1,224 @@
1
+ import { PosthogAnalyticsProvider } from "@contractspec/integration.providers-impls/impls/posthog";
2
+
3
+ //#region src/posthog.ts
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;
28
+ }
29
+ 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.`);
33
+ }
34
+ 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
+ });
43
+ }
44
+ 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
+ };
62
+ }
63
+ 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 });
67
+ }
68
+ 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;
102
+ }
103
+ 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;
126
+ }
127
+ 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
+ });
135
+ }
136
+ 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
+ };
146
+ }
147
+ 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";
149
+ }
150
+ function buildCapturePreview() {
151
+ return {
152
+ event: buildCaptureEvent(),
153
+ hint: "Dry run enabled. Set CONTRACTSPEC_POSTHOG_DRY_RUN=false."
154
+ };
155
+ }
156
+ 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
+ };
175
+ }
176
+ 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
+ };
186
+ }
187
+ 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
+ };
193
+ }
194
+ 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;
199
+ }
200
+ function resolveBooleanEnv(key, defaultValue) {
201
+ const value = process.env[key];
202
+ if (value === void 0) return defaultValue;
203
+ return value.toLowerCase() === "true";
204
+ }
205
+ function requireEnv(key) {
206
+ const value = process.env[key];
207
+ if (!value) throw new Error(`Missing required env var: ${key}`);
208
+ return value;
209
+ }
210
+ 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posthog.js","names":[],"sources":["../src/posthog.ts"],"sourcesContent":["import { PosthogAnalyticsProvider } from '@contractspec/integration.providers-impls/impls/posthog';\nimport type {\n AnalyticsEventInput,\n AnalyticsProvider,\n AnalyticsQueryResult,\n AnalyticsRequest,\n AnalyticsResponse,\n} from '@contractspec/integration.providers-impls/analytics';\n\nexport type PosthogExampleMode =\n | 'capture'\n | 'query'\n | 'request'\n | 'read'\n | 'all';\n\nexport interface PosthogExampleOutput {\n mode: PosthogExampleMode;\n dryRun: boolean;\n allowWrites: boolean;\n capture?: unknown;\n query?: AnalyticsQueryResult | unknown;\n request?: Record<string, unknown>;\n read?: Record<string, unknown>;\n mcp?: unknown;\n}\n\nexport async function runPosthogExampleFromEnv(): Promise<PosthogExampleOutput> {\n const mode = resolvePosthogMode();\n const dryRun = resolveBooleanEnv('CONTRACTSPEC_POSTHOG_DRY_RUN', true);\n const allowWrites = resolveBooleanEnv(\n 'CONTRACTSPEC_POSTHOG_ALLOW_WRITES',\n false\n );\n const output: PosthogExampleOutput = { mode, dryRun, allowWrites };\n\n if (dryRun) {\n if (mode === 'capture' || mode === 'all') {\n output.capture = buildCapturePreview();\n }\n if (mode === 'query' || mode === 'all') {\n output.query = { query: buildHogQLQuery() };\n }\n if (mode === 'request' || mode === 'all') {\n output.request = buildRequestPreview();\n }\n if (mode === 'read' || mode === 'all') {\n output.read = buildReadPreview();\n }\n if (process.env.POSTHOG_MCP_URL) {\n output.mcp = buildMcpPreview();\n }\n return output;\n }\n\n const provider = createProviderFromEnv();\n\n if (mode === 'capture' || mode === 'all') {\n output.capture = await runCapture(provider, allowWrites);\n }\n\n if (mode === 'query' || mode === 'all') {\n output.query = await runHogQLQuery(provider);\n }\n\n if (mode === 'request' || mode === 'all') {\n output.request = await runApiRequests(provider, allowWrites);\n }\n\n if (mode === 'read' || mode === 'all') {\n output.read = await runReadOperations(provider);\n }\n\n if (process.env.POSTHOG_MCP_URL) {\n output.mcp = await runMcpToolCall(provider);\n }\n\n return output;\n}\n\nexport function resolvePosthogMode(): PosthogExampleMode {\n const raw = (process.env.CONTRACTSPEC_POSTHOG_MODE ?? 'all').toLowerCase();\n if (\n raw === 'capture' ||\n raw === 'query' ||\n raw === 'request' ||\n raw === 'read' ||\n raw === 'all'\n ) {\n return raw;\n }\n throw new Error(\n `Unsupported CONTRACTSPEC_POSTHOG_MODE: ${raw}. Use capture, query, request, read, or all.`\n );\n}\n\nfunction createProviderFromEnv(): AnalyticsProvider {\n return new PosthogAnalyticsProvider({\n host: process.env.POSTHOG_HOST,\n projectId: process.env.POSTHOG_PROJECT_ID,\n projectApiKey: process.env.POSTHOG_PROJECT_API_KEY,\n personalApiKey: process.env.POSTHOG_PERSONAL_API_KEY,\n mcpUrl: process.env.POSTHOG_MCP_URL,\n requestTimeoutMs: 10000,\n });\n}\n\nasync function runCapture(\n provider: AnalyticsProvider,\n allowWrites: boolean\n): Promise<Record<string, unknown>> {\n if (!allowWrites) {\n return {\n skipped: true,\n reason: 'Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to enable capture.',\n };\n }\n\n const event = buildCaptureEvent();\n if (provider.identify) {\n await provider.identify({\n distinctId: event.distinctId,\n properties: { plan: 'pro', source: 'contractspec-example' },\n });\n }\n await provider.capture(event);\n return { captured: true, event };\n}\n\nasync function runHogQLQuery(\n provider: AnalyticsProvider\n): Promise<AnalyticsQueryResult> {\n if (!provider.queryHogQL) {\n throw new Error('Analytics provider does not support HogQL queries.');\n }\n const query = buildHogQLQuery();\n return provider.queryHogQL({ query });\n}\n\nasync function runApiRequests(\n provider: AnalyticsProvider,\n allowWrites: boolean\n): Promise<Record<string, unknown>> {\n const projectId = requireEnv('POSTHOG_PROJECT_ID');\n const listRequest: AnalyticsRequest = {\n method: 'GET',\n path: `/api/projects/${projectId}/feature_flags/`,\n query: { limit: 5 },\n };\n const listResponse = await provider.request(listRequest);\n const output: Record<string, unknown> = {\n list: listResponse.data,\n };\n\n if (!allowWrites) {\n output.writeGuard =\n 'Set CONTRACTSPEC_POSTHOG_ALLOW_WRITES=true to create/delete feature flags.';\n return output;\n }\n\n const flagKey = `contractspec-example-${Date.now()}`;\n const createResponse = await provider.request({\n method: 'POST',\n path: `/api/projects/${projectId}/feature_flags/`,\n body: {\n name: 'ContractSpec Example Flag',\n key: flagKey,\n active: true,\n filters: {\n groups: [\n {\n properties: [],\n rollout_percentage: 100,\n },\n ],\n },\n },\n });\n output.created = createResponse.data;\n\n const createdId = extractId(createResponse);\n if (createdId) {\n const deleteResponse = await provider.request({\n method: 'DELETE',\n path: `/api/projects/${projectId}/feature_flags/${createdId}`,\n });\n output.deleted = deleteResponse.status;\n } else {\n output.deleted = 'Skipped delete: response did not include an id.';\n }\n\n return output;\n}\n\nasync function runReadOperations(\n provider: AnalyticsProvider\n): Promise<Record<string, unknown>> {\n const now = new Date();\n const from = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n const dateRange = { from, to: now };\n const output: Record<string, unknown> = {\n window: { from: from.toISOString(), to: now.toISOString() },\n };\n\n if (provider.getEvents) {\n output.events = await provider.getEvents({ dateRange, limit: 5 });\n } else {\n output.events = 'Provider does not support getEvents.';\n }\n\n if (provider.getPersons) {\n output.persons = await provider.getPersons({ limit: 5 });\n } else {\n output.persons = 'Provider does not support getPersons.';\n }\n\n if (provider.getInsights) {\n output.insights = await provider.getInsights({ limit: 5 });\n } else {\n output.insights = 'Provider does not support getInsights.';\n }\n\n if (provider.getFeatureFlags) {\n output.featureFlags = await provider.getFeatureFlags({ limit: 5 });\n } else {\n output.featureFlags = 'Provider does not support getFeatureFlags.';\n }\n\n return output;\n}\n\nasync function runMcpToolCall(provider: AnalyticsProvider): Promise<unknown> {\n if (!provider.callMcpTool) {\n throw new Error('Analytics provider does not support MCP tool calls.');\n }\n const name = process.env.POSTHOG_MCP_TOOL_NAME ?? 'posthog.query';\n const argumentsValue = parseOptionalJsonEnv('POSTHOG_MCP_TOOL_ARGS', {\n query: buildHogQLQuery(),\n });\n return provider.callMcpTool({ name, arguments: argumentsValue });\n}\n\nfunction buildCaptureEvent(): AnalyticsEventInput {\n const distinctId = process.env.POSTHOG_DISTINCT_ID ?? 'contractspec-demo';\n const event = process.env.POSTHOG_EVENT_NAME ?? 'contractspec.example.event';\n return {\n distinctId,\n event,\n properties: {\n source: 'contractspec-example',\n environment: process.env.NODE_ENV ?? 'development',\n },\n timestamp: new Date(),\n };\n}\n\nfunction buildHogQLQuery(): string {\n return (\n 'select event, count() as count ' +\n 'from events ' +\n 'where timestamp >= now() - interval 1 day ' +\n 'group by event ' +\n 'order by count desc ' +\n 'limit 5'\n );\n}\n\nfunction buildCapturePreview(): Record<string, unknown> {\n return {\n event: buildCaptureEvent(),\n hint: 'Dry run enabled. Set CONTRACTSPEC_POSTHOG_DRY_RUN=false.',\n };\n}\n\nfunction buildRequestPreview(): Record<string, unknown> {\n const projectId = process.env.POSTHOG_PROJECT_ID ?? 'PROJECT_ID';\n return {\n listRequest: {\n method: 'GET',\n path: `/api/projects/${projectId}/feature_flags/`,\n query: { limit: 5 },\n },\n writeRequests: {\n create: {\n method: 'POST',\n path: `/api/projects/${projectId}/feature_flags/`,\n },\n delete: {\n method: 'DELETE',\n path: `/api/projects/${projectId}/feature_flags/{id}`,\n },\n },\n };\n}\n\nfunction buildReadPreview(): Record<string, unknown> {\n return {\n events: {\n dateRange: 'last_24_hours',\n limit: 5,\n },\n persons: {\n limit: 5,\n },\n insights: {\n limit: 5,\n },\n featureFlags: {\n limit: 5,\n },\n };\n}\n\nfunction buildMcpPreview(): Record<string, unknown> {\n return {\n url: process.env.POSTHOG_MCP_URL,\n toolName: process.env.POSTHOG_MCP_TOOL_NAME ?? 'posthog.query',\n arguments: parseOptionalJsonEnv('POSTHOG_MCP_TOOL_ARGS', {\n query: buildHogQLQuery(),\n }),\n };\n}\n\nfunction extractId(\n response: AnalyticsResponse<unknown>\n): string | number | null {\n if (!response || typeof response !== 'object') return null;\n const data = response.data as { id?: string | number } | null | undefined;\n if (data && (typeof data.id === 'string' || typeof data.id === 'number')) {\n return data.id;\n }\n return null;\n}\n\nfunction resolveBooleanEnv(key: string, defaultValue: boolean): boolean {\n const value = process.env[key];\n if (value === undefined) return defaultValue;\n return value.toLowerCase() === 'true';\n}\n\nfunction requireEnv(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(`Missing required env var: ${key}`);\n }\n return value;\n}\n\nfunction parseOptionalJsonEnv(\n key: string,\n fallback: Record<string, unknown>\n): Record<string, unknown> {\n const raw = process.env[key];\n if (!raw) return fallback;\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n if (parsed && typeof parsed === 'object') return parsed;\n } catch {\n throw new Error(`Invalid JSON in ${key}`);\n }\n return fallback;\n}\n"],"mappings":"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"}