@kojinx/github 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/github-integration-card/github-integration-card.component.mjs +169 -36
- package/esm2022/lib/services/github-auth.service.mjs +12 -2
- package/fesm2022/kojinx-github.mjs +179 -36
- package/fesm2022/kojinx-github.mjs.map +1 -1
- package/lib/components/github-integration-card/github-integration-card.component.d.ts +3 -0
- package/lib/services/github-auth.service.d.ts +2 -1
- package/package.json +1 -1
package/esm2022/lib/components/github-integration-card/github-integration-card.component.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
1
|
+
import { Component, Input, signal } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
import * as i1 from "../../services/github-auth.service";
|
|
@@ -6,6 +6,13 @@ export class GithubIntegrationCardComponent {
|
|
|
6
6
|
constructor(githubAuth) {
|
|
7
7
|
this.githubAuth = githubAuth;
|
|
8
8
|
this.isConnected = false;
|
|
9
|
+
this.showModal = signal(false);
|
|
10
|
+
}
|
|
11
|
+
openModal() {
|
|
12
|
+
this.showModal.set(true);
|
|
13
|
+
}
|
|
14
|
+
closeModal(event) {
|
|
15
|
+
this.showModal.set(false);
|
|
9
16
|
}
|
|
10
17
|
link() {
|
|
11
18
|
this.githubAuth.linkGithub();
|
|
@@ -15,34 +22,97 @@ export class GithubIntegrationCardComponent {
|
|
|
15
22
|
}
|
|
16
23
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, deps: [{ token: i1.GithubAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
24
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GithubIntegrationCardComponent, isStandalone: true, selector: "github-integration-card", inputs: { isConnected: "isConnected" }, ngImport: i0, template: `
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
<!-- The Card -->
|
|
26
|
+
<div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
|
|
27
|
+
<div class="flex items-center justify-between">
|
|
20
28
|
<div class="flex items-center gap-4">
|
|
21
|
-
<div class="w-12 h-12 rounded-xl bg-
|
|
22
|
-
<svg class="w-
|
|
29
|
+
<div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
|
|
30
|
+
<svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
23
31
|
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
24
32
|
</svg>
|
|
25
33
|
</div>
|
|
26
34
|
<div>
|
|
27
|
-
<
|
|
28
|
-
<p class="text-
|
|
35
|
+
<p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
|
|
36
|
+
<p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
|
|
29
37
|
</div>
|
|
30
38
|
</div>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<span class="inline-flex items-center gap-1.5 px-
|
|
34
|
-
<
|
|
39
|
+
<div class="pr-6">
|
|
40
|
+
@if (isConnected) {
|
|
41
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
|
|
42
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
43
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
|
|
44
|
+
</svg>
|
|
35
45
|
Connected
|
|
36
46
|
</span>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
47
|
+
} @else {
|
|
48
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
|
|
49
|
+
Connect
|
|
50
|
+
</span>
|
|
51
|
+
}
|
|
52
|
+
</div>
|
|
44
53
|
</div>
|
|
45
54
|
</div>
|
|
55
|
+
|
|
56
|
+
<!-- The Modal -->
|
|
57
|
+
@if (showModal()) {
|
|
58
|
+
<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
|
|
59
|
+
<div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
|
|
60
|
+
|
|
61
|
+
<div class="p-6 border-b border-white/5 flex items-center justify-between">
|
|
62
|
+
<h2 class="text-xl font-bold text-white flex items-center gap-3">
|
|
63
|
+
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
64
|
+
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
65
|
+
</svg>
|
|
66
|
+
GitHub Integration
|
|
67
|
+
</h2>
|
|
68
|
+
<button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
|
|
69
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
70
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
71
|
+
</svg>
|
|
72
|
+
</button>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="p-6 space-y-6">
|
|
76
|
+
|
|
77
|
+
<div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
|
|
78
|
+
<p>Log in to automatically pull your profile data and discover your projects.</p>
|
|
79
|
+
<p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
|
|
83
|
+
<div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
|
|
84
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
85
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
|
86
|
+
</svg>
|
|
87
|
+
</div>
|
|
88
|
+
<div>
|
|
89
|
+
<p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
|
|
90
|
+
<p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
|
|
91
|
+
Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
|
|
92
|
+
</p>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
|
|
99
|
+
@if (isConnected) {
|
|
100
|
+
<button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
|
|
101
|
+
Disconnect GitHub
|
|
102
|
+
</button>
|
|
103
|
+
<button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
|
|
104
|
+
Done
|
|
105
|
+
</button>
|
|
106
|
+
} @else {
|
|
107
|
+
<button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
|
|
108
|
+
Connect GitHub
|
|
109
|
+
</button>
|
|
110
|
+
}
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
}
|
|
46
116
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
47
117
|
}
|
|
48
118
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, decorators: [{
|
|
@@ -52,37 +122,100 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
52
122
|
standalone: true,
|
|
53
123
|
imports: [CommonModule],
|
|
54
124
|
template: `
|
|
55
|
-
|
|
56
|
-
|
|
125
|
+
<!-- The Card -->
|
|
126
|
+
<div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
|
|
127
|
+
<div class="flex items-center justify-between">
|
|
57
128
|
<div class="flex items-center gap-4">
|
|
58
|
-
<div class="w-12 h-12 rounded-xl bg-
|
|
59
|
-
<svg class="w-
|
|
129
|
+
<div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
|
|
130
|
+
<svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
60
131
|
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
61
132
|
</svg>
|
|
62
133
|
</div>
|
|
63
134
|
<div>
|
|
64
|
-
<
|
|
65
|
-
<p class="text-
|
|
135
|
+
<p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
|
|
136
|
+
<p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
|
|
66
137
|
</div>
|
|
67
138
|
</div>
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
<span class="inline-flex items-center gap-1.5 px-
|
|
71
|
-
<
|
|
139
|
+
<div class="pr-6">
|
|
140
|
+
@if (isConnected) {
|
|
141
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
|
|
142
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
143
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
|
|
144
|
+
</svg>
|
|
72
145
|
Connected
|
|
73
146
|
</span>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
147
|
+
} @else {
|
|
148
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
|
|
149
|
+
Connect
|
|
150
|
+
</span>
|
|
151
|
+
}
|
|
152
|
+
</div>
|
|
81
153
|
</div>
|
|
82
154
|
</div>
|
|
155
|
+
|
|
156
|
+
<!-- The Modal -->
|
|
157
|
+
@if (showModal()) {
|
|
158
|
+
<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
|
|
159
|
+
<div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
|
|
160
|
+
|
|
161
|
+
<div class="p-6 border-b border-white/5 flex items-center justify-between">
|
|
162
|
+
<h2 class="text-xl font-bold text-white flex items-center gap-3">
|
|
163
|
+
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
164
|
+
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
165
|
+
</svg>
|
|
166
|
+
GitHub Integration
|
|
167
|
+
</h2>
|
|
168
|
+
<button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
|
|
169
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
170
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
171
|
+
</svg>
|
|
172
|
+
</button>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
<div class="p-6 space-y-6">
|
|
176
|
+
|
|
177
|
+
<div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
|
|
178
|
+
<p>Log in to automatically pull your profile data and discover your projects.</p>
|
|
179
|
+
<p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
|
|
180
|
+
</div>
|
|
181
|
+
|
|
182
|
+
<div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
|
|
183
|
+
<div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
|
|
184
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
185
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
|
186
|
+
</svg>
|
|
187
|
+
</div>
|
|
188
|
+
<div>
|
|
189
|
+
<p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
|
|
190
|
+
<p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
|
|
191
|
+
Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
|
|
192
|
+
</p>
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
|
|
199
|
+
@if (isConnected) {
|
|
200
|
+
<button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
|
|
201
|
+
Disconnect GitHub
|
|
202
|
+
</button>
|
|
203
|
+
<button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
|
|
204
|
+
Done
|
|
205
|
+
</button>
|
|
206
|
+
} @else {
|
|
207
|
+
<button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
|
|
208
|
+
Connect GitHub
|
|
209
|
+
</button>
|
|
210
|
+
}
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
}
|
|
83
216
|
`
|
|
84
217
|
}]
|
|
85
218
|
}], ctorParameters: () => [{ type: i1.GithubAuthService }], propDecorators: { isConnected: [{
|
|
86
219
|
type: Input
|
|
87
220
|
}] } });
|
|
88
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL2NvbXBvbmVudHMvZ2l0aHViLWludGVncmF0aW9uLWNhcmQvZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBc0MvQyxNQUFNLE9BQU8sOEJBQThCO0lBRXpDLFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBRHhDLGdCQUFXLEdBQVksS0FBSyxDQUFDO0lBQ2MsQ0FBQztJQUVyRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakMsQ0FBQzsrR0FWVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwySEEvQi9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCVCwyREE5QlMsWUFBWTs7NEZBZ0NYLDhCQUE4QjtrQkFuQzFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCVDtpQkFDRjtzRkFFVSxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdpdGh1YkF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2l0aHViLWF1dGguc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpdGh1Yi1pbnRlZ3JhdGlvbi1jYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImJnLWJsYWNrLzMwIGJvcmRlciBib3JkZXItd2hpdGUvNSByb3VuZGVkLXhsIHAtNiBob3Zlcjpib3JkZXItd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMiBoLTEyIHJvdW5kZWQteGwgYmctWyMyNDI5MmVdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy02IGgtNiB0ZXh0LXdoaXRlXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIgMkM2LjQ3NyAyIDIgNi40ODQgMiAxMi4wMTdjMCA0LjQyNSAyLjg2NSA4LjE4IDYuODM5IDkuNTA0LjUuMDkyLjY4Mi0uMjE3LjY4Mi0uNDgzIDAtLjIzNy0uMDA4LS44NjgtLjAxMy0xLjcwMy0yLjc4Mi42MDUtMy4zNjktMS4zNDMtMy4zNjktMS4zNDMtLjQ1NC0xLjE1OC0xLjExLTEuNDY2LTEuMTEtMS40NjYtLjkwOC0uNjIuMDY5LS42MDguMDY5LS42MDggMS4wMDMuMDcgMS41MzEgMS4wMzIgMS41MzEgMS4wMzIuODkyIDEuNTMgMi4zNDEgMS4wODggMi45MS44MzIuMDkyLS42NDcuMzUtMS4wODguNjM2LTEuMzM4LTIuMjItLjI1My00LjU1NS0xLjExMy00LjU1NS00Ljk1MSAwLTEuMDkzLjM5LTEuOTg4IDEuMDI5LTIuNjg4LS4xMDMtLjI1My0uNDQ2LTEuMjcyLjA5OC0yLjY1IDAgMCAuODQtLjI3IDIuNzUgMS4wMjZBOS41NjQgOS41NjQgMCAwMTEyIDYuODQ0Yy44NS4wMDQgMS43MDUuMTE1IDIuNTA0LjMzNyAxLjkwOS0xLjI5NiAyLjc0Ny0xLjAyNyAyLjc0Ny0xLjAyNy41NDYgMS4zNzkuMjAyIDIuMzk4LjEgMi42NTEuNjQuNyAxLjAyOCAxLjU5NSAxLjAyOCAyLjY4OCAwIDMuODQ4LTIuMzM5IDQuNjk1LTQuNTY2IDQuOTQzLjM1OS4zMDkuNjc4LjkyLjY3OCAxLjg1NSAwIDEuMzM4LS4wMTIgMi40MTktLjAxMiAyLjc0NyAwIC4yNjguMTguNTguNjg4LjQ4MkExMC4wMTkgMTAuMDE5IDAgMDAyMiAxMi4wMTdDMjIgNi40ODQgMTcuNTIyIDIgMTIgMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlIGZvbnQtbWVkaXVtXCI+R2l0SHViPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC13aGl0ZS82MCB0ZXh0LXNtIG10LTFcIj5Db25uZWN0IHlvdXIgcmVwb3NpdG9yaWVzIGFuZCBtYW5hZ2UgUFJzIGRpcmVjdGx5IGZyb20gS29qaW54LjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtMi41IHB5LTEgcm91bmRlZC1mdWxsIHRleHQteHMgZm9udC1tZWRpdW0gYmctZW1lcmFsZC01MDAvMTAgdGV4dC1lbWVyYWxkLTQwMCBib3JkZXIgYm9yZGVyLWVtZXJhbGQtNTAwLzIwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidy0xLjUgaC0xLjUgcm91bmRlZC1mdWxsIGJnLWVtZXJhbGQtNDAwXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBDb25uZWN0ZWRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInVubGluaygpXCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtcmVkLTQwMCBob3Zlcjp0ZXh0LXJlZC0zMDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5EaXNjb25uZWN0PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxpbmsoKVwiIGNsYXNzPVwicHgtNCBweS0yIGJnLXdoaXRlLzUgaG92ZXI6Ymctd2hpdGUvMTAgYm9yZGVyIGJvcmRlci13aGl0ZS8xMCByb3VuZGVkLWxnIHRleHQtc20gdGV4dC13aGl0ZSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWtvamlueC1wdXJwbGVcIj5cbiAgICAgICAgICAgIENvbm5lY3RcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgR2l0aHViSW50ZWdyYXRpb25DYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNDb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnaXRodWJBdXRoOiBHaXRodWJBdXRoU2VydmljZSkge31cbiAgXG4gIGxpbmsoKSB7XG4gICAgdGhpcy5naXRodWJBdXRoLmxpbmtHaXRodWIoKTtcbiAgfVxuXG4gIHVubGluaygpIHtcbiAgICB0aGlzLmdpdGh1YkF1dGgudW5saW5rR2l0aHViKCk7XG4gIH1cbn1cbiJdfQ==
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL2NvbXBvbmVudHMvZ2l0aHViLWludGVncmF0aW9uLWNhcmQvZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFxRy9DLE1BQU0sT0FBTyw4QkFBOEI7SUFLekMsWUFBb0IsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFKeEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0IsY0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVpQixDQUFDO0lBRXJELFNBQVM7UUFDUCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWlCO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakMsQ0FBQzsrR0FyQlUsOEJBQThCO21HQUE5Qiw4QkFBOEIsMkhBOUYvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RlQsMkRBN0ZTLFlBQVk7OzRGQStGWCw4QkFBOEI7a0JBbEcxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RlQ7aUJBQ0Y7c0ZBRVUsV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIHNpZ25hbCwgT25Jbml0LCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBHaXRodWJBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dpdGh1Yi1hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnaXRodWItaW50ZWdyYXRpb24tY2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gVGhlIENhcmQgLS0+XG4gICAgPGRpdiAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBjbGFzcz1cImdyb3VwIGN1cnNvci1wb2ludGVyIHJlbGF0aXZlIHAtNiByb3VuZGVkLXhsIGJnLWtvamlueC1wYW5lbCBib3JkZXIgYm9yZGVyLWtvamlueC1ib3JkZXIgaG92ZXI6Ym9yZGVyLXdoaXRlLzMwIHRyYW5zaXRpb24tY29sb3JzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEyIGgtMTIgcm91bmRlZC14bCBiZy13aGl0ZS8xMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXIgYm9yZGVyLXdoaXRlLzIwXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy03IGgtNyB0ZXh0LXdoaXRlXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIgMkM2LjQ3NyAyIDIgNi40ODQgMiAxMi4wMTdjMCA0LjQyNSAyLjg2NSA4LjE4IDYuODM5IDkuNTA0LjUuMDkyLjY4Mi0uMjE3LjY4Mi0uNDgzIDAtLjIzNy0uMDA4LS44NjgtLjAxMy0xLjcwMy0yLjc4Mi42MDUtMy4zNjktMS4zNDMtMy4zNjktMS4zNDMtLjQ1NC0xLjE1OC0xLjExLTEuNDY2LTEuMTEtMS40NjYtLjkwOC0uNjIuMDY5LS42MDguMDY5LS42MDggMS4wMDMuMDcgMS41MzEgMS4wMzIgMS41MzEgMS4wMzIuODkyIDEuNTMgMi4zNDEgMS4wODggMi45MS44MzIuMDkyLS42NDcuMzUtMS4wODguNjM2LTEuMzM4LTIuMjItLjI1My00LjU1NS0xLjExMy00LjU1NS00Ljk1MSAwLTEuMDkzLjM5LTEuOTg4IDEuMDI5LTIuNjg4LS4xMDMtLjI1My0uNDQ2LTEuMjcyLjA5OC0yLjY1IDAgMCAuODQtLjI3IDIuNzUgMS4wMjZBOS41NjQgOS41NjQgMCAwMTEyIDYuODQ0Yy44NS4wMDQgMS43MDUuMTE1IDIuNTA0LjMzNyAxLjkwOS0xLjI5NiAyLjc0Ny0xLjAyNyAyLjc0Ny0xLjAyNy41NDYgMS4zNzkuMjAyIDIuMzk4LjEgMi42NTEuNjQuNyAxLjAyOCAxLjU5NSAxLjAyOCAyLjY4OCAwIDMuODQ4LTIuMzM5IDQuNjk1LTQuNTY2IDQuOTQzLjM1OS4zMDkuNjc4LjkyLjY3OCAxLjg1NSAwIDEuMzM4LS4wMTIgMi40MTktLjAxMiAyLjc0NyAwIC4yNjguMTguNTguNjg4LjQ4MkExMC4wMTkgMTAuMDE5IDAgMDAyMiAxMi4wMTdDMjIgNi40ODQgMTcuNTIyIDIgMTIgMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtYmFzZSBmb250LXNlbWlib2xkIHRleHQtd2hpdGUgZ3JvdXAtaG92ZXI6dGV4dC1ncmF5LTMwMCB0cmFuc2l0aW9uLWNvbG9yc1wiPkdpdEh1YjwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWtvamlueC10ZXh0LW11dGVkIG10LTAuNVwiPkxvZyBpbiB0byBhdXRvbWF0aWNhbGx5IHB1bGwgcHJvZmlsZSBkYXRhIGFuZCBwcm9qZWN0cy48L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHItNlwiPlxuICAgICAgICAgIEBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtNCBweS0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNTAwLzEwIGJvcmRlciBib3JkZXItZ3JlZW4tNTAwLzMwIHRleHQtZ3JlZW4tNDAwIHRleHQtc20gZm9udC1ib2xkIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy00IGgtNFwiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIGQ9XCJNNSAxM2w0IDRMMTkgN1wiLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENvbm5lY3RlZFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBweC00IHB5LTIgcm91bmRlZC1sZyBiZy13aGl0ZS81IGJvcmRlciBib3JkZXItd2hpdGUvMTAgdGV4dC13aGl0ZSB0ZXh0LXNtIGZvbnQtYm9sZCBmb250LW1vbm8gZ3JvdXAtaG92ZXI6Ymctd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgQ29ubmVjdFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVGhlIE1vZGFsIC0tPlxuICAgIEBpZiAoc2hvd01vZGFsKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZCBpbnNldC0wIHotNTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctYmxhY2svNjAgYmFja2Ryb3AtYmx1ci1zbSBhbmltYXRlLWZhZGUtaW5cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgkZXZlbnQpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiZy1rb2ppbngtcGFuZWwgYm9yZGVyIGJvcmRlci1rb2ppbngtYm9yZGVyIHJvdW5kZWQtMnhsIHctZnVsbCBtYXgtdy1sZyBzaGFkb3ctMnhsIG92ZXJmbG93LWhpZGRlbiBmbGV4IGZsZXgtY29sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTYgYm9yZGVyLWIgYm9yZGVyLXdoaXRlLzUgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGZsZXggaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTYgaC02IHRleHQtd2hpdGVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEyIDJDNi40NzcgMiAyIDYuNDg0IDIgMTIuMDE3YzAgNC40MjUgMi44NjUgOC4xOCA2LjgzOSA5LjUwNC41LjA5Mi42ODItLjIxNy42ODItLjQ4MyAwLS4yMzctLjAwOC0uODY4LS4wMTMtMS43MDMtMi43ODIuNjA1LTMuMzY5LTEuMzQzLTMuMzY5LTEuMzQzLS40NTQtMS4xNTgtMS4xMS0xLjQ2Ni0xLjExLTEuNDY2LS45MDgtLjYyLjA2OS0uNjA4LjA2OS0uNjA4IDEuMDAzLjA3IDEuNTMxIDEuMDMyIDEuNTMxIDEuMDMyLjg5MiAxLjUzIDIuMzQxIDEuMDg4IDIuOTEuODMyLjA5Mi0uNjQ3LjM1LTEuMDg4LjYzNi0xLjMzOC0yLjIyLS4yNTMtNC41NTUtMS4xMTMtNC41NTUtNC45NTEgMC0xLjA5My4zOS0xLjk4OCAxLjAyOS0yLjY4OC0uMTAzLS4yNTMtLjQ0Ni0xLjI3Mi4wOTgtMi42NSAwIDAgLjg0LS4yNyAyLjc1IDEuMDI2QTkuNTY0IDkuNTY0IDAgMDExMiA2Ljg0NGMuODUuMDA0IDEuNzA1LjExNSAyLjUwNC4zMzcgMS45MDktMS4yOTYgMi43NDctMS4wMjcgMi43NDctMS4wMjcuNTQ2IDEuMzc5LjIwMiAyLjM5OC4xIDIuNjUxLjY0LjcgMS4wMjggMS41OTUgMS4wMjggMi42ODggMCAzLjg0OC0yLjMzOSA0LjY5NS00LjU2NiA0Ljk0My4zNTkuMzA5LjY3OC45Mi42NzggMS44NTUgMCAxLjMzOC0uMDEyIDIuNDE5LS4wMTIgMi43NDcgMCAuMjY4LjE4LjU4LjY4OC40ODJBMTAuMDE5IDEwLjAxOSAwIDAwMjIgMTIuMDE3QzIyIDYuNDg0IDE3LjUyMiAyIDEyIDJ6XCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICBHaXRIdWIgSW50ZWdyYXRpb25cbiAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzaG93TW9kYWwuc2V0KGZhbHNlKVwiIGNsYXNzPVwidGV4dC13aGl0ZS80MCBob3Zlcjp0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIHAtMSByb3VuZGVkLWxnIGhvdmVyOmJnLXdoaXRlLzVcIj5cbiAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInctNSBoLTVcIiBmaWxsPVwibm9uZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk02IDE4TDE4IDZNNiA2bDEyIDEyXCIgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTYgc3BhY2UteS02XCI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1rb2ppbngtYmx1ZS8xMCBib3JkZXIgYm9yZGVyLWtvamlueC1ibHVlLzMwIHJvdW5kZWQteGwgcC00IHRleHQtc20gdGV4dC1zbGF0ZS0zMDBcIj5cbiAgICAgICAgICAgICAgPHA+TG9nIGluIHRvIGF1dG9tYXRpY2FsbHkgcHVsbCB5b3VyIHByb2ZpbGUgZGF0YSBhbmQgZGlzY292ZXIgeW91ciBwcm9qZWN0cy48L3A+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMiB0ZXh0LWtvamlueC1ibHVlIGZvbnQtbWVkaXVtXCI+Tm90ZTogS29qaW54IHVzZXMgZmluZS1ncmFpbmVkIEdpdEh1YiBBcHAgcGVybWlzc2lvbnMgKE1ldGFkYXRhIG9ubHkpLiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byByZWFkIG9yIG1vZGlmeSB5b3VyIHNvdXJjZSBjb2RlLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1zdGFydCBnYXAtMy41IHAtNCBiZy1ibGFjay8yMCBib3JkZXIgYm9yZGVyLXdoaXRlLzUgcm91bmRlZC14bFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNTAwLzEwIGJvcmRlciBib3JkZXItZ3JlZW4tNTAwLzIwIHRleHQtZ3JlZW4tNDAwIHNocmluay0wIG10LTAuNVwiPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJ3LTUgaC01XCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk05IDEybDIgMiA0LTRtNS42MTgtNC4wMTZBMTEuOTU1IDExLjk1NSAwIDAxMTIgMi45NDRhMTEuOTU1IDExLjk1NSAwIDAxLTguNjE4IDMuMDRBMTIuMDIgMTIuMDIgMCAwMDMgOWMwIDUuNTkxIDMuODI0IDEwLjI5IDkgMTEuNjIyIDUuMTc2LTEuMzMyIDktNi4wMyA5LTExLjYyMiAwLTEuMDQyLS4xMzMtMi4wNTItLjM4Mi0zLjAxNnpcIi8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtd2hpdGVcIj5GaW5lLUdyYWluZWQgU2VjdXJpdHkgTW9kZWw8L3A+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXhzIHRleHQta29qaW54LXRleHQtbXV0ZWQgbXQtMSBsZWFkaW5nLXJlbGF4ZWRcIj5cbiAgICAgICAgICAgICAgICAgIFlvdXIgcmVwb3NpdG9yaWVzIGFyZSBsaXN0ZWQgdmlhIEdpdEh1YiBBcHAgdG9rZW5zIHdpdGggc3RyaWN0bHkgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNsYXRlLTIwMCBmb250LW1vbm9cIj5tZXRhZGF0YTpyZWFkPC9zcGFuPi4gU291cmNlIGNvZGUgYW5kIGNvbW1pdCBhY2Nlc3MgYXJlIGNyeXB0b2dyYXBoaWNhbGx5IGJsb2NrZWQgYnkgdGhlIEdpdEh1YiBBUEkuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC02IGJvcmRlci10IGJvcmRlci13aGl0ZS81IGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBiZy1ibGFjay8yMFwiPlxuICAgICAgICAgICAgQGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ1bmxpbmsoKTsgc2hvd01vZGFsLnNldChmYWxzZSlcIiBjbGFzcz1cInB4LTQgcHktMiByb3VuZGVkLWxnIHRleHQtc20gZm9udC1tZWRpdW0gYmctcmVkLTUwMC8xMCB0ZXh0LXJlZC00MDAgaG92ZXI6YmctcmVkLTUwMC8yMCBib3JkZXIgYm9yZGVyLXJlZC01MDAvMjAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgICAgICAgICAgICBEaXNjb25uZWN0IEdpdEh1YlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd01vZGFsLnNldChmYWxzZSlcIiBjbGFzcz1cInB4LTYgcHktMiByb3VuZGVkLWxnIHRleHQtc20gZm9udC1tZWRpdW0gYmctd2hpdGUvNSB0ZXh0LXdoaXRlIGhvdmVyOmJnLXdoaXRlLzEwIGJvcmRlciBib3JkZXItd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnMgbWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwibGluaygpOyBzaG93TW9kYWwuc2V0KGZhbHNlKVwiIGNsYXNzPVwicHgtNiBweS0yIHJvdW5kZWQtbGcgdGV4dC1zbSBmb250LW1lZGl1bSBiZy13aGl0ZSB0ZXh0LWJsYWNrIGhvdmVyOmJnLWdyYXktMjAwIHRyYW5zaXRpb24tY29sb3JzIG1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICBDb25uZWN0IEdpdEh1YlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBHaXRodWJJbnRlZ3JhdGlvbkNhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSBpc0Nvbm5lY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgcmVhZG9ubHkgc2hvd01vZGFsID0gc2lnbmFsKGZhbHNlKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdpdGh1YkF1dGg6IEdpdGh1YkF1dGhTZXJ2aWNlKSB7fVxuXG4gIG9wZW5Nb2RhbCgpIHtcbiAgICB0aGlzLnNob3dNb2RhbC5zZXQodHJ1ZSk7XG4gIH1cbiAgXG4gIGNsb3NlTW9kYWwoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnNob3dNb2RhbC5zZXQoZmFsc2UpO1xuICB9XG5cbiAgbGluaygpIHtcbiAgICB0aGlzLmdpdGh1YkF1dGgubGlua0dpdGh1YigpO1xuICB9XG5cbiAgdW5saW5rKCkge1xuICAgIHRoaXMuZ2l0aHViQXV0aC51bmxpbmtHaXRodWIoKTtcbiAgfVxufVxuIl19
|
|
@@ -11,7 +11,7 @@ export class GithubAuthService {
|
|
|
11
11
|
this.unlinkLocal = unlinkLocal;
|
|
12
12
|
this.setupTauriListener();
|
|
13
13
|
}
|
|
14
|
-
async linkGithub() {
|
|
14
|
+
async linkGithub(mapRepos = true) {
|
|
15
15
|
const url = `${this.getApiUrl()}/api/auth/link-github`;
|
|
16
16
|
const token = await this.getToken();
|
|
17
17
|
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
@@ -21,6 +21,16 @@ export class GithubAuthService {
|
|
|
21
21
|
await this.openExternal(data.url);
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
async checkRepoScope() {
|
|
25
|
+
const url = `${this.getApiUrl()}/api/github/debug-token`;
|
|
26
|
+
const token = await this.getToken();
|
|
27
|
+
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
28
|
+
if (res.ok) {
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
return data.hasRepoScope === true || data.apiCallSuccess === true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
24
34
|
async unlinkGithub() {
|
|
25
35
|
const url = `${this.getApiUrl()}/api/auth/unlink-github`;
|
|
26
36
|
const token = await this.getToken();
|
|
@@ -66,4 +76,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
66
76
|
type: Inject,
|
|
67
77
|
args: [KOJINX_UNLINK_LOCAL_CALLBACK]
|
|
68
78
|
}] }] });
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tvamlueC9naXRodWIvc3JjL2xpYi9zZXJ2aWNlcy9naXRodWItYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSw0QkFBNEIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFHckosTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNVLElBQVksRUFDaUIsU0FBdUIsRUFDekIsUUFBc0MsRUFDbkMsWUFBNEMsRUFDcEMsV0FBNkMsRUFDN0MsV0FBZ0M7UUFMdEUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNpQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQThCO1FBQ25DLGlCQUFZLEdBQVosWUFBWSxDQUFnQztRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0M7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBRTlFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQW9CLElBQUk7UUFDdkMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLHVCQUF1QixDQUFDO1FBQ3ZELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksR0FBRyxD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bGFyL2NvcmUnO1xuaW1wb3J0IHsgS09KSU5YX0FQSV9CQVNFX1VSTCwgS09KSU5YX0FVVEhfVE9LRU4sIEtPSklOWF9PUEVOX0VYVEVSTkFMLCBLT0pJTlhfQVVUSF9TVUNDRVNTX0NBTExCQUNLLCBLT0pJTlhfVU5MSU5LX0xPQ0FMX0NBTExCQUNLIH0gZnJvbSAnLi4vdG9rZW5zJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBHaXRodWJBdXRoU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgIEBJbmplY3QoS09KSU5YX0FQSV9CQVNFX1VSTCkgcHJpdmF0ZSBnZXRBcGlVcmw6ICgpID0+IHN0cmluZyxcbiAgICBASW5qZWN0KEtPSklOWF9BVVRIX1RPS0VOKSBwcml2YXRlIGdldFRva2VuOiAoKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+LFxuICAgIEBJbmplY3QoS09KSU5YX09QRU5fRVhURVJOQUwpIHByaXZhdGUgb3BlbkV4dGVybmFsOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4sXG4gICAgQEluamVjdChLT0pJTlhfQVVUSF9TVUNDRVNTX0NBTExCQUNLKSBwcml2YXRlIGF1dGhTdWNjZXNzOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPixcbiAgICBASW5qZWN0KEtPSklOWF9VTkxJTktfTE9DQUxfQ0FMTEJBQ0spIHByaXZhdGUgdW5saW5rTG9jYWw6ICgpID0+IFByb21pc2U8dm9pZD5cbiAgKSB7XG4gICAgdGhpcy5zZXR1cFRhdXJpTGlzdGVuZXIoKTtcbiAgfVxuXG4gIGFzeW5jIGxpbmtHaXRodWIobWFwUmVwb3M6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvbGluay1naXRodWJgO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnVybCkgYXdhaXQgdGhpcy5vcGVuRXh0ZXJuYWwoZGF0YS51cmwpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNoZWNrUmVwb1Njb3BlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QXBpVXJsKCl9L2FwaS9naXRodWIvZGVidWctdG9rZW5gO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIHJldHVybiBkYXRhLmhhc1JlcG9TY29wZSA9PT0gdHJ1ZSB8fCBkYXRhLmFwaUNhbGxTdWNjZXNzID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyB1bmxpbmtHaXRodWIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvdW5saW5rLWdpdGh1YmA7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFRva2VuKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgYXdhaXQgdGhpcy51bmxpbmtMb2NhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYXRlT0F1dGgoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvZ2l0aHViYDtcbiAgICB0aGlzLm9wZW5FeHRlcm5hbCh1cmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFRhdXJpTGlzdGVuZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbGlzdGVuIH0gPSBhd2FpdCBpbXBvcnQoJ0B0YXVyaS1hcHBzL2FwaS9ldmVudCcpO1xuICAgICAgYXdhaXQgbGlzdGVuPHt0b2tlbjogc3RyaW5nfT4oJ29hdXRoLXN1Y2Nlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdXRoU3VjY2VzcyhldmVudC5wYXlsb2FkLnRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGUpIHt9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, Inject, Injectable, Input, Component } from '@angular/core';
|
|
2
|
+
import { InjectionToken, Inject, Injectable, Input, Component, signal } from '@angular/core';
|
|
3
3
|
import { CommonModule } from '@angular/common';
|
|
4
4
|
|
|
5
5
|
const KOJINX_API_BASE_URL = new InjectionToken('KOJINX_API_BASE_URL');
|
|
@@ -18,7 +18,7 @@ class GithubAuthService {
|
|
|
18
18
|
this.unlinkLocal = unlinkLocal;
|
|
19
19
|
this.setupTauriListener();
|
|
20
20
|
}
|
|
21
|
-
async linkGithub() {
|
|
21
|
+
async linkGithub(mapRepos = true) {
|
|
22
22
|
const url = `${this.getApiUrl()}/api/auth/link-github`;
|
|
23
23
|
const token = await this.getToken();
|
|
24
24
|
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
@@ -28,6 +28,16 @@ class GithubAuthService {
|
|
|
28
28
|
await this.openExternal(data.url);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
async checkRepoScope() {
|
|
32
|
+
const url = `${this.getApiUrl()}/api/github/debug-token`;
|
|
33
|
+
const token = await this.getToken();
|
|
34
|
+
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
35
|
+
if (res.ok) {
|
|
36
|
+
const data = await res.json();
|
|
37
|
+
return data.hasRepoScope === true || data.apiCallSuccess === true;
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
31
41
|
async unlinkGithub() {
|
|
32
42
|
const url = `${this.getApiUrl()}/api/auth/unlink-github`;
|
|
33
43
|
const token = await this.getToken();
|
|
@@ -117,6 +127,13 @@ class GithubIntegrationCardComponent {
|
|
|
117
127
|
constructor(githubAuth) {
|
|
118
128
|
this.githubAuth = githubAuth;
|
|
119
129
|
this.isConnected = false;
|
|
130
|
+
this.showModal = signal(false);
|
|
131
|
+
}
|
|
132
|
+
openModal() {
|
|
133
|
+
this.showModal.set(true);
|
|
134
|
+
}
|
|
135
|
+
closeModal(event) {
|
|
136
|
+
this.showModal.set(false);
|
|
120
137
|
}
|
|
121
138
|
link() {
|
|
122
139
|
this.githubAuth.linkGithub();
|
|
@@ -126,34 +143,97 @@ class GithubIntegrationCardComponent {
|
|
|
126
143
|
}
|
|
127
144
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, deps: [{ token: GithubAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
128
145
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: GithubIntegrationCardComponent, isStandalone: true, selector: "github-integration-card", inputs: { isConnected: "isConnected" }, ngImport: i0, template: `
|
|
129
|
-
|
|
130
|
-
|
|
146
|
+
<!-- The Card -->
|
|
147
|
+
<div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
|
|
148
|
+
<div class="flex items-center justify-between">
|
|
131
149
|
<div class="flex items-center gap-4">
|
|
132
|
-
<div class="w-12 h-12 rounded-xl bg-
|
|
133
|
-
<svg class="w-
|
|
150
|
+
<div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
|
|
151
|
+
<svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
134
152
|
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
135
153
|
</svg>
|
|
136
154
|
</div>
|
|
137
155
|
<div>
|
|
138
|
-
<
|
|
139
|
-
<p class="text-
|
|
156
|
+
<p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
|
|
157
|
+
<p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
|
|
140
158
|
</div>
|
|
141
159
|
</div>
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
<span class="inline-flex items-center gap-1.5 px-
|
|
145
|
-
<
|
|
160
|
+
<div class="pr-6">
|
|
161
|
+
@if (isConnected) {
|
|
162
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
|
|
163
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
164
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
|
|
165
|
+
</svg>
|
|
146
166
|
Connected
|
|
147
167
|
</span>
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
168
|
+
} @else {
|
|
169
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
|
|
170
|
+
Connect
|
|
171
|
+
</span>
|
|
172
|
+
}
|
|
173
|
+
</div>
|
|
155
174
|
</div>
|
|
156
175
|
</div>
|
|
176
|
+
|
|
177
|
+
<!-- The Modal -->
|
|
178
|
+
@if (showModal()) {
|
|
179
|
+
<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
|
|
180
|
+
<div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
|
|
181
|
+
|
|
182
|
+
<div class="p-6 border-b border-white/5 flex items-center justify-between">
|
|
183
|
+
<h2 class="text-xl font-bold text-white flex items-center gap-3">
|
|
184
|
+
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
185
|
+
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
186
|
+
</svg>
|
|
187
|
+
GitHub Integration
|
|
188
|
+
</h2>
|
|
189
|
+
<button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
|
|
190
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
191
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
192
|
+
</svg>
|
|
193
|
+
</button>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
<div class="p-6 space-y-6">
|
|
197
|
+
|
|
198
|
+
<div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
|
|
199
|
+
<p>Log in to automatically pull your profile data and discover your projects.</p>
|
|
200
|
+
<p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
|
|
201
|
+
</div>
|
|
202
|
+
|
|
203
|
+
<div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
|
|
204
|
+
<div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
|
|
205
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
206
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
|
207
|
+
</svg>
|
|
208
|
+
</div>
|
|
209
|
+
<div>
|
|
210
|
+
<p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
|
|
211
|
+
<p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
|
|
212
|
+
Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
|
|
213
|
+
</p>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
</div>
|
|
218
|
+
|
|
219
|
+
<div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
|
|
220
|
+
@if (isConnected) {
|
|
221
|
+
<button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
|
|
222
|
+
Disconnect GitHub
|
|
223
|
+
</button>
|
|
224
|
+
<button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
|
|
225
|
+
Done
|
|
226
|
+
</button>
|
|
227
|
+
} @else {
|
|
228
|
+
<button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
|
|
229
|
+
Connect GitHub
|
|
230
|
+
</button>
|
|
231
|
+
}
|
|
232
|
+
</div>
|
|
233
|
+
|
|
234
|
+
</div>
|
|
235
|
+
</div>
|
|
236
|
+
}
|
|
157
237
|
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
158
238
|
}
|
|
159
239
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, decorators: [{
|
|
@@ -163,34 +243,97 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
163
243
|
standalone: true,
|
|
164
244
|
imports: [CommonModule],
|
|
165
245
|
template: `
|
|
166
|
-
|
|
167
|
-
|
|
246
|
+
<!-- The Card -->
|
|
247
|
+
<div (click)="openModal()" class="group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors">
|
|
248
|
+
<div class="flex items-center justify-between">
|
|
168
249
|
<div class="flex items-center gap-4">
|
|
169
|
-
<div class="w-12 h-12 rounded-xl bg-
|
|
170
|
-
<svg class="w-
|
|
250
|
+
<div class="w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20">
|
|
251
|
+
<svg class="w-7 h-7 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
171
252
|
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
172
253
|
</svg>
|
|
173
254
|
</div>
|
|
174
255
|
<div>
|
|
175
|
-
<
|
|
176
|
-
<p class="text-
|
|
256
|
+
<p class="text-base font-semibold text-white group-hover:text-gray-300 transition-colors">GitHub</p>
|
|
257
|
+
<p class="text-sm text-kojinx-text-muted mt-0.5">Log in to automatically pull profile data and projects.</p>
|
|
177
258
|
</div>
|
|
178
259
|
</div>
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
<span class="inline-flex items-center gap-1.5 px-
|
|
182
|
-
<
|
|
260
|
+
<div class="pr-6">
|
|
261
|
+
@if (isConnected) {
|
|
262
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono">
|
|
263
|
+
<svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
264
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7"/>
|
|
265
|
+
</svg>
|
|
183
266
|
Connected
|
|
184
267
|
</span>
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
268
|
+
} @else {
|
|
269
|
+
<span class="inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors">
|
|
270
|
+
Connect
|
|
271
|
+
</span>
|
|
272
|
+
}
|
|
273
|
+
</div>
|
|
192
274
|
</div>
|
|
193
275
|
</div>
|
|
276
|
+
|
|
277
|
+
<!-- The Modal -->
|
|
278
|
+
@if (showModal()) {
|
|
279
|
+
<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in" (click)="closeModal($event)">
|
|
280
|
+
<div class="bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col" (click)="$event.stopPropagation()">
|
|
281
|
+
|
|
282
|
+
<div class="p-6 border-b border-white/5 flex items-center justify-between">
|
|
283
|
+
<h2 class="text-xl font-bold text-white flex items-center gap-3">
|
|
284
|
+
<svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
285
|
+
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
286
|
+
</svg>
|
|
287
|
+
GitHub Integration
|
|
288
|
+
</h2>
|
|
289
|
+
<button (click)="showModal.set(false)" class="text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5">
|
|
290
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
291
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
292
|
+
</svg>
|
|
293
|
+
</button>
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
<div class="p-6 space-y-6">
|
|
297
|
+
|
|
298
|
+
<div class="bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300">
|
|
299
|
+
<p>Log in to automatically pull your profile data and discover your projects.</p>
|
|
300
|
+
<p class="mt-2 text-kojinx-blue font-medium">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>
|
|
301
|
+
</div>
|
|
302
|
+
|
|
303
|
+
<div class="flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl">
|
|
304
|
+
<div class="p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5">
|
|
305
|
+
<svg class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
306
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"/>
|
|
307
|
+
</svg>
|
|
308
|
+
</div>
|
|
309
|
+
<div>
|
|
310
|
+
<p class="text-sm font-semibold text-white">Fine-Grained Security Model</p>
|
|
311
|
+
<p class="text-xs text-kojinx-text-muted mt-1 leading-relaxed">
|
|
312
|
+
Your repositories are listed via GitHub App tokens with strictly <span class="text-slate-200 font-mono">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.
|
|
313
|
+
</p>
|
|
314
|
+
</div>
|
|
315
|
+
</div>
|
|
316
|
+
|
|
317
|
+
</div>
|
|
318
|
+
|
|
319
|
+
<div class="p-6 border-t border-white/5 flex items-center justify-between bg-black/20">
|
|
320
|
+
@if (isConnected) {
|
|
321
|
+
<button (click)="unlink(); showModal.set(false)" class="px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors">
|
|
322
|
+
Disconnect GitHub
|
|
323
|
+
</button>
|
|
324
|
+
<button (click)="showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto">
|
|
325
|
+
Done
|
|
326
|
+
</button>
|
|
327
|
+
} @else {
|
|
328
|
+
<button (click)="link(); showModal.set(false)" class="px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto">
|
|
329
|
+
Connect GitHub
|
|
330
|
+
</button>
|
|
331
|
+
}
|
|
332
|
+
</div>
|
|
333
|
+
|
|
334
|
+
</div>
|
|
335
|
+
</div>
|
|
336
|
+
}
|
|
194
337
|
`
|
|
195
338
|
}]
|
|
196
339
|
}], ctorParameters: () => [{ type: GithubAuthService }], propDecorators: { isConnected: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kojinx-github.mjs","sources":["../../../../projects/kojinx/github/src/lib/tokens.ts","../../../../projects/kojinx/github/src/lib/services/github-auth.service.ts","../../../../projects/kojinx/github/src/lib/components/github-login-button/github-login-button.component.ts","../../../../projects/kojinx/github/src/lib/components/github-integration-card/github-integration-card.component.ts","../../../../projects/kojinx/github/src/kojinx-github.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const KOJINX_API_BASE_URL = new InjectionToken<() => string>('KOJINX_API_BASE_URL');\nexport const KOJINX_AUTH_TOKEN = new InjectionToken<() => Promise<string | null>>('KOJINX_AUTH_TOKEN');\nexport const KOJINX_OPEN_EXTERNAL = new InjectionToken<(url: string) => Promise<void>>('KOJINX_OPEN_EXTERNAL');\nexport const KOJINX_AUTH_SUCCESS_CALLBACK = new InjectionToken<(token: string) => Promise<void>>('KOJINX_AUTH_SUCCESS_CALLBACK');\nexport const KOJINX_UNLINK_LOCAL_CALLBACK = new InjectionToken<() => Promise<void>>('KOJINX_UNLINK_LOCAL_CALLBACK');\n","import { Injectable, Inject, NgZone } from '@angular/core';\nimport { KOJINX_API_BASE_URL, KOJINX_AUTH_TOKEN, KOJINX_OPEN_EXTERNAL, KOJINX_AUTH_SUCCESS_CALLBACK, KOJINX_UNLINK_LOCAL_CALLBACK } from '../tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class GithubAuthService {\n constructor(\n private zone: NgZone,\n @Inject(KOJINX_API_BASE_URL) private getApiUrl: () => string,\n @Inject(KOJINX_AUTH_TOKEN) private getToken: () => Promise<string | null>,\n @Inject(KOJINX_OPEN_EXTERNAL) private openExternal: (url: string) => Promise<void>,\n @Inject(KOJINX_AUTH_SUCCESS_CALLBACK) private authSuccess: (token: string) => Promise<void>,\n @Inject(KOJINX_UNLINK_LOCAL_CALLBACK) private unlinkLocal: () => Promise<void>\n ) {\n this.setupTauriListener();\n }\n\n async linkGithub(): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/link-github`;\n const token = await this.getToken();\n const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n const data = await res.json();\n if (data.url) await this.openExternal(data.url);\n }\n }\n\n async unlinkGithub(): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/unlink-github`;\n const token = await this.getToken();\n const res = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n await this.unlinkLocal();\n }\n }\n\n initiateOAuth(): void {\n const url = `${this.getApiUrl()}/api/auth/github`;\n this.openExternal(url);\n }\n\n private async setupTauriListener(): Promise<void> {\n try {\n const { listen } = await import('@tauri-apps/api/event');\n await listen<{token: string}>('oauth-success', (event) => {\n this.zone.run(() => {\n this.authSuccess(event.payload.token);\n });\n });\n } catch(e) {}\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-login-button',\n standalone: true,\n template: `\n <button (click)=\"login()\" [disabled]=\"isLoading\" class=\"w-full flex justify-center items-center gap-3 bg-white/5 hover:bg-white/10 text-white font-medium py-3 px-4 rounded-xl transition-all border border-white/10 focus:outline-none focus:ring-2 focus:ring-white/20\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n {{ text }}\n </button>\n `\n})\nexport class GithubLoginButtonComponent {\n @Input() text: string = 'Continue with GitHub';\n @Input() isLoading: boolean = false;\n constructor(private githubAuth: GithubAuthService) {}\n login() {\n this.githubAuth.initiateOAuth();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-integration-card',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors\">\n <div class=\"flex items-start justify-between\">\n <div class=\"flex items-center gap-4\">\n <div class=\"w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center\">\n <svg class=\"w-6 h-6 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div>\n <h3 class=\"text-white font-medium\">GitHub</h3>\n <p class=\"text-white/60 text-sm mt-1\">Connect your repositories and manage PRs directly from Kojinx.</p>\n </div>\n </div>\n @if (isConnected) {\n <div class=\"flex flex-col items-end gap-2\">\n <span class=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\">\n <span class=\"w-1.5 h-1.5 rounded-full bg-emerald-400\"></span>\n Connected\n </span>\n <button (click)=\"unlink()\" class=\"text-xs text-red-400 hover:text-red-300 transition-colors\">Disconnect</button>\n </div>\n } @else {\n <button (click)=\"link()\" class=\"px-4 py-2 bg-white/5 hover:bg-white/10 border border-white/10 rounded-lg text-sm text-white font-medium transition-all focus:outline-none focus:border-kojinx-purple\">\n Connect\n </button>\n }\n </div>\n </div>\n `\n})\nexport class GithubIntegrationCardComponent {\n @Input() isConnected: boolean = false;\n constructor(private githubAuth: GithubAuthService) {}\n \n link() {\n this.githubAuth.linkGithub();\n }\n\n unlink() {\n this.githubAuth.unlinkGithub();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GithubAuthService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kojinx-github.mjs","sources":["../../../../projects/kojinx/github/src/lib/tokens.ts","../../../../projects/kojinx/github/src/lib/services/github-auth.service.ts","../../../../projects/kojinx/github/src/lib/components/github-login-button/github-login-button.component.ts","../../../../projects/kojinx/github/src/lib/components/github-integration-card/github-integration-card.component.ts","../../../../projects/kojinx/github/src/kojinx-github.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const KOJINX_API_BASE_URL = new InjectionToken<() => string>('KOJINX_API_BASE_URL');\nexport const KOJINX_AUTH_TOKEN = new InjectionToken<() => Promise<string | null>>('KOJINX_AUTH_TOKEN');\nexport const KOJINX_OPEN_EXTERNAL = new InjectionToken<(url: string) => Promise<void>>('KOJINX_OPEN_EXTERNAL');\nexport const KOJINX_AUTH_SUCCESS_CALLBACK = new InjectionToken<(token: string) => Promise<void>>('KOJINX_AUTH_SUCCESS_CALLBACK');\nexport const KOJINX_UNLINK_LOCAL_CALLBACK = new InjectionToken<() => Promise<void>>('KOJINX_UNLINK_LOCAL_CALLBACK');\n","import { Injectable, Inject, NgZone } from '@angular/core';\nimport { KOJINX_API_BASE_URL, KOJINX_AUTH_TOKEN, KOJINX_OPEN_EXTERNAL, KOJINX_AUTH_SUCCESS_CALLBACK, KOJINX_UNLINK_LOCAL_CALLBACK } from '../tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class GithubAuthService {\n constructor(\n private zone: NgZone,\n @Inject(KOJINX_API_BASE_URL) private getApiUrl: () => string,\n @Inject(KOJINX_AUTH_TOKEN) private getToken: () => Promise<string | null>,\n @Inject(KOJINX_OPEN_EXTERNAL) private openExternal: (url: string) => Promise<void>,\n @Inject(KOJINX_AUTH_SUCCESS_CALLBACK) private authSuccess: (token: string) => Promise<void>,\n @Inject(KOJINX_UNLINK_LOCAL_CALLBACK) private unlinkLocal: () => Promise<void>\n ) {\n this.setupTauriListener();\n }\n\n async linkGithub(mapRepos: boolean = true): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/link-github`;\n const token = await this.getToken();\n const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n const data = await res.json();\n if (data.url) await this.openExternal(data.url);\n }\n }\n\n async checkRepoScope(): Promise<boolean> {\n const url = `${this.getApiUrl()}/api/github/debug-token`;\n const token = await this.getToken();\n const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n const data = await res.json();\n return data.hasRepoScope === true || data.apiCallSuccess === true;\n }\n return false;\n }\n\n async unlinkGithub(): Promise<void> {\n const url = `${this.getApiUrl()}/api/auth/unlink-github`;\n const token = await this.getToken();\n const res = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });\n if (res.ok) {\n await this.unlinkLocal();\n }\n }\n\n initiateOAuth(): void {\n const url = `${this.getApiUrl()}/api/auth/github`;\n this.openExternal(url);\n }\n\n private async setupTauriListener(): Promise<void> {\n try {\n const { listen } = await import('@tauri-apps/api/event');\n await listen<{token: string}>('oauth-success', (event) => {\n this.zone.run(() => {\n this.authSuccess(event.payload.token);\n });\n });\n } catch(e) {}\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-login-button',\n standalone: true,\n template: `\n <button (click)=\"login()\" [disabled]=\"isLoading\" class=\"w-full flex justify-center items-center gap-3 bg-white/5 hover:bg-white/10 text-white font-medium py-3 px-4 rounded-xl transition-all border border-white/10 focus:outline-none focus:ring-2 focus:ring-white/20\">\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n {{ text }}\n </button>\n `\n})\nexport class GithubLoginButtonComponent {\n @Input() text: string = 'Continue with GitHub';\n @Input() isLoading: boolean = false;\n constructor(private githubAuth: GithubAuthService) {}\n login() {\n this.githubAuth.initiateOAuth();\n }\n}\n","import { Component, Input, signal, OnInit, effect } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GithubAuthService } from '../../services/github-auth.service';\n\n@Component({\n selector: 'github-integration-card',\n standalone: true,\n imports: [CommonModule],\n template: `\n <!-- The Card -->\n <div (click)=\"openModal()\" class=\"group cursor-pointer relative p-6 rounded-xl bg-kojinx-panel border border-kojinx-border hover:border-white/30 transition-colors\">\n <div class=\"flex items-center justify-between\">\n <div class=\"flex items-center gap-4\">\n <div class=\"w-12 h-12 rounded-xl bg-white/10 flex items-center justify-center border border-white/20\">\n <svg class=\"w-7 h-7 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n </div>\n <div>\n <p class=\"text-base font-semibold text-white group-hover:text-gray-300 transition-colors\">GitHub</p>\n <p class=\"text-sm text-kojinx-text-muted mt-0.5\">Log in to automatically pull profile data and projects.</p>\n </div>\n </div>\n <div class=\"pr-6\">\n @if (isConnected) {\n <span class=\"inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-green-500/10 border border-green-500/30 text-green-400 text-sm font-bold font-mono\">\n <svg class=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" d=\"M5 13l4 4L19 7\"/>\n </svg>\n Connected\n </span>\n } @else {\n <span class=\"inline-flex items-center gap-1.5 px-4 py-2 rounded-lg bg-white/5 border border-white/10 text-white text-sm font-bold font-mono group-hover:bg-white/10 transition-colors\">\n Connect\n </span>\n }\n </div>\n </div>\n </div>\n\n <!-- The Modal -->\n @if (showModal()) {\n <div class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm animate-fade-in\" (click)=\"closeModal($event)\">\n <div class=\"bg-kojinx-panel border border-kojinx-border rounded-2xl w-full max-w-lg shadow-2xl overflow-hidden flex flex-col\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"p-6 border-b border-white/5 flex items-center justify-between\">\n <h2 class=\"text-xl font-bold text-white flex items-center gap-3\">\n <svg class=\"w-6 h-6 text-white\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\" d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\" clip-rule=\"evenodd\" />\n </svg>\n GitHub Integration\n </h2>\n <button (click)=\"showModal.set(false)\" class=\"text-white/40 hover:text-white transition-colors p-1 rounded-lg hover:bg-white/5\">\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n <div class=\"p-6 space-y-6\">\n \n <div class=\"bg-kojinx-blue/10 border border-kojinx-blue/30 rounded-xl p-4 text-sm text-slate-300\">\n <p>Log in to automatically pull your profile data and discover your projects.</p>\n <p class=\"mt-2 text-kojinx-blue font-medium\">Note: Kojinx uses fine-grained GitHub App permissions (Metadata only). It does not have access to read or modify your source code.</p>\n </div>\n\n <div class=\"flex items-start gap-3.5 p-4 bg-black/20 border border-white/5 rounded-xl\">\n <div class=\"p-2 rounded-lg bg-green-500/10 border border-green-500/20 text-green-400 shrink-0 mt-0.5\">\n <svg class=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\"/>\n </svg>\n </div>\n <div>\n <p class=\"text-sm font-semibold text-white\">Fine-Grained Security Model</p>\n <p class=\"text-xs text-kojinx-text-muted mt-1 leading-relaxed\">\n Your repositories are listed via GitHub App tokens with strictly <span class=\"text-slate-200 font-mono\">metadata:read</span>. Source code and commit access are cryptographically blocked by the GitHub API.\n </p>\n </div>\n </div>\n\n </div>\n\n <div class=\"p-6 border-t border-white/5 flex items-center justify-between bg-black/20\">\n @if (isConnected) {\n <button (click)=\"unlink(); showModal.set(false)\" class=\"px-4 py-2 rounded-lg text-sm font-medium bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20 transition-colors\">\n Disconnect GitHub\n </button>\n <button (click)=\"showModal.set(false)\" class=\"px-6 py-2 rounded-lg text-sm font-medium bg-white/5 text-white hover:bg-white/10 border border-white/10 transition-colors ml-auto\">\n Done\n </button>\n } @else {\n <button (click)=\"link(); showModal.set(false)\" class=\"px-6 py-2 rounded-lg text-sm font-medium bg-white text-black hover:bg-gray-200 transition-colors ml-auto\">\n Connect GitHub\n </button>\n }\n </div>\n\n </div>\n </div>\n }\n `\n})\nexport class GithubIntegrationCardComponent {\n @Input() isConnected: boolean = false;\n \n readonly showModal = signal(false);\n\n constructor(private githubAuth: GithubAuthService) {}\n\n openModal() {\n this.showModal.set(true);\n }\n \n closeModal(event: MouseEvent) {\n this.showModal.set(false);\n }\n\n link() {\n this.githubAuth.linkGithub();\n }\n\n unlink() {\n this.githubAuth.unlinkGithub();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.GithubAuthService"],"mappings":"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"}
|
|
@@ -3,7 +3,10 @@ import * as i0 from "@angular/core";
|
|
|
3
3
|
export declare class GithubIntegrationCardComponent {
|
|
4
4
|
private githubAuth;
|
|
5
5
|
isConnected: boolean;
|
|
6
|
+
readonly showModal: import("@angular/core").WritableSignal<boolean>;
|
|
6
7
|
constructor(githubAuth: GithubAuthService);
|
|
8
|
+
openModal(): void;
|
|
9
|
+
closeModal(event: MouseEvent): void;
|
|
7
10
|
link(): void;
|
|
8
11
|
unlink(): void;
|
|
9
12
|
static ɵfac: i0.ɵɵFactoryDeclaration<GithubIntegrationCardComponent, never>;
|
|
@@ -8,7 +8,8 @@ export declare class GithubAuthService {
|
|
|
8
8
|
private authSuccess;
|
|
9
9
|
private unlinkLocal;
|
|
10
10
|
constructor(zone: NgZone, getApiUrl: () => string, getToken: () => Promise<string | null>, openExternal: (url: string) => Promise<void>, authSuccess: (token: string) => Promise<void>, unlinkLocal: () => Promise<void>);
|
|
11
|
-
linkGithub(): Promise<void>;
|
|
11
|
+
linkGithub(mapRepos?: boolean): Promise<void>;
|
|
12
|
+
checkRepoScope(): Promise<boolean>;
|
|
12
13
|
unlinkGithub(): Promise<void>;
|
|
13
14
|
initiateOAuth(): void;
|
|
14
15
|
private setupTauriListener;
|