codedna 0.2.0__tar.gz → 0.2.1__tar.gz
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.
- codedna-0.2.1/.env.ls +6 -0
- {codedna-0.2.0 → codedna-0.2.1}/PKG-INFO +1 -1
- {codedna-0.2.0 → codedna-0.2.1}/codedna/plan.py +12 -4
- codedna-0.2.1/dashboard/app/api/billing/checkout/route.ts +49 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/billing/page.tsx +98 -10
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/pricing/page.tsx +108 -61
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/i18n/en.ts +1 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/i18n/tr.ts +1 -0
- {codedna-0.2.0 → codedna-0.2.1}/pyproject.toml +1 -1
- codedna-0.2.0/dashboard/app/api/billing/checkout/route.ts +0 -47
- {codedna-0.2.0 → codedna-0.2.1}/.env.example +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/.github/workflows/codedna.yml +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/.gitignore +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/.python-version +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/README.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/__init__.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/ai_fingerprint.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/analyzer.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/api.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/auth.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/bus_factor.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/cli.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/db.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/git_hook.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/__init__.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/github_bot.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/jira.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/integrations/lemonsqueezy.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/interview.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/onboarding.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/protection.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/rate_limit.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/scorer.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/sprint_health.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/survey.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/codedna/tech_debt.py +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/.env.local.example +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/.gitignore +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/README.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/ai-compare/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/login/route.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/logout/route.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/me/route.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/api/auth/register/route.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/bus-factor/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/commits/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/debt/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/favicon.ico +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/files/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/fonts/GeistMonoVF.woff +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/fonts/GeistVF.woff +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/globals.css +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/interview/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/layout.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/login/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/onboarding/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/protected/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/register/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/settings/integrations/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/app/sprints/page.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/AnlamaGrafigi.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/AuthProvider.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/ClientProviders.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/CommitTable.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/CostInfoTooltip.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/FeatureGate.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/FileHeatmap.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/HataBanner.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/LanguageSwitcher.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/NavClient.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/OverviewTitles.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/QuickInsights.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/RiskBadge.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/SummaryCards.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/components/UpgradeBanner.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/api.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/auth.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/i18n/index.tsx +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/lib/plan.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/next-env.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/next.config.mjs +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/package-lock.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/package.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/postcss.config.mjs +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/tailwind.config.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/dashboard/tsconfig.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/hooks/post-commit +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/uv.lock +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/.bin/tsc +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/.bin/tsserver +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/.package-lock.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/LICENSE +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/README.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/assert/strict.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/assert.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/async_hooks.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/buffer.buffer.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/buffer.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/child_process.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/cluster.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/disposable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/index.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/indexable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/compatibility/iterators.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/console.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/constants.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/crypto.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/dgram.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/diagnostics_channel.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/dns/promises.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/dns.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/domain.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/events.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/fs/promises.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/fs.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/globals.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/globals.typedarray.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/http.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/http2.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/https.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/index.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/inspector.generated.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/module.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/net.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/os.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/package.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/path.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/perf_hooks.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/process.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/punycode.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/querystring.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/readline/promises.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/readline.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/repl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/sea.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream/consumers.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream/promises.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream/web.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/stream.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/string_decoder.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/test.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/timers/promises.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/timers.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/tls.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/trace_events.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/ts5.6/index.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/tty.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/url.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/util.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/v8.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/vm.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/wasi.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/abortcontroller.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/domexception.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/events.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/web-globals/fetch.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/worker_threads.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/node/zlib.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/LICENSE +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/README.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/index.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/@types/vscode/package.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/LICENSE.txt +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/README.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/SECURITY.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/ThirdPartyNoticeText.txt +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/bin/tsc +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/bin/tsserver +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/_tsc.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/_tsserver.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/_typingsInstaller.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/de/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/es/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/it/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.decorators.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.decorators.legacy.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.dom.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.dom.iterable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.collection.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.core.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.generator.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.iterable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.promise.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.proxy.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.reflect.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.array.include.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2016.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.date.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.object.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.string.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.promise.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2018.regexp.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.array.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.object.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.string.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2019.symbol.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.bigint.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.date.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.number.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.promise.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.string.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.promise.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.string.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2021.weakref.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.array.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.error.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.object.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.regexp.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2022.string.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.array.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.collection.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2023.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.collection.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.object.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.promise.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.regexp.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es2024.string.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es5.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.es6.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.array.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.collection.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.decorators.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.disposable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.error.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.float16.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.full.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.intl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.iterator.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.promise.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.scripthost.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/lib.webworker.iterable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsc.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsserver.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/tsserverlibrary.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typesMap.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typescript.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typescript.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/typingsInstaller.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/watchGuard.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/typescript/package.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/LICENSE +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/README.md +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/agent.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/api.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/balanced-pool.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/cache.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/client.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/connector.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/content-type.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/cookies.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/diagnostics-channel.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/dispatcher.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/env-http-proxy-agent.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/errors.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/eventsource.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/fetch.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/file.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/filereader.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/formdata.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/global-dispatcher.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/global-origin.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/handlers.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/header.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/index.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/interceptors.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-agent.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-client.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-errors.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-interceptor.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/mock-pool.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/package.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/patch.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/pool-stats.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/pool.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/proxy-agent.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/readable.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/retry-agent.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/retry-handler.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/util.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/webidl.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/node_modules/undici-types/websocket.d.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/apiClient.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/apiClient.js.map +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/decorations.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/decorations.js.map +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/extension.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/extension.js.map +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/statusBar.js +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/out/statusBar.js.map +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/package-lock.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/package.json +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/apiClient.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/decorations.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/extension.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/src/statusBar.ts +0 -0
- {codedna-0.2.0 → codedna-0.2.1}/vscode-extension/tsconfig.json +0 -0
codedna-0.2.1/.env.ls
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
LEMONSQUEEZY_API_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI5NGQ1OWNlZi1kYmI4LTRlYTUtYjE3OC1kMjU0MGZjZDY5MTkiLCJqdGkiOiJjNDRkOTE2Y2VkMTkzYWY4Y2YxYzE0NWNiOWFkZGQwMDhkYjI3MjFmN2RjMTY2YmY2ZjZmYzYzMjk2YWQ1MDIyMzExMTNhNWY0OTYwYjQ0MCIsImlhdCI6MTc4MjIzMzAxNC43NTY5MzYsIm5iZiI6MTc4MjIzMzAxNC43NTY5MzgsImV4cCI6MTc5Nzk4NDAwMC4wNDM2ODcsInN1YiI6Ijc0NTI2NzIiLCJzY29wZXMiOltdfQ.RpIFrkd63uqxWvY52AdyT84kKaN703-OkMr58bp0_60ro9-LhgpKyJY1fjCqO4Fb4ikubUerACTJy-NBkZXJMPaJ7L3YYZvD9ZyuUN7Ui6R7ipQknSP8sii5TDhYCITEXjZHblC_l3z6x-K-AKkwu7_tJKt2aeJK0nas31fkvdvh1JAX9F7KzkxWUCOYKSCMEXmjM07-l4Rs4_mLV06cu-DHpWWwgGd92RV13CPDZ8MGeI8Wp8qLuWVgFXAw--6uo1O3jlepZYltUAuBZN8hS_jyf05oBVoCCiB4N8yr59ejLCbRA6JQEydY7VqbPwmsqPg9FgdIP0Z3QScLZyOi4Enf6S65nKk0IShPT9DYpwyqQ52za1ibvxQhlI72w9MVvf2aInF-AknkM4ABw73JQf-R_kX7EMOtkXm7SlXy7XfirFBgrg2wmKw-lOodm6qAoWX98Q7p_En58PRka671GPziNebeUNXPmezlLG3BG3MJTWExQO8ljw_pAcETcvl6u--NqnSmi4bw6aFaWUuXNIa0-z87g3p6H0831yFbjjslBNWiRpwrhnJSx-4NyDIpleZR0iQde_5lyEU-eDIG8V9V-lKjSxLDgjiJLD-8dIsZGHz0bVRhgCAvs-QdzVr9eGGe0MEtizhEqr3CUX6YTR5DiPSHM5xRMdbqmsV6vTo
|
|
2
|
+
LEMONSQUEEZY_STORE_ID=415918
|
|
3
|
+
LEMONSQUEEZY_WEBHOOK_SECRET=webhook-test-secret-1234567890
|
|
4
|
+
LS_VARIANT_PRO=1828791
|
|
5
|
+
LS_VARIANT_TEAM=1828772
|
|
6
|
+
LS_VARIANT_ENTERPRISE=1828714
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codedna
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: AI kod şeffaflık aracı — her commit'te AI yazım oranını ve anlama skorunu ölçer
|
|
5
5
|
Project-URL: Homepage, https://codedna.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/natureco-official/codedna
|
|
@@ -87,7 +87,9 @@ def activate_license(key: str) -> Plan:
|
|
|
87
87
|
"""
|
|
88
88
|
Lisans anahtarını doğrula ve aktif et.
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
Not: Lemon Squeezy lisans key API'si sağlamaz — satın alma checkout URL
|
|
91
|
+
üzerinden yapılır, webhook ile subscription_status güncellenir.
|
|
92
|
+
|
|
91
93
|
Şimdilik anahtar formatına göre plan belirler:
|
|
92
94
|
- 'CDNA-PRO-...' → pro
|
|
93
95
|
- 'CDNA-TEAM-...' → team
|
|
@@ -100,6 +102,8 @@ def activate_license(key: str) -> Plan:
|
|
|
100
102
|
Aktif edilen plan seviyesi
|
|
101
103
|
"""
|
|
102
104
|
anahtar = key.upper().strip()
|
|
105
|
+
|
|
106
|
+
# Plan belirleme
|
|
103
107
|
if anahtar.startswith("CDNA-PRO"):
|
|
104
108
|
plan = Plan.PRO
|
|
105
109
|
elif anahtar.startswith("CDNA-TEAM"):
|
|
@@ -109,13 +113,17 @@ def activate_license(key: str) -> Plan:
|
|
|
109
113
|
else:
|
|
110
114
|
raise ValueError(f"Geçersiz lisans anahtarı formatı: {key!r}")
|
|
111
115
|
|
|
112
|
-
|
|
116
|
+
_write_license_file(plan, anahtar)
|
|
117
|
+
return plan
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _write_license_file(plan: Plan, key: str) -> None:
|
|
121
|
+
"""Lisans dosyasını yaz."""
|
|
113
122
|
_LISANS_YOLU.parent.mkdir(parents=True, exist_ok=True)
|
|
114
123
|
_LISANS_YOLU.write_text(
|
|
115
|
-
json.dumps({"plan": plan.value, "key":
|
|
124
|
+
json.dumps({"plan": plan.value, "key": key}, ensure_ascii=False, indent=2),
|
|
116
125
|
encoding="utf-8",
|
|
117
126
|
)
|
|
118
|
-
return plan
|
|
119
127
|
|
|
120
128
|
|
|
121
129
|
def activate_demo_license(plan: Plan) -> Plan:
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js API Route — Billing Checkout
|
|
3
|
+
* Cookie'deki JWT token'ı FastAPI'ye iletir.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
7
|
+
|
|
8
|
+
const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000";
|
|
9
|
+
|
|
10
|
+
export async function POST(req: NextRequest) {
|
|
11
|
+
const govde = await req.json().catch(() => null);
|
|
12
|
+
if (!govde?.plan) {
|
|
13
|
+
return NextResponse.json({ detail: "Plan zorunlu." }, { status: 422 });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Cookie'den token al
|
|
17
|
+
const token = req.cookies.get("codedna_token")?.value;
|
|
18
|
+
if (!token) {
|
|
19
|
+
return NextResponse.json({ detail: "Token gerekli." }, { status: 401 });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// FastAPI'ye ilet
|
|
23
|
+
try {
|
|
24
|
+
const yanit = await fetch(`${API_URL}/billing/checkout`, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
"Authorization": `Bearer ${token}`,
|
|
28
|
+
"Content-Type": "application/json",
|
|
29
|
+
},
|
|
30
|
+
body: JSON.stringify({ plan: govde.plan }),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const veri = await yanit.json();
|
|
34
|
+
|
|
35
|
+
if (!yanit.ok) {
|
|
36
|
+
return NextResponse.json(
|
|
37
|
+
{ detail: veri.detail || "Bilinmeyen hata" },
|
|
38
|
+
{ status: yanit.status }
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return NextResponse.json(veri);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
return NextResponse.json(
|
|
45
|
+
{ detail: "API'ye bağlanılamadı." },
|
|
46
|
+
{ status: 503 }
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -49,10 +49,16 @@ function PlanKarti({
|
|
|
49
49
|
)}
|
|
50
50
|
<div>
|
|
51
51
|
<h3 className="text-white font-bold text-lg">{planAdi}</h3>
|
|
52
|
-
<div className="
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
<div className="flex items-end gap-1">
|
|
53
|
+
{fiyat === "?" ? (
|
|
54
|
+
<span className="text-2xl font-bold text-white">{t("pricing_contact_sales").split(" ")[0]}</span>
|
|
55
|
+
) : (
|
|
56
|
+
<>
|
|
57
|
+
<span className="text-2xl font-bold text-white">₺{fiyat}</span>
|
|
58
|
+
{fiyat !== "0" && (
|
|
59
|
+
<span className="text-gray-500 text-sm mb-0.5">{t("pricing_per_month")}</span>
|
|
60
|
+
)}
|
|
61
|
+
</>
|
|
56
62
|
)}
|
|
57
63
|
</div>
|
|
58
64
|
</div>
|
|
@@ -67,7 +73,7 @@ function PlanKarti({
|
|
|
67
73
|
</div>
|
|
68
74
|
) : plan === "enterprise" ? (
|
|
69
75
|
<a
|
|
70
|
-
href="mailto:hello@
|
|
76
|
+
href="mailto:hello@natureco.me"
|
|
71
77
|
className="w-full text-center py-2 px-3 rounded-xl border border-cyan-500 text-cyan-400 hover:bg-cyan-500/10 transition-colors text-sm font-medium"
|
|
72
78
|
>
|
|
73
79
|
{t("pricing_contact_sales")}
|
|
@@ -82,7 +88,7 @@ function PlanKarti({
|
|
|
82
88
|
: "bg-gray-800 hover:bg-gray-700 text-white"
|
|
83
89
|
}`}
|
|
84
90
|
>
|
|
85
|
-
{yukleniyor ? "..." : t("billing_upgrade")}
|
|
91
|
+
{yukleniyor ? "..." : `💳 ${t("billing_upgrade")}`}
|
|
86
92
|
</button>
|
|
87
93
|
)}
|
|
88
94
|
</div>
|
|
@@ -117,6 +123,7 @@ export default function BillingSayfasi() {
|
|
|
117
123
|
const [abonelik, setAbonelik] = useState<AbonelikVeri | null>(null);
|
|
118
124
|
const [checkoutYukleniyor, setCheckoutYukleniyor] = useState(false);
|
|
119
125
|
const [checkoutHata, setCheckoutHata] = useState("");
|
|
126
|
+
const [iptalYukleniyor, setIptalYukleniyor] = useState(false);
|
|
120
127
|
|
|
121
128
|
useEffect(() => {
|
|
122
129
|
// Cookie üzerinden abonelik bilgisi al
|
|
@@ -167,6 +174,36 @@ export default function BillingSayfasi() {
|
|
|
167
174
|
}
|
|
168
175
|
};
|
|
169
176
|
|
|
177
|
+
const handleIptal = async () => {
|
|
178
|
+
if (!confirm("Aboneliği iptal etmek istediğinize emin misiniz? Lemon Squeezy portalına yönlendirileceksiniz.")) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
setIptalYukleniyor(true);
|
|
182
|
+
try {
|
|
183
|
+
// Müşteriyi Lemon Squeezy customer portal'a yönlendir
|
|
184
|
+
// Bu gerçek API ile yapılır (subscription cancel)
|
|
185
|
+
const res = await fetch("/api/billing/customer-portal", {
|
|
186
|
+
method: "POST",
|
|
187
|
+
credentials: "include",
|
|
188
|
+
});
|
|
189
|
+
if (res.ok) {
|
|
190
|
+
const data = await res.json();
|
|
191
|
+
if (data.url) {
|
|
192
|
+
window.location.href = data.url;
|
|
193
|
+
} else {
|
|
194
|
+
alert("Müşteri portalı oluşturulamadı. Daha sonra tekrar deneyin.");
|
|
195
|
+
}
|
|
196
|
+
} else {
|
|
197
|
+
// Henüz API yoksa - demo: sadece sayfayı yenile
|
|
198
|
+
alert("Müşteri portalı yakında hazır olacak. Şimdilik: codedna plan demo komutunu kullanabilirsiniz.");
|
|
199
|
+
}
|
|
200
|
+
} catch (e) {
|
|
201
|
+
alert("Hata: " + (e instanceof Error ? e.message : "Bilinmeyen"));
|
|
202
|
+
} finally {
|
|
203
|
+
setIptalYukleniyor(false);
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
|
|
170
207
|
const mevcutPlan = abonelik?.plan ?? kullanici?.plan ?? "free";
|
|
171
208
|
const abonelikDurum = abonelik?.subscription_status ?? "none";
|
|
172
209
|
|
|
@@ -233,13 +270,64 @@ export default function BillingSayfasi() {
|
|
|
233
270
|
<span className="text-cyan-400">◈</span> {t("billing_upgrade")}
|
|
234
271
|
</h2>
|
|
235
272
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
|
|
236
|
-
<PlanKarti plan="free" fiyat="0"
|
|
237
|
-
<PlanKarti plan="pro" fiyat="
|
|
238
|
-
<PlanKarti plan="team" fiyat="
|
|
239
|
-
<PlanKarti plan="enterprise" fiyat="
|
|
273
|
+
<PlanKarti plan="free" fiyat="0" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
|
|
274
|
+
<PlanKarti plan="pro" fiyat="400" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
|
|
275
|
+
<PlanKarti plan="team" fiyat="800" mevcutPlan={mevcutPlan} vurgulu={true} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
|
|
276
|
+
<PlanKarti plan="enterprise" fiyat="1650" mevcutPlan={mevcutPlan} vurgulu={false} onYukselt={handleYukselt} yukleniyor={checkoutYukleniyor} t={t} />
|
|
240
277
|
</div>
|
|
241
278
|
</div>
|
|
242
279
|
|
|
280
|
+
{/* Abonelik Detayları */}
|
|
281
|
+
{abonelik && abonelikDurum === "active" && mevcutPlan !== "free" && (
|
|
282
|
+
<div className="bg-gray-900 border border-gray-800 rounded-xl p-5 space-y-4">
|
|
283
|
+
<h2 className="text-white font-semibold flex items-center gap-2">
|
|
284
|
+
<span className="text-cyan-400">◈</span> Abonelik Detayları
|
|
285
|
+
</h2>
|
|
286
|
+
|
|
287
|
+
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3 text-sm">
|
|
288
|
+
<div>
|
|
289
|
+
<p className="text-gray-500 text-xs uppercase tracking-wider">Plan</p>
|
|
290
|
+
<p className="text-white font-semibold uppercase mt-0.5">{mevcutPlan}</p>
|
|
291
|
+
</div>
|
|
292
|
+
<div>
|
|
293
|
+
<p className="text-gray-500 text-xs uppercase tracking-wider">Durum</p>
|
|
294
|
+
<div className="mt-0.5">
|
|
295
|
+
<AbonelikDurum durum={abonelikDurum} t={t} />
|
|
296
|
+
</div>
|
|
297
|
+
</div>
|
|
298
|
+
<div>
|
|
299
|
+
<p className="text-gray-500 text-xs uppercase tracking-wider">Aylık Ücret</p>
|
|
300
|
+
<p className="text-white font-semibold mt-0.5">
|
|
301
|
+
₺{mevcutPlan === "pro" ? "400" : mevcutPlan === "team" ? "800" : mevcutPlan === "enterprise" ? "1,650" : "—"}
|
|
302
|
+
</p>
|
|
303
|
+
</div>
|
|
304
|
+
<div>
|
|
305
|
+
<p className="text-gray-500 text-xs uppercase tracking-wider">Sonraki Ödeme</p>
|
|
306
|
+
<p className="text-white font-semibold mt-0.5">Aylık (otomatik)</p>
|
|
307
|
+
</div>
|
|
308
|
+
{abonelik?.lemonsqueezy_customer_id && (
|
|
309
|
+
<div className="sm:col-span-2">
|
|
310
|
+
<p className="text-gray-500 text-xs uppercase tracking-wider">Müşteri ID</p>
|
|
311
|
+
<p className="text-white font-mono text-xs mt-0.5">{abonelik.lemonsqueezy_customer_id}</p>
|
|
312
|
+
</div>
|
|
313
|
+
)}
|
|
314
|
+
</div>
|
|
315
|
+
|
|
316
|
+
<div className="pt-2 border-t border-gray-800 flex items-center justify-between">
|
|
317
|
+
<p className="text-xs text-gray-500">
|
|
318
|
+
İstediğiniz zaman iptal edebilirsiniz. Mevcut ay için ödeme yapılmış olur.
|
|
319
|
+
</p>
|
|
320
|
+
<button
|
|
321
|
+
onClick={handleIptal}
|
|
322
|
+
disabled={iptalYukleniyor}
|
|
323
|
+
className="bg-red-500/10 hover:bg-red-500/20 border border-red-500/30 text-red-400 text-sm font-semibold px-4 py-2 rounded-lg transition-colors disabled:opacity-50"
|
|
324
|
+
>
|
|
325
|
+
{iptalYukleniyor ? "..." : "Aboneliği İptal Et"}
|
|
326
|
+
</button>
|
|
327
|
+
</div>
|
|
328
|
+
</div>
|
|
329
|
+
)}
|
|
330
|
+
|
|
243
331
|
{/* Pricing karşılaştırması linki */}
|
|
244
332
|
<p className="text-center text-sm text-gray-600">
|
|
245
333
|
Tüm özellikleri karşılaştırmak için{" "}
|
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import Link from "next/link";
|
|
4
3
|
import { useTranslation } from "@/lib/i18n";
|
|
5
4
|
import { PLAN_LIMITS, Plan, getCurrentPlan } from "@/lib/plan";
|
|
6
5
|
import { useState, useEffect } from "react";
|
|
6
|
+
import { useRouter } from "next/navigation";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
const CHECK = "✓";
|
|
9
|
+
const CROSS = "✗";
|
|
10
|
+
const LOCK = "🔒";
|
|
11
|
+
|
|
12
|
+
// Fiyatlar TRY - Lemon Squeezy'den
|
|
9
13
|
const PRICES: Record<Plan, string> = {
|
|
10
14
|
free: "0",
|
|
11
|
-
pro: "
|
|
12
|
-
team: "
|
|
13
|
-
enterprise: "
|
|
15
|
+
pro: "400",
|
|
16
|
+
team: "800",
|
|
17
|
+
enterprise: "1650",
|
|
14
18
|
};
|
|
15
19
|
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
const PLAN_VARIANT: Record<Exclude<Plan, "free">, string> = {
|
|
21
|
+
pro: "pro",
|
|
22
|
+
team: "team",
|
|
23
|
+
enterprise: "enterprise",
|
|
24
|
+
};
|
|
19
25
|
|
|
20
|
-
/** Özellik değerini okunabilir string'e çevir */
|
|
21
26
|
function limitGoster(
|
|
22
27
|
value: number | boolean,
|
|
23
28
|
t: (k: string) => string,
|
|
@@ -33,48 +38,80 @@ interface PlanKarti {
|
|
|
33
38
|
plan: Plan;
|
|
34
39
|
vurgulu: boolean;
|
|
35
40
|
fiyat: string;
|
|
36
|
-
buton: "started" | "sales" | "current";
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
export default function PricingSayfasi() {
|
|
40
44
|
const { t: tRaw } = useTranslation();
|
|
41
|
-
// limitGoster string parametresi alabilsin diye sarmala
|
|
42
45
|
const t = (k: string) => tRaw(k as Parameters<typeof tRaw>[0]);
|
|
46
|
+
const router = useRouter();
|
|
43
47
|
const [mevcutPlan, setMevcutPlan] = useState<Plan>("free");
|
|
48
|
+
const [yukleniyor, setYukleniyor] = useState<Plan | null>(null);
|
|
49
|
+
const [hata, setHata] = useState<string>("");
|
|
44
50
|
|
|
45
51
|
useEffect(() => {
|
|
46
52
|
setMevcutPlan(getCurrentPlan());
|
|
47
53
|
}, []);
|
|
48
54
|
|
|
49
55
|
const planlar: PlanKarti[] = [
|
|
50
|
-
{ plan: "free", vurgulu: false, fiyat: PRICES.free
|
|
51
|
-
{ plan: "pro", vurgulu: false, fiyat: PRICES.pro
|
|
52
|
-
{ plan: "team", vurgulu: true, fiyat: PRICES.team
|
|
53
|
-
{ plan: "enterprise", vurgulu: false, fiyat: PRICES.enterprise
|
|
56
|
+
{ plan: "free", vurgulu: false, fiyat: PRICES.free },
|
|
57
|
+
{ plan: "pro", vurgulu: false, fiyat: PRICES.pro },
|
|
58
|
+
{ plan: "team", vurgulu: true, fiyat: PRICES.team },
|
|
59
|
+
{ plan: "enterprise", vurgulu: false, fiyat: PRICES.enterprise },
|
|
54
60
|
];
|
|
55
61
|
|
|
56
62
|
const planAdi = (p: Plan) =>
|
|
57
63
|
({ free: t("plan_free"), pro: t("plan_pro"), team: t("plan_team"), enterprise: t("plan_enterprise") })[p];
|
|
58
64
|
|
|
59
|
-
//
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
// Lemon Squeezy checkout'a yonlendir
|
|
66
|
+
const handleBuy = async (plan: Exclude<Plan, "free">) => {
|
|
67
|
+
if (yukleniyor) return;
|
|
68
|
+
setYukleniyor(plan);
|
|
69
|
+
setHata("");
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
// Once login kontrolu - /api/auth/me cookie uzerinden calisiyor
|
|
73
|
+
const meRes = await fetch("/api/auth/me", { credentials: "include" });
|
|
74
|
+
if (!meRes.ok) {
|
|
75
|
+
// Login degilse login'e yonlendir
|
|
76
|
+
router.push(`/login?redirect=/pricing&plan=${plan}`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Checkout istegi - cookie otomatik gider
|
|
81
|
+
const response = await fetch("/api/billing/checkout", {
|
|
82
|
+
method: "POST",
|
|
83
|
+
headers: { "Content-Type": "application/json" },
|
|
84
|
+
body: JSON.stringify({ plan }),
|
|
85
|
+
credentials: "include",
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
const err = await response.json().catch(() => ({ detail: "Bilinmeyen hata" }));
|
|
90
|
+
throw new Error(err.detail || `HTTP ${response.status}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const data = await response.json();
|
|
94
|
+
if (data.checkout_url) {
|
|
95
|
+
// Lemon Squeezy checkout sayfasina yonlendir
|
|
96
|
+
window.location.href = data.checkout_url;
|
|
97
|
+
} else {
|
|
98
|
+
throw new Error("Checkout URL alinamadi");
|
|
99
|
+
}
|
|
100
|
+
} catch (e: any) {
|
|
101
|
+
setHata(e.message || "Odeme sayfasi acilamadi");
|
|
102
|
+
setYukleniyor(null);
|
|
103
|
+
}
|
|
64
104
|
};
|
|
65
105
|
|
|
66
|
-
|
|
106
|
+
// Ozellik satirlari
|
|
107
|
+
const ozellikler = [
|
|
67
108
|
{
|
|
68
109
|
label: t("pricing_feature_repos"),
|
|
69
|
-
values: planlar.map((k) =>
|
|
70
|
-
limitGoster(PLAN_LIMITS[k.plan].max_repos, t)
|
|
71
|
-
),
|
|
110
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].max_repos, t)),
|
|
72
111
|
},
|
|
73
112
|
{
|
|
74
113
|
label: t("pricing_feature_files"),
|
|
75
|
-
values: planlar.map((k) =>
|
|
76
|
-
limitGoster(PLAN_LIMITS[k.plan].max_files_scan, t)
|
|
77
|
-
),
|
|
114
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].max_files_scan, t)),
|
|
78
115
|
},
|
|
79
116
|
{
|
|
80
117
|
label: t("pricing_feature_history"),
|
|
@@ -86,49 +123,35 @@ export default function PricingSayfasi() {
|
|
|
86
123
|
},
|
|
87
124
|
{
|
|
88
125
|
label: t("pricing_feature_dashboard"),
|
|
89
|
-
values: planlar.map((k) =>
|
|
90
|
-
limitGoster(PLAN_LIMITS[k.plan].dashboard_access, t)
|
|
91
|
-
),
|
|
126
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].dashboard_access, t)),
|
|
92
127
|
},
|
|
93
128
|
{
|
|
94
129
|
label: t("pricing_feature_github"),
|
|
95
|
-
values: planlar.map((k) =>
|
|
96
|
-
limitGoster(PLAN_LIMITS[k.plan].github_actions, t)
|
|
97
|
-
),
|
|
130
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].github_actions, t)),
|
|
98
131
|
},
|
|
99
132
|
{
|
|
100
133
|
label: t("pricing_feature_slack"),
|
|
101
|
-
values: planlar.map((k) =>
|
|
102
|
-
limitGoster(PLAN_LIMITS[k.plan].slack_notify, t)
|
|
103
|
-
),
|
|
134
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].slack_notify, t)),
|
|
104
135
|
kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].slack_notify),
|
|
105
136
|
},
|
|
106
137
|
{
|
|
107
138
|
label: `${t("pricing_feature_bus_factor")} ${LOCK}`,
|
|
108
|
-
values: planlar.map((k) =>
|
|
109
|
-
limitGoster(PLAN_LIMITS[k.plan].bus_factor, t)
|
|
110
|
-
),
|
|
139
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].bus_factor, t)),
|
|
111
140
|
kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].bus_factor),
|
|
112
141
|
},
|
|
113
142
|
{
|
|
114
143
|
label: `${t("pricing_feature_sprint")} ${LOCK}`,
|
|
115
|
-
values: planlar.map((k) =>
|
|
116
|
-
limitGoster(PLAN_LIMITS[k.plan].sprint_health, t)
|
|
117
|
-
),
|
|
144
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].sprint_health, t)),
|
|
118
145
|
kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].sprint_health),
|
|
119
146
|
},
|
|
120
147
|
{
|
|
121
148
|
label: `${t("pricing_feature_ai_comparison")} ${LOCK}`,
|
|
122
|
-
values: planlar.map((k) =>
|
|
123
|
-
limitGoster(PLAN_LIMITS[k.plan].ai_comparison, t)
|
|
124
|
-
),
|
|
149
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].ai_comparison, t)),
|
|
125
150
|
kilitli: planlar.map((k) => !PLAN_LIMITS[k.plan].ai_comparison),
|
|
126
151
|
},
|
|
127
152
|
{
|
|
128
153
|
label: t("pricing_feature_team_members"),
|
|
129
|
-
values: planlar.map((k) =>
|
|
130
|
-
limitGoster(PLAN_LIMITS[k.plan].team_members, t)
|
|
131
|
-
),
|
|
154
|
+
values: planlar.map((k) => limitGoster(PLAN_LIMITS[k.plan].team_members, t)),
|
|
132
155
|
},
|
|
133
156
|
{
|
|
134
157
|
label: t("pricing_feature_support"),
|
|
@@ -143,16 +166,25 @@ export default function PricingSayfasi() {
|
|
|
143
166
|
|
|
144
167
|
return (
|
|
145
168
|
<div className="space-y-10">
|
|
146
|
-
{/*
|
|
169
|
+
{/* Baslik */}
|
|
147
170
|
<div className="text-center">
|
|
148
171
|
<h1 className="text-3xl font-bold text-white">💎 {t("pricing_title")}</h1>
|
|
149
172
|
<p className="text-gray-500 mt-2">{t("pricing_subtitle")}</p>
|
|
150
173
|
</div>
|
|
151
174
|
|
|
152
|
-
{/*
|
|
175
|
+
{/* Hata mesaji */}
|
|
176
|
+
{hata && (
|
|
177
|
+
<div className="max-w-2xl mx-auto bg-red-500/10 border border-red-500/30 text-red-300 px-4 py-3 rounded-xl text-sm text-center">
|
|
178
|
+
{hata}
|
|
179
|
+
</div>
|
|
180
|
+
)}
|
|
181
|
+
|
|
182
|
+
{/* Plan kartlari */}
|
|
153
183
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-5">
|
|
154
184
|
{planlar.map((k) => {
|
|
155
185
|
const isCurrent = k.plan === mevcutPlan;
|
|
186
|
+
const isLoading = yukleniyor === k.plan;
|
|
187
|
+
const isPaid = k.plan !== "free";
|
|
156
188
|
return (
|
|
157
189
|
<div
|
|
158
190
|
key={k.plan}
|
|
@@ -162,7 +194,6 @@ export default function PricingSayfasi() {
|
|
|
162
194
|
: "border-gray-800"
|
|
163
195
|
}`}
|
|
164
196
|
>
|
|
165
|
-
{/* Most Popular badge */}
|
|
166
197
|
{k.vurgulu && (
|
|
167
198
|
<div className="absolute -top-3 left-1/2 -translate-x-1/2">
|
|
168
199
|
<span className="bg-cyan-500 text-gray-950 text-xs font-bold px-3 py-1 rounded-full">
|
|
@@ -180,7 +211,7 @@ export default function PricingSayfasi() {
|
|
|
180
211
|
</span>
|
|
181
212
|
) : (
|
|
182
213
|
<>
|
|
183
|
-
<span className="text-3xl font-bold text-white"
|
|
214
|
+
<span className="text-3xl font-bold text-white">₺{k.fiyat}</span>
|
|
184
215
|
{k.fiyat !== "0" && (
|
|
185
216
|
<span className="text-gray-500 text-sm mb-1">
|
|
186
217
|
{t("pricing_per_month")}
|
|
@@ -196,31 +227,47 @@ export default function PricingSayfasi() {
|
|
|
196
227
|
<div className="w-full text-center py-2 px-4 rounded-xl border border-gray-700 text-gray-500 text-sm font-medium">
|
|
197
228
|
{t("pricing_current_plan")}
|
|
198
229
|
</div>
|
|
199
|
-
) : k.
|
|
200
|
-
<
|
|
201
|
-
href="mailto:hello@
|
|
230
|
+
) : k.plan === "enterprise" ? (
|
|
231
|
+
<a
|
|
232
|
+
href="mailto:hello@natureco.me"
|
|
202
233
|
className="w-full text-center py-2 px-4 rounded-xl border border-cyan-500 text-cyan-400 hover:bg-cyan-500/10 transition-colors text-sm font-medium"
|
|
203
234
|
>
|
|
204
235
|
{t("pricing_contact_sales")}
|
|
205
|
-
</
|
|
236
|
+
</a>
|
|
237
|
+
) : isPaid ? (
|
|
238
|
+
<button
|
|
239
|
+
onClick={() => handleBuy(k.plan as Exclude<Plan, "free">)}
|
|
240
|
+
disabled={isLoading}
|
|
241
|
+
className={`w-full py-2 px-4 rounded-xl text-sm font-semibold transition-colors ${
|
|
242
|
+
k.vurgulu
|
|
243
|
+
? "bg-cyan-500 hover:bg-cyan-400 text-gray-950"
|
|
244
|
+
: "bg-gray-800 hover:bg-gray-700 text-white"
|
|
245
|
+
} ${isLoading ? "opacity-50 cursor-wait" : ""}`}
|
|
246
|
+
>
|
|
247
|
+
{isLoading ? (
|
|
248
|
+
<span>Yukleniyor...</span>
|
|
249
|
+
) : (
|
|
250
|
+
<>💳 {t("pricing_get_started_paid")}</>
|
|
251
|
+
)}
|
|
252
|
+
</button>
|
|
206
253
|
) : (
|
|
207
|
-
<
|
|
208
|
-
|
|
209
|
-
className={`w-full
|
|
254
|
+
<button
|
|
255
|
+
onClick={() => router.push("/login?redirect=/pricing")}
|
|
256
|
+
className={`w-full py-2 px-4 rounded-xl text-sm font-semibold transition-colors ${
|
|
210
257
|
k.vurgulu
|
|
211
258
|
? "bg-cyan-500 hover:bg-cyan-400 text-gray-950"
|
|
212
259
|
: "bg-gray-800 hover:bg-gray-700 text-white"
|
|
213
260
|
}`}
|
|
214
261
|
>
|
|
215
262
|
{t("pricing_get_started")}
|
|
216
|
-
</
|
|
263
|
+
</button>
|
|
217
264
|
)}
|
|
218
265
|
</div>
|
|
219
266
|
);
|
|
220
267
|
})}
|
|
221
268
|
</div>
|
|
222
269
|
|
|
223
|
-
{/*
|
|
270
|
+
{/* Ozellik karsilastirma tablosu */}
|
|
224
271
|
<div className="bg-gray-900 border border-gray-800 rounded-2xl overflow-hidden">
|
|
225
272
|
<table className="w-full text-sm">
|
|
226
273
|
<thead>
|
|
@@ -91,6 +91,7 @@ export const en = {
|
|
|
91
91
|
pricing_most_popular: "Most Popular",
|
|
92
92
|
pricing_per_month: "/mo",
|
|
93
93
|
pricing_get_started: "Get Started",
|
|
94
|
+
pricing_get_started_paid: "Upgrade Now",
|
|
94
95
|
pricing_contact_sales: "Contact Sales",
|
|
95
96
|
pricing_current_plan: "Current Plan",
|
|
96
97
|
pricing_feature_repos: "Repositories",
|
|
@@ -93,6 +93,7 @@ export const tr: Record<TranslationKey, string> = {
|
|
|
93
93
|
pricing_most_popular: "En Popüler",
|
|
94
94
|
pricing_per_month: "/ay",
|
|
95
95
|
pricing_get_started: "Başla",
|
|
96
|
+
pricing_get_started_paid: "Hemen Yükselt",
|
|
96
97
|
pricing_contact_sales: "Satışla İletişim",
|
|
97
98
|
pricing_current_plan: "Mevcut Plan",
|
|
98
99
|
pricing_feature_repos: "Repo sayısı",
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Next.js API Route — /api/billing/checkout
|
|
3
|
-
* Cookie'deki token'ı alıp FastAPI'ye checkout isteği proxy'ler.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { NextRequest, NextResponse } from "next/server";
|
|
7
|
-
import { cookies } from "next/headers";
|
|
8
|
-
|
|
9
|
-
const API_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhost:8000";
|
|
10
|
-
|
|
11
|
-
export async function POST(req: NextRequest) {
|
|
12
|
-
const cookieStore = cookies();
|
|
13
|
-
const token = cookieStore.get("codedna_token")?.value;
|
|
14
|
-
|
|
15
|
-
if (!token) {
|
|
16
|
-
return NextResponse.json({ detail: "Giriş yapınız." }, { status: 401 });
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const govde = await req.json().catch(() => null);
|
|
20
|
-
if (!govde?.plan) {
|
|
21
|
-
return NextResponse.json({ detail: "Plan zorunlu." }, { status: 422 });
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const fastapiYanit = await fetch(`${API_URL}/billing/checkout`, {
|
|
26
|
-
method: "POST",
|
|
27
|
-
headers: {
|
|
28
|
-
"Content-Type": "application/json",
|
|
29
|
-
Authorization: `Bearer ${token}`,
|
|
30
|
-
},
|
|
31
|
-
body: JSON.stringify({ plan: govde.plan }),
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const veri = await fastapiYanit.json();
|
|
35
|
-
|
|
36
|
-
if (!fastapiYanit.ok) {
|
|
37
|
-
return NextResponse.json(
|
|
38
|
-
{ detail: veri.detail || "Checkout URL alınamadı." },
|
|
39
|
-
{ status: fastapiYanit.status }
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return NextResponse.json(veri);
|
|
44
|
-
} catch {
|
|
45
|
-
return NextResponse.json({ detail: "API'ye bağlanılamadı." }, { status: 503 });
|
|
46
|
-
}
|
|
47
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|