@posthog/wizard 1.31.1 → 1.32.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.
- package/README.md +2 -1
- package/dist/bin.js +14 -1
- package/dist/bin.js.map +1 -1
- package/dist/src/__tests__/run.test.js +5 -5
- package/dist/src/__tests__/run.test.js.map +1 -1
- package/dist/src/android/android-wizard-agent.d.ts +6 -0
- package/dist/src/android/android-wizard-agent.js +140 -0
- package/dist/src/android/android-wizard-agent.js.map +1 -0
- package/dist/src/android/utils.d.ts +11 -0
- package/dist/src/android/utils.js +97 -0
- package/dist/src/android/utils.js.map +1 -0
- package/dist/src/angular/angular-wizard-agent.d.ts +4 -0
- package/dist/src/angular/angular-wizard-agent.js +67 -0
- package/dist/src/angular/angular-wizard-agent.js.map +1 -0
- package/dist/src/angular/utils.d.ts +4 -0
- package/dist/src/angular/utils.js +9 -0
- package/dist/src/angular/utils.js.map +1 -0
- package/dist/src/astro/astro-wizard-agent.d.ts +7 -0
- package/dist/src/astro/astro-wizard-agent.js +102 -0
- package/dist/src/astro/astro-wizard-agent.js.map +1 -0
- package/dist/src/astro/utils.d.ts +17 -0
- package/dist/src/astro/utils.js +163 -0
- package/dist/src/astro/utils.js.map +1 -0
- package/dist/src/django/django-wizard-agent.d.ts +8 -5
- package/dist/src/django/django-wizard-agent.js +62 -51
- package/dist/src/django/django-wizard-agent.js.map +1 -1
- package/dist/src/django/utils.d.ts +1 -1
- package/dist/src/django/utils.js +3 -22
- package/dist/src/django/utils.js.map +1 -1
- package/dist/src/fastapi/fastapi-wizard-agent.d.ts +7 -0
- package/dist/src/fastapi/fastapi-wizard-agent.js +217 -0
- package/dist/src/fastapi/fastapi-wizard-agent.js.map +1 -0
- package/dist/src/fastapi/utils.d.ts +26 -0
- package/dist/src/fastapi/utils.js +258 -0
- package/dist/src/fastapi/utils.js.map +1 -0
- package/dist/src/flask/flask-wizard-agent.d.ts +8 -5
- package/dist/src/flask/flask-wizard-agent.js +67 -51
- package/dist/src/flask/flask-wizard-agent.js.map +1 -1
- package/dist/src/flask/utils.d.ts +1 -1
- package/dist/src/flask/utils.js +3 -22
- package/dist/src/flask/utils.js.map +1 -1
- package/dist/src/laravel/laravel-wizard-agent.d.ts +10 -5
- package/dist/src/laravel/laravel-wizard-agent.js +50 -53
- package/dist/src/laravel/laravel-wizard-agent.js.map +1 -1
- package/dist/src/laravel/utils.d.ts +1 -1
- package/dist/src/laravel/utils.js +3 -22
- package/dist/src/laravel/utils.js.map +1 -1
- package/dist/src/lib/__tests__/agent-interface.test.js +1 -0
- package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
- package/dist/src/lib/agent-interface.d.ts +4 -1
- package/dist/src/lib/agent-interface.js +36 -3
- package/dist/src/lib/agent-interface.js.map +1 -1
- package/dist/src/lib/agent-runner.js +69 -6
- package/dist/src/lib/agent-runner.js.map +1 -1
- package/dist/src/lib/api.d.ts +4 -4
- package/dist/src/lib/constants.d.ts +15 -14
- package/dist/src/lib/constants.js +17 -40
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/env-file-tools.d.ts +11 -0
- package/dist/src/lib/env-file-tools.js +154 -0
- package/dist/src/lib/env-file-tools.js.map +1 -0
- package/dist/src/lib/framework-config.d.ts +34 -16
- package/dist/src/lib/framework-config.js.map +1 -1
- package/dist/src/lib/registry.d.ts +3 -0
- package/dist/src/lib/registry.js +41 -0
- package/dist/src/lib/registry.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard-agent.d.ts +7 -5
- package/dist/src/nextjs/nextjs-wizard-agent.js +16 -79
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -1
- package/dist/src/nextjs/utils.d.ts +1 -1
- package/dist/src/nextjs/utils.js +3 -22
- package/dist/src/nextjs/utils.js.map +1 -1
- package/dist/src/nuxt/nuxt-wizard-agent.d.ts +6 -0
- package/dist/src/nuxt/nuxt-wizard-agent.js +77 -0
- package/dist/src/nuxt/nuxt-wizard-agent.js.map +1 -0
- package/dist/src/python/python-wizard-agent.d.ts +7 -0
- package/dist/src/python/python-wizard-agent.js +269 -0
- package/dist/src/python/python-wizard-agent.js.map +1 -0
- package/dist/src/python/utils.d.ts +28 -0
- package/dist/src/python/utils.js +147 -0
- package/dist/src/python/utils.js.map +1 -0
- package/dist/src/react-native/react-native-wizard-agent.d.ts +7 -0
- package/dist/src/react-native/react-native-wizard-agent.js +91 -0
- package/dist/src/react-native/react-native-wizard-agent.js.map +1 -0
- package/dist/src/react-native/utils.d.ts +8 -0
- package/dist/src/react-native/utils.js +31 -0
- package/dist/src/react-native/utils.js.map +1 -0
- package/dist/src/react-router/react-router-wizard-agent.d.ts +7 -5
- package/dist/src/react-router/react-router-wizard-agent.js +18 -80
- package/dist/src/react-router/react-router-wizard-agent.js.map +1 -1
- package/dist/src/react-router/utils.d.ts +1 -1
- package/dist/src/react-router/utils.js +3 -21
- package/dist/src/react-router/utils.js.map +1 -1
- package/dist/src/run.d.ts +1 -0
- package/dist/src/run.js +28 -76
- package/dist/src/run.js.map +1 -1
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +6 -6
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +6 -6
- package/dist/src/svelte/svelte-wizard-agent.d.ts +4 -0
- package/dist/src/svelte/svelte-wizard-agent.js +60 -0
- package/dist/src/svelte/svelte-wizard-agent.js.map +1 -0
- package/dist/src/swift/swift-wizard-agent.d.ts +7 -0
- package/dist/src/swift/swift-wizard-agent.js +141 -0
- package/dist/src/swift/swift-wizard-agent.js.map +1 -0
- package/dist/src/swift/utils.d.ts +8 -0
- package/dist/src/swift/utils.js +105 -0
- package/dist/src/swift/utils.js.map +1 -0
- package/dist/src/tanstack-router/tanstack-router-wizard-agent.d.ts +7 -0
- package/dist/src/tanstack-router/tanstack-router-wizard-agent.js +93 -0
- package/dist/src/tanstack-router/tanstack-router-wizard-agent.js.map +1 -0
- package/dist/src/tanstack-router/utils.d.ts +17 -0
- package/dist/src/tanstack-router/utils.js +192 -0
- package/dist/src/tanstack-router/utils.js.map +1 -0
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.d.ts +4 -0
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +66 -0
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
- package/dist/src/tanstack-start/utils.d.ts +4 -0
- package/dist/src/tanstack-start/utils.js +9 -0
- package/dist/src/tanstack-start/utils.js.map +1 -0
- package/dist/src/utils/__tests__/semver.test.d.ts +1 -0
- package/dist/src/utils/__tests__/semver.test.js +117 -0
- package/dist/src/utils/__tests__/semver.test.js.map +1 -0
- package/dist/src/utils/clack-utils.js +3 -5
- package/dist/src/utils/clack-utils.js.map +1 -1
- package/dist/src/utils/debug.d.ts +2 -0
- package/dist/src/utils/debug.js +17 -5
- package/dist/src/utils/debug.js.map +1 -1
- package/dist/src/utils/file-utils.d.ts +1 -31
- package/dist/src/utils/file-utils.js +0 -163
- package/dist/src/utils/file-utils.js.map +1 -1
- package/dist/src/utils/semver.d.ts +16 -0
- package/dist/src/utils/semver.js +37 -0
- package/dist/src/utils/semver.js.map +1 -1
- package/dist/src/utils/types.d.ts +4 -0
- package/dist/src/utils/types.js.map +1 -1
- package/dist/src/vue/vue-wizard-agent.d.ts +4 -0
- package/dist/src/vue/vue-wizard-agent.js +64 -0
- package/dist/src/vue/vue-wizard-agent.js.map +1 -0
- package/package.json +1 -1
- package/dist/src/astro/astro-wizard.d.ts +0 -2
- package/dist/src/astro/astro-wizard.js +0 -89
- package/dist/src/astro/astro-wizard.js.map +0 -1
- package/dist/src/astro/docs.d.ts +0 -4
- package/dist/src/astro/docs.js +0 -101
- package/dist/src/astro/docs.js.map +0 -1
- package/dist/src/lib/config.d.ts +0 -104
- package/dist/src/lib/config.js +0 -368
- package/dist/src/lib/config.js.map +0 -1
- package/dist/src/lib/messages.d.ts +0 -16
- package/dist/src/lib/messages.js +0 -66
- package/dist/src/lib/messages.js.map +0 -1
- package/dist/src/lib/prompts.d.ts +0 -16
- package/dist/src/lib/prompts.js +0 -83
- package/dist/src/lib/prompts.js.map +0 -1
- package/dist/src/react/docs.d.ts +0 -4
- package/dist/src/react/docs.js +0 -49
- package/dist/src/react/docs.js.map +0 -1
- package/dist/src/react/react-wizard.d.ts +0 -2
- package/dist/src/react/react-wizard.js +0 -121
- package/dist/src/react/react-wizard.js.map +0 -1
- package/dist/src/react-native/docs.d.ts +0 -5
- package/dist/src/react-native/docs.js +0 -31
- package/dist/src/react-native/docs.js.map +0 -1
- package/dist/src/react-native/react-native-wizard.d.ts +0 -2
- package/dist/src/react-native/react-native-wizard.js +0 -128
- package/dist/src/react-native/react-native-wizard.js.map +0 -1
- package/dist/src/svelte/docs.d.ts +0 -3
- package/dist/src/svelte/docs.js +0 -111
- package/dist/src/svelte/docs.js.map +0 -1
- package/dist/src/svelte/svelte-wizard.d.ts +0 -2
- package/dist/src/svelte/svelte-wizard.js +0 -121
- package/dist/src/svelte/svelte-wizard.js.map +0 -1
- package/dist/src/utils/errors.d.ts +0 -3
- package/dist/src/utils/errors.js +0 -11
- package/dist/src/utils/errors.js.map +0 -1
- package/dist/src/utils/query.d.ts +0 -11
- package/dist/src/utils/query.js +0 -115
- package/dist/src/utils/query.js.map +0 -1
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ASTRO_AGENT_CONFIG = void 0;
|
|
4
|
+
const constants_1 = require("../lib/constants");
|
|
5
|
+
const package_json_1 = require("../utils/package-json");
|
|
6
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
exports.ASTRO_AGENT_CONFIG = {
|
|
9
|
+
metadata: {
|
|
10
|
+
name: 'Astro',
|
|
11
|
+
integration: constants_1.Integration.astro,
|
|
12
|
+
docsUrl: 'https://posthog.com/docs/libraries/astro',
|
|
13
|
+
gatherContext: async (options) => {
|
|
14
|
+
const renderingMode = await (0, utils_1.getAstroRenderingMode)(options);
|
|
15
|
+
return { renderingMode };
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
detection: {
|
|
19
|
+
packageName: 'astro',
|
|
20
|
+
packageDisplayName: 'Astro',
|
|
21
|
+
getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('astro', packageJson),
|
|
22
|
+
getVersionBucket: utils_1.getAstroVersionBucket,
|
|
23
|
+
minimumVersion: '4.0.0',
|
|
24
|
+
getInstalledVersion: async (options) => {
|
|
25
|
+
const packageJson = await (0, clack_utils_1.getPackageDotJson)(options);
|
|
26
|
+
return (0, package_json_1.getPackageVersion)('astro', packageJson);
|
|
27
|
+
},
|
|
28
|
+
detect: async (options) => {
|
|
29
|
+
const packageJson = await (0, clack_utils_1.tryGetPackageJson)(options);
|
|
30
|
+
return packageJson ? (0, package_json_1.hasPackageInstalled)('astro', packageJson) : false;
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
environment: {
|
|
34
|
+
uploadToHosting: true,
|
|
35
|
+
getEnvVars: (apiKey, host) => ({
|
|
36
|
+
PUBLIC_POSTHOG_KEY: apiKey,
|
|
37
|
+
PUBLIC_POSTHOG_HOST: host,
|
|
38
|
+
}),
|
|
39
|
+
},
|
|
40
|
+
analytics: {
|
|
41
|
+
getTags: (context) => ({
|
|
42
|
+
'rendering-mode': context.renderingMode ?? 'static',
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
prompts: {
|
|
46
|
+
projectTypeDetection: 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',
|
|
47
|
+
packageInstallation: 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',
|
|
48
|
+
getAdditionalContextLines: (context) => {
|
|
49
|
+
const modeName = (0, utils_1.getAstroRenderingModeName)(context.renderingMode ?? utils_1.AstroRenderingMode.STATIC);
|
|
50
|
+
// Map rendering mode to framework ID for MCP docs resource
|
|
51
|
+
const frameworkIdMap = {
|
|
52
|
+
[utils_1.AstroRenderingMode.STATIC]: 'astro-static',
|
|
53
|
+
[utils_1.AstroRenderingMode.VIEW_TRANSITIONS]: 'astro-view-transitions',
|
|
54
|
+
[utils_1.AstroRenderingMode.SSR]: 'astro-ssr',
|
|
55
|
+
[utils_1.AstroRenderingMode.HYBRID]: 'astro-hybrid',
|
|
56
|
+
};
|
|
57
|
+
const frameworkId = frameworkIdMap[context.renderingMode ?? utils_1.AstroRenderingMode.STATIC];
|
|
58
|
+
const lines = [
|
|
59
|
+
`Rendering mode: ${modeName}`,
|
|
60
|
+
`Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
|
|
61
|
+
];
|
|
62
|
+
// Add mode-specific guidance
|
|
63
|
+
if (context.renderingMode === utils_1.AstroRenderingMode.VIEW_TRANSITIONS) {
|
|
64
|
+
lines.push('IMPORTANT: Use window.__posthog_initialized guard to prevent re-initialization during soft navigation');
|
|
65
|
+
lines.push("IMPORTANT: Set capture_pageview: 'history_change' for automatic pageview tracking");
|
|
66
|
+
}
|
|
67
|
+
if (context.renderingMode === utils_1.AstroRenderingMode.SSR ||
|
|
68
|
+
context.renderingMode === utils_1.AstroRenderingMode.HYBRID) {
|
|
69
|
+
lines.push('IMPORTANT: Use posthog-node for server-side tracking in API routes');
|
|
70
|
+
lines.push('IMPORTANT: Create a singleton pattern for the posthog-node client');
|
|
71
|
+
}
|
|
72
|
+
return lines;
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
ui: {
|
|
76
|
+
successMessage: 'PostHog integration complete',
|
|
77
|
+
estimatedDurationMinutes: 6,
|
|
78
|
+
getOutroChanges: (context) => {
|
|
79
|
+
const modeName = (0, utils_1.getAstroRenderingModeName)(context.renderingMode ?? utils_1.AstroRenderingMode.STATIC);
|
|
80
|
+
const changes = [
|
|
81
|
+
`Analyzed your Astro project structure (${modeName})`,
|
|
82
|
+
`Created PostHog component with is:inline script`,
|
|
83
|
+
`Integrated PostHog into your layout`,
|
|
84
|
+
];
|
|
85
|
+
if (context.renderingMode === utils_1.AstroRenderingMode.SSR ||
|
|
86
|
+
context.renderingMode === utils_1.AstroRenderingMode.HYBRID) {
|
|
87
|
+
changes.push(`Set up posthog-node for server-side tracking`);
|
|
88
|
+
}
|
|
89
|
+
if (context.renderingMode === utils_1.AstroRenderingMode.VIEW_TRANSITIONS) {
|
|
90
|
+
changes.push(`Added initialization guard for view transitions compatibility`);
|
|
91
|
+
}
|
|
92
|
+
return changes;
|
|
93
|
+
},
|
|
94
|
+
getOutroNextSteps: () => {
|
|
95
|
+
return [
|
|
96
|
+
'Start your development server to see PostHog in action',
|
|
97
|
+
'Visit your PostHog dashboard to see incoming events',
|
|
98
|
+
];
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=astro-wizard-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astro-wizard-agent.js","sourceRoot":"","sources":["../../../src/astro/astro-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Astro wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { Integration } from '../lib/constants';\nimport {\n getPackageVersion,\n hasPackageInstalled,\n type PackageDotJson,\n} from '../utils/package-json';\nimport { getPackageDotJson, tryGetPackageJson } from '../utils/clack-utils';\nimport {\n getAstroRenderingMode,\n getAstroVersionBucket,\n getAstroRenderingModeName,\n AstroRenderingMode,\n} from './utils';\n\ntype AstroContext = {\n renderingMode?: AstroRenderingMode;\n};\n\nexport const ASTRO_AGENT_CONFIG: FrameworkConfig<AstroContext> = {\n metadata: {\n name: 'Astro',\n integration: Integration.astro,\n docsUrl: 'https://posthog.com/docs/libraries/astro',\n gatherContext: async (options: WizardOptions) => {\n const renderingMode = await getAstroRenderingMode(options);\n return { renderingMode };\n },\n },\n\n detection: {\n packageName: 'astro',\n packageDisplayName: 'Astro',\n getVersion: (packageJson: unknown) =>\n getPackageVersion('astro', packageJson as PackageDotJson),\n getVersionBucket: getAstroVersionBucket,\n minimumVersion: '4.0.0',\n getInstalledVersion: async (options: WizardOptions) => {\n const packageJson = await getPackageDotJson(options);\n return getPackageVersion('astro', packageJson);\n },\n detect: async (options) => {\n const packageJson = await tryGetPackageJson(options);\n return packageJson ? hasPackageInstalled('astro', packageJson) : false;\n },\n },\n\n environment: {\n uploadToHosting: true,\n getEnvVars: (apiKey: string, host: string) => ({\n PUBLIC_POSTHOG_KEY: apiKey,\n PUBLIC_POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n 'rendering-mode': context.renderingMode ?? 'static',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',\n packageInstallation:\n 'Look for lockfiles to determine the package manager (npm, yarn, pnpm, bun). Do not manually edit package.json.',\n getAdditionalContextLines: (context) => {\n const modeName = getAstroRenderingModeName(\n context.renderingMode ?? AstroRenderingMode.STATIC,\n );\n\n // Map rendering mode to framework ID for MCP docs resource\n const frameworkIdMap: Record<AstroRenderingMode, string> = {\n [AstroRenderingMode.STATIC]: 'astro-static',\n [AstroRenderingMode.VIEW_TRANSITIONS]: 'astro-view-transitions',\n [AstroRenderingMode.SSR]: 'astro-ssr',\n [AstroRenderingMode.HYBRID]: 'astro-hybrid',\n };\n\n const frameworkId =\n frameworkIdMap[context.renderingMode ?? AstroRenderingMode.STATIC];\n\n const lines = [\n `Rendering mode: ${modeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n // Add mode-specific guidance\n if (context.renderingMode === AstroRenderingMode.VIEW_TRANSITIONS) {\n lines.push(\n 'IMPORTANT: Use window.__posthog_initialized guard to prevent re-initialization during soft navigation',\n );\n lines.push(\n \"IMPORTANT: Set capture_pageview: 'history_change' for automatic pageview tracking\",\n );\n }\n\n if (\n context.renderingMode === AstroRenderingMode.SSR ||\n context.renderingMode === AstroRenderingMode.HYBRID\n ) {\n lines.push(\n 'IMPORTANT: Use posthog-node for server-side tracking in API routes',\n );\n lines.push(\n 'IMPORTANT: Create a singleton pattern for the posthog-node client',\n );\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 6,\n getOutroChanges: (context) => {\n const modeName = getAstroRenderingModeName(\n context.renderingMode ?? AstroRenderingMode.STATIC,\n );\n const changes = [\n `Analyzed your Astro project structure (${modeName})`,\n `Created PostHog component with is:inline script`,\n `Integrated PostHog into your layout`,\n ];\n\n if (\n context.renderingMode === AstroRenderingMode.SSR ||\n context.renderingMode === AstroRenderingMode.HYBRID\n ) {\n changes.push(`Set up posthog-node for server-side tracking`);\n }\n\n if (context.renderingMode === AstroRenderingMode.VIEW_TRANSITIONS) {\n changes.push(\n `Added initialization guard for view transitions compatibility`,\n );\n }\n\n return changes;\n },\n getOutroNextSteps: () => {\n return [\n 'Start your development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n ];\n },\n },\n};\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WizardOptions } from '../utils/types';
|
|
2
|
+
export declare const getAstroVersionBucket: (version: string | undefined) => string;
|
|
3
|
+
export declare enum AstroRenderingMode {
|
|
4
|
+
STATIC = "static",
|
|
5
|
+
SSR = "ssr",
|
|
6
|
+
HYBRID = "hybrid",
|
|
7
|
+
VIEW_TRANSITIONS = "view-transitions"
|
|
8
|
+
}
|
|
9
|
+
export declare const IGNORE_PATTERNS: string[];
|
|
10
|
+
/**
|
|
11
|
+
* Detect the Astro rendering mode by analyzing:
|
|
12
|
+
* 1. astro.config.* for output mode
|
|
13
|
+
* 2. Package.json for adapters
|
|
14
|
+
* 3. Source files for view transitions usage
|
|
15
|
+
*/
|
|
16
|
+
export declare function getAstroRenderingMode({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<AstroRenderingMode>;
|
|
17
|
+
export declare const getAstroRenderingModeName: (mode: AstroRenderingMode) => string;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getAstroRenderingModeName = exports.IGNORE_PATTERNS = exports.AstroRenderingMode = exports.getAstroVersionBucket = void 0;
|
|
7
|
+
exports.getAstroRenderingMode = getAstroRenderingMode;
|
|
8
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const clack_utils_1 = require("../utils/clack-utils");
|
|
12
|
+
const clack_1 = __importDefault(require("../utils/clack"));
|
|
13
|
+
const constants_1 = require("../lib/constants");
|
|
14
|
+
const semver_1 = require("../utils/semver");
|
|
15
|
+
exports.getAstroVersionBucket = (0, semver_1.createVersionBucket)();
|
|
16
|
+
var AstroRenderingMode;
|
|
17
|
+
(function (AstroRenderingMode) {
|
|
18
|
+
AstroRenderingMode["STATIC"] = "static";
|
|
19
|
+
AstroRenderingMode["SSR"] = "ssr";
|
|
20
|
+
AstroRenderingMode["HYBRID"] = "hybrid";
|
|
21
|
+
AstroRenderingMode["VIEW_TRANSITIONS"] = "view-transitions";
|
|
22
|
+
})(AstroRenderingMode || (exports.AstroRenderingMode = AstroRenderingMode = {}));
|
|
23
|
+
exports.IGNORE_PATTERNS = [
|
|
24
|
+
'**/node_modules/**',
|
|
25
|
+
'**/dist/**',
|
|
26
|
+
'**/.astro/**',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Detect the Astro rendering mode by analyzing:
|
|
30
|
+
* 1. astro.config.* for output mode
|
|
31
|
+
* 2. Package.json for adapters
|
|
32
|
+
* 3. Source files for view transitions usage
|
|
33
|
+
*/
|
|
34
|
+
async function getAstroRenderingMode({ installDir, }) {
|
|
35
|
+
// Check for astro config file
|
|
36
|
+
const configMatches = await (0, fast_glob_1.default)('astro.config.@(mjs|ts|js)', {
|
|
37
|
+
dot: true,
|
|
38
|
+
cwd: installDir,
|
|
39
|
+
ignore: exports.IGNORE_PATTERNS,
|
|
40
|
+
});
|
|
41
|
+
let hasAdapter = false;
|
|
42
|
+
let outputMode = null;
|
|
43
|
+
let usesViewTransitions = false;
|
|
44
|
+
// Check package.json for adapters
|
|
45
|
+
try {
|
|
46
|
+
const packageJsonPath = path_1.default.join(installDir, 'package.json');
|
|
47
|
+
const packageJsonContent = await promises_1.default.readFile(packageJsonPath, 'utf-8');
|
|
48
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
49
|
+
const allDeps = {
|
|
50
|
+
...packageJson.dependencies,
|
|
51
|
+
...packageJson.devDependencies,
|
|
52
|
+
};
|
|
53
|
+
// Check for Astro adapters (node, vercel, netlify, cloudflare, etc.)
|
|
54
|
+
hasAdapter = Object.keys(allDeps).some((dep) => dep.startsWith('@astrojs/') &&
|
|
55
|
+
(dep.includes('node') ||
|
|
56
|
+
dep.includes('vercel') ||
|
|
57
|
+
dep.includes('netlify') ||
|
|
58
|
+
dep.includes('cloudflare') ||
|
|
59
|
+
dep.includes('deno')));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// package.json not found or invalid
|
|
63
|
+
}
|
|
64
|
+
// Parse astro config for output mode
|
|
65
|
+
if (configMatches.length > 0) {
|
|
66
|
+
try {
|
|
67
|
+
const configPath = path_1.default.join(installDir, configMatches[0]);
|
|
68
|
+
const configContent = await promises_1.default.readFile(configPath, 'utf-8');
|
|
69
|
+
// Simple regex to detect output mode
|
|
70
|
+
const outputMatch = configContent.match(/output:\s*['"](\w+)['"]/);
|
|
71
|
+
if (outputMatch) {
|
|
72
|
+
outputMode = outputMatch[1];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Config file not readable
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Check for view transitions usage
|
|
80
|
+
const viewTransitionMatches = await (0, fast_glob_1.default)('**/*.@(astro|ts|tsx|js|jsx)', {
|
|
81
|
+
dot: true,
|
|
82
|
+
cwd: installDir,
|
|
83
|
+
ignore: exports.IGNORE_PATTERNS,
|
|
84
|
+
});
|
|
85
|
+
for (const file of viewTransitionMatches.slice(0, 20)) {
|
|
86
|
+
// Check first 20 files
|
|
87
|
+
try {
|
|
88
|
+
const filePath = path_1.default.join(installDir, file);
|
|
89
|
+
const content = await promises_1.default.readFile(filePath, 'utf-8');
|
|
90
|
+
if (content.includes('ClientRouter') ||
|
|
91
|
+
content.includes('ViewTransitions') ||
|
|
92
|
+
content.includes('astro:transitions')) {
|
|
93
|
+
usesViewTransitions = true;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// File not readable
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Determine rendering mode based on findings
|
|
102
|
+
if (usesViewTransitions) {
|
|
103
|
+
clack_1.default.log.info(`Detected Astro with View Transitions (ClientRouter) 🔄`);
|
|
104
|
+
return AstroRenderingMode.VIEW_TRANSITIONS;
|
|
105
|
+
}
|
|
106
|
+
if (outputMode === 'server' && hasAdapter) {
|
|
107
|
+
clack_1.default.log.info(`Detected Astro SSR mode 🖥️`);
|
|
108
|
+
return AstroRenderingMode.SSR;
|
|
109
|
+
}
|
|
110
|
+
// In Astro 5, 'static' is the default and supports per-page SSR opt-in when an adapter is present
|
|
111
|
+
// This is the "hybrid" pattern even if output mode isn't explicitly set
|
|
112
|
+
if (hasAdapter) {
|
|
113
|
+
clack_1.default.log.info(`Detected Astro hybrid mode 🔀`);
|
|
114
|
+
return AstroRenderingMode.HYBRID;
|
|
115
|
+
}
|
|
116
|
+
if (!hasAdapter) {
|
|
117
|
+
clack_1.default.log.info(`Detected Astro static mode 📄`);
|
|
118
|
+
return AstroRenderingMode.STATIC;
|
|
119
|
+
}
|
|
120
|
+
// If detection is ambiguous, ask the user
|
|
121
|
+
const result = await (0, clack_utils_1.abortIfCancelled)(clack_1.default.select({
|
|
122
|
+
message: 'What rendering mode is your Astro project using?',
|
|
123
|
+
options: [
|
|
124
|
+
{
|
|
125
|
+
label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.STATIC),
|
|
126
|
+
value: AstroRenderingMode.STATIC,
|
|
127
|
+
hint: 'Pre-rendered static HTML (default)',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.VIEW_TRANSITIONS),
|
|
131
|
+
value: AstroRenderingMode.VIEW_TRANSITIONS,
|
|
132
|
+
hint: 'Static with ClientRouter for SPA-like navigation',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.HYBRID),
|
|
136
|
+
value: AstroRenderingMode.HYBRID,
|
|
137
|
+
hint: 'Mostly static with some SSR pages',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
label: (0, exports.getAstroRenderingModeName)(AstroRenderingMode.SSR),
|
|
141
|
+
value: AstroRenderingMode.SSR,
|
|
142
|
+
hint: 'Full server-side rendering',
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
}), constants_1.Integration.astro);
|
|
146
|
+
return result;
|
|
147
|
+
}
|
|
148
|
+
const getAstroRenderingModeName = (mode) => {
|
|
149
|
+
switch (mode) {
|
|
150
|
+
case AstroRenderingMode.STATIC:
|
|
151
|
+
return 'Static (SSG)';
|
|
152
|
+
case AstroRenderingMode.VIEW_TRANSITIONS:
|
|
153
|
+
return 'View Transitions';
|
|
154
|
+
case AstroRenderingMode.SSR:
|
|
155
|
+
return 'Server (SSR)';
|
|
156
|
+
case AstroRenderingMode.HYBRID:
|
|
157
|
+
return 'Hybrid';
|
|
158
|
+
default:
|
|
159
|
+
return 'Static';
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
exports.getAstroRenderingModeName = getAstroRenderingModeName;
|
|
163
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/astro/utils.ts"],"names":[],"mappings":";;;;;;AA8BA,sDAqIC;AAnKD,0DAA2B;AAC3B,2DAA6B;AAC7B,gDAAwB;AACxB,sDAAwD;AACxD,2DAAmC;AAEnC,gDAA+C;AAC/C,4CAAsD;AAEzC,QAAA,qBAAqB,GAAG,IAAA,4BAAmB,GAAE,CAAC;AAE3D,IAAY,kBAKX;AALD,WAAY,kBAAkB;IAC5B,uCAAiB,CAAA;IACjB,iCAAW,CAAA;IACX,uCAAiB,CAAA;IACjB,2DAAqC,CAAA;AACvC,CAAC,EALW,kBAAkB,kCAAlB,kBAAkB,QAK7B;AAEY,QAAA,eAAe,GAAG;IAC7B,oBAAoB;IACpB,YAAY;IACZ,cAAc;CACf,CAAC;AAEF;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB,CAAC,EAC1C,UAAU,GACwB;IAClC,8BAA8B;IAC9B,MAAM,aAAa,GAAG,MAAM,IAAA,mBAAE,EAAC,2BAA2B,EAAE;QAC1D,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,uBAAe;KACxB,CAAC,CAAC;IAEH,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,kBAAkB,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG;YACd,GAAG,WAAW,CAAC,YAAY;YAC3B,GAAG,WAAW,CAAC,eAAe;SAC/B,CAAC;QAEF,qEAAqE;QACrE,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CACpC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;YAC3B,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACnB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACtB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACvB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC1B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAC1B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,qCAAqC;IACrC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE7D,qCAAqC;YACrC,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACnE,IAAI,WAAW,EAAE,CAAC;gBAChB,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,2BAA2B;QAC7B,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,qBAAqB,GAAG,MAAM,IAAA,mBAAE,EAAC,6BAA6B,EAAE;QACpE,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,uBAAe;KACxB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtD,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,IACE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACrC,CAAC;gBACD,mBAAmB,GAAG,IAAI,CAAC;gBAC3B,MAAM;YACR,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,mBAAmB,EAAE,CAAC;QACxB,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACzE,OAAO,kBAAkB,CAAC,gBAAgB,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,EAAE,CAAC;QAC1C,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC9C,OAAO,kBAAkB,CAAC,GAAG,CAAC;IAChC,CAAC;IAED,kGAAkG;IAClG,wEAAwE;IACxE,IAAI,UAAU,EAAE,CAAC;QACf,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,OAAO,kBAAkB,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChD,OAAO,kBAAkB,CAAC,MAAM,CAAC;IACnC,CAAC;IAED,0CAA0C;IAC1C,MAAM,MAAM,GAAuB,MAAM,IAAA,8BAAgB,EACvD,eAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,kDAAkD;QAC3D,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAA,iCAAyB,EAAC,kBAAkB,CAAC,MAAM,CAAC;gBAC3D,KAAK,EAAE,kBAAkB,CAAC,MAAM;gBAChC,IAAI,EAAE,oCAAoC;aAC3C;YACD;gBACE,KAAK,EAAE,IAAA,iCAAyB,EAAC,kBAAkB,CAAC,gBAAgB,CAAC;gBACrE,KAAK,EAAE,kBAAkB,CAAC,gBAAgB;gBAC1C,IAAI,EAAE,kDAAkD;aACzD;YACD;gBACE,KAAK,EAAE,IAAA,iCAAyB,EAAC,kBAAkB,CAAC,MAAM,CAAC;gBAC3D,KAAK,EAAE,kBAAkB,CAAC,MAAM;gBAChC,IAAI,EAAE,mCAAmC;aAC1C;YACD;gBACE,KAAK,EAAE,IAAA,iCAAyB,EAAC,kBAAkB,CAAC,GAAG,CAAC;gBACxD,KAAK,EAAE,kBAAkB,CAAC,GAAG;gBAC7B,IAAI,EAAE,4BAA4B;aACnC;SACF;KACF,CAAC,EACF,uBAAW,CAAC,KAAK,CAClB,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,MAAM,yBAAyB,GAAG,CAAC,IAAwB,EAAU,EAAE;IAC5E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC,MAAM;YAC5B,OAAO,cAAc,CAAC;QACxB,KAAK,kBAAkB,CAAC,gBAAgB;YACtC,OAAO,kBAAkB,CAAC;QAC5B,KAAK,kBAAkB,CAAC,GAAG;YACzB,OAAO,cAAc,CAAC;QACxB,KAAK,kBAAkB,CAAC,MAAM;YAC5B,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC,CAAC;AAbW,QAAA,yBAAyB,6BAapC","sourcesContent":["import fg from 'fast-glob';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { abortIfCancelled } from '../utils/clack-utils';\nimport clack from '../utils/clack';\nimport type { WizardOptions } from '../utils/types';\nimport { Integration } from '../lib/constants';\nimport { createVersionBucket } from '../utils/semver';\n\nexport const getAstroVersionBucket = createVersionBucket();\n\nexport enum AstroRenderingMode {\n STATIC = 'static',\n SSR = 'ssr',\n HYBRID = 'hybrid',\n VIEW_TRANSITIONS = 'view-transitions',\n}\n\nexport const IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/.astro/**',\n];\n\n/**\n * Detect the Astro rendering mode by analyzing:\n * 1. astro.config.* for output mode\n * 2. Package.json for adapters\n * 3. Source files for view transitions usage\n */\nexport async function getAstroRenderingMode({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<AstroRenderingMode> {\n // Check for astro config file\n const configMatches = await fg('astro.config.@(mjs|ts|js)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n let hasAdapter = false;\n let outputMode: string | null = null;\n let usesViewTransitions = false;\n\n // Check package.json for adapters\n try {\n const packageJsonPath = path.join(installDir, 'package.json');\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n // Check for Astro adapters (node, vercel, netlify, cloudflare, etc.)\n hasAdapter = Object.keys(allDeps).some(\n (dep) =>\n dep.startsWith('@astrojs/') &&\n (dep.includes('node') ||\n dep.includes('vercel') ||\n dep.includes('netlify') ||\n dep.includes('cloudflare') ||\n dep.includes('deno')),\n );\n } catch {\n // package.json not found or invalid\n }\n\n // Parse astro config for output mode\n if (configMatches.length > 0) {\n try {\n const configPath = path.join(installDir, configMatches[0]);\n const configContent = await fs.readFile(configPath, 'utf-8');\n\n // Simple regex to detect output mode\n const outputMatch = configContent.match(/output:\\s*['\"](\\w+)['\"]/);\n if (outputMatch) {\n outputMode = outputMatch[1];\n }\n } catch {\n // Config file not readable\n }\n }\n\n // Check for view transitions usage\n const viewTransitionMatches = await fg('**/*.@(astro|ts|tsx|js|jsx)', {\n dot: true,\n cwd: installDir,\n ignore: IGNORE_PATTERNS,\n });\n\n for (const file of viewTransitionMatches.slice(0, 20)) {\n // Check first 20 files\n try {\n const filePath = path.join(installDir, file);\n const content = await fs.readFile(filePath, 'utf-8');\n if (\n content.includes('ClientRouter') ||\n content.includes('ViewTransitions') ||\n content.includes('astro:transitions')\n ) {\n usesViewTransitions = true;\n break;\n }\n } catch {\n // File not readable\n }\n }\n\n // Determine rendering mode based on findings\n if (usesViewTransitions) {\n clack.log.info(`Detected Astro with View Transitions (ClientRouter) 🔄`);\n return AstroRenderingMode.VIEW_TRANSITIONS;\n }\n\n if (outputMode === 'server' && hasAdapter) {\n clack.log.info(`Detected Astro SSR mode 🖥️`);\n return AstroRenderingMode.SSR;\n }\n\n // In Astro 5, 'static' is the default and supports per-page SSR opt-in when an adapter is present\n // This is the \"hybrid\" pattern even if output mode isn't explicitly set\n if (hasAdapter) {\n clack.log.info(`Detected Astro hybrid mode 🔀`);\n return AstroRenderingMode.HYBRID;\n }\n\n if (!hasAdapter) {\n clack.log.info(`Detected Astro static mode 📄`);\n return AstroRenderingMode.STATIC;\n }\n\n // If detection is ambiguous, ask the user\n const result: AstroRenderingMode = await abortIfCancelled(\n clack.select({\n message: 'What rendering mode is your Astro project using?',\n options: [\n {\n label: getAstroRenderingModeName(AstroRenderingMode.STATIC),\n value: AstroRenderingMode.STATIC,\n hint: 'Pre-rendered static HTML (default)',\n },\n {\n label: getAstroRenderingModeName(AstroRenderingMode.VIEW_TRANSITIONS),\n value: AstroRenderingMode.VIEW_TRANSITIONS,\n hint: 'Static with ClientRouter for SPA-like navigation',\n },\n {\n label: getAstroRenderingModeName(AstroRenderingMode.HYBRID),\n value: AstroRenderingMode.HYBRID,\n hint: 'Mostly static with some SSR pages',\n },\n {\n label: getAstroRenderingModeName(AstroRenderingMode.SSR),\n value: AstroRenderingMode.SSR,\n hint: 'Full server-side rendering',\n },\n ],\n }),\n Integration.astro,\n );\n\n return result;\n}\n\nexport const getAstroRenderingModeName = (mode: AstroRenderingMode): string => {\n switch (mode) {\n case AstroRenderingMode.STATIC:\n return 'Static (SSG)';\n case AstroRenderingMode.VIEW_TRANSITIONS:\n return 'View Transitions';\n case AstroRenderingMode.SSR:\n return 'Server (SSR)';\n case AstroRenderingMode.HYBRID:\n return 'Hybrid';\n default:\n return 'Static';\n }\n};\n"]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type { FrameworkConfig } from '../lib/framework-config';
|
|
2
|
+
import { DjangoProjectType } from './utils';
|
|
3
|
+
type DjangoContext = {
|
|
4
|
+
projectType?: DjangoProjectType;
|
|
5
|
+
settingsFile?: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const DJANGO_AGENT_CONFIG: FrameworkConfig<DjangoContext>;
|
|
8
|
+
export {};
|
|
@@ -36,22 +36,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
40
|
-
const debug_1 = require("../utils/debug");
|
|
41
|
-
const agent_runner_1 = require("../lib/agent-runner");
|
|
39
|
+
exports.DJANGO_AGENT_CONFIG = void 0;
|
|
42
40
|
const constants_1 = require("../lib/constants");
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
41
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
42
|
+
const fs = __importStar(require("node:fs"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
46
44
|
const utils_1 = require("./utils");
|
|
47
|
-
|
|
48
|
-
* Django framework configuration for the universal agent runner
|
|
49
|
-
*/
|
|
50
|
-
const MINIMUM_DJANGO_VERSION = '3.0.0';
|
|
51
|
-
const DJANGO_AGENT_CONFIG = {
|
|
45
|
+
exports.DJANGO_AGENT_CONFIG = {
|
|
52
46
|
metadata: {
|
|
53
47
|
name: 'Django',
|
|
54
48
|
integration: constants_1.Integration.django,
|
|
49
|
+
beta: true,
|
|
55
50
|
docsUrl: 'https://posthog.com/docs/libraries/django',
|
|
56
51
|
unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',
|
|
57
52
|
gatherContext: async (options) => {
|
|
@@ -64,12 +59,53 @@ const DJANGO_AGENT_CONFIG = {
|
|
|
64
59
|
packageName: 'django',
|
|
65
60
|
packageDisplayName: 'Django',
|
|
66
61
|
usesPackageJson: false,
|
|
67
|
-
getVersion: (
|
|
68
|
-
// For Django, we don't use package.json. Version is extracted separately
|
|
69
|
-
// from requirements.txt or pyproject.toml in the wizard entry point
|
|
70
|
-
return undefined;
|
|
71
|
-
},
|
|
62
|
+
getVersion: () => undefined,
|
|
72
63
|
getVersionBucket: utils_1.getDjangoVersionBucket,
|
|
64
|
+
minimumVersion: '3.0.0',
|
|
65
|
+
getInstalledVersion: (options) => (0, utils_1.getDjangoVersion)(options),
|
|
66
|
+
detect: async (options) => {
|
|
67
|
+
const { installDir } = options;
|
|
68
|
+
const managePyMatches = await (0, fast_glob_1.default)('**/manage.py', {
|
|
69
|
+
cwd: installDir,
|
|
70
|
+
ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],
|
|
71
|
+
});
|
|
72
|
+
if (managePyMatches.length > 0) {
|
|
73
|
+
for (const match of managePyMatches) {
|
|
74
|
+
try {
|
|
75
|
+
const content = fs.readFileSync(path.join(installDir, match), 'utf-8');
|
|
76
|
+
// Check for actual Django imports and usage
|
|
77
|
+
if (content.includes('from django') ||
|
|
78
|
+
content.includes('import django') ||
|
|
79
|
+
content.includes('DJANGO_SETTINGS_MODULE') ||
|
|
80
|
+
/execute_from_command_line/.test(content)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const requirementsFiles = await (0, fast_glob_1.default)(['**/requirements*.txt', '**/pyproject.toml', '**/setup.py'], {
|
|
90
|
+
cwd: installDir,
|
|
91
|
+
ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],
|
|
92
|
+
});
|
|
93
|
+
for (const reqFile of requirementsFiles) {
|
|
94
|
+
try {
|
|
95
|
+
const content = fs.readFileSync(path.join(installDir, reqFile), 'utf-8');
|
|
96
|
+
// Match Django as a package requirement, not in comments or other text
|
|
97
|
+
// Look for: django, django>=, django==, django~=, Django (capitalized)
|
|
98
|
+
if (/^django([>=~!<\s]|$)/im.test(content) ||
|
|
99
|
+
/["']django["']/i.test(content)) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
},
|
|
73
109
|
},
|
|
74
110
|
environment: {
|
|
75
111
|
uploadToHosting: false,
|
|
@@ -79,20 +115,16 @@ const DJANGO_AGENT_CONFIG = {
|
|
|
79
115
|
}),
|
|
80
116
|
},
|
|
81
117
|
analytics: {
|
|
82
|
-
getTags: (context) => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
projectType: projectType || 'unknown',
|
|
86
|
-
};
|
|
87
|
-
},
|
|
118
|
+
getTags: (context) => ({
|
|
119
|
+
projectType: context.projectType || 'unknown',
|
|
120
|
+
}),
|
|
88
121
|
},
|
|
89
122
|
prompts: {
|
|
90
123
|
projectTypeDetection: 'This is a Python/Django project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or manage.py to confirm.',
|
|
91
124
|
packageInstallation: 'Use pip, poetry, or pipenv based on existing config files (requirements.txt, pyproject.toml, Pipfile). Do not pin the posthog version - just add "posthog" without version constraints.',
|
|
92
125
|
getAdditionalContextLines: (context) => {
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
? (0, utils_1.getDjangoProjectTypeName)(projectType)
|
|
126
|
+
const projectTypeName = context.projectType
|
|
127
|
+
? (0, utils_1.getDjangoProjectTypeName)(context.projectType)
|
|
96
128
|
: 'unknown';
|
|
97
129
|
// Map project type to framework ID for MCP docs resource
|
|
98
130
|
const frameworkIdMap = {
|
|
@@ -101,7 +133,9 @@ const DJANGO_AGENT_CONFIG = {
|
|
|
101
133
|
[utils_1.DjangoProjectType.WAGTAIL]: 'django',
|
|
102
134
|
[utils_1.DjangoProjectType.CHANNELS]: 'django',
|
|
103
135
|
};
|
|
104
|
-
const frameworkId = projectType
|
|
136
|
+
const frameworkId = context.projectType
|
|
137
|
+
? frameworkIdMap[context.projectType]
|
|
138
|
+
: 'django';
|
|
105
139
|
const lines = [
|
|
106
140
|
`Project type: ${projectTypeName}`,
|
|
107
141
|
`Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,
|
|
@@ -116,9 +150,8 @@ const DJANGO_AGENT_CONFIG = {
|
|
|
116
150
|
successMessage: 'PostHog integration complete',
|
|
117
151
|
estimatedDurationMinutes: 5,
|
|
118
152
|
getOutroChanges: (context) => {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
? (0, utils_1.getDjangoProjectTypeName)(projectType)
|
|
153
|
+
const projectTypeName = context.projectType
|
|
154
|
+
? (0, utils_1.getDjangoProjectTypeName)(context.projectType)
|
|
122
155
|
: 'Django';
|
|
123
156
|
return [
|
|
124
157
|
`Analyzed your ${projectTypeName} project structure`,
|
|
@@ -134,26 +167,4 @@ const DJANGO_AGENT_CONFIG = {
|
|
|
134
167
|
],
|
|
135
168
|
},
|
|
136
169
|
};
|
|
137
|
-
/**
|
|
138
|
-
* Django wizard powered by the universal agent runner.
|
|
139
|
-
*/
|
|
140
|
-
async function runDjangoWizardAgent(options) {
|
|
141
|
-
if (options.debug) {
|
|
142
|
-
(0, debug_1.enableDebugLogs)();
|
|
143
|
-
}
|
|
144
|
-
// Check Django version - agent wizard requires >= 3.0.0
|
|
145
|
-
const djangoVersion = await (0, utils_1.getDjangoVersion)(options);
|
|
146
|
-
if (djangoVersion) {
|
|
147
|
-
const coercedVersion = semver.coerce(djangoVersion);
|
|
148
|
-
if (coercedVersion && semver.lt(coercedVersion, MINIMUM_DJANGO_VERSION)) {
|
|
149
|
-
const docsUrl = DJANGO_AGENT_CONFIG.metadata.unsupportedVersionDocsUrl ??
|
|
150
|
-
DJANGO_AGENT_CONFIG.metadata.docsUrl;
|
|
151
|
-
clack_1.default.log.warn(`Sorry: the wizard can't help you with Django ${djangoVersion}. Upgrade to Django ${MINIMUM_DJANGO_VERSION} or later, or check out the manual setup guide.`);
|
|
152
|
-
clack_1.default.log.info(`Setup Django manually: ${chalk_1.default.cyan(docsUrl)}`);
|
|
153
|
-
clack_1.default.outro('PostHog wizard will see you next time!');
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
await (0, agent_runner_1.runAgentWizard)(DJANGO_AGENT_CONFIG, options);
|
|
158
|
-
}
|
|
159
170
|
//# sourceMappingURL=django-wizard-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"django-wizard-agent.js","sourceRoot":"","sources":["../../../src/django/django-wizard-agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"django-wizard-agent.js","sourceRoot":"","sources":["../../../src/django/django-wizard-agent.ts"],"names":[],"mappings":"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","sourcesContent":["/* Django wizard using posthog-agent with PostHog MCP */\nimport type { WizardOptions } from '../utils/types';\nimport type { FrameworkConfig } from '../lib/framework-config';\nimport { Integration } from '../lib/constants';\nimport fg from 'fast-glob';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport {\n getDjangoVersion,\n getDjangoProjectType,\n getDjangoProjectTypeName,\n getDjangoVersionBucket,\n DjangoProjectType,\n findDjangoSettingsFile,\n} from './utils';\n\ntype DjangoContext = {\n projectType?: DjangoProjectType;\n settingsFile?: string;\n};\n\nexport const DJANGO_AGENT_CONFIG: FrameworkConfig<DjangoContext> = {\n metadata: {\n name: 'Django',\n integration: Integration.django,\n beta: true,\n docsUrl: 'https://posthog.com/docs/libraries/django',\n unsupportedVersionDocsUrl: 'https://posthog.com/docs/libraries/python',\n gatherContext: async (options: WizardOptions) => {\n const projectType = await getDjangoProjectType(options);\n const settingsFile = await findDjangoSettingsFile(options);\n return { projectType, settingsFile };\n },\n },\n\n detection: {\n packageName: 'django',\n packageDisplayName: 'Django',\n usesPackageJson: false,\n getVersion: () => undefined,\n getVersionBucket: getDjangoVersionBucket,\n minimumVersion: '3.0.0',\n getInstalledVersion: (options: WizardOptions) => getDjangoVersion(options),\n detect: async (options) => {\n const { installDir } = options;\n\n const managePyMatches = await fg('**/manage.py', {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n });\n\n if (managePyMatches.length > 0) {\n for (const match of managePyMatches) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, match),\n 'utf-8',\n );\n // Check for actual Django imports and usage\n if (\n content.includes('from django') ||\n content.includes('import django') ||\n content.includes('DJANGO_SETTINGS_MODULE') ||\n /execute_from_command_line/.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n }\n\n const requirementsFiles = await fg(\n ['**/requirements*.txt', '**/pyproject.toml', '**/setup.py'],\n {\n cwd: installDir,\n ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],\n },\n );\n\n for (const reqFile of requirementsFiles) {\n try {\n const content = fs.readFileSync(\n path.join(installDir, reqFile),\n 'utf-8',\n );\n // Match Django as a package requirement, not in comments or other text\n // Look for: django, django>=, django==, django~=, Django (capitalized)\n if (\n /^django([>=~!<\\s]|$)/im.test(content) ||\n /[\"']django[\"']/i.test(content)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n\n return false;\n },\n },\n\n environment: {\n uploadToHosting: false,\n getEnvVars: (apiKey: string, host: string) => ({\n POSTHOG_API_KEY: apiKey,\n POSTHOG_HOST: host,\n }),\n },\n\n analytics: {\n getTags: (context) => ({\n projectType: context.projectType || 'unknown',\n }),\n },\n\n prompts: {\n projectTypeDetection:\n 'This is a Python/Django project. Look for requirements.txt, pyproject.toml, setup.py, Pipfile, or manage.py to confirm.',\n packageInstallation:\n 'Use pip, poetry, or pipenv based on existing config files (requirements.txt, pyproject.toml, Pipfile). Do not pin the posthog version - just add \"posthog\" without version constraints.',\n getAdditionalContextLines: (context) => {\n const projectTypeName = context.projectType\n ? getDjangoProjectTypeName(context.projectType)\n : 'unknown';\n\n // Map project type to framework ID for MCP docs resource\n const frameworkIdMap: Record<DjangoProjectType, string> = {\n [DjangoProjectType.STANDARD]: 'django',\n [DjangoProjectType.DRF]: 'django',\n [DjangoProjectType.WAGTAIL]: 'django',\n [DjangoProjectType.CHANNELS]: 'django',\n };\n\n const frameworkId = context.projectType\n ? frameworkIdMap[context.projectType]\n : 'django';\n\n const lines = [\n `Project type: ${projectTypeName}`,\n `Framework docs ID: ${frameworkId} (use posthog://docs/frameworks/${frameworkId} for documentation)`,\n ];\n\n if (context.settingsFile) {\n lines.push(`Settings file: ${context.settingsFile}`);\n }\n\n return lines;\n },\n },\n\n ui: {\n successMessage: 'PostHog integration complete',\n estimatedDurationMinutes: 5,\n getOutroChanges: (context) => {\n const projectTypeName = context.projectType\n ? getDjangoProjectTypeName(context.projectType)\n : 'Django';\n return [\n `Analyzed your ${projectTypeName} project structure`,\n `Installed the PostHog Python package`,\n `Configured PostHog in your Django settings`,\n `Added PostHog middleware for automatic event tracking`,\n ];\n },\n getOutroNextSteps: () => [\n 'Start your Django development server to see PostHog in action',\n 'Visit your PostHog dashboard to see incoming events',\n 'Use identify_context() within new_context() to associate events with users',\n ],\n },\n};\n"]}
|
|
@@ -8,7 +8,7 @@ export declare enum DjangoProjectType {
|
|
|
8
8
|
/**
|
|
9
9
|
* Get Django version bucket for analytics
|
|
10
10
|
*/
|
|
11
|
-
export declare
|
|
11
|
+
export declare const getDjangoVersionBucket: (version: string | undefined) => string;
|
|
12
12
|
/**
|
|
13
13
|
* Extract Django version from requirements files or pyproject.toml
|
|
14
14
|
*/
|
package/dist/src/django/utils.js
CHANGED
|
@@ -36,16 +36,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.DjangoProjectType = void 0;
|
|
40
|
-
exports.getDjangoVersionBucket = getDjangoVersionBucket;
|
|
39
|
+
exports.getDjangoVersionBucket = exports.DjangoProjectType = void 0;
|
|
41
40
|
exports.getDjangoVersion = getDjangoVersion;
|
|
42
41
|
exports.getDjangoProjectType = getDjangoProjectType;
|
|
43
42
|
exports.getDjangoProjectTypeName = getDjangoProjectTypeName;
|
|
44
43
|
exports.findDjangoSettingsFile = findDjangoSettingsFile;
|
|
45
44
|
exports.findDjangoUrlsFile = findDjangoUrlsFile;
|
|
46
|
-
const semver_1 = require("semver");
|
|
47
45
|
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
48
46
|
const clack_1 = __importDefault(require("../utils/clack"));
|
|
47
|
+
const semver_1 = require("../utils/semver");
|
|
49
48
|
const fs = __importStar(require("node:fs"));
|
|
50
49
|
const path = __importStar(require("node:path"));
|
|
51
50
|
var DjangoProjectType;
|
|
@@ -69,25 +68,7 @@ const IGNORE_PATTERNS = [
|
|
|
69
68
|
/**
|
|
70
69
|
* Get Django version bucket for analytics
|
|
71
70
|
*/
|
|
72
|
-
|
|
73
|
-
if (!version) {
|
|
74
|
-
return 'none';
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
const minVer = (0, semver_1.minVersion)(version);
|
|
78
|
-
if (!minVer) {
|
|
79
|
-
return 'invalid';
|
|
80
|
-
}
|
|
81
|
-
const majorVersion = (0, semver_1.major)(minVer);
|
|
82
|
-
if (majorVersion >= 3) {
|
|
83
|
-
return `${majorVersion}.x`;
|
|
84
|
-
}
|
|
85
|
-
return `<3.0.0`;
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
return 'unknown';
|
|
89
|
-
}
|
|
90
|
-
}
|
|
71
|
+
exports.getDjangoVersionBucket = (0, semver_1.createVersionBucket)();
|
|
91
72
|
/**
|
|
92
73
|
* Extract Django version from requirements files or pyproject.toml
|
|
93
74
|
*/
|