| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(integrations): add support for microsoft-dataverse (#7505) ## Describe the problem and your solution - add support for microsoft-dataverse <!-- Issue ticket number and link (if applicable) --> <!-- Testing instructions (skip if just adding/editing providers) --> <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7505?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 2 天前 | |
feat(webapp): token editor dev tool for live design token tweaking (#6442) ## Problem Designers have no way to validate design-token changes against the real app UI without shipping a code change first. Tweaking `--text-default` or a brand primitive means a full code → review → deploy cycle just to see it in context — with no quick way to gauge the accessibility or usage impact of a token. ## Solution Adds a **Token Editor** to the Dev Tools panel (`Ctrl+Shift+D`) — a 640px drawer for live design-token tweaking, with built-in accessibility and usage analysis. Access is gated to dev/staging hosts (local + `*.app-development.nango.dev` + `app-staging.nango.dev`) or the Nango admin team, so on production it's reachable only by admins. The editor is lazy-loaded, so its chunk — plus the bundled tokens.json and usage snapshot — is code-split out of the main bundle and only fetched when opened. **Editing** - Semantic / Primitives modes; live CSS-var overrides applied across the whole app, persisted per-theme in `localStorage` - Alpha-capable colour picker (react-colorful) with a checkerboard swatch, alongside a hex field - Reroute a semantic token to a different source primitive; optional recursive linking cascades an edit up the alias chain - Light/dark toggle with independent per-theme overrides; diff panel grouped by Semantic/Light, Semantic/Dark, Primitives; Tokens-Studio-compatible diff export **Contrast checker** (toggle) — scores each token against its real backgrounds from a declarative token-intent table (not a live DOM scan or per-component parse): - Text legibility (WCAG 1.4.3), border/fill-vs-surface and focus-ring contrast (1.4.11 / 2.4.11), and status-icon vs status-bg - Worst-of badge per token with a per-surface breakdown; the list narrows to the tokens that participate **Usage counts** (toggle) — shows how many times each token is used in code, from a precomputed snapshot (`npm run tokens:usage -w packages/webapp`); `0×` flags likely-dead tokens Fixes [NAN-5794](https://linear.app/nango/issue/NAN-5794) ## Testing - Open Dev Tools → Token Editor; edit a token via the picker/hex and confirm it updates live; reload and confirm overrides persist; Reset all clears them - Toggle contrast — verify badges/bands against real backgrounds in both light and dark; toggle usage — verify counts and the `0×` flag - Switch to Primitives mode — verify the filter/usage/contrast controls hide (semantic-only) - Export diff — verify the JSON groups changes per theme > Note: screenshots of the Token Editor UI (editing, contrast mode, usage mode) should be added to this description before merging. <!-- start telescope-canary-packages --> <!-- end telescope-canary-packages --> --------- Co-authored-by: Cursor <cursoragent@cursor.com> | 2 个月前 | |
feat(logs): add an agent session filter to the logs page (NAN-6606) (#7446) NAN-6606 NAN-6943 Adds an agent session filter to the logs page, next to integration and connection. Filtering by a session returns the operations that session ran. Fixes the operation type filter, which rejected the agent_session and function types with a 400. The logs table and the operation drawer show which session drove an operation, and the drawer shows the session id. Stacked on #7443, which populates the actor this filters by. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7446?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 2 天前 | |
refactor(webapp): move InputOTP out of components-v2 (#7089) ## Problem `components-v2` was fully retired and renamed to `components` on `master` back in June ([#6373](https://github.com/NangoHQ/nango/pull/6373)), but `packages/webapp/AGENTS.md` was never updated to match. [A recent cubic bot review comment](https://github.com/NangoHQ/nango/pull/6878#discussion_r3634021900) cited that stale doc and asked for `InputOTP.tsx` to be moved back under `components-v2/ui`, even though no other v2 components exist anymore. ## Solution - Update `AGENTS.md` to describe the current `components/ui` + `components/patterns` structure and explicitly call out that `components-v2` no longer exists - Move `InputOTP.tsx` from `components-v2/ui` to `components/ui`, updating its three import sites - Add a Storybook story for `InputOTP` (Default / Filled / Disabled), per the doc's own "Storybook story required" rule for design-system lift candidates ## Testing - `tsc -b`, `oxlint`, and `prettier --check` all pass - Verified the new story renders correctly under `Components/UI/InputOTP` in Storybook | 1 个月前 | |
fix(webapp): address post-merge Account API keys UI review (#7095) ## Summary - Follow-up to [#7025](https://github.com/NangoHQ/nango/pull/7025) for late UI review feedback - Bold API key names in destructive confirm copy (`DestructiveActionModal` description now accepts `ReactNode`) - Align Account API keys loading / error / empty states with existing `Skeleton`, `Alert` + `AlertButton`, and `EmptyCard` patterns - Show Alert actions for all story variants (adds `neutral` / `neutral-secondary` `AlertButton` variants) - Move `DestructiveActionModal` out of `components-v2` into `components/patterns` (same cleanup as [#7089](https://github.com/NangoHQ/nango/pull/7089)) Noted without code change: dual destructive-confirm paths → tracked in [NAN-6572](https://linear.app/nango/issue/NAN-6572). ## Test plan - [ ] Open Account API keys page: loading skeleton, empty state, and error + Try again - [ ] Delete an Account API key: name is bold in the confirm dialog; failed delete keeps modal open and shows toast - [ ] Delete an Environment API key: name is bold in the confirm dialog - [ ] Storybook Alert Default story shows action button on every variant including neutral - [ ] Storybook DestructiveActionModal still loads from the new import path Made with [Cursor](https://cursor.com) <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7095?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> Co-authored-by: Cursor <cursoragent@cursor.com> | 1 个月前 | |
fix(webapp): adapt favicons to the browser theme (#7366) ## Problem The dashboard shipped one favicon on a transparent background, so it ignored the browser theme and nearly vanished in a dark tab strip. `nango.dev` already switches between a light and a dark pair. Separately, the PWA icons (`logo192`, `logo512`) were transparent outside the mark, so an installed dashboard showed an invisible icon on a light launcher. ## Solution - Adopt the same icon set and `prefers-color-scheme` queries `nango.dev` uses. - Add the missing 180x180 `apple-touch-icon`. - Re-render `logo192`/`logo512` opaque on white, matching the website's touch icon. - Fix the sizes `manifest.json` claimed for `favicon.ico`. Switching follows the OS theme, not the in-app theme setting — the browser paints the tab strip. Fixes [NAN-6875](https://linear.app/nango/issue/NAN-6875) ## Testing Checked on the preview deploy: exactly one icon set resolves per color scheme, and all nine assets serve 200. ## Screenshots Dark <img width="32" height="28" alt="image" src="https://github.com/user-attachments/assets/fe4aae24-1e70-4e43-83cc-181fee75b163" /> Light <img width="28" height="30" alt="image" src="https://github.com/user-attachments/assets/ea8baf0b-bcbf-4808-9de3-49ed186b3db7" /> | 11 天前 | |
chore(release): 0.71.7 | 3 天前 | |
chore: make tsconfigs compatible with typescript-go (#6593) ## Problem Step 3 of the ESLint → oxlint migration (NAN-5769). oxlint's type-aware mode runs on the native `typescript-go` compiler (via `oxlint-tsgolint`), which has dropped several legacy tsconfig options we still use. Until they're migrated, type-aware linting errors out on the affected packages, so those files wouldn't actually be type-checked. All of these are changes we'd need for newer TypeScript regardless. ## Solution Migrate each removed option to its modern equivalent: - **root `tsconfig.json`** — drop `ignoreDeprecations: "5.0"` + `importsNotUsedAsValues: "remove"`, add `verbatimModuleSyntax: true` - **`packages/webapp` + `packages/connect-ui`** — remove `baseUrl`; the `@/*` alias still resolves via the relative `paths` entry (tsc) and the explicit Vite `alias` (build), both independent of `baseUrl` - **`scripts/one-off/*` (3 tsconfigs)** — `moduleResolution: "Node"` (node10, removed) → `"Bundler"` `verbatimModuleSyntax` surfaced one value/type export to split (`BigQueryType` in `data-ingestion`); the rest of the codebase was already compliant since `consistent-type-imports` enforces `import type`. Prereq NAN-5809 (posthog-node v5) is already on master, so `verbatimModuleSyntax` no longer trips the old posthog packaging bug. Part of NAN-5769. Sub-issue: NAN-5810. ## Testing - `npm run ts-build` passes clean (exit 0) with `verbatimModuleSyntax` enabled - `@/` alias resolution confirmed unaffected — webapp/connect-ui resolve it via an explicit Vite `alias`, not tsconfig `baseUrl` - (Follow-up) `oxlint --type-aware .` reports zero `tsconfig-error` diagnostics — verified during the migration spike | 2 个月前 | |
feat(server): let the dashboard's API target be configured separately from NANGO_SERVER_URL (#7064) Fixes NangoHQ/nango#7052. ## Problem `NANGO_SERVER_URL` decides two things at once: the public API host (OAuth callbacks, webhooks, the `apiURL` handed to the SDK and Connect UI) and the base URL the dashboard sends its own requests to. Self-hosted deployments need the first publicly reachable and the second internal, so they can't share a value — blocking `/api` at the public gateway breaks the dashboard, while leaving it open exposes the unauthenticated `signin` / `signup` / `forgot-password` routes on the public host. ## Solution Add `NANGO_DASHBOARD_API_URL`, surfaced on `window._env` as `dashboardApiUrl` and used by `apiFetch` / `publicApiFetch`. It falls back to `NANGO_SERVER_URL`, so leaving it unset changes nothing — including the CSP header, where the fallback is deduplicated against the public host (same `new Set` idiom as `connectUrlCspSources`) so the rendered directives stay byte-identical. `apiUrl` deliberately keeps its meaning. The other nine `globalEnv.apiUrl` reads — displayed OAuth callback URLs, the SDK `host`, and the `apiURL` passed to Connect UI — all need the public host; repointing it would show internal URLs that can't be registered with a provider. `utils/cors.ts` is unchanged: `allowedOrigins` lists request *origins*, and the dashboard's origin (`basePublicUrl`) is already on it. ## Testing `packages/server/lib/controllers/v1/getEnvJs.unit.test.ts` (new) covers both directions: unset means `dashboardApiUrl === apiUrl`, and when set only `dashboardApiUrl` moves while `apiUrl` stays on `NANGO_SERVER_URL`. `npm run lint`, `npm run format:check`, and unit tests for `packages/server` and `packages/webapp` all pass; `tsc --noEmit` output is unchanged from master. ## One thing worth flagging `getEnvJs` sends `Cache-Control: max-age=3600`, so a browser holding a stale `env.js` next to a new bundle would see `dashboardApiUrl === undefined` and `new URL(path, undefined)` would throw. `loadRuntimeEnv.ts`'s `nango-env-hash` param busts that on deploy, so I left the two call sites without an `|| globalEnv.apiUrl` guard — happy to add one if you'd rather be defensive. The issue also mentions allowing a relative value (e.g. `/`) so the dashboard can address its own origin. That needs a looser zod schema and relative-base handling in `apiFetch`, so I kept it out of this PR — glad to follow up if you prefer that shape. 🤖 Generated with [Claude Code](<https://claude.com/claude-code>)  --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Ross McEwan <ross@nango.dev> | 28 天前 | |
feat(playground): NAN-4846: Create playground (#5581) <img width="32%" alt="Screenshot 2026-04-07 at 10 25 18 AM" src="https://github.com/user-attachments/assets/673e3ff0-f5d9-4613-9976-c9121c079ad6" /> <img width="32%" alt="Screenshot 2026-04-07 at 10 25 27 AM" src="https://github.com/user-attachments/assets/5c25cb30-2bbf-41cf-8ffa-97a1855a4b07" /> <img width="32%" alt="Screenshot 2026-04-07 at 10 25 44 AM" src="https://github.com/user-attachments/assets/eb3d9960-4521-4add-bf8a-b294dd754cb5" /> <!-- Issue ticket number and link (if applicable) --> <!-- Testing instructions (skip if just adding/editing providers) --> <!-- Summary by @propel-code-bot --> --- **Add `Playground` End-to-End Feature with Persisted State, Execution Lifecycle, and Permission Gating** This PR introduces a major new `Playground` experience in the web app, accessible from `packages/webapp/src/components-v2/AppHeader.tsx` and rendered in `packages/webapp/src/layout/DashboardLayout.tsx` via a right-side `Sheet`. Users can select an integration, connection, and function (`action` or `sync`), provide schema-derived inputs, trigger runs, view execution status/results, cancel sync runs, and jump to filtered logs. The implementation includes new feature modules (`Playground` components, orchestration hook, utilities, and shared `Combobox`) plus updates to shared UI primitives and styling utilities. State management was split into a dedicated persisted Zustand store in `packages/webapp/src/store/playground.ts` with `sessionStorage` persistence and selective partialization for reattach behavior. The run lifecycle is handled in `packages/webapp/src/components-v2/Playground/usePlayground.ts` with input parsing/validation, operation discovery, status polling, terminal result handling, and best-effort cancellation. The PR also adds production authorization checks via `packages/authz/lib/permissions.ts` (`canUseProdPlayground`) and broad test coverage for schema parsing, parsing/validation helpers, store behavior/persistence, and logs URL generation. --- *This summary was automatically generated by @propel-code-bot* | 4 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 天前 | ||
| 2 个月前 | ||
| 2 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 11 天前 | ||
| 3 天前 | ||
| 2 个月前 | ||
| 28 天前 | ||
| 4 个月前 |