@burdenoff/microfe-devportal 2026.611.1 → 2026.611.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"RevenueDashboardPage.js","names":[],"sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n AlertCircle,\n ArrowDownToLine,\n Building2,\n CreditCard,\n DollarSign,\n Loader2,\n Wallet,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { StatusBadge } from \"../components/StatusBadge\";\nimport type { DeveloperOrganization } from \"../types\";\nimport {\n type GetMyOrganizationsQuery,\n type GetRevenueDashboardDataQuery,\n getErrorMessage,\n useGetMyOrganizationsQuery,\n useGetRevenueDashboardDataQuery,\n} from \"../hooks\";\nimport { useTr } from \"../utils/i18n\";\n\ntype TimeRange = \"30d\" | \"90d\" | \"12m\";\n\nconst chartColors = {\n primary: \"var(--color-chart-1)\",\n secondary: \"var(--color-chart-2)\",\n tertiary: \"var(--color-chart-4)\",\n};\n\ntype RevenueSale =\n GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number][\"node\"];\ntype RevenuePayout =\n GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number][\"node\"];\n\nconst daysByRange: Record<TimeRange, number> = {\n \"30d\": 30,\n \"90d\": 90,\n \"12m\": 365,\n};\n\nexport const RevenueDashboardPage: FC = () => {\n const tr = useTr();\n const [timeRange, setTimeRange] = useState<TimeRange>(\"90d\");\n const [selectedOrganizationId, setSelectedOrganizationId] = useState(\"\");\n const [searchParams] = useSearchParams();\n const now = useMemo(() => new Date(), []);\n const requestedOrganizationId = searchParams.get(\"org\");\n const startDate = useMemo(() => {\n const nextDate = new Date(now);\n nextDate.setDate(nextDate.getDate() - daysByRange[timeRange]);\n return nextDate.toISOString();\n }, [now, timeRange]);\n\n const {\n data: organizationsData,\n loading: organizationsLoading,\n error: organizationsError,\n } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data, loading, error } = useGetRevenueDashboardDataQuery({\n variables: {\n organizationId: selectedOrganizationId,\n period: \"monthly\",\n startDate,\n endDate: now.toISOString(),\n salesLimit: 10,\n salesOffset: 0,\n payoutsLimit: 10,\n payoutsOffset: 0,\n },\n skip: !selectedOrganizationId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizations: DeveloperOrganization[] = useMemo(\n () =>\n organizationsData?.myDeveloperOrganizations?.map(\n (\n organization: GetMyOrganizationsQuery[\"myDeveloperOrganizations\"][number],\n ) => organization as unknown as DeveloperOrganization,\n ) ?? [],\n [organizationsData?.myDeveloperOrganizations],\n );\n\n useEffect(() => {\n if (selectedOrganizationId) {\n return;\n }\n\n if (\n requestedOrganizationId &&\n organizations.some(\n (organization) => organization.id === requestedOrganizationId,\n )\n ) {\n setSelectedOrganizationId(requestedOrganizationId);\n return;\n }\n\n if (organizations.length === 1) {\n setSelectedOrganizationId(organizations[0]?.id ?? \"\");\n }\n }, [organizations, requestedOrganizationId, selectedOrganizationId]);\n\n const selectedOrganization = organizations.find(\n (organization) => organization.id === selectedOrganizationId,\n );\n const summary = data?.developerOrgRevenueSummary;\n const analytics = [...(data?.developerOrgRevenueAnalytics ?? [])].sort(\n (left, right) =>\n new Date(left.date).getTime() - new Date(right.date).getTime(),\n );\n const sales: RevenueSale[] =\n data?.developerOrgSales?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n const payouts: RevenuePayout[] =\n data?.developerOrgPayouts?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n\n const chartData = analytics.map((entry) => ({\n date: new Date(entry.date).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n }),\n grossRevenue: entry.grossRevenue,\n netRevenue: entry.netRevenue,\n platformFees: entry.platformFees,\n refunds: entry.refunds,\n salesCount: entry.salesCount,\n }));\n\n if (organizationsLoading && !organizationsData) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n </PageLayout>\n );\n }\n\n if (organizationsError) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadOrgs\",\n \"Unable to load organizations\",\n )}\n description={getErrorMessage(organizationsError)}\n />\n </PageLayout>\n );\n }\n\n if (!selectedOrganizationId) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.selectOrgDescription\",\n \"Select an organization to review real sales and payout data through the public gateway\",\n )}\n >\n {organizations.length > 0 ? (\n <div className=\"space-y-2\">\n {organizations.map((organization) => (\n <button\n key={organization.id}\n type=\"button\"\n onClick={() => setSelectedOrganizationId(organization.id)}\n className=\"flex w-full items-start justify-between rounded-lg border bg-card p-4 text-left transition-colors hover:bg-accent\"\n >\n <div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{organization.name}</span>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {organization.totalApps ?? 0}{\" \"}\n {tr(\"devportal.revenue.apps\", \"apps\")} · $\n {organization.totalRevenue?.toLocaleString() ?? 0}{\" \"}\n {tr(\"devportal.revenue.revenue\", \"revenue\")}\n </p>\n </div>\n </button>\n ))}\n </div>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\n \"devportal.revenue.noOrgsTitle\",\n \"No organizations available\",\n )}\n description={tr(\n \"devportal.revenue.noOrgsDescription\",\n \"Create a developer organization before reviewing revenue data.\",\n )}\n />\n )}\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadData\",\n \"Unable to load revenue data\",\n )}\n description={getErrorMessage(error)}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={\n selectedOrganization\n ? `${tr(\"devportal.revenue.financialPerformanceFor\", \"Financial performance for\")} ${selectedOrganization.name}`\n : tr(\n \"devportal.revenue.shortDescription\",\n \"Track revenue, sales, and payouts\",\n )\n }\n actions={\n <div className=\"flex flex-wrap gap-2\">\n <select\n value={selectedOrganizationId}\n onChange={(event) => setSelectedOrganizationId(event.target.value)}\n aria-label={tr(\n \"devportal.revenue.selectOrgAria\",\n \"Select organization\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n {organizations.map((organization) => (\n <option key={organization.id} value={organization.id}>\n {organization.name}\n </option>\n ))}\n </select>\n <select\n value={timeRange}\n onChange={(event) => setTimeRange(event.target.value as TimeRange)}\n aria-label={tr(\n \"devportal.revenue.selectRangeAria\",\n \"Select time range\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n <option value=\"30d\">\n {tr(\"devportal.revenue.range.30d\", \"Last 30 days\")}\n </option>\n <option value=\"90d\">\n {tr(\"devportal.revenue.range.90d\", \"Last 90 days\")}\n </option>\n <option value=\"12m\">\n {tr(\"devportal.revenue.range.12m\", \"Last 12 months\")}\n </option>\n </select>\n </div>\n }\n >\n {loading && !summary ? (\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n ) : summary ? (\n <>\n <StatCardGrid columns={4}>\n <StatCard\n title={tr(\"devportal.revenue.grossRevenue\", \"Gross Revenue\")}\n value={`$${summary.totalGrossRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.netRevenue\", \"Net Revenue\")}\n value={`$${summary.totalNetRevenue.toLocaleString()}`}\n icon={<Wallet size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.pendingBalance\", \"Pending Balance\")}\n value={`$${summary.pendingBalance.toLocaleString()}`}\n icon={<CreditCard size={20} />}\n description={\n summary.nextPayoutDate\n ? `${tr(\"devportal.revenue.nextPayout\", \"Next payout\")} ${new Date(summary.nextPayoutDate).toLocaleDateString()}`\n : tr(\n \"devportal.revenue.noPayoutScheduled\",\n \"No payout scheduled\",\n )\n }\n />\n <StatCard\n title={tr(\"devportal.revenue.platformFees\", \"Platform Fees\")}\n value={`$${summary.totalPlatformFees.toLocaleString()}`}\n icon={<ArrowDownToLine size={20} />}\n description={`${summary.totalRefundsCount} ${tr(\"devportal.revenue.refunds\", \"refunds\")}`}\n />\n </StatCardGrid>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.revenueTrend\", \"Revenue trend\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"grossRevenue\"\n stroke={chartColors.primary}\n strokeWidth={2}\n dot={false}\n />\n <Line\n type=\"monotone\"\n dataKey=\"netRevenue\"\n stroke={chartColors.secondary}\n strokeWidth={2}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.revenue.topApps\",\n \"Top applications by revenue\",\n )}\n >\n {summary.topApps.length > 0 ? (\n <div className=\"space-y-2\">\n {summary.topApps.map(\n (\n application: GetRevenueDashboardDataQuery[\"developerOrgRevenueSummary\"][\"topApps\"][number],\n ) => (\n <div\n key={application.applicationId}\n className=\"rounded-lg border bg-card p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium\">\n {application.applicationName}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {application.salesCount}{\" \"}\n {tr(\"devportal.revenue.sales\", \"sales\")}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n ${application.grossRevenue.toLocaleString()}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\"devportal.revenue.net\", \"Net\")} $\n {application.netRevenue.toLocaleString()}\n </p>\n </div>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <EmptyState\n icon={<Building2 size={24} />}\n title={tr(\n \"devportal.revenue.noLeadersTitle\",\n \"No revenue leaders yet\",\n )}\n description={tr(\n \"devportal.revenue.noLeadersDescription\",\n \"Top-performing applications will appear here once revenue is recorded.\",\n )}\n />\n )}\n </PageSection>\n </div>\n\n <PageSection\n title={tr(\"devportal.revenue.salesVolume\", \"Sales volume\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={280}>\n <BarChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Bar\n dataKey=\"salesCount\"\n fill={chartColors.tertiary}\n radius={[6, 6, 0, 0]}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.recentSales\", \"Recent sales\")}\n >\n <DataTable\n data={sales}\n keyField=\"id\"\n columns={[\n {\n key: \"application\",\n header: tr(\"devportal.revenue.application\", \"Application\"),\n render: (sale) =>\n sale.application?.name ||\n sale.planName ||\n tr(\"devportal.common.unknown\", \"Unknown\"),\n },\n {\n key: \"grossAmount\",\n header: tr(\"devportal.revenue.gross\", \"Gross\"),\n render: (sale) => `$${sale.grossAmount.toLocaleString()}`,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.net\", \"Net\"),\n render: (sale) => `$${sale.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (sale) => (\n <StatusBadge status={sale.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.revenue.payoutHistory\", \"Payout history\")}\n >\n <DataTable\n data={payouts}\n keyField=\"id\"\n columns={[\n {\n key: \"periodLabel\",\n header: tr(\"devportal.revenue.period\", \"Period\"),\n render: (payout) => payout.periodLabel,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.netPayout\", \"Net payout\"),\n render: (payout) => `$${payout.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (payout) => (\n <StatusBadge status={payout.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n </div>\n </>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\"devportal.revenue.noDataTitle\", \"No revenue data yet\")}\n description={tr(\n \"devportal.revenue.noDataDescription\",\n \"Revenue metrics will appear after this organization starts recording marketplace sales.\",\n )}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"RevenueDashboardPage.js","names":[],"sources":["../../../src/devportal/pages/RevenueDashboardPage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useSearchParams } from \"react-router-dom\";\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Line,\n LineChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport {\n AlertCircle,\n ArrowDownToLine,\n Building2,\n CreditCard,\n DollarSign,\n Link2,\n Loader2,\n Wallet,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { DataTable } from \"../components/DataTable\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { StatCard, StatCardGrid } from \"../components/StatCard\";\nimport { StatusBadge } from \"../components/StatusBadge\";\nimport type { DeveloperOrganization } from \"../types\";\nimport {\n type GetMyOrganizationsQuery,\n type GetRevenueDashboardDataQuery,\n getErrorMessage,\n useCreateBillingAccountMutation,\n useGetMyOrganizationsQuery,\n useGetRevenueDashboardDataQuery,\n useLinkDevOrgBillingAccountMutation,\n} from \"../hooks\";\nimport { useTr } from \"../utils/i18n\";\n\ntype TimeRange = \"30d\" | \"90d\" | \"12m\";\n\nconst chartColors = {\n primary: \"var(--color-chart-1)\",\n secondary: \"var(--color-chart-2)\",\n tertiary: \"var(--color-chart-4)\",\n};\n\ntype RevenueSale =\n GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number][\"node\"];\ntype RevenuePayout =\n GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number][\"node\"];\n\nconst daysByRange: Record<TimeRange, number> = {\n \"30d\": 30,\n \"90d\": 90,\n \"12m\": 365,\n};\n\nexport const RevenueDashboardPage: FC = () => {\n const tr = useTr();\n const [timeRange, setTimeRange] = useState<TimeRange>(\"90d\");\n const [selectedOrganizationId, setSelectedOrganizationId] = useState(\"\");\n const [linkingBilling, setLinkingBilling] = useState(false);\n const [linkBillingError, setLinkBillingError] = useState<string | null>(null);\n\n const [createBillingAccount] = useCreateBillingAccountMutation();\n const [linkBillingAccount] = useLinkDevOrgBillingAccountMutation();\n const [searchParams] = useSearchParams();\n const now = useMemo(() => new Date(), []);\n const requestedOrganizationId = searchParams.get(\"org\");\n const startDate = useMemo(() => {\n const nextDate = new Date(now);\n nextDate.setDate(nextDate.getDate() - daysByRange[timeRange]);\n return nextDate.toISOString();\n }, [now, timeRange]);\n\n const {\n data: organizationsData,\n loading: organizationsLoading,\n error: organizationsError,\n } = useGetMyOrganizationsQuery({\n fetchPolicy: \"cache-and-network\",\n });\n const { data, loading, error } = useGetRevenueDashboardDataQuery({\n variables: {\n organizationId: selectedOrganizationId,\n period: \"monthly\",\n startDate,\n endDate: now.toISOString(),\n salesLimit: 10,\n salesOffset: 0,\n payoutsLimit: 10,\n payoutsOffset: 0,\n },\n skip: !selectedOrganizationId,\n fetchPolicy: \"cache-and-network\",\n });\n\n const organizations: DeveloperOrganization[] = useMemo(\n () =>\n organizationsData?.myDeveloperOrganizations?.map(\n (\n organization: GetMyOrganizationsQuery[\"myDeveloperOrganizations\"][number],\n ) => organization as unknown as DeveloperOrganization,\n ) ?? [],\n [organizationsData?.myDeveloperOrganizations],\n );\n\n useEffect(() => {\n if (selectedOrganizationId) {\n return;\n }\n\n if (\n requestedOrganizationId &&\n organizations.some(\n (organization) => organization.id === requestedOrganizationId,\n )\n ) {\n setSelectedOrganizationId(requestedOrganizationId);\n return;\n }\n\n if (organizations.length === 1) {\n setSelectedOrganizationId(organizations[0]?.id ?? \"\");\n }\n }, [organizations, requestedOrganizationId, selectedOrganizationId]);\n\n const selectedOrganization = organizations.find(\n (organization) => organization.id === selectedOrganizationId,\n );\n\n const handleLinkBillingAccount = async () => {\n if (!selectedOrganizationId) return;\n setLinkingBilling(true);\n setLinkBillingError(null);\n try {\n const billingResult = await createBillingAccount({\n variables: {\n input: {\n name: selectedOrganization?.name ?? selectedOrganizationId,\n email: \"\",\n },\n },\n });\n const billingAccountId = billingResult.data?.createBillingAccount?.id;\n if (billingAccountId) {\n await linkBillingAccount({\n variables: {\n organizationId: selectedOrganizationId,\n billingAccountId,\n },\n refetchQueries: [\"GetMyOrganizations\"],\n });\n }\n } catch (err) {\n setLinkBillingError(\n err instanceof Error ? err.message : \"Failed to link billing account\",\n );\n } finally {\n setLinkingBilling(false);\n }\n };\n\n const summary = data?.developerOrgRevenueSummary;\n const analytics = [...(data?.developerOrgRevenueAnalytics ?? [])].sort(\n (left, right) =>\n new Date(left.date).getTime() - new Date(right.date).getTime(),\n );\n const sales: RevenueSale[] =\n data?.developerOrgSales?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgSales\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n const payouts: RevenuePayout[] =\n data?.developerOrgPayouts?.edges?.map(\n (\n edge: GetRevenueDashboardDataQuery[\"developerOrgPayouts\"][\"edges\"][number],\n ) => edge.node,\n ) ?? [];\n\n const chartData = analytics.map((entry) => ({\n date: new Date(entry.date).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n }),\n grossRevenue: entry.grossRevenue,\n netRevenue: entry.netRevenue,\n platformFees: entry.platformFees,\n refunds: entry.refunds,\n salesCount: entry.salesCount,\n }));\n\n if (organizationsLoading && !organizationsData) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n </PageLayout>\n );\n }\n\n if (organizationsError) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadOrgs\",\n \"Unable to load organizations\",\n )}\n description={getErrorMessage(organizationsError)}\n />\n </PageLayout>\n );\n }\n\n if (!selectedOrganizationId) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.selectOrgDescription\",\n \"Select an organization to review real sales and payout data through the public gateway\",\n )}\n >\n {organizations.length > 0 ? (\n <div className=\"space-y-2\">\n {organizations.map((organization) => (\n <button\n key={organization.id}\n type=\"button\"\n onClick={() => setSelectedOrganizationId(organization.id)}\n className=\"flex w-full items-start justify-between rounded-lg border bg-card p-4 text-left transition-colors hover:bg-accent\"\n >\n <div>\n <div className=\"flex items-center gap-2\">\n <Building2 className=\"h-4 w-4 text-primary\" />\n <span className=\"font-medium\">{organization.name}</span>\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {organization.totalApps ?? 0}{\" \"}\n {tr(\"devportal.revenue.apps\", \"apps\")} · $\n {organization.totalRevenue?.toLocaleString() ?? 0}{\" \"}\n {tr(\"devportal.revenue.revenue\", \"revenue\")}\n </p>\n </div>\n </button>\n ))}\n </div>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\n \"devportal.revenue.noOrgsTitle\",\n \"No organizations available\",\n )}\n description={tr(\n \"devportal.revenue.noOrgsDescription\",\n \"Create a developer organization before reviewing revenue data.\",\n )}\n />\n )}\n </PageLayout>\n );\n }\n\n if (error) {\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={tr(\n \"devportal.revenue.description\",\n \"Track real revenue, sales, and payout activity for your developer organizations\",\n )}\n >\n <EmptyState\n icon={<AlertCircle size={32} className=\"text-status-error-text\" />}\n title={tr(\n \"devportal.revenue.errorLoadData\",\n \"Unable to load revenue data\",\n )}\n description={getErrorMessage(error)}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={tr(\"devportal.revenue.title\", \"Revenue\")}\n description={\n selectedOrganization\n ? `${tr(\"devportal.revenue.financialPerformanceFor\", \"Financial performance for\")} ${selectedOrganization.name}`\n : tr(\n \"devportal.revenue.shortDescription\",\n \"Track revenue, sales, and payouts\",\n )\n }\n actions={\n <div className=\"flex flex-wrap gap-2\">\n <select\n value={selectedOrganizationId}\n onChange={(event) => setSelectedOrganizationId(event.target.value)}\n aria-label={tr(\n \"devportal.revenue.selectOrgAria\",\n \"Select organization\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n {organizations.map((organization) => (\n <option key={organization.id} value={organization.id}>\n {organization.name}\n </option>\n ))}\n </select>\n <select\n value={timeRange}\n onChange={(event) => setTimeRange(event.target.value as TimeRange)}\n aria-label={tr(\n \"devportal.revenue.selectRangeAria\",\n \"Select time range\",\n )}\n className=\"rounded-md border bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary\"\n >\n <option value=\"30d\">\n {tr(\"devportal.revenue.range.30d\", \"Last 30 days\")}\n </option>\n <option value=\"90d\">\n {tr(\"devportal.revenue.range.90d\", \"Last 90 days\")}\n </option>\n <option value=\"12m\">\n {tr(\"devportal.revenue.range.12m\", \"Last 12 months\")}\n </option>\n </select>\n </div>\n }\n >\n {/* Billing account link banner for orgs not yet linked */}\n {selectedOrganization && !selectedOrganization.billingAccountId && (\n <div className=\"mb-6 rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 flex items-start gap-3\">\n <Link2 size={20} className=\"text-accent-blue flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-status-info-text\">\n {tr(\n \"devportal.revenue.billingNotLinkedTitle\",\n \"Link a billing account to receive store revenue\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-status-info-text\">\n {tr(\n \"devportal.revenue.billingNotLinkedDesc\",\n \"Once linked, net earnings from app sales will appear in your billing credits — you can spend them on platform services or withdraw to your bank.\",\n )}\n </p>\n {linkBillingError && (\n <p className=\"mt-2 text-sm text-status-error-text\">\n {linkBillingError}\n </p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleLinkBillingAccount}\n disabled={linkingBilling}\n className=\"inline-flex items-center gap-2 rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90 transition-colors disabled:opacity-50 flex-shrink-0\"\n >\n {linkingBilling ? (\n <Loader2 size={14} className=\"animate-spin\" />\n ) : (\n <Link2 size={14} />\n )}\n {linkingBilling\n ? tr(\"devportal.revenue.linking\", \"Linking...\")\n : tr(\n \"devportal.revenue.linkBillingAccount\",\n \"Link Billing Account\",\n )}\n </button>\n </div>\n )}\n\n {loading && !summary ? (\n <div className=\"flex items-center justify-center py-16 text-muted-foreground\">\n <Loader2 className=\"h-8 w-8 animate-spin\" />\n </div>\n ) : summary ? (\n <>\n <StatCardGrid columns={4}>\n <StatCard\n title={tr(\"devportal.revenue.grossRevenue\", \"Gross Revenue\")}\n value={`$${summary.totalGrossRevenue.toLocaleString()}`}\n icon={<DollarSign size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.netRevenue\", \"Net Revenue\")}\n value={`$${summary.totalNetRevenue.toLocaleString()}`}\n icon={<Wallet size={20} />}\n />\n <StatCard\n title={tr(\"devportal.revenue.pendingBalance\", \"Pending Balance\")}\n value={`$${summary.pendingBalance.toLocaleString()}`}\n icon={<CreditCard size={20} />}\n description={\n summary.nextPayoutDate\n ? `${tr(\"devportal.revenue.nextPayout\", \"Next payout\")} ${new Date(summary.nextPayoutDate).toLocaleDateString()}`\n : tr(\n \"devportal.revenue.noPayoutScheduled\",\n \"No payout scheduled\",\n )\n }\n />\n <StatCard\n title={tr(\"devportal.revenue.platformFees\", \"Platform Fees\")}\n value={`$${summary.totalPlatformFees.toLocaleString()}`}\n icon={<ArrowDownToLine size={20} />}\n description={`${summary.totalRefundsCount} ${tr(\"devportal.revenue.refunds\", \"refunds\")}`}\n />\n </StatCardGrid>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.revenueTrend\", \"Revenue trend\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Line\n type=\"monotone\"\n dataKey=\"grossRevenue\"\n stroke={chartColors.primary}\n strokeWidth={2}\n dot={false}\n />\n <Line\n type=\"monotone\"\n dataKey=\"netRevenue\"\n stroke={chartColors.secondary}\n strokeWidth={2}\n dot={false}\n />\n </LineChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <PageSection\n title={tr(\n \"devportal.revenue.topApps\",\n \"Top applications by revenue\",\n )}\n >\n {summary.topApps.length > 0 ? (\n <div className=\"space-y-2\">\n {summary.topApps.map(\n (\n application: GetRevenueDashboardDataQuery[\"developerOrgRevenueSummary\"][\"topApps\"][number],\n ) => (\n <div\n key={application.applicationId}\n className=\"rounded-lg border bg-card p-4\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"font-medium\">\n {application.applicationName}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {application.salesCount}{\" \"}\n {tr(\"devportal.revenue.sales\", \"sales\")}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"font-semibold\">\n ${application.grossRevenue.toLocaleString()}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\"devportal.revenue.net\", \"Net\")} $\n {application.netRevenue.toLocaleString()}\n </p>\n </div>\n </div>\n </div>\n ),\n )}\n </div>\n ) : (\n <EmptyState\n icon={<Building2 size={24} />}\n title={tr(\n \"devportal.revenue.noLeadersTitle\",\n \"No revenue leaders yet\",\n )}\n description={tr(\n \"devportal.revenue.noLeadersDescription\",\n \"Top-performing applications will appear here once revenue is recorded.\",\n )}\n />\n )}\n </PageSection>\n </div>\n\n <PageSection\n title={tr(\"devportal.revenue.salesVolume\", \"Sales volume\")}\n >\n <div className=\"rounded-lg border bg-card p-4\">\n <ResponsiveContainer width=\"100%\" height={280}>\n <BarChart data={chartData}>\n <CartesianGrid\n strokeDasharray=\"3 3\"\n stroke=\"var(--color-chart-grid)\"\n />\n <XAxis\n dataKey=\"date\"\n stroke=\"var(--color-chart-axis)\"\n fontSize={12}\n />\n <YAxis stroke=\"var(--color-chart-axis)\" fontSize={12} />\n <Tooltip\n contentStyle={{\n backgroundColor: \"var(--color-card)\",\n border: \"1px solid var(--color-border-default)\",\n borderRadius: 12,\n }}\n />\n <Bar\n dataKey=\"salesCount\"\n fill={chartColors.tertiary}\n radius={[6, 6, 0, 0]}\n />\n </BarChart>\n </ResponsiveContainer>\n </div>\n </PageSection>\n\n <div className=\"grid gap-6 xl:grid-cols-2\">\n <PageSection\n title={tr(\"devportal.revenue.recentSales\", \"Recent sales\")}\n >\n <DataTable\n data={sales}\n keyField=\"id\"\n columns={[\n {\n key: \"application\",\n header: tr(\"devportal.revenue.application\", \"Application\"),\n render: (sale) =>\n sale.application?.name ||\n sale.planName ||\n tr(\"devportal.common.unknown\", \"Unknown\"),\n },\n {\n key: \"grossAmount\",\n header: tr(\"devportal.revenue.gross\", \"Gross\"),\n render: (sale) => `$${sale.grossAmount.toLocaleString()}`,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.net\", \"Net\"),\n render: (sale) => `$${sale.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (sale) => (\n <StatusBadge status={sale.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n\n <PageSection\n title={tr(\"devportal.revenue.payoutHistory\", \"Payout history\")}\n >\n <DataTable\n data={payouts}\n keyField=\"id\"\n columns={[\n {\n key: \"periodLabel\",\n header: tr(\"devportal.revenue.period\", \"Period\"),\n render: (payout) => payout.periodLabel,\n },\n {\n key: \"netAmount\",\n header: tr(\"devportal.revenue.netPayout\", \"Net payout\"),\n render: (payout) => `$${payout.netAmount.toLocaleString()}`,\n },\n {\n key: \"status\",\n header: tr(\"devportal.revenue.status\", \"Status\"),\n render: (payout) => (\n <StatusBadge status={payout.status} type=\"app\" />\n ),\n },\n ]}\n />\n </PageSection>\n </div>\n </>\n ) : (\n <EmptyState\n icon={<DollarSign size={32} />}\n title={tr(\"devportal.revenue.noDataTitle\", \"No revenue data yet\")}\n description={tr(\n \"devportal.revenue.noDataDescription\",\n \"Revenue metrics will appear after this organization starts recording marketplace sales.\",\n )}\n />\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/devportal/types/index.ts"],"sourcesContent":["/**\n * Developer Portal Types\n *\n * Core type definitions for the Developer Portal microfrontend\n */\n\nimport type { ReactNode } from \"react\";\n\n// =============================================================================\n// NAVIGATION TYPES\n// =============================================================================\n\n/**\n * Navigation item for shell integration\n */\nexport interface NavItem {\n id: string;\n label: string;\n path: string;\n icon?: ReactNode;\n badge?: number;\n order?: number;\n group?: string;\n visible?: boolean;\n children?: NavItem[];\n}\n\n/**\n * Footer item for shell integration\n */\nexport interface FooterItem {\n id: string;\n label: string;\n type: \"status\" | \"action\";\n order?: number;\n section: \"left\" | \"center\" | \"right\";\n}\n\n// =============================================================================\n// ROOT PROPS\n// =============================================================================\n\n/**\n * Props for the DevportalRoot component\n */\nexport interface DevportalRootProps {\n /**\n * Base path for the devportal microfrontend\n */\n basePath?: string;\n\n /**\n * Tenant ID for scoping operations\n */\n tenantId?: string;\n\n /**\n * Workspace ID (optional, for workspace-scoped features)\n */\n workspaceId?: string;\n\n /**\n * API Gateway URL for GraphQL requests (global gateway)\n */\n apiGatewayUrl?: string;\n\n /**\n * Workspace gateway URL for workspace-layer operations (e.g. wspace-files-svc uploads)\n * e.g. \"https://graphqlworkspaces.burdenoff.com\" or \"http://localhost:4003\"\n */\n workspacesGatewayUrl?: string;\n\n /**\n * Authentication token for API requests\n */\n authToken?: string;\n\n /**\n * Workspace authentication token for workspace-gateway requests (X-Workspace-Authorization).\n * May be a cached/stale value — use getWorkspaceToken() for upload flows that need a fresh token.\n */\n workspaceToken?: string;\n\n /**\n * Async getter that always returns a valid (non-expired) workspace token.\n * Call this instead of reading workspaceToken directly for workspace-layer mutations.\n */\n getWorkspaceToken?: () => Promise<string | null>;\n\n /**\n * Navigation function provided by the shell\n */\n navigate?: (path: string) => void;\n\n /**\n * Current user information\n */\n currentUser?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n };\n\n /**\n * Optional function to register navigation items with the shell\n */\n registerNavItems?: (items: NavItem | NavItem[]) => () => void;\n\n /**\n * Optional function to register footer items with the shell\n */\n registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;\n\n /**\n * Optional callback when an application is selected\n */\n onApplicationSelect?: (app: Application) => void;\n\n /**\n * Optional callback when an organization is selected\n */\n onOrganizationSelect?: (org: DeveloperOrganization) => void;\n}\n\n// =============================================================================\n// APPLICATION TYPES\n// =============================================================================\n\nexport type AppType =\n | \"WEB_APP\"\n | \"MOBILE_APP\"\n | \"DESKTOP_APP\"\n | \"CLI_TOOL\"\n | \"API_INTEGRATION\"\n | \"WORKFLOW\"\n | \"WIDGET\"\n | \"BOT\"\n | \"SERVICE\"\n | \"INTEGRATION\"\n | \"ANALYST\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"SPECIALIST\";\n\nexport type AppStatus =\n | \"DRAFT\"\n | \"SUBMITTED\"\n | \"IN_REVIEW\"\n | \"APPROVED\"\n | \"PUBLISHED\"\n | \"REJECTED\"\n | \"SUSPENDED\"\n | \"DEPRECATED\"\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"REVOKED\";\n\nexport type AppVisibility = \"PUBLIC\" | \"PRIVATE\" | \"UNLISTED\" | \"INTERNAL\";\n\nexport type AppSubmissionReviewStatus =\n | \"PENDING\"\n | \"IN_PROGRESS\"\n | \"APPROVED\"\n | \"REJECTED\"\n | \"CHANGES_REQUESTED\";\n\nexport interface Application {\n id: string;\n name: string;\n slug: string;\n shortDescription?: string;\n description?: string;\n appType: AppType;\n status: AppStatus;\n visibility: AppVisibility;\n tenantId: string;\n developerId: string;\n developerOrganizationId?: string;\n developerOrganization?: DeveloperOrganization;\n category?: string;\n tags: string[];\n keywords: string[];\n iconUrl?: string;\n bannerUrl?: string;\n videoUrl?: string;\n screenshots?: Record<string, unknown>;\n websiteUrl?: string;\n documentationUrl?: string;\n supportUrl?: string;\n privacyPolicyUrl?: string;\n termsOfServiceUrl?: string;\n githubUrl?: string;\n pricingType?: string;\n pricingDetails?: Record<string, unknown>;\n installCount: number;\n activeInstallCount: number;\n averageRating?: number;\n reviewCount: number;\n submittedAt?: string;\n publishedAt?: string;\n lastReviewedAt?: string;\n reviewStatus: AppSubmissionReviewStatus;\n reviewNotes?: string;\n reviewedBy?: string;\n isFeatured: boolean;\n isVerified: boolean;\n requiresApproval: boolean;\n manifest?: Record<string, unknown>;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n appId?: string;\n createdAt: string;\n updatedAt: string;\n versions?: ApplicationVersion[];\n oauthClients?: OAuthClient[];\n apiKeys?: ApiKey[];\n webhooks?: Webhook[];\n scopes?: ApplicationScope[];\n}\n\nexport interface ApplicationVersion {\n id: string;\n applicationId: string;\n version: string;\n releaseNotes?: string;\n changelog?: string;\n status: string;\n isLatest: boolean;\n isStable: boolean;\n packageUrl?: string;\n packageSize?: string;\n packageHash?: string;\n manifest?: Record<string, unknown>;\n minPlatformVersion?: string;\n maxPlatformVersion?: string;\n requiredScopes: string[];\n publishedAt?: string;\n deprecatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApplicationScope {\n id: string;\n applicationId: string;\n scope: string;\n description?: string;\n isRequired: boolean;\n createdAt: string;\n}\n\n// =============================================================================\n// OAUTH TYPES\n// =============================================================================\n\nexport type OAuthClientType = \"PUBLIC\" | \"CONFIDENTIAL\";\n\nexport type OAuthGrantType =\n | \"AUTHORIZATION_CODE\"\n | \"REFRESH_TOKEN\"\n | \"CLIENT_CREDENTIALS\"\n | \"IMPLICIT\"\n | \"PASSWORD\";\n\nexport interface OAuthClient {\n id: string;\n applicationId: string;\n name: string;\n clientId: string;\n clientSecret: string;\n clientType: OAuthClientType;\n redirectUris: string[];\n allowedGrantTypes: OAuthGrantType[];\n allowedScopes: string[];\n accessTokenLifetime: number;\n refreshTokenLifetime: number;\n isActive: boolean;\n requirePKCE: boolean;\n requireConsent: boolean;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OAuthToken {\n id: string;\n clientId: string;\n userId: string;\n tenantId: string;\n workspaceId?: string;\n accessToken: string;\n refreshToken?: string;\n tokenType: string;\n scopes: string[];\n expiresAt: string;\n refreshExpiresAt?: string;\n isRevoked: boolean;\n revokedAt?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n// =============================================================================\n// API KEY TYPES\n// =============================================================================\n\nexport type ApiKeyType = \"PUBLISHABLE\" | \"SECRET\" | \"RESTRICTED\";\n\nexport interface ApiKey {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n keyId: string;\n keyHash?: string; // Hash is not always returned by API for security\n keyPrefix: string;\n keyType: ApiKeyType;\n scopes: string[];\n permissions?: Record<string, unknown>;\n rateLimit?: number;\n quotaLimit?: number;\n quotaUsed: number;\n quotaResetAt?: string;\n allowedIps: string[];\n allowedDomains: string[];\n environment?: string;\n isActive: boolean;\n isRevoked: boolean;\n createdAt: string;\n lastUsedAt?: string;\n expiresAt?: string;\n revokedAt?: string;\n}\n\nexport interface ApiKeyPayload {\n apiKey: ApiKey;\n plainTextKey: string;\n}\n\n// =============================================================================\n// WEBHOOK TYPES\n// =============================================================================\n\nexport type WebhookStatus = \"ACTIVE\" | \"PAUSED\" | \"FAILED\" | \"DISABLED\";\n\nexport type WebhookDeliveryStatus =\n | \"PENDING\"\n | \"DELIVERING\"\n | \"DELIVERED\"\n | \"FAILED\"\n | \"RETRYING\";\n\nexport interface Webhook {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n url: string;\n secret: string;\n events: string[];\n filters?: Record<string, unknown>;\n retryEnabled: boolean;\n maxRetries: number;\n retryDelay: number;\n status: WebhookStatus;\n isActive: boolean;\n successCount: number;\n failureCount: number;\n lastTriggeredAt?: string;\n lastSuccessAt?: string;\n lastFailureAt?: string;\n lastFailureReason?: string;\n createdAt: string;\n updatedAt: string;\n deliveries?: WebhookDelivery[];\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n eventType: string;\n eventId: string;\n payload: Record<string, unknown>;\n attemptNumber: number;\n status: WebhookDeliveryStatus;\n requestHeaders?: Record<string, unknown>;\n requestBody?: Record<string, unknown>;\n responseStatus?: number;\n responseHeaders?: Record<string, unknown>;\n responseBody?: string;\n deliveredAt?: string;\n failedAt?: string;\n nextRetryAt?: string;\n errorMessage?: string;\n errorCode?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WebhookTestResult {\n success: boolean;\n statusCode?: number;\n response?: string;\n error?: string;\n}\n\n// =============================================================================\n// DEVELOPER ORGANIZATION TYPES\n// =============================================================================\n\nexport type DeveloperOrgRole = \"OWNER\" | \"ADMIN\" | \"DEVELOPER\" | \"VIEWER\";\n\nexport type DeveloperOrgTier =\n | \"FREE\"\n | \"DEVELOPER\"\n | \"PROFESSIONAL\"\n | \"ENTERPRISE\";\n\nexport type PartnerTier = \"REGISTERED\" | \"SELECT\" | \"PREMIER\";\n\nexport type InvitationStatus =\n | \"PENDING\"\n | \"ACCEPTED\"\n | \"REJECTED\"\n | \"EXPIRED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrganization {\n id: string;\n name: string;\n slug: string;\n description?: string;\n logoUrl?: string;\n bannerUrl?: string;\n websiteUrl?: string;\n contactEmail?: string;\n supportEmail?: string;\n tier: DeveloperOrgTier;\n partnerTier?: PartnerTier;\n partnerSince?: string;\n isVerified: boolean;\n verifiedAt?: string;\n verificationMethod?: string;\n isCertified: boolean;\n certifiedAt?: string;\n certificationExpiry?: string;\n totalApps: number;\n publishedApps: number;\n totalInstalls: number;\n activeInstalls: number;\n totalApiCalls: string;\n averageRating?: number;\n totalRevenue: number;\n totalPlatformFees: number;\n totalPayouts: number;\n pendingBalance: number;\n lifetimeRevenue: number;\n platformFeeRate: number;\n apiCallsLimit: number;\n storageLimit: string;\n apiCallsUsed: string;\n storageUsed: string;\n quotaResetAt?: string;\n taxId?: string;\n taxCountry?: string;\n taxFormType?: string;\n taxFormVerified: boolean;\n legalEntityName?: string;\n legalEntityType?: string;\n legalAddress?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n members?: DeveloperOrgMember[];\n invitations?: DeveloperOrgInvitation[];\n applications?: Application[];\n}\n\nexport interface DeveloperOrgMember {\n id: string;\n organizationId: string;\n userId: string;\n email?: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy?: string;\n invitationId?: string;\n isActive: boolean;\n isSuspended: boolean;\n suspendedAt?: string;\n suspendedReason?: string;\n joinedAt: string;\n lastActiveAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DeveloperOrgInvitation {\n id: string;\n organizationId: string;\n invitedUserId?: string;\n invitedEmail: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy: string;\n message?: string;\n token: string;\n status: InvitationStatus;\n expiresAt: string;\n respondedAt?: string;\n memberId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// ANALYTICS TYPES (MOCKED)\n// =============================================================================\n\nexport interface ApplicationAnalytics {\n id: string;\n applicationId: string;\n date: string;\n period: string;\n activeUsers: number;\n newUsers: number;\n apiCalls: number;\n errors: number;\n avgResponseTime?: number;\n sessions: number;\n avgSessionDuration?: number;\n createdAt: string;\n}\n\nexport interface DeveloperOrgRevenueAnalytics {\n id: string;\n organizationId: string;\n period: string;\n periodStart: string;\n periodEnd: string;\n grossRevenue: number;\n platformFees: number;\n netRevenue: number;\n salesCount: number;\n refundsCount: number;\n refundsAmount: number;\n newSubscribers: number;\n churnedSubscribers: number;\n activeSubscribers: number;\n avgRevenuePerUser: number;\n topApps?: Array<{ appId: string; revenue: number }>;\n createdAt: string;\n}\n\n// =============================================================================\n// MONETIZATION TYPES (MOCKED)\n// =============================================================================\n\nexport type DevPortalPricingModel =\n | \"FREE\"\n | \"FREEMIUM\"\n | \"SUBSCRIPTION\"\n | \"ONE_TIME\"\n | \"USAGE_BASED\"\n | \"ENTERPRISE\";\n\nexport type SaleStatus =\n | \"PENDING\"\n | \"COMPLETED\"\n | \"REFUNDED\"\n | \"PARTIAL_REFUND\"\n | \"DISPUTED\"\n | \"CHARGEBACK\"\n | \"CANCELLED\";\n\nexport type PayoutStatus =\n | \"PENDING\"\n | \"PROCESSING\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrgSale {\n id: string;\n organizationId: string;\n applicationId: string;\n buyerUserId: string;\n buyerTenantId?: string;\n installationScope: string;\n pricingModel: DevPortalPricingModel;\n planName?: string;\n grossAmount: number;\n platformFeeRate: number;\n platformFee: number;\n netAmount: number;\n currency: string;\n taxAmount?: number;\n discountAmount?: number;\n status: SaleStatus;\n createdAt: string;\n}\n\nexport interface DeveloperOrgPayout {\n id: string;\n organizationId: string;\n periodStart: string;\n periodEnd: string;\n grossAmount: number;\n platformFees: number;\n netAmount: number;\n currency: string;\n status: PayoutStatus;\n processedAt?: string;\n failedAt?: string;\n failureReason?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// APP INSTALLATION TYPES\n// =============================================================================\n\nexport type AppInstallationStatus =\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"TRIAL\"\n | \"EXPIRED\"\n | \"UNINSTALLED\";\n\nexport interface AppInstallation {\n id: string;\n applicationId: string;\n userId: string;\n tenantId?: string;\n workspaceId?: string;\n organizationId?: string;\n scope: string;\n installedVersion: string;\n status: AppInstallationStatus;\n grantedScopes: string[];\n settings?: Record<string, unknown>;\n installedAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// REVIEW TYPES\n// =============================================================================\n\nexport type ReviewStatus =\n | \"PENDING\"\n | \"PUBLISHED\"\n | \"HIDDEN\"\n | \"FLAGGED\"\n | \"REMOVED\";\n\nexport interface AppReview {\n id: string;\n applicationId: string;\n userId: string;\n rating: number;\n title?: string;\n body?: string;\n status: ReviewStatus;\n isFeatured: boolean;\n helpfulCount: number;\n notHelpfulCount: number;\n developerResponse?: string;\n developerResponseAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// DELEGATION TYPES\n// =============================================================================\n\nexport type DelegationStatus = \"ACTIVE\" | \"REVOKED\" | \"EXPIRED\";\n\nexport interface AppUserDelegation {\n id: string;\n appId: string;\n app?: {\n id: string;\n name: string;\n description?: string;\n type: string;\n status: string;\n };\n userId: string;\n scopes: string[];\n workspaceIds: string[];\n status: DelegationStatus;\n grantedAt: string;\n grantedBy: string;\n expiresAt?: string;\n revokedAt?: string;\n revokedBy?: string;\n}\n\nexport interface GrantDelegationInput {\n appId: string;\n userId?: string;\n workspaceIds: string[];\n scopes: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUTH APP TYPES (from auth-svc layer)\n// =============================================================================\n\nexport type AuthAppType =\n | \"ANALYST\"\n | \"API_INTEGRATION\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"BOT\"\n | \"CLI_TOOL\"\n | \"DESKTOP_APP\"\n | \"INTEGRATION\"\n | \"MOBILE_APP\"\n | \"SERVICE\"\n | \"SPECIALIST\"\n | \"WEB_APP\"\n | \"WIDGET\"\n | \"WORKFLOW\";\nexport type AuthAppStatus = \"ACTIVE\" | \"INACTIVE\" | \"REVOKED\";\n\nexport interface AuthApp {\n id: string;\n name: string;\n description?: string;\n clientId: string;\n type: AuthAppType;\n status: AuthAppStatus;\n scopes: string[];\n redirectUris: string[];\n ownerUserId: string;\n tenantId: string;\n delegations?: AppUserDelegation[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AuthAppCreateResponse {\n app: AuthApp;\n clientSecret: string;\n}\n\nexport interface CreateAuthAppInput {\n name: string;\n description?: string;\n type: AuthAppType;\n scopes: string[];\n redirectUris?: string[];\n tenantId?: string;\n}\n\nexport interface UpdateAuthAppInput {\n name?: string;\n description?: string;\n scopes?: string[];\n redirectUris?: string[];\n}\n\n// =============================================================================\n// AUTH API KEY TYPES (from auth-svc layer)\n// =============================================================================\n\nexport interface AuthApiKey {\n id: string;\n name: string;\n prefix: string;\n scopes: string[];\n appId: string;\n appName?: string;\n createdAt: string;\n expiresAt?: string;\n lastUsedAt?: string;\n}\n\nexport interface AuthApiKeyResult {\n apiKey: string;\n apiSecret: string;\n keyId: string;\n}\n\nexport interface AuthApiKeyRotateResult {\n apiSecret: string;\n}\n\nexport interface GenerateAuthApiKeyInput {\n appId: string;\n name: string;\n scope: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUDIT LOG TYPES\n// =============================================================================\n\nexport interface AuditLog {\n id: string;\n actorId: string;\n actorType: string;\n tenantId: string;\n action: string;\n resource: string;\n resourceId?: string;\n changes?: Record<string, unknown>;\n ipAddress?: string;\n userAgent?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// VIEW TYPES\n// =============================================================================\n\nexport type DevportalView =\n | \"dashboard\"\n | \"organizations\"\n | \"apps\"\n | \"oauth\"\n | \"api-keys\"\n | \"webhooks\"\n | \"delegations\"\n | \"analytics\"\n | \"revenue\"\n | \"docs\"\n | \"profile\"\n | \"settings\";\n\n// =============================================================================\n// FILTER TYPES\n// =============================================================================\n\nexport interface ApplicationFilter {\n search?: string;\n status?: AppStatus;\n visibility?: AppVisibility;\n appType?: AppType;\n organizationId?: string;\n isFeatured?: boolean;\n}\n\nexport interface WebhookFilter {\n status?: WebhookStatus;\n event?: string;\n}\n\n// =============================================================================\n// WEBHOOK EVENT TYPES\n// =============================================================================\n\nexport const WEBHOOK_EVENTS = [\n // Application events\n \"application.created\",\n \"application.updated\",\n \"application.deleted\",\n \"application.published\",\n \"application.unpublished\",\n \"application.suspended\",\n // Installation events\n \"installation.created\",\n \"installation.updated\",\n \"installation.deleted\",\n // User events\n \"user.created\",\n \"user.updated\",\n \"user.deleted\",\n // Workspace events\n \"workspace.created\",\n \"workspace.updated\",\n \"workspace.deleted\",\n // Project events\n \"project.created\",\n \"project.updated\",\n \"project.deleted\",\n // Task events\n \"task.created\",\n \"task.updated\",\n \"task.deleted\",\n \"task.completed\",\n // Comment events\n \"comment.created\",\n \"comment.updated\",\n \"comment.deleted\",\n // File events\n \"file.uploaded\",\n \"file.deleted\",\n // Member events\n \"member.added\",\n \"member.removed\",\n \"member.role_changed\",\n] as const;\n\nexport type WebhookEvent = (typeof WEBHOOK_EVENTS)[number];\n\n// =============================================================================\n// SCOPE DEFINITIONS\n// =============================================================================\n\nexport const AVAILABLE_SCOPES = [\n // User scopes\n {\n scope: \"user:read\",\n description: \"Read user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:write\",\n description: \"Modify user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:email\",\n description: \"Access user email address\",\n category: \"User\",\n },\n // Workspace scopes\n {\n scope: \"workspace:read\",\n description: \"Read workspace information\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:write\",\n description: \"Create and modify workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:delete\",\n description: \"Delete workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:members\",\n description: \"Manage workspace members\",\n category: \"Workspace\",\n },\n // Project scopes\n {\n scope: \"project:read\",\n description: \"Read project information\",\n category: \"Project\",\n },\n {\n scope: \"project:write\",\n description: \"Create and modify projects\",\n category: \"Project\",\n },\n {\n scope: \"project:delete\",\n description: \"Delete projects\",\n category: \"Project\",\n },\n // Task scopes\n { scope: \"task:read\", description: \"Read tasks\", category: \"Task\" },\n {\n scope: \"task:write\",\n description: \"Create and modify tasks\",\n category: \"Task\",\n },\n { scope: \"task:delete\", description: \"Delete tasks\", category: \"Task\" },\n // File scopes\n { scope: \"file:read\", description: \"Read files\", category: \"File\" },\n {\n scope: \"file:write\",\n description: \"Upload and modify files\",\n category: \"File\",\n },\n { scope: \"file:delete\", description: \"Delete files\", category: \"File\" },\n // Comment scopes\n { scope: \"comment:read\", description: \"Read comments\", category: \"Comment\" },\n {\n scope: \"comment:write\",\n description: \"Create and modify comments\",\n category: \"Comment\",\n },\n {\n scope: \"comment:delete\",\n description: \"Delete comments\",\n category: \"Comment\",\n },\n // Offline access\n {\n scope: \"offline_access\",\n description: \"Access data while user is offline\",\n category: \"Access\",\n },\n] as const;\n\nexport type AvailableScope = (typeof AVAILABLE_SCOPES)[number][\"scope\"];\n"],"mappings":";AA21BA,IAAa,IAAiB,yhBAwC7B,EAQY,IAAmB;CAE9B;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAgB,aAAa;EAAiB,UAAU;EAAW;CAC5E;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/devportal/types/index.ts"],"sourcesContent":["/**\n * Developer Portal Types\n *\n * Core type definitions for the Developer Portal microfrontend\n */\n\nimport type { ReactNode } from \"react\";\n\n// =============================================================================\n// NAVIGATION TYPES\n// =============================================================================\n\n/**\n * Navigation item for shell integration\n */\nexport interface NavItem {\n id: string;\n label: string;\n path: string;\n icon?: ReactNode;\n badge?: number;\n order?: number;\n group?: string;\n visible?: boolean;\n children?: NavItem[];\n}\n\n/**\n * Footer item for shell integration\n */\nexport interface FooterItem {\n id: string;\n label: string;\n type: \"status\" | \"action\";\n order?: number;\n section: \"left\" | \"center\" | \"right\";\n}\n\n// =============================================================================\n// ROOT PROPS\n// =============================================================================\n\n/**\n * Props for the DevportalRoot component\n */\nexport interface DevportalRootProps {\n /**\n * Base path for the devportal microfrontend\n */\n basePath?: string;\n\n /**\n * Tenant ID for scoping operations\n */\n tenantId?: string;\n\n /**\n * Workspace ID (optional, for workspace-scoped features)\n */\n workspaceId?: string;\n\n /**\n * API Gateway URL for GraphQL requests (global gateway)\n */\n apiGatewayUrl?: string;\n\n /**\n * Workspace gateway URL for workspace-layer operations (e.g. wspace-files-svc uploads)\n * e.g. \"https://graphqlworkspaces.burdenoff.com\" or \"http://localhost:4003\"\n */\n workspacesGatewayUrl?: string;\n\n /**\n * Authentication token for API requests\n */\n authToken?: string;\n\n /**\n * Workspace authentication token for workspace-gateway requests (X-Workspace-Authorization).\n * May be a cached/stale value — use getWorkspaceToken() for upload flows that need a fresh token.\n */\n workspaceToken?: string;\n\n /**\n * Async getter that always returns a valid (non-expired) workspace token.\n * Call this instead of reading workspaceToken directly for workspace-layer mutations.\n */\n getWorkspaceToken?: () => Promise<string | null>;\n\n /**\n * Navigation function provided by the shell\n */\n navigate?: (path: string) => void;\n\n /**\n * Current user information\n */\n currentUser?: {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n };\n\n /**\n * Optional function to register navigation items with the shell\n */\n registerNavItems?: (items: NavItem | NavItem[]) => () => void;\n\n /**\n * Optional function to register footer items with the shell\n */\n registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;\n\n /**\n * Optional callback when an application is selected\n */\n onApplicationSelect?: (app: Application) => void;\n\n /**\n * Optional callback when an organization is selected\n */\n onOrganizationSelect?: (org: DeveloperOrganization) => void;\n}\n\n// =============================================================================\n// APPLICATION TYPES\n// =============================================================================\n\nexport type AppType =\n | \"WEB_APP\"\n | \"MOBILE_APP\"\n | \"DESKTOP_APP\"\n | \"CLI_TOOL\"\n | \"API_INTEGRATION\"\n | \"WORKFLOW\"\n | \"WIDGET\"\n | \"BOT\"\n | \"SERVICE\"\n | \"INTEGRATION\"\n | \"ANALYST\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"SPECIALIST\";\n\nexport type AppStatus =\n | \"DRAFT\"\n | \"SUBMITTED\"\n | \"IN_REVIEW\"\n | \"APPROVED\"\n | \"PUBLISHED\"\n | \"REJECTED\"\n | \"SUSPENDED\"\n | \"DEPRECATED\"\n | \"ACTIVE\"\n | \"INACTIVE\"\n | \"REVOKED\";\n\nexport type AppVisibility = \"PUBLIC\" | \"PRIVATE\" | \"UNLISTED\" | \"INTERNAL\";\n\nexport type AppSubmissionReviewStatus =\n | \"PENDING\"\n | \"IN_PROGRESS\"\n | \"APPROVED\"\n | \"REJECTED\"\n | \"CHANGES_REQUESTED\";\n\nexport interface Application {\n id: string;\n name: string;\n slug: string;\n shortDescription?: string;\n description?: string;\n appType: AppType;\n status: AppStatus;\n visibility: AppVisibility;\n tenantId: string;\n developerId: string;\n developerOrganizationId?: string;\n developerOrganization?: DeveloperOrganization;\n category?: string;\n tags: string[];\n keywords: string[];\n iconUrl?: string;\n bannerUrl?: string;\n videoUrl?: string;\n screenshots?: Record<string, unknown>;\n websiteUrl?: string;\n documentationUrl?: string;\n supportUrl?: string;\n privacyPolicyUrl?: string;\n termsOfServiceUrl?: string;\n githubUrl?: string;\n pricingType?: string;\n pricingDetails?: Record<string, unknown>;\n installCount: number;\n activeInstallCount: number;\n averageRating?: number;\n reviewCount: number;\n submittedAt?: string;\n publishedAt?: string;\n lastReviewedAt?: string;\n reviewStatus: AppSubmissionReviewStatus;\n reviewNotes?: string;\n reviewedBy?: string;\n isFeatured: boolean;\n isVerified: boolean;\n requiresApproval: boolean;\n manifest?: Record<string, unknown>;\n config?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n appId?: string;\n createdAt: string;\n updatedAt: string;\n versions?: ApplicationVersion[];\n oauthClients?: OAuthClient[];\n apiKeys?: ApiKey[];\n webhooks?: Webhook[];\n scopes?: ApplicationScope[];\n}\n\nexport interface ApplicationVersion {\n id: string;\n applicationId: string;\n version: string;\n releaseNotes?: string;\n changelog?: string;\n status: string;\n isLatest: boolean;\n isStable: boolean;\n packageUrl?: string;\n packageSize?: string;\n packageHash?: string;\n manifest?: Record<string, unknown>;\n minPlatformVersion?: string;\n maxPlatformVersion?: string;\n requiredScopes: string[];\n publishedAt?: string;\n deprecatedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ApplicationScope {\n id: string;\n applicationId: string;\n scope: string;\n description?: string;\n isRequired: boolean;\n createdAt: string;\n}\n\n// =============================================================================\n// OAUTH TYPES\n// =============================================================================\n\nexport type OAuthClientType = \"PUBLIC\" | \"CONFIDENTIAL\";\n\nexport type OAuthGrantType =\n | \"AUTHORIZATION_CODE\"\n | \"REFRESH_TOKEN\"\n | \"CLIENT_CREDENTIALS\"\n | \"IMPLICIT\"\n | \"PASSWORD\";\n\nexport interface OAuthClient {\n id: string;\n applicationId: string;\n name: string;\n clientId: string;\n clientSecret: string;\n clientType: OAuthClientType;\n redirectUris: string[];\n allowedGrantTypes: OAuthGrantType[];\n allowedScopes: string[];\n accessTokenLifetime: number;\n refreshTokenLifetime: number;\n isActive: boolean;\n requirePKCE: boolean;\n requireConsent: boolean;\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OAuthToken {\n id: string;\n clientId: string;\n userId: string;\n tenantId: string;\n workspaceId?: string;\n accessToken: string;\n refreshToken?: string;\n tokenType: string;\n scopes: string[];\n expiresAt: string;\n refreshExpiresAt?: string;\n isRevoked: boolean;\n revokedAt?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n// =============================================================================\n// API KEY TYPES\n// =============================================================================\n\nexport type ApiKeyType = \"PUBLISHABLE\" | \"SECRET\" | \"RESTRICTED\";\n\nexport interface ApiKey {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n keyId: string;\n keyHash?: string; // Hash is not always returned by API for security\n keyPrefix: string;\n keyType: ApiKeyType;\n scopes: string[];\n permissions?: Record<string, unknown>;\n rateLimit?: number;\n quotaLimit?: number;\n quotaUsed: number;\n quotaResetAt?: string;\n allowedIps: string[];\n allowedDomains: string[];\n environment?: string;\n isActive: boolean;\n isRevoked: boolean;\n createdAt: string;\n lastUsedAt?: string;\n expiresAt?: string;\n revokedAt?: string;\n}\n\nexport interface ApiKeyPayload {\n apiKey: ApiKey;\n plainTextKey: string;\n}\n\n// =============================================================================\n// WEBHOOK TYPES\n// =============================================================================\n\nexport type WebhookStatus = \"ACTIVE\" | \"PAUSED\" | \"FAILED\" | \"DISABLED\";\n\nexport type WebhookDeliveryStatus =\n | \"PENDING\"\n | \"DELIVERING\"\n | \"DELIVERED\"\n | \"FAILED\"\n | \"RETRYING\";\n\nexport interface Webhook {\n id: string;\n applicationId: string;\n name: string;\n description?: string;\n url: string;\n secret: string;\n events: string[];\n filters?: Record<string, unknown>;\n retryEnabled: boolean;\n maxRetries: number;\n retryDelay: number;\n status: WebhookStatus;\n isActive: boolean;\n successCount: number;\n failureCount: number;\n lastTriggeredAt?: string;\n lastSuccessAt?: string;\n lastFailureAt?: string;\n lastFailureReason?: string;\n createdAt: string;\n updatedAt: string;\n deliveries?: WebhookDelivery[];\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n eventType: string;\n eventId: string;\n payload: Record<string, unknown>;\n attemptNumber: number;\n status: WebhookDeliveryStatus;\n requestHeaders?: Record<string, unknown>;\n requestBody?: Record<string, unknown>;\n responseStatus?: number;\n responseHeaders?: Record<string, unknown>;\n responseBody?: string;\n deliveredAt?: string;\n failedAt?: string;\n nextRetryAt?: string;\n errorMessage?: string;\n errorCode?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WebhookTestResult {\n success: boolean;\n statusCode?: number;\n response?: string;\n error?: string;\n}\n\n// =============================================================================\n// DEVELOPER ORGANIZATION TYPES\n// =============================================================================\n\nexport type DeveloperOrgRole = \"OWNER\" | \"ADMIN\" | \"DEVELOPER\" | \"VIEWER\";\n\nexport type DeveloperOrgTier =\n | \"FREE\"\n | \"DEVELOPER\"\n | \"PROFESSIONAL\"\n | \"ENTERPRISE\";\n\nexport type PartnerTier = \"REGISTERED\" | \"SELECT\" | \"PREMIER\";\n\nexport type InvitationStatus =\n | \"PENDING\"\n | \"ACCEPTED\"\n | \"REJECTED\"\n | \"EXPIRED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrganization {\n id: string;\n name: string;\n slug: string;\n description?: string;\n logoUrl?: string;\n bannerUrl?: string;\n websiteUrl?: string;\n contactEmail?: string;\n supportEmail?: string;\n tier: DeveloperOrgTier;\n partnerTier?: PartnerTier;\n partnerSince?: string;\n isVerified: boolean;\n verifiedAt?: string;\n verificationMethod?: string;\n isCertified: boolean;\n certifiedAt?: string;\n certificationExpiry?: string;\n totalApps: number;\n publishedApps: number;\n totalInstalls: number;\n activeInstalls: number;\n totalApiCalls: string;\n averageRating?: number;\n totalRevenue: number;\n totalPlatformFees: number;\n totalPayouts: number;\n pendingBalance: number;\n lifetimeRevenue: number;\n platformFeeRate: number;\n apiCallsLimit: number;\n storageLimit: string;\n apiCallsUsed: string;\n storageUsed: string;\n quotaResetAt?: string;\n taxId?: string;\n taxCountry?: string;\n taxFormType?: string;\n taxFormVerified: boolean;\n legalEntityName?: string;\n legalEntityType?: string;\n legalAddress?: Record<string, unknown>;\n settings?: Record<string, unknown>;\n billingAccountId?: string;\n billingLinkedAt?: string;\n createdAt: string;\n updatedAt: string;\n members?: DeveloperOrgMember[];\n invitations?: DeveloperOrgInvitation[];\n applications?: Application[];\n}\n\nexport interface DeveloperOrgMember {\n id: string;\n organizationId: string;\n userId: string;\n email?: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy?: string;\n invitationId?: string;\n isActive: boolean;\n isSuspended: boolean;\n suspendedAt?: string;\n suspendedReason?: string;\n joinedAt: string;\n lastActiveAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface DeveloperOrgInvitation {\n id: string;\n organizationId: string;\n invitedUserId?: string;\n invitedEmail: string;\n role: DeveloperOrgRole;\n permissions?: Record<string, unknown>;\n invitedBy: string;\n message?: string;\n token: string;\n status: InvitationStatus;\n expiresAt: string;\n respondedAt?: string;\n memberId?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// ANALYTICS TYPES (MOCKED)\n// =============================================================================\n\nexport interface ApplicationAnalytics {\n id: string;\n applicationId: string;\n date: string;\n period: string;\n activeUsers: number;\n newUsers: number;\n apiCalls: number;\n errors: number;\n avgResponseTime?: number;\n sessions: number;\n avgSessionDuration?: number;\n createdAt: string;\n}\n\nexport interface DeveloperOrgRevenueAnalytics {\n id: string;\n organizationId: string;\n period: string;\n periodStart: string;\n periodEnd: string;\n grossRevenue: number;\n platformFees: number;\n netRevenue: number;\n salesCount: number;\n refundsCount: number;\n refundsAmount: number;\n newSubscribers: number;\n churnedSubscribers: number;\n activeSubscribers: number;\n avgRevenuePerUser: number;\n topApps?: Array<{ appId: string; revenue: number }>;\n createdAt: string;\n}\n\n// =============================================================================\n// MONETIZATION TYPES (MOCKED)\n// =============================================================================\n\nexport type DevPortalPricingModel =\n | \"FREE\"\n | \"FREEMIUM\"\n | \"SUBSCRIPTION\"\n | \"ONE_TIME\"\n | \"USAGE_BASED\"\n | \"ENTERPRISE\";\n\nexport type SaleStatus =\n | \"PENDING\"\n | \"COMPLETED\"\n | \"REFUNDED\"\n | \"PARTIAL_REFUND\"\n | \"DISPUTED\"\n | \"CHARGEBACK\"\n | \"CANCELLED\";\n\nexport type PayoutStatus =\n | \"PENDING\"\n | \"PROCESSING\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\nexport interface DeveloperOrgSale {\n id: string;\n organizationId: string;\n applicationId: string;\n buyerUserId: string;\n buyerTenantId?: string;\n installationScope: string;\n pricingModel: DevPortalPricingModel;\n planName?: string;\n grossAmount: number;\n platformFeeRate: number;\n platformFee: number;\n netAmount: number;\n currency: string;\n taxAmount?: number;\n discountAmount?: number;\n status: SaleStatus;\n createdAt: string;\n}\n\nexport interface DeveloperOrgPayout {\n id: string;\n organizationId: string;\n periodStart: string;\n periodEnd: string;\n grossAmount: number;\n platformFees: number;\n netAmount: number;\n currency: string;\n status: PayoutStatus;\n processedAt?: string;\n failedAt?: string;\n failureReason?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// APP INSTALLATION TYPES\n// =============================================================================\n\nexport type AppInstallationStatus =\n | \"ACTIVE\"\n | \"SUSPENDED\"\n | \"TRIAL\"\n | \"EXPIRED\"\n | \"UNINSTALLED\";\n\nexport interface AppInstallation {\n id: string;\n applicationId: string;\n userId: string;\n tenantId?: string;\n workspaceId?: string;\n organizationId?: string;\n scope: string;\n installedVersion: string;\n status: AppInstallationStatus;\n grantedScopes: string[];\n settings?: Record<string, unknown>;\n installedAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// REVIEW TYPES\n// =============================================================================\n\nexport type ReviewStatus =\n | \"PENDING\"\n | \"PUBLISHED\"\n | \"HIDDEN\"\n | \"FLAGGED\"\n | \"REMOVED\";\n\nexport interface AppReview {\n id: string;\n applicationId: string;\n userId: string;\n rating: number;\n title?: string;\n body?: string;\n status: ReviewStatus;\n isFeatured: boolean;\n helpfulCount: number;\n notHelpfulCount: number;\n developerResponse?: string;\n developerResponseAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// =============================================================================\n// DELEGATION TYPES\n// =============================================================================\n\nexport type DelegationStatus = \"ACTIVE\" | \"REVOKED\" | \"EXPIRED\";\n\nexport interface AppUserDelegation {\n id: string;\n appId: string;\n app?: {\n id: string;\n name: string;\n description?: string;\n type: string;\n status: string;\n };\n userId: string;\n scopes: string[];\n workspaceIds: string[];\n status: DelegationStatus;\n grantedAt: string;\n grantedBy: string;\n expiresAt?: string;\n revokedAt?: string;\n revokedBy?: string;\n}\n\nexport interface GrantDelegationInput {\n appId: string;\n userId?: string;\n workspaceIds: string[];\n scopes: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUTH APP TYPES (from auth-svc layer)\n// =============================================================================\n\nexport type AuthAppType =\n | \"ANALYST\"\n | \"API_INTEGRATION\"\n | \"ASSISTANT\"\n | \"AUTOMATION\"\n | \"BOT\"\n | \"CLI_TOOL\"\n | \"DESKTOP_APP\"\n | \"INTEGRATION\"\n | \"MOBILE_APP\"\n | \"SERVICE\"\n | \"SPECIALIST\"\n | \"WEB_APP\"\n | \"WIDGET\"\n | \"WORKFLOW\";\nexport type AuthAppStatus = \"ACTIVE\" | \"INACTIVE\" | \"REVOKED\";\n\nexport interface AuthApp {\n id: string;\n name: string;\n description?: string;\n clientId: string;\n type: AuthAppType;\n status: AuthAppStatus;\n scopes: string[];\n redirectUris: string[];\n ownerUserId: string;\n tenantId: string;\n delegations?: AppUserDelegation[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AuthAppCreateResponse {\n app: AuthApp;\n clientSecret: string;\n}\n\nexport interface CreateAuthAppInput {\n name: string;\n description?: string;\n type: AuthAppType;\n scopes: string[];\n redirectUris?: string[];\n tenantId?: string;\n}\n\nexport interface UpdateAuthAppInput {\n name?: string;\n description?: string;\n scopes?: string[];\n redirectUris?: string[];\n}\n\n// =============================================================================\n// AUTH API KEY TYPES (from auth-svc layer)\n// =============================================================================\n\nexport interface AuthApiKey {\n id: string;\n name: string;\n prefix: string;\n scopes: string[];\n appId: string;\n appName?: string;\n createdAt: string;\n expiresAt?: string;\n lastUsedAt?: string;\n}\n\nexport interface AuthApiKeyResult {\n apiKey: string;\n apiSecret: string;\n keyId: string;\n}\n\nexport interface AuthApiKeyRotateResult {\n apiSecret: string;\n}\n\nexport interface GenerateAuthApiKeyInput {\n appId: string;\n name: string;\n scope: string[];\n expiresAt?: string;\n}\n\n// =============================================================================\n// AUDIT LOG TYPES\n// =============================================================================\n\nexport interface AuditLog {\n id: string;\n actorId: string;\n actorType: string;\n tenantId: string;\n action: string;\n resource: string;\n resourceId?: string;\n changes?: Record<string, unknown>;\n ipAddress?: string;\n userAgent?: string;\n createdAt: string;\n}\n\n// =============================================================================\n// VIEW TYPES\n// =============================================================================\n\nexport type DevportalView =\n | \"dashboard\"\n | \"organizations\"\n | \"apps\"\n | \"oauth\"\n | \"api-keys\"\n | \"webhooks\"\n | \"delegations\"\n | \"analytics\"\n | \"revenue\"\n | \"docs\"\n | \"profile\"\n | \"settings\";\n\n// =============================================================================\n// FILTER TYPES\n// =============================================================================\n\nexport interface ApplicationFilter {\n search?: string;\n status?: AppStatus;\n visibility?: AppVisibility;\n appType?: AppType;\n organizationId?: string;\n isFeatured?: boolean;\n}\n\nexport interface WebhookFilter {\n status?: WebhookStatus;\n event?: string;\n}\n\n// =============================================================================\n// WEBHOOK EVENT TYPES\n// =============================================================================\n\nexport const WEBHOOK_EVENTS = [\n // Application events\n \"application.created\",\n \"application.updated\",\n \"application.deleted\",\n \"application.published\",\n \"application.unpublished\",\n \"application.suspended\",\n // Installation events\n \"installation.created\",\n \"installation.updated\",\n \"installation.deleted\",\n // User events\n \"user.created\",\n \"user.updated\",\n \"user.deleted\",\n // Workspace events\n \"workspace.created\",\n \"workspace.updated\",\n \"workspace.deleted\",\n // Project events\n \"project.created\",\n \"project.updated\",\n \"project.deleted\",\n // Task events\n \"task.created\",\n \"task.updated\",\n \"task.deleted\",\n \"task.completed\",\n // Comment events\n \"comment.created\",\n \"comment.updated\",\n \"comment.deleted\",\n // File events\n \"file.uploaded\",\n \"file.deleted\",\n // Member events\n \"member.added\",\n \"member.removed\",\n \"member.role_changed\",\n] as const;\n\nexport type WebhookEvent = (typeof WEBHOOK_EVENTS)[number];\n\n// =============================================================================\n// SCOPE DEFINITIONS\n// =============================================================================\n\nexport const AVAILABLE_SCOPES = [\n // User scopes\n {\n scope: \"user:read\",\n description: \"Read user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:write\",\n description: \"Modify user profile information\",\n category: \"User\",\n },\n {\n scope: \"user:email\",\n description: \"Access user email address\",\n category: \"User\",\n },\n // Workspace scopes\n {\n scope: \"workspace:read\",\n description: \"Read workspace information\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:write\",\n description: \"Create and modify workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:delete\",\n description: \"Delete workspaces\",\n category: \"Workspace\",\n },\n {\n scope: \"workspace:members\",\n description: \"Manage workspace members\",\n category: \"Workspace\",\n },\n // Project scopes\n {\n scope: \"project:read\",\n description: \"Read project information\",\n category: \"Project\",\n },\n {\n scope: \"project:write\",\n description: \"Create and modify projects\",\n category: \"Project\",\n },\n {\n scope: \"project:delete\",\n description: \"Delete projects\",\n category: \"Project\",\n },\n // Task scopes\n { scope: \"task:read\", description: \"Read tasks\", category: \"Task\" },\n {\n scope: \"task:write\",\n description: \"Create and modify tasks\",\n category: \"Task\",\n },\n { scope: \"task:delete\", description: \"Delete tasks\", category: \"Task\" },\n // File scopes\n { scope: \"file:read\", description: \"Read files\", category: \"File\" },\n {\n scope: \"file:write\",\n description: \"Upload and modify files\",\n category: \"File\",\n },\n { scope: \"file:delete\", description: \"Delete files\", category: \"File\" },\n // Comment scopes\n { scope: \"comment:read\", description: \"Read comments\", category: \"Comment\" },\n {\n scope: \"comment:write\",\n description: \"Create and modify comments\",\n category: \"Comment\",\n },\n {\n scope: \"comment:delete\",\n description: \"Delete comments\",\n category: \"Comment\",\n },\n // Offline access\n {\n scope: \"offline_access\",\n description: \"Access data while user is offline\",\n category: \"Access\",\n },\n] as const;\n\nexport type AvailableScope = (typeof AVAILABLE_SCOPES)[number][\"scope\"];\n"],"mappings":";AA61BA,IAAa,IAAiB,yhBAwC7B,EAQY,IAAmB;CAE9B;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAa,aAAa;EAAc,UAAU;EAAQ;CACnE;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EAAE,OAAO;EAAe,aAAa;EAAgB,UAAU;EAAQ;CAEvE;EAAE,OAAO;EAAgB,aAAa;EAAiB,UAAU;EAAW;CAC5E;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACD;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CAED;EACE,OAAO;EACP,aAAa;EACb,UAAU;EACX;CACF"}
@@ -178,6 +178,8 @@ var n = {}, r = e`
178
178
  legalEntityType
179
179
  taxId
180
180
  taxCountry
181
+ billingAccountId
182
+ billingLinkedAt
181
183
  createdAt
182
184
  updatedAt
183
185
  }
@@ -1474,18 +1476,42 @@ e`
1474
1476
  }
1475
1477
  ${c}`;
1476
1478
  var ct = e`
1479
+ mutation LinkDevOrgBillingAccount($organizationId: ID!, $billingAccountId: ID!) {
1480
+ linkDevOrgBillingAccount(
1481
+ organizationId: $organizationId
1482
+ billingAccountId: $billingAccountId
1483
+ ) {
1484
+ ...OrganizationFields
1485
+ }
1486
+ }
1487
+ ${c}`;
1488
+ function lt(e) {
1489
+ let r = {
1490
+ ...n,
1491
+ ...e
1492
+ };
1493
+ return t.useMutation(ct, r);
1494
+ }
1495
+ e`
1496
+ mutation UnlinkDevOrgBillingAccount($organizationId: ID!) {
1497
+ unlinkDevOrgBillingAccount(organizationId: $organizationId) {
1498
+ ...OrganizationFields
1499
+ }
1500
+ }
1501
+ ${c}`;
1502
+ var ut = e`
1477
1503
  mutation CreateBillingAccount($input: CreateBillingAccountInput!) {
1478
1504
  createBillingAccount(input: $input) {
1479
1505
  ...BillingAccountFields
1480
1506
  }
1481
1507
  }
1482
1508
  ${d}`;
1483
- function lt(e) {
1509
+ function dt(e) {
1484
1510
  let r = {
1485
1511
  ...n,
1486
1512
  ...e
1487
1513
  };
1488
- return t.useMutation(ct, r);
1514
+ return t.useMutation(ut, r);
1489
1515
  }
1490
1516
  e`
1491
1517
  query GetBillingAccount($id: ID!) {
@@ -1494,19 +1520,19 @@ e`
1494
1520
  }
1495
1521
  }
1496
1522
  ${d}`;
1497
- var ut = e`
1523
+ var ft = e`
1498
1524
  query GetMyDeveloperProfile {
1499
1525
  myDeveloperProfile {
1500
1526
  ...DeveloperProfileFields
1501
1527
  }
1502
1528
  }
1503
1529
  ${f}`;
1504
- function dt(e) {
1530
+ function pt(e) {
1505
1531
  let r = {
1506
1532
  ...n,
1507
1533
  ...e
1508
1534
  };
1509
- return t.useQuery(ut, r);
1535
+ return t.useQuery(ft, r);
1510
1536
  }
1511
1537
  e`
1512
1538
  query GetDeveloperProfile($userId: ID!) {
@@ -1515,7 +1541,7 @@ e`
1515
1541
  }
1516
1542
  }
1517
1543
  ${f}`;
1518
- var ft = e`
1544
+ var mt = e`
1519
1545
  query GetApplicationAuditLogs($applicationId: ID!, $limit: Int, $offset: Int) {
1520
1546
  application(id: $applicationId) {
1521
1547
  id
@@ -1543,12 +1569,12 @@ var ft = e`
1543
1569
  }
1544
1570
  }
1545
1571
  ${te}`;
1546
- function pt(e) {
1572
+ function ht(e) {
1547
1573
  let r = {
1548
1574
  ...n,
1549
1575
  ...e
1550
1576
  };
1551
- return t.useQuery(ft, r);
1577
+ return t.useQuery(mt, r);
1552
1578
  }
1553
1579
  e`
1554
1580
  mutation CreateDeveloperProfile($input: CreateDeveloperProfileInput!) {
@@ -1557,19 +1583,19 @@ e`
1557
1583
  }
1558
1584
  }
1559
1585
  ${f}`;
1560
- var mt = e`
1586
+ var gt = e`
1561
1587
  mutation UpdateDeveloperProfile($userId: ID!, $input: UpdateDeveloperProfileInput!) {
1562
1588
  updateDeveloperProfile(userId: $userId, input: $input) {
1563
1589
  ...DeveloperProfileFields
1564
1590
  }
1565
1591
  }
1566
1592
  ${f}`;
1567
- function ht(e) {
1593
+ function _t(e) {
1568
1594
  let r = {
1569
1595
  ...n,
1570
1596
  ...e
1571
1597
  };
1572
- return t.useMutation(mt, r);
1598
+ return t.useMutation(gt, r);
1573
1599
  }
1574
1600
  e`
1575
1601
  query GetRevenueSummary($organizationId: ID!, $period: String!) {
@@ -1597,7 +1623,7 @@ e`
1597
1623
  }
1598
1624
  }
1599
1625
  `;
1600
- var gt = e`
1626
+ var vt = e`
1601
1627
  query GetRevenueDashboardData($organizationId: ID!, $period: String!, $startDate: DateTime, $endDate: DateTime, $salesLimit: Int, $salesOffset: Int, $payoutsLimit: Int, $payoutsOffset: Int) {
1602
1628
  developerOrgRevenueSummary(organizationId: $organizationId, period: $period) {
1603
1629
  period
@@ -1675,12 +1701,12 @@ var gt = e`
1675
1701
  ${g}
1676
1702
  ${p}
1677
1703
  ${m}`;
1678
- function _t(e) {
1704
+ function yt(e) {
1679
1705
  let r = {
1680
1706
  ...n,
1681
1707
  ...e
1682
1708
  };
1683
- return t.useQuery(gt, r);
1709
+ return t.useQuery(vt, r);
1684
1710
  }
1685
1711
  e`
1686
1712
  query GetRevenueAnalytics($organizationId: ID!, $period: String!, $startDate: DateTime, $endDate: DateTime) {
@@ -1840,7 +1866,7 @@ ${p}`, e`
1840
1866
  }
1841
1867
  }
1842
1868
  ${p}`;
1843
- var vt = e`
1869
+ var $ = e`
1844
1870
  query GetDeveloperPortalSettingsOverview {
1845
1871
  myDeveloperProfile {
1846
1872
  ...DeveloperProfileFields
@@ -1870,42 +1896,42 @@ var vt = e`
1870
1896
  }
1871
1897
  }
1872
1898
  ${f}`;
1873
- function yt(e) {
1899
+ function bt(e) {
1874
1900
  let r = {
1875
1901
  ...n,
1876
1902
  ...e
1877
1903
  };
1878
- return t.useQuery(vt, r);
1904
+ return t.useQuery($, r);
1879
1905
  }
1880
- var $ = e`
1906
+ var xt = e`
1881
1907
  query GetWebhooks($applicationId: ID!) {
1882
1908
  webhooks(applicationId: $applicationId) {
1883
1909
  ...DevportalWebhookFields
1884
1910
  }
1885
1911
  }
1886
1912
  ${_}`;
1887
- function bt(e) {
1913
+ function St(e) {
1888
1914
  let r = {
1889
1915
  ...n,
1890
1916
  ...e
1891
1917
  };
1892
- return t.useQuery($, r);
1918
+ return t.useQuery(xt, r);
1893
1919
  }
1894
- var xt = e`
1920
+ var Ct = e`
1895
1921
  query GetWebhook($id: ID!) {
1896
1922
  webhook(id: $id) {
1897
1923
  ...DevportalWebhookFields
1898
1924
  }
1899
1925
  }
1900
1926
  ${_}`;
1901
- function St(e) {
1927
+ function wt(e) {
1902
1928
  let r = {
1903
1929
  ...n,
1904
1930
  ...e
1905
1931
  };
1906
- return t.useQuery(xt, r);
1932
+ return t.useQuery(Ct, r);
1907
1933
  }
1908
- var Ct = e`
1934
+ var Tt = e`
1909
1935
  query GetWebhookDetail($id: ID!, $limit: Int, $offset: Int) {
1910
1936
  webhook(id: $id) {
1911
1937
  ...DevportalWebhookFields
@@ -1925,12 +1951,12 @@ var Ct = e`
1925
1951
  }
1926
1952
  ${_}
1927
1953
  ${v}`;
1928
- function wt(e) {
1954
+ function Et(e) {
1929
1955
  let r = {
1930
1956
  ...n,
1931
1957
  ...e
1932
1958
  };
1933
- return t.useQuery(Ct, r);
1959
+ return t.useQuery(Tt, r);
1934
1960
  }
1935
1961
  e`
1936
1962
  query GetWebhookDeliveries($webhookId: ID!, $limit: Int, $offset: Int) {
@@ -1954,47 +1980,47 @@ e`
1954
1980
  }
1955
1981
  }
1956
1982
  ${v}`;
1957
- var Tt = e`
1983
+ var Dt = e`
1958
1984
  mutation CreateWebhook($applicationId: ID!, $input: CreateWebhookInput!) {
1959
1985
  createWebhook(applicationId: $applicationId, input: $input) {
1960
1986
  ...DevportalWebhookFields
1961
1987
  }
1962
1988
  }
1963
1989
  ${_}`;
1964
- function Et(e) {
1990
+ function Ot(e) {
1965
1991
  let r = {
1966
1992
  ...n,
1967
1993
  ...e
1968
1994
  };
1969
- return t.useMutation(Tt, r);
1995
+ return t.useMutation(Dt, r);
1970
1996
  }
1971
- var Dt = e`
1997
+ var kt = e`
1972
1998
  mutation UpdateWebhook($id: ID!, $input: UpdateWebhookInput!) {
1973
1999
  updateWebhook(id: $id, input: $input) {
1974
2000
  ...DevportalWebhookFields
1975
2001
  }
1976
2002
  }
1977
2003
  ${_}`;
1978
- function Ot(e) {
2004
+ function At(e) {
1979
2005
  let r = {
1980
2006
  ...n,
1981
2007
  ...e
1982
2008
  };
1983
- return t.useMutation(Dt, r);
2009
+ return t.useMutation(kt, r);
1984
2010
  }
1985
- var kt = e`
2011
+ var jt = e`
1986
2012
  mutation DeleteWebhook($id: ID!) {
1987
2013
  deleteWebhook(id: $id)
1988
2014
  }
1989
2015
  `;
1990
- function At(e) {
2016
+ function Mt(e) {
1991
2017
  let r = {
1992
2018
  ...n,
1993
2019
  ...e
1994
2020
  };
1995
- return t.useMutation(kt, r);
2021
+ return t.useMutation(jt, r);
1996
2022
  }
1997
- var jt = e`
2023
+ var Nt = e`
1998
2024
  mutation TestWebhook($id: ID!, $eventType: String!) {
1999
2025
  testWebhook(id: $id, eventType: $eventType) {
2000
2026
  success
@@ -2004,14 +2030,14 @@ var jt = e`
2004
2030
  }
2005
2031
  }
2006
2032
  `;
2007
- function Mt(e) {
2033
+ function Pt(e) {
2008
2034
  let r = {
2009
2035
  ...n,
2010
2036
  ...e
2011
2037
  };
2012
- return t.useMutation(jt, r);
2038
+ return t.useMutation(Nt, r);
2013
2039
  }
2014
2040
  //#endregion
2015
- export { a as AppInstallationFieldsFragmentDoc, r as ApplicationFieldsFragmentDoc, ee as ApplicationScopeFieldsFragmentDoc, i as ApplicationVersionFieldsFragmentDoc, k as ApproveApplicationDocument, te as AuditLogFieldsFragmentDoc, o as AuthAppFieldsFragmentDoc, d as BillingAccountFieldsFragmentDoc, Je as CancelInvitationDocument, T as CreateApplicationDocument, j as CreateApplicationVersionDocument, V as CreateAuthAppDocument, ct as CreateBillingAccountDocument, Be as CreateOrganizationDocument, Tt as CreateWebhookDocument, z as CurrentUserAppsDocument, K as CurrentUserDelegationsDocument, q as CurrentUserGrantedDelegationsDocument, U as DeactivateAppDocument, s as DelegationFieldsFragmentDoc, D as DeleteApplicationDocument, We as DeleteOrganizationDocument, kt as DeleteWebhookDocument, N as DeprecateApplicationVersionDocument, f as DeveloperProfileFieldsFragmentDoc, _ as DevportalWebhookFieldsFragmentDoc, I as GenerateApiKeyDocument, y as GetAnalyticsDashboardOptionsDocument, b as GetApplicationAnalyticsDashboardDocument, w as GetApplicationAnalyticsDocument, ft as GetApplicationAuditLogsDocument, S as GetApplicationDocument, C as GetApplicationVersionsDocument, x as GetApplicationsDocument, B as GetAuthAppDocument, vt as GetDeveloperPortalSettingsOverviewDocument, G as GetDevportalDashboardBootstrapDocument, ut as GetMyDeveloperProfileDocument, X as GetMyOrganizationsDocument, Q as GetOrganizationDocument, Re as GetOrganizationInvitationsDocument, Ie as GetOrganizationMembersDocument, Z as GetOrganizationsDocument, gt as GetRevenueDashboardDataDocument, Ct as GetWebhookDetailDocument, xt as GetWebhookDocument, $ as GetWebhooksDocument, J as GrantDelegationDocument, P as InstallApplicationDocument, Ke as InviteMemberDocument, F as MyApiKeysDocument, u as OrgInvitationFieldsFragmentDoc, l as OrgMemberFieldsFragmentDoc, c as OrganizationFieldsFragmentDoc, h as PaymentMethodFieldsFragmentDoc, m as PayoutFieldsFragmentDoc, M as PublishApplicationVersionDocument, it as ReactivateMemberDocument, A as RejectApplicationDocument, et as RemoveMemberDocument, Xe as ResendInvitationDocument, g as RevenueAnalyticsFieldsFragmentDoc, L as RevokeApiKeyAuthDocument, Y as RevokeDelegationDocument, R as RotateApiKeyAuthDocument, W as RotateAppSecretDocument, p as SaleFieldsFragmentDoc, O as SubmitApplicationDocument, nt as SuspendMemberDocument, jt as TestWebhookDocument, ot as TransferOwnershipDocument, E as UpdateApplicationDocument, H as UpdateAuthAppDocument, mt as UpdateDeveloperProfileDocument, Qe as UpdateMemberRoleDocument, He as UpdateOrganizationDocument, Dt as UpdateWebhookDocument, v as WebhookDeliveryFieldsFragmentDoc, fe as useApproveApplicationMutation, Ye as useCancelInvitationMutation, ce as useCreateApplicationMutation, me as useCreateApplicationVersionMutation, we as useCreateAuthAppMutation, lt as useCreateBillingAccountMutation, Ve as useCreateOrganizationMutation, Et as useCreateWebhookMutation, Se as useCurrentUserAppsQuery, ke as useCurrentUserDelegationsQuery, Ae as useCurrentUserGrantedDelegationsQuery, Ee as useDeactivateAppMutation, ue as useDeleteApplicationMutation, Ge as useDeleteOrganizationMutation, At as useDeleteWebhookMutation, ge as useDeprecateApplicationVersionMutation, ye as useGenerateApiKeyMutation, ne as useGetAnalyticsDashboardOptionsQuery, re as useGetApplicationAnalyticsDashboardQuery, se as useGetApplicationAnalyticsQuery, pt as useGetApplicationAuditLogsQuery, ae as useGetApplicationQuery, oe as useGetApplicationVersionsQuery, ie as useGetApplicationsQuery, Ce as useGetAuthAppQuery, yt as useGetDeveloperPortalSettingsOverviewQuery, Oe as useGetDevportalDashboardBootstrapQuery, dt as useGetMyDeveloperProfileQuery, Ne as useGetMyOrganizationsQuery, ze as useGetOrganizationInvitationsQuery, Le as useGetOrganizationMembersQuery, Fe as useGetOrganizationQuery, Pe as useGetOrganizationsQuery, _t as useGetRevenueDashboardDataQuery, wt as useGetWebhookDetailQuery, St as useGetWebhookQuery, bt as useGetWebhooksQuery, je as useGrantDelegationMutation, _e as useInstallApplicationMutation, qe as useInviteMemberMutation, ve as useMyApiKeysQuery, he as usePublishApplicationVersionMutation, at as useReactivateMemberMutation, pe as useRejectApplicationMutation, tt as useRemoveMemberMutation, Ze as useResendInvitationMutation, be as useRevokeApiKeyAuthMutation, Me as useRevokeDelegationMutation, xe as useRotateApiKeyAuthMutation, De as useRotateAppSecretMutation, de as useSubmitApplicationMutation, rt as useSuspendMemberMutation, Mt as useTestWebhookMutation, st as useTransferOwnershipMutation, le as useUpdateApplicationMutation, Te as useUpdateAuthAppMutation, ht as useUpdateDeveloperProfileMutation, $e as useUpdateMemberRoleMutation, Ue as useUpdateOrganizationMutation, Ot as useUpdateWebhookMutation };
2041
+ export { a as AppInstallationFieldsFragmentDoc, r as ApplicationFieldsFragmentDoc, ee as ApplicationScopeFieldsFragmentDoc, i as ApplicationVersionFieldsFragmentDoc, k as ApproveApplicationDocument, te as AuditLogFieldsFragmentDoc, o as AuthAppFieldsFragmentDoc, d as BillingAccountFieldsFragmentDoc, Je as CancelInvitationDocument, T as CreateApplicationDocument, j as CreateApplicationVersionDocument, V as CreateAuthAppDocument, ut as CreateBillingAccountDocument, Be as CreateOrganizationDocument, Dt as CreateWebhookDocument, z as CurrentUserAppsDocument, K as CurrentUserDelegationsDocument, q as CurrentUserGrantedDelegationsDocument, U as DeactivateAppDocument, s as DelegationFieldsFragmentDoc, D as DeleteApplicationDocument, We as DeleteOrganizationDocument, jt as DeleteWebhookDocument, N as DeprecateApplicationVersionDocument, f as DeveloperProfileFieldsFragmentDoc, _ as DevportalWebhookFieldsFragmentDoc, I as GenerateApiKeyDocument, y as GetAnalyticsDashboardOptionsDocument, b as GetApplicationAnalyticsDashboardDocument, w as GetApplicationAnalyticsDocument, mt as GetApplicationAuditLogsDocument, S as GetApplicationDocument, C as GetApplicationVersionsDocument, x as GetApplicationsDocument, B as GetAuthAppDocument, $ as GetDeveloperPortalSettingsOverviewDocument, G as GetDevportalDashboardBootstrapDocument, ft as GetMyDeveloperProfileDocument, X as GetMyOrganizationsDocument, Q as GetOrganizationDocument, Re as GetOrganizationInvitationsDocument, Ie as GetOrganizationMembersDocument, Z as GetOrganizationsDocument, vt as GetRevenueDashboardDataDocument, Tt as GetWebhookDetailDocument, Ct as GetWebhookDocument, xt as GetWebhooksDocument, J as GrantDelegationDocument, P as InstallApplicationDocument, Ke as InviteMemberDocument, ct as LinkDevOrgBillingAccountDocument, F as MyApiKeysDocument, u as OrgInvitationFieldsFragmentDoc, l as OrgMemberFieldsFragmentDoc, c as OrganizationFieldsFragmentDoc, h as PaymentMethodFieldsFragmentDoc, m as PayoutFieldsFragmentDoc, M as PublishApplicationVersionDocument, it as ReactivateMemberDocument, A as RejectApplicationDocument, et as RemoveMemberDocument, Xe as ResendInvitationDocument, g as RevenueAnalyticsFieldsFragmentDoc, L as RevokeApiKeyAuthDocument, Y as RevokeDelegationDocument, R as RotateApiKeyAuthDocument, W as RotateAppSecretDocument, p as SaleFieldsFragmentDoc, O as SubmitApplicationDocument, nt as SuspendMemberDocument, Nt as TestWebhookDocument, ot as TransferOwnershipDocument, E as UpdateApplicationDocument, H as UpdateAuthAppDocument, gt as UpdateDeveloperProfileDocument, Qe as UpdateMemberRoleDocument, He as UpdateOrganizationDocument, kt as UpdateWebhookDocument, v as WebhookDeliveryFieldsFragmentDoc, fe as useApproveApplicationMutation, Ye as useCancelInvitationMutation, ce as useCreateApplicationMutation, me as useCreateApplicationVersionMutation, we as useCreateAuthAppMutation, dt as useCreateBillingAccountMutation, Ve as useCreateOrganizationMutation, Ot as useCreateWebhookMutation, Se as useCurrentUserAppsQuery, ke as useCurrentUserDelegationsQuery, Ae as useCurrentUserGrantedDelegationsQuery, Ee as useDeactivateAppMutation, ue as useDeleteApplicationMutation, Ge as useDeleteOrganizationMutation, Mt as useDeleteWebhookMutation, ge as useDeprecateApplicationVersionMutation, ye as useGenerateApiKeyMutation, ne as useGetAnalyticsDashboardOptionsQuery, re as useGetApplicationAnalyticsDashboardQuery, se as useGetApplicationAnalyticsQuery, ht as useGetApplicationAuditLogsQuery, ae as useGetApplicationQuery, oe as useGetApplicationVersionsQuery, ie as useGetApplicationsQuery, Ce as useGetAuthAppQuery, bt as useGetDeveloperPortalSettingsOverviewQuery, Oe as useGetDevportalDashboardBootstrapQuery, pt as useGetMyDeveloperProfileQuery, Ne as useGetMyOrganizationsQuery, ze as useGetOrganizationInvitationsQuery, Le as useGetOrganizationMembersQuery, Fe as useGetOrganizationQuery, Pe as useGetOrganizationsQuery, yt as useGetRevenueDashboardDataQuery, Et as useGetWebhookDetailQuery, wt as useGetWebhookQuery, St as useGetWebhooksQuery, je as useGrantDelegationMutation, _e as useInstallApplicationMutation, qe as useInviteMemberMutation, lt as useLinkDevOrgBillingAccountMutation, ve as useMyApiKeysQuery, he as usePublishApplicationVersionMutation, at as useReactivateMemberMutation, pe as useRejectApplicationMutation, tt as useRemoveMemberMutation, Ze as useResendInvitationMutation, be as useRevokeApiKeyAuthMutation, Me as useRevokeDelegationMutation, xe as useRotateApiKeyAuthMutation, De as useRotateAppSecretMutation, de as useSubmitApplicationMutation, rt as useSuspendMemberMutation, Pt as useTestWebhookMutation, st as useTransferOwnershipMutation, le as useUpdateApplicationMutation, Te as useUpdateAuthAppMutation, _t as useUpdateDeveloperProfileMutation, $e as useUpdateMemberRoleMutation, Ue as useUpdateOrganizationMutation, At as useUpdateWebhookMutation };
2016
2042
 
2017
2043
  //# sourceMappingURL=global-operations.js.map