From 9f1dcf80e1fde10ca427c38056bc6012d6e94aee Mon Sep 17 00:00:00 2001 From: pratham5456 Date: Tue, 18 Nov 2025 12:24:45 +0530 Subject: [PATCH 1/4] update package.json files to replace workspace dependencies with specific versions and improve formatting --- examples/nextjs-demo/package.json | 14 +-- package.json | 1 + packages/ssokit-next/package.json | 16 +++- packages/ssokit-react/package.json | 16 +++- packages/ssokit-team/package.json | 10 +-- packages/ssokit-webhooks/package.json | 15 +++- prepare-npm.js | 118 ++++++++++++++++++++++++++ 7 files changed, 167 insertions(+), 23 deletions(-) create mode 100644 prepare-npm.js diff --git a/examples/nextjs-demo/package.json b/examples/nextjs-demo/package.json index ac1f8c2..8b15a03 100644 --- a/examples/nextjs-demo/package.json +++ b/examples/nextjs-demo/package.json @@ -13,12 +13,12 @@ "next": "^14.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "@ssojet/ssokit-core": "workspace:*", - "@ssojet/ssokit-react": "workspace:*", - "@ssojet/ssokit-next": "workspace:*", - "@ssojet/ssokit-team": "workspace:*", - "@ssojet/ssokit-webhooks": "workspace:*", - "@ssojet/ssokit-css": "workspace:*", + "@ssojet/ssokit-core": "0.1.0", + "@ssojet/ssokit-react": "0.1.0", + "@ssojet/ssokit-next": "0.1.0", + "@ssojet/ssokit-team": "0.1.0", + "@ssojet/ssokit-webhooks": "0.1.0", + "@ssojet/ssokit-css": "0.1.0", "next-auth": "^4.24.0", "openid-client": "^5.6.1", "jose": "^5.1.0", @@ -38,4 +38,4 @@ "engines": { "node": ">=18.0.0" } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 525c8b2..d1942e6 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "build": "turbo run build", "dev": "turbo run dev --parallel", "lint": "turbo run lint", + "prepare-npm": "node prepare-npm.js", "format": "prettier --write \"**/*.{ts,tsx,md,json}\"", "format:check": "prettier --check \"**/*.{ts,tsx,md,json}\"", "test": "turbo run test", diff --git a/packages/ssokit-next/package.json b/packages/ssokit-next/package.json index 2e12828..047a921 100644 --- a/packages/ssokit-next/package.json +++ b/packages/ssokit-next/package.json @@ -1,8 +1,13 @@ { - "name": "@ssojet/ssokit-next", + "name": "@ssojet/ssokit-next", "version": "0.1.0", "description": "Next.js App Router helpers and route handlers for SSOJet AuthKit", - "keywords": ["ssojet", "authkit", "nextjs", "app-router"], + "keywords": [ + "ssojet", + "authkit", + "nextjs", + "app-router" + ], "homepage": "https://github.com/ssojet/ssojet-authkit#readme", "repository": { "type": "git", @@ -24,7 +29,10 @@ }, "main": "./dist/index.js", "types": "./dist/index.d.ts", - "files": ["dist", "README.md"], + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsup", "dev": "tsup --watch", @@ -33,7 +41,7 @@ "clean": "rm -rf dist .turbo" }, "dependencies": { - "@ssojet/ssokit-core": "workspace:*" + "@ssojet/ssokit-core": "0.1.0" }, "peerDependencies": { "next": "^14.0.0 || ^15.0.0" diff --git a/packages/ssokit-react/package.json b/packages/ssokit-react/package.json index 14506d1..16a2aba 100644 --- a/packages/ssokit-react/package.json +++ b/packages/ssokit-react/package.json @@ -2,7 +2,12 @@ "name": "@ssojet/ssokit-react", "version": "0.1.0", "description": "React hooks and providers for SSOJet AuthKit", - "keywords": ["ssojet", "authkit", "react", "hooks"], + "keywords": [ + "ssojet", + "authkit", + "react", + "hooks" + ], "homepage": "https://github.com/ssojet/ssojet-authkit#readme", "repository": { "type": "git", @@ -20,7 +25,10 @@ }, "main": "./dist/index.js", "types": "./dist/index.d.ts", - "files": ["dist", "README.md"], + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsup", "dev": "tsup --watch", @@ -30,8 +38,8 @@ "clean": "rm -rf dist .turbo" }, "dependencies": { - "@ssojet/ssokit-core": "workspace:*", - "@ssojet/ssokit-css": "workspace:*" + "@ssojet/ssokit-core": "0.1.0", + "@ssojet/ssokit-css": "0.1.0" }, "peerDependencies": { "react": "^18.0.0" diff --git a/packages/ssokit-team/package.json b/packages/ssokit-team/package.json index c0c5985..20da7e6 100644 --- a/packages/ssokit-team/package.json +++ b/packages/ssokit-team/package.json @@ -1,5 +1,5 @@ { - "name": "@ssojet/ssokit-team", + "name": "@ssojet/ssokit-team", "version": "0.1.0", "description": "Drop-in TeamManager widget for SSOJet AuthKit", "type": "module", @@ -27,10 +27,10 @@ "react-dom": "^18.0.0" }, "dependencies": { - "@ssojet/ssokit-core": "workspace:*", - "@ssojet/ssokit-css": "workspace:*", - "@ssojet/ssokit-next": "workspace:*", - "@ssojet/ssokit-react": "workspace:*" + "@ssojet/ssokit-core": "0.1.0", + "@ssojet/ssokit-css": "0.1.0", + "@ssojet/ssokit-next": "0.1.0", + "@ssojet/ssokit-react": "0.1.0" }, "devDependencies": { "@types/react": "^18.2.47", diff --git a/packages/ssokit-webhooks/package.json b/packages/ssokit-webhooks/package.json index d5b3485..8e38a97 100644 --- a/packages/ssokit-webhooks/package.json +++ b/packages/ssokit-webhooks/package.json @@ -2,7 +2,13 @@ "name": "@ssojet/ssokit-webhooks", "version": "0.1.0", "description": "Webhook verification and SCIM provisioning for SSOJet AuthKit", - "keywords": ["ssojet", "authkit", "webhooks", "scim", "provisioning"], + "keywords": [ + "ssojet", + "authkit", + "webhooks", + "scim", + "provisioning" + ], "homepage": "https://github.com/ssojet/ssojet-authkit#readme", "repository": { "type": "git", @@ -20,7 +26,10 @@ }, "main": "./dist/index.js", "types": "./dist/index.d.ts", - "files": ["dist", "README.md"], + "files": [ + "dist", + "README.md" + ], "scripts": { "build": "tsup", "dev": "tsup --watch", @@ -30,7 +39,7 @@ "clean": "rm -rf dist .turbo" }, "dependencies": { - "@ssojet/ssokit-core": "workspace:*" + "@ssojet/ssokit-core": "0.1.0" }, "devDependencies": { "@types/node": "^20.11.24", diff --git a/prepare-npm.js b/prepare-npm.js new file mode 100644 index 0000000..77d4879 --- /dev/null +++ b/prepare-npm.js @@ -0,0 +1,118 @@ +#!/usr/bin/env node +import fs from 'fs/promises'; +import path from 'path'; + +const IGNORED_DIRS = new Set(['node_modules', '.git']); + +async function readJson(file) { + const txt = await fs.readFile(file, 'utf8'); + return JSON.parse(txt); +} + +async function writeJson(file, obj) { + const txt = JSON.stringify(obj, null, 2) + '\n'; + await fs.writeFile(file, txt, 'utf8'); +} + +async function findPackageJsons(dir) { + const results = []; + async function walk(cur) { + const entries = await fs.readdir(cur, { withFileTypes: true }); + for (const e of entries) { + if (IGNORED_DIRS.has(e.name)) continue; + const full = path.join(cur, e.name); + if (e.isDirectory()) { + await walk(full); + } else if (e.isFile() && e.name === 'package.json') { + results.push(full); + } + } + } + await walk(dir); + return results; +} + +function replaceWorkspaceDeps(pkgJson, versionMap) { + let changed = false; + const sections = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']; + for (const s of sections) { + const sec = pkgJson[s]; + if (!sec) continue; + for (const [name, ver] of Object.entries(sec)) { + if (ver === 'workspace:*' || (typeof ver === 'string' && ver.startsWith('workspace:')) ) { + const target = versionMap[name]; + if (target) { + sec[name] = target; + changed = true; + } else { + console.warn(`Warning: no version found for ${name} referenced from workspace in package ${pkgJson.name || ''}`); + } + } + } + } + return changed; +} + +async function main() { + const root = process.cwd(); + console.log('prepare-npm: scanning workspace packages...'); + const packagesDir = path.join(root, 'packages'); + + // gather versions from packages/* + const versionMap = {}; + try { + const pkgDirs = await fs.readdir(packagesDir, { withFileTypes: true }); + for (const d of pkgDirs) { + if (!d.isDirectory()) continue; + const pj = path.join(packagesDir, d.name, 'package.json'); + try { + const p = await readJson(pj); + if (p && p.name && p.version) versionMap[p.name] = p.version; + } catch (e) { + // ignore + } + } + } catch (e) { + // no packages dir + } + + // also include root package if it has a version (rare for private monorepos), and any other discovered packages + const all = await findPackageJsons(root); + + const changedFiles = []; + for (const pj of all) { + // skip the lockfile directory area + if (pj.includes('node_modules')) continue; + let pkg; + try { + pkg = await readJson(pj); + } catch (e) { + console.warn(`Skipping unreadable ${pj}`); + continue; + } + + const changed = replaceWorkspaceDeps(pkg, versionMap); + if (changed) { + await writeJson(pj, pkg); + changedFiles.push(pj); + console.log(`Updated ${pj}`); + } + } + + if (changedFiles.length === 0) { + console.log('No workspace:* references replaced. Nothing to do.'); + } else { + console.log('\nReplaced workspace:* with concrete versions in the files listed above.'); + console.log('TIP: These changes were written in-place. If you want to revert, run:'); + console.log(' git restore ' + changedFiles.map(f => '"' + path.relative(root, f).replace(/\\/g,'/') + '"').join(' ')); + } + console.log('\nNext steps:'); + console.log(' 1) Run your build step (e.g. `pnpm run build` or `pnpm -w build`) to ensure built artifacts exist.'); + console.log(' 2) Run `node prepare-npm.js` (or `npm run prepare-npm`) before creating a tarball or publishing.'); + console.log(' 3) Create a tarball with `npm pack` or publish with `npm publish` from the package directory you want to distribute.'); +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); From 09c8097ba89dac1c0de349f59073fce868b8b83b Mon Sep 17 00:00:00 2001 From: Vijay Singh Date: Fri, 2 Jan 2026 15:12:25 +0530 Subject: [PATCH 2/4] Log management permission checks Added console logs to check management permissions. --- packages/ssokit-team/src/TeamManager.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/ssokit-team/src/TeamManager.tsx b/packages/ssokit-team/src/TeamManager.tsx index fa9ccf4..81b2cfb 100644 --- a/packages/ssokit-team/src/TeamManager.tsx +++ b/packages/ssokit-team/src/TeamManager.tsx @@ -120,6 +120,10 @@ export function TeamManager({ // Check if current user has management permissions const canManageTeam = useMemo(() => { + + console.log("== Checking management permissions =="); + console.log("Current User Role:", currentUserRole); + console.log("Allowed Manager Roles:", allowedManagerRoles); if (!currentUserRole) return false; return allowedManagerRoles.includes(currentUserRole); }, [currentUserRole, allowedManagerRoles]); From ce406d6ac36970fdaa4ab48a1375837ed2662c87 Mon Sep 17 00:00:00 2001 From: Vijay Singh Date: Fri, 2 Jan 2026 15:58:21 +0530 Subject: [PATCH 3/4] remove extra logs --- packages/ssokit-next/src/client.ts | 4 ++-- packages/ssokit-team/src/TeamManager.tsx | 12 +++--------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/packages/ssokit-next/src/client.ts b/packages/ssokit-next/src/client.ts index f1a5fc1..a4c1984 100644 --- a/packages/ssokit-next/src/client.ts +++ b/packages/ssokit-next/src/client.ts @@ -215,7 +215,7 @@ export class SSOJetClient { // Members async listMembers(orgId: string, params?: Record) { - console.log("=== ssojet"); + const query = params ? `?${new URLSearchParams(params).toString()}` : ''; return this.request(`/api/v1/auth/tenants/${orgId}/users${query}`); } @@ -293,7 +293,7 @@ export class SSOJetClient { // Roles async listRoles() { - console.log('==== Listing roles from SSOJetClient'); + return this.request(`/api/v1/auth/roles`); } diff --git a/packages/ssokit-team/src/TeamManager.tsx b/packages/ssokit-team/src/TeamManager.tsx index 81b2cfb..d310eec 100644 --- a/packages/ssokit-team/src/TeamManager.tsx +++ b/packages/ssokit-team/src/TeamManager.tsx @@ -121,9 +121,7 @@ export function TeamManager({ // Check if current user has management permissions const canManageTeam = useMemo(() => { - console.log("== Checking management permissions =="); - console.log("Current User Role:", currentUserRole); - console.log("Allowed Manager Roles:", allowedManagerRoles); + if (!currentUserRole) return false; return allowedManagerRoles.includes(currentUserRole); }, [currentUserRole, allowedManagerRoles]); @@ -160,7 +158,7 @@ export function TeamManager({ client.listRoles(), ]); - console.log('API Responses:', { membersRes, invitationsRes, rolesRes }); + // console.log('API Responses:', { membersRes, invitationsRes, rolesRes }); // Handle users API response format: { users: [...] } const rawUsers = (membersRes as any)?.users || (membersRes as any)?.data || membersRes || []; @@ -201,11 +199,7 @@ export function TeamManager({ }); } - console.log('Processed data:', { - activeMembers: allMembers, - pendingInvites, - roles - }); + setMembers(allMembers); setInvites(pendingInvites); From bdac07a5a65970f442419c1899556fd894b209d9 Mon Sep 17 00:00:00 2001 From: Vijay Singh Date: Sat, 28 Feb 2026 21:13:26 +0530 Subject: [PATCH 4/4] added logs --- packages/ssokit-team/src/TeamManager.tsx | 41 +++++++++++++----------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/ssokit-team/src/TeamManager.tsx b/packages/ssokit-team/src/TeamManager.tsx index d310eec..7906c7d 100644 --- a/packages/ssokit-team/src/TeamManager.tsx +++ b/packages/ssokit-team/src/TeamManager.tsx @@ -86,16 +86,16 @@ export function TeamManager({ if (managerRoles && managerRoles.length > 0) { return managerRoles; } - + // Check environment variable - const envRoles = typeof window !== 'undefined' + const envRoles = typeof window !== 'undefined' ? process.env.NEXT_PUBLIC_SSOKIT_TEAM_MANAGER_ROLES : process.env.SSOKIT_TEAM_MANAGER_ROLES; - + if (envRoles) { return envRoles.split(',').map(role => role.trim()); } - + // Default to Owner only return ['Owner']; }, [managerRoles]); @@ -113,6 +113,9 @@ export function TeamManager({ // Get current user's role in this organization const currentUserRole = useMemo(() => { + console.log('currentUserId', currentUserId); + console.log('members', members); + console.log('allowedManagerRoles', allowedManagerRoles); if (!currentUserId) return null; const currentMember = members.find(m => m.userId === currentUserId || m.id === currentUserId); return currentMember?.role || null; @@ -121,7 +124,7 @@ export function TeamManager({ // Check if current user has management permissions const canManageTeam = useMemo(() => { - + if (!currentUserRole) return false; return allowedManagerRoles.includes(currentUserRole); }, [currentUserRole, allowedManagerRoles]); @@ -130,7 +133,7 @@ export function TeamManager({ const transformUserToMember = useCallback((user: any, targetTenantId: string): UIMember => { const targetTenant = user.tenants?.find((t: any) => t.tenant_id === targetTenantId); const primaryRole = targetTenant?.roles?.[0]; - + return { id: user.id, userId: user.id, @@ -151,36 +154,36 @@ export function TeamManager({ try { setLoading(true); setError(null); - + const [membersRes, invitationsRes, rolesRes] = await Promise.all([ client.listMembers(organizationId), client.listInvites(organizationId, 'pending'), client.listRoles(), ]); - - // console.log('API Responses:', { membersRes, invitationsRes, rolesRes }); - + + // console.log('API Responses:', { membersRes, invitationsRes, rolesRes }); + // Handle users API response format: { users: [...] } const rawUsers = (membersRes as any)?.users || (membersRes as any)?.data || membersRes || []; // Handle roles API response format: { roles: [...] } const roles = (rolesRes as any)?.roles || (rolesRes as any)?.data || rolesRes || []; // Handle invitations API response format: { invitation: [...] } const rawInvitations = (invitationsRes as any)?.invitation || []; - + // Transform users to active members only const allMembers: UIMember[] = []; - + if (Array.isArray(rawUsers)) { rawUsers.forEach((user: any) => { const member = transformUserToMember(user, organizationId); - + // Only include active members if (member.status === 'active' || !member.status) { allMembers.push(member); } }); } - + // Transform invitations to pending invites const pendingInvites: UIMember[] = []; if (Array.isArray(rawInvitations)) { @@ -198,9 +201,9 @@ export function TeamManager({ pendingInvites.push(invite); }); } - - - + + + setMembers(allMembers); setInvites(pendingInvites); setRoles(Array.isArray(roles) ? roles : []); @@ -249,7 +252,7 @@ export function TeamManager({ [client, organizationId, fetchData, onMemberRemoved] ); - const handleInviteMember = useCallback( + const handleInviteMember = useCallback( async (email: string, roleName: string) => { try { // Find the role ID by role name @@ -391,7 +394,7 @@ export function TeamManager({ {/* Status Message */} {statusMessage && ( -