@kojinx/github 0.0.1

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/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # Github
2
+
3
+ This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.3.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Run `ng generate component component-name --project github` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project github`.
8
+ > Note: Don't forget to add `--project github` or else it will be added to the default project in your `angular.json` file.
9
+
10
+ ## Build
11
+
12
+ Run `ng build github` to build the project. The build artifacts will be stored in the `dist/` directory.
13
+
14
+ ## Publishing
15
+
16
+ After building your library with `ng build github`, go to the dist folder `cd dist/github` and run `npm publish`.
17
+
18
+ ## Running unit tests
19
+
20
+ Run `ng test github` to execute the unit tests via [Karma](https://karma-runner.github.io).
21
+
22
+ ## Further help
23
+
24
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29qaW54LWdpdGh1Yi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2tvamlueC9naXRodWIvc3JjL2tvamlueC1naXRodWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,88 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../services/github-auth.service";
5
+ export class GithubIntegrationCardComponent {
6
+ constructor(githubAuth) {
7
+ this.githubAuth = githubAuth;
8
+ this.isConnected = false;
9
+ }
10
+ link() {
11
+ this.githubAuth.linkGithub();
12
+ }
13
+ unlink() {
14
+ this.githubAuth.unlinkGithub();
15
+ }
16
+ 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
+ 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
+ <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
19
+ <div class="flex items-start justify-between">
20
+ <div class="flex items-center gap-4">
21
+ <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
22
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
23
+ <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
+ </svg>
25
+ </div>
26
+ <div>
27
+ <h3 class="text-white font-medium">GitHub</h3>
28
+ <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
29
+ </div>
30
+ </div>
31
+ @if (isConnected) {
32
+ <div class="flex flex-col items-end gap-2">
33
+ <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">
34
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
35
+ Connected
36
+ </span>
37
+ <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
38
+ </div>
39
+ } @else {
40
+ <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">
41
+ Connect
42
+ </button>
43
+ }
44
+ </div>
45
+ </div>
46
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
47
+ }
48
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, decorators: [{
49
+ type: Component,
50
+ args: [{
51
+ selector: 'github-integration-card',
52
+ standalone: true,
53
+ imports: [CommonModule],
54
+ template: `
55
+ <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
56
+ <div class="flex items-start justify-between">
57
+ <div class="flex items-center gap-4">
58
+ <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
59
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
60
+ <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
+ </svg>
62
+ </div>
63
+ <div>
64
+ <h3 class="text-white font-medium">GitHub</h3>
65
+ <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
66
+ </div>
67
+ </div>
68
+ @if (isConnected) {
69
+ <div class="flex flex-col items-end gap-2">
70
+ <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">
71
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
72
+ Connected
73
+ </span>
74
+ <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
75
+ </div>
76
+ } @else {
77
+ <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">
78
+ Connect
79
+ </button>
80
+ }
81
+ </div>
82
+ </div>
83
+ `
84
+ }]
85
+ }], ctorParameters: () => [{ type: i1.GithubAuthService }], propDecorators: { isConnected: [{
86
+ type: Input
87
+ }] } });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL2NvbXBvbmVudHMvZ2l0aHViLWludGVncmF0aW9uLWNhcmQvZ2l0aHViLWludGVncmF0aW9uLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBc0MvQyxNQUFNLE9BQU8sOEJBQThCO0lBRXpDLFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBRHhDLGdCQUFXLEdBQVksS0FBSyxDQUFDO0lBQ2MsQ0FBQztJQUVyRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakMsQ0FBQzsrR0FWVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwySEEvQi9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCVCwyREE5QlMsWUFBWTs7NEZBZ0NYLDhCQUE4QjtrQkFuQzFDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCVDtpQkFDRjtzRkFFVSxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEdpdGh1YkF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZ2l0aHViLWF1dGguc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpdGh1Yi1pbnRlZ3JhdGlvbi1jYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImJnLWJsYWNrLzMwIGJvcmRlciBib3JkZXItd2hpdGUvNSByb3VuZGVkLXhsIHAtNiBob3Zlcjpib3JkZXItd2hpdGUvMTAgdHJhbnNpdGlvbi1jb2xvcnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMiBoLTEyIHJvdW5kZWQteGwgYmctWyMyNDI5MmVdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidy02IGgtNiB0ZXh0LXdoaXRlXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIgMkM2LjQ3NyAyIDIgNi40ODQgMiAxMi4wMTdjMCA0LjQyNSAyLjg2NSA4LjE4IDYuODM5IDkuNTA0LjUuMDkyLjY4Mi0uMjE3LjY4Mi0uNDgzIDAtLjIzNy0uMDA4LS44NjgtLjAxMy0xLjcwMy0yLjc4Mi42MDUtMy4zNjktMS4zNDMtMy4zNjktMS4zNDMtLjQ1NC0xLjE1OC0xLjExLTEuNDY2LTEuMTEtMS40NjYtLjkwOC0uNjIuMDY5LS42MDguMDY5LS42MDggMS4wMDMuMDcgMS41MzEgMS4wMzIgMS41MzEgMS4wMzIuODkyIDEuNTMgMi4zNDEgMS4wODggMi45MS44MzIuMDkyLS42NDcuMzUtMS4wODguNjM2LTEuMzM4LTIuMjItLjI1My00LjU1NS0xLjExMy00LjU1NS00Ljk1MSAwLTEuMDkzLjM5LTEuOTg4IDEuMDI5LTIuNjg4LS4xMDMtLjI1My0uNDQ2LTEuMjcyLjA5OC0yLjY1IDAgMCAuODQtLjI3IDIuNzUgMS4wMjZBOS41NjQgOS41NjQgMCAwMTEyIDYuODQ0Yy44NS4wMDQgMS43MDUuMTE1IDIuNTA0LjMzNyAxLjkwOS0xLjI5NiAyLjc0Ny0xLjAyNyAyLjc0Ny0xLjAyNy41NDYgMS4zNzkuMjAyIDIuMzk4LjEgMi42NTEuNjQuNyAxLjAyOCAxLjU5NSAxLjAyOCAyLjY4OCAwIDMuODQ4LTIuMzM5IDQuNjk1LTQuNTY2IDQuOTQzLjM1OS4zMDkuNjc4LjkyLjY3OCAxLjg1NSAwIDEuMzM4LS4wMTIgMi40MTktLjAxMiAyLjc0NyAwIC4yNjguMTguNTguNjg4LjQ4MkExMC4wMTkgMTAuMDE5IDAgMDAyMiAxMi4wMTdDMjIgNi40ODQgMTcuNTIyIDIgMTIgMnpcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlIGZvbnQtbWVkaXVtXCI+R2l0SHViPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC13aGl0ZS82MCB0ZXh0LXNtIG10LTFcIj5Db25uZWN0IHlvdXIgcmVwb3NpdG9yaWVzIGFuZCBtYW5hZ2UgUFJzIGRpcmVjdGx5IGZyb20gS29qaW54LjwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcHgtMi41IHB5LTEgcm91bmRlZC1mdWxsIHRleHQteHMgZm9udC1tZWRpdW0gYmctZW1lcmFsZC01MDAvMTAgdGV4dC1lbWVyYWxkLTQwMCBib3JkZXIgYm9yZGVyLWVtZXJhbGQtNTAwLzIwXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidy0xLjUgaC0xLjUgcm91bmRlZC1mdWxsIGJnLWVtZXJhbGQtNDAwXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBDb25uZWN0ZWRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInVubGluaygpXCIgY2xhc3M9XCJ0ZXh0LXhzIHRleHQtcmVkLTQwMCBob3Zlcjp0ZXh0LXJlZC0zMDAgdHJhbnNpdGlvbi1jb2xvcnNcIj5EaXNjb25uZWN0PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImxpbmsoKVwiIGNsYXNzPVwicHgtNCBweS0yIGJnLXdoaXRlLzUgaG92ZXI6Ymctd2hpdGUvMTAgYm9yZGVyIGJvcmRlci13aGl0ZS8xMCByb3VuZGVkLWxnIHRleHQtc20gdGV4dC13aGl0ZSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLWtvamlueC1wdXJwbGVcIj5cbiAgICAgICAgICAgIENvbm5lY3RcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgR2l0aHViSW50ZWdyYXRpb25DYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KCkgaXNDb25uZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnaXRodWJBdXRoOiBHaXRodWJBdXRoU2VydmljZSkge31cbiAgXG4gIGxpbmsoKSB7XG4gICAgdGhpcy5naXRodWJBdXRoLmxpbmtHaXRodWIoKTtcbiAgfVxuXG4gIHVubGluaygpIHtcbiAgICB0aGlzLmdpdGh1YkF1dGgudW5saW5rR2l0aHViKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,42 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../../services/github-auth.service";
4
+ export class GithubLoginButtonComponent {
5
+ constructor(githubAuth) {
6
+ this.githubAuth = githubAuth;
7
+ this.text = 'Continue with GitHub';
8
+ this.isLoading = false;
9
+ }
10
+ login() {
11
+ this.githubAuth.initiateOAuth();
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubLoginButtonComponent, deps: [{ token: i1.GithubAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GithubLoginButtonComponent, isStandalone: true, selector: "github-login-button", inputs: { text: "text", isLoading: "isLoading" }, ngImport: i0, template: `
15
+ <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">
16
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
17
+ <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" />
18
+ </svg>
19
+ {{ text }}
20
+ </button>
21
+ `, isInline: true }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubLoginButtonComponent, decorators: [{
24
+ type: Component,
25
+ args: [{
26
+ selector: 'github-login-button',
27
+ standalone: true,
28
+ template: `
29
+ <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">
30
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
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" />
32
+ </svg>
33
+ {{ text }}
34
+ </button>
35
+ `
36
+ }]
37
+ }], ctorParameters: () => [{ type: i1.GithubAuthService }], propDecorators: { text: [{
38
+ type: Input
39
+ }], isLoading: [{
40
+ type: Input
41
+ }] } });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWxvZ2luLWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rb2ppbngvZ2l0aHViL3NyYy9saWIvY29tcG9uZW50cy9naXRodWItbG9naW4tYnV0dG9uL2dpdGh1Yi1sb2dpbi1idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFlakQsTUFBTSxPQUFPLDBCQUEwQjtJQUdyQyxZQUFvQixVQUE2QjtRQUE3QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUZ4QyxTQUFJLEdBQVcsc0JBQXNCLENBQUM7UUFDdEMsY0FBUyxHQUFZLEtBQUssQ0FBQztJQUNnQixDQUFDO0lBQ3JELEtBQUs7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7K0dBTlUsMEJBQTBCO21HQUExQiwwQkFBMEIsaUlBVDNCOzs7Ozs7O0dBT1Q7OzRGQUVVLDBCQUEwQjtrQkFadEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7Ozs7O0dBT1Q7aUJBQ0Y7c0ZBRVUsSUFBSTtzQkFBWixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHaXRodWJBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2dpdGh1Yi1hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdnaXRodWItbG9naW4tYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uIChjbGljayk9XCJsb2dpbigpXCIgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiIGNsYXNzPVwidy1mdWxsIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGdhcC0zIGJnLXdoaXRlLzUgaG92ZXI6Ymctd2hpdGUvMTAgdGV4dC13aGl0ZSBmb250LW1lZGl1bSBweS0zIHB4LTQgcm91bmRlZC14bCB0cmFuc2l0aW9uLWFsbCBib3JkZXIgYm9yZGVyLXdoaXRlLzEwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy13aGl0ZS8yMFwiPlxuICAgICAgPHN2ZyBjbGFzcz1cInctNSBoLTVcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMiAyQzYuNDc3IDIgMiA2LjQ4NCAyIDEyLjAxN2MwIDQuNDI1IDIuODY1IDguMTggNi44MzkgOS41MDQuNS4wOTIuNjgyLS4yMTcuNjgyLS40ODMgMC0uMjM3LS4wMDgtLjg2OC0uMDEzLTEuNzAzLTIuNzgyLjYwNS0zLjM2OS0xLjM0My0zLjM2OS0xLjM0My0uNDU0LTEuMTU4LTEuMTEtMS40NjYtMS4xMS0xLjQ2Ni0uOTA4LS42Mi4wNjktLjYwOC4wNjktLjYwOCAxLjAwMy4wNyAxLjUzMSAxLjAzMiAxLjUzMSAxLjAzMi44OTIgMS41MyAyLjM0MSAxLjA4OCAyLjkxLjgzMi4wOTItLjY0Ny4zNS0xLjA4OC42MzYtMS4zMzgtMi4yMi0uMjUzLTQuNTU1LTEuMTEzLTQuNTU1LTQuOTUxIDAtMS4wOTMuMzktMS45ODggMS4wMjktMi42ODgtLjEwMy0uMjUzLS40NDYtMS4yNzIuMDk4LTIuNjUgMCAwIC44NC0uMjcgMi43NSAxLjAyNkE5LjU2NCA5LjU2NCAwIDAxMTIgNi44NDRjLjg1LjAwNCAxLjcwNS4xMTUgMi41MDQuMzM3IDEuOTA5LTEuMjk2IDIuNzQ3LTEuMDI3IDIuNzQ3LTEuMDI3LjU0NiAxLjM3OS4yMDIgMi4zOTguMSAyLjY1MS42NC43IDEuMDI4IDEuNTk1IDEuMDI4IDIuNjg4IDAgMy44NDgtMi4zMzkgNC42OTUtNC41NjYgNC45NDMuMzU5LjMwOS42NzguOTIuNjc4IDEuODU1IDAgMS4zMzgtLjAxMiAyLjQxOS0uMDEyIDIuNzQ3IDAgLjI2OC4xOC41OC42ODguNDgyQTEwLjAxOSAxMC4wMTkgMCAwMDIyIDEyLjAxN0MyMiA2LjQ4NCAxNy41MjIgMiAxMiAyelwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiAvPlxuICAgICAgPC9zdmc+XG4gICAgICB7eyB0ZXh0IH19XG4gICAgPC9idXR0b24+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgR2l0aHViTG9naW5CdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSB0ZXh0OiBzdHJpbmcgPSAnQ29udGludWUgd2l0aCBHaXRIdWInO1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBnaXRodWJBdXRoOiBHaXRodWJBdXRoU2VydmljZSkge31cbiAgbG9naW4oKSB7XG4gICAgdGhpcy5naXRodWJBdXRoLmluaXRpYXRlT0F1dGgoKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,69 @@
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { KOJINX_API_BASE_URL, KOJINX_AUTH_TOKEN, KOJINX_OPEN_EXTERNAL, KOJINX_AUTH_SUCCESS_CALLBACK, KOJINX_UNLINK_LOCAL_CALLBACK } from '../tokens';
3
+ import * as i0 from "@angular/core";
4
+ export class GithubAuthService {
5
+ constructor(zone, getApiUrl, getToken, openExternal, authSuccess, unlinkLocal) {
6
+ this.zone = zone;
7
+ this.getApiUrl = getApiUrl;
8
+ this.getToken = getToken;
9
+ this.openExternal = openExternal;
10
+ this.authSuccess = authSuccess;
11
+ this.unlinkLocal = unlinkLocal;
12
+ this.setupTauriListener();
13
+ }
14
+ async linkGithub() {
15
+ const url = `${this.getApiUrl()}/api/auth/link-github`;
16
+ const token = await this.getToken();
17
+ const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
18
+ if (res.ok) {
19
+ const data = await res.json();
20
+ if (data.url)
21
+ await this.openExternal(data.url);
22
+ }
23
+ }
24
+ async unlinkGithub() {
25
+ const url = `${this.getApiUrl()}/api/auth/unlink-github`;
26
+ const token = await this.getToken();
27
+ const res = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });
28
+ if (res.ok) {
29
+ await this.unlinkLocal();
30
+ }
31
+ }
32
+ initiateOAuth() {
33
+ const url = `${this.getApiUrl()}/api/auth/github`;
34
+ this.openExternal(url);
35
+ }
36
+ async setupTauriListener() {
37
+ try {
38
+ const { listen } = await import('@tauri-apps/api/event');
39
+ await listen('oauth-success', (event) => {
40
+ this.zone.run(() => {
41
+ this.authSuccess(event.payload.token);
42
+ });
43
+ });
44
+ }
45
+ catch (e) { }
46
+ }
47
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubAuthService, deps: [{ token: i0.NgZone }, { token: KOJINX_API_BASE_URL }, { token: KOJINX_AUTH_TOKEN }, { token: KOJINX_OPEN_EXTERNAL }, { token: KOJINX_AUTH_SUCCESS_CALLBACK }, { token: KOJINX_UNLINK_LOCAL_CALLBACK }], target: i0.ɵɵFactoryTarget.Injectable }); }
48
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubAuthService, providedIn: 'root' }); }
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubAuthService, decorators: [{
51
+ type: Injectable,
52
+ args: [{ providedIn: 'root' }]
53
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: undefined, decorators: [{
54
+ type: Inject,
55
+ args: [KOJINX_API_BASE_URL]
56
+ }] }, { type: undefined, decorators: [{
57
+ type: Inject,
58
+ args: [KOJINX_AUTH_TOKEN]
59
+ }] }, { type: undefined, decorators: [{
60
+ type: Inject,
61
+ args: [KOJINX_OPEN_EXTERNAL]
62
+ }] }, { type: undefined, decorators: [{
63
+ type: Inject,
64
+ args: [KOJINX_AUTH_SUCCESS_CALLBACK]
65
+ }] }, { type: undefined, decorators: [{
66
+ type: Inject,
67
+ args: [KOJINX_UNLINK_LOCAL_CALLBACK]
68
+ }] }] });
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tvamlueC9naXRodWIvc3JjL2xpYi9zZXJ2aWNlcy9naXRodWItYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSw0QkFBNEIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7QUFHckosTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNVLElBQVksRUFDaUIsU0FBdUIsRUFDekIsUUFBc0MsRUFDbkMsWUFBNEMsRUFDcEMsV0FBNkMsRUFDN0MsV0FBZ0M7UUFMdEUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNpQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQThCO1FBQ25DLGlCQUFZLEdBQVosWUFBWSxDQUFnQztRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0M7UUFDN0MsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBRTlFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNkLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsQ0FBQztRQUN2RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxlQUFlLEVBQUUsVUFBVSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRixJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLEdBQUc7Z0JBQUUsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQztRQUN6RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLElBQUksR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0I7UUFDOUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDekQsTUFBTSxNQUFNLENBQWtCLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFNLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQztJQUNmLENBQUM7K0dBN0NVLGlCQUFpQix3Q0FHbEIsbUJBQW1CLGFBQ25CLGlCQUFpQixhQUNqQixvQkFBb0IsYUFDcEIsNEJBQTRCLGFBQzVCLDRCQUE0QjttSEFQM0IsaUJBQWlCLGNBREosTUFBTTs7NEZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQUk3QixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLDRCQUE0Qjs7MEJBQ25DLE1BQU07MkJBQUMsNEJBQTRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtPSklOWF9BUElfQkFTRV9VUkwsIEtPSklOWF9BVVRIX1RPS0VOLCBLT0pJTlhfT1BFTl9FWFRFUk5BTCwgS09KSU5YX0FVVEhfU1VDQ0VTU19DQUxMQkFDSywgS09KSU5YX1VOTElOS19MT0NBTF9DQUxMQkFDSyB9IGZyb20gJy4uL3Rva2Vucyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgR2l0aHViQXV0aFNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KEtPSklOWF9BUElfQkFTRV9VUkwpIHByaXZhdGUgZ2V0QXBpVXJsOiAoKSA9PiBzdHJpbmcsXG4gICAgQEluamVjdChLT0pJTlhfQVVUSF9UT0tFTikgcHJpdmF0ZSBnZXRUb2tlbjogKCkgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPixcbiAgICBASW5qZWN0KEtPSklOWF9PUEVOX0VYVEVSTkFMKSBwcml2YXRlIG9wZW5FeHRlcm5hbDogKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+LFxuICAgIEBJbmplY3QoS09KSU5YX0FVVEhfU1VDQ0VTU19DQUxMQkFDSykgcHJpdmF0ZSBhdXRoU3VjY2VzczogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4sXG4gICAgQEluamVjdChLT0pJTlhfVU5MSU5LX0xPQ0FMX0NBTExCQUNLKSBwcml2YXRlIHVubGlua0xvY2FsOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gICkge1xuICAgIHRoaXMuc2V0dXBUYXVyaUxpc3RlbmVyKCk7XG4gIH1cblxuICBhc3luYyBsaW5rR2l0aHViKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuZ2V0QXBpVXJsKCl9L2FwaS9hdXRoL2xpbmstZ2l0aHViYDtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0gfSk7XG4gICAgaWYgKHJlcy5vaykge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS51cmwpIGF3YWl0IHRoaXMub3BlbkV4dGVybmFsKGRhdGEudXJsKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1bmxpbmtHaXRodWIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvdW5saW5rLWdpdGh1YmA7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFRva2VuKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgYXdhaXQgdGhpcy51bmxpbmtMb2NhbCgpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRpYXRlT0F1dGgoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5nZXRBcGlVcmwoKX0vYXBpL2F1dGgvZ2l0aHViYDtcbiAgICB0aGlzLm9wZW5FeHRlcm5hbCh1cmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFRhdXJpTGlzdGVuZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbGlzdGVuIH0gPSBhd2FpdCBpbXBvcnQoJ0B0YXVyaS1hcHBzL2FwaS9ldmVudCcpO1xuICAgICAgYXdhaXQgbGlzdGVuPHt0b2tlbjogc3RyaW5nfT4oJ29hdXRoLXN1Y2Nlc3MnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hdXRoU3VjY2VzcyhldmVudC5wYXlsb2FkLnRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGUpIHt9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const KOJINX_API_BASE_URL = new InjectionToken('KOJINX_API_BASE_URL');
3
+ export const KOJINX_AUTH_TOKEN = new InjectionToken('KOJINX_AUTH_TOKEN');
4
+ export const KOJINX_OPEN_EXTERNAL = new InjectionToken('KOJINX_OPEN_EXTERNAL');
5
+ export const KOJINX_AUTH_SUCCESS_CALLBACK = new InjectionToken('KOJINX_AUTH_SUCCESS_CALLBACK');
6
+ export const KOJINX_UNLINK_LOCAL_CALLBACK = new InjectionToken('KOJINX_UNLINK_LOCAL_CALLBACK');
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva29qaW54L2dpdGh1Yi9zcmMvbGliL3Rva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUFlLHFCQUFxQixDQUFDLENBQUM7QUFDM0YsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQStCLG1CQUFtQixDQUFDLENBQUM7QUFDdkcsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQWlDLHNCQUFzQixDQUFDLENBQUM7QUFDL0csTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBQW1DLDhCQUE4QixDQUFDLENBQUM7QUFDakksTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQUcsSUFBSSxjQUFjLENBQXNCLDhCQUE4QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgS09KSU5YX0FQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjwoKSA9PiBzdHJpbmc+KCdLT0pJTlhfQVBJX0JBU0VfVVJMJyk7XG5leHBvcnQgY29uc3QgS09KSU5YX0FVVEhfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPj4oJ0tPSklOWF9BVVRIX1RPS0VOJyk7XG5leHBvcnQgY29uc3QgS09KSU5YX09QRU5fRVhURVJOQUwgPSBuZXcgSW5qZWN0aW9uVG9rZW48KHVybDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+PignS09KSU5YX09QRU5fRVhURVJOQUwnKTtcbmV4cG9ydCBjb25zdCBLT0pJTlhfQVVUSF9TVUNDRVNTX0NBTExCQUNLID0gbmV3IEluamVjdGlvblRva2VuPCh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+PignS09KSU5YX0FVVEhfU1VDQ0VTU19DQUxMQkFDSycpO1xuZXhwb3J0IGNvbnN0IEtPSklOWF9VTkxJTktfTE9DQUxfQ0FMTEJBQ0sgPSBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gUHJvbWlzZTx2b2lkPj4oJ0tPSklOWF9VTkxJTktfTE9DQUxfQ0FMTEJBQ0snKTtcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export * from './lib/tokens';
2
+ export * from './lib/services/github-auth.service';
3
+ export * from './lib/components/github-login-button/github-login-button.component';
4
+ export * from './lib/components/github-integration-card/github-integration-card.component';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2tvamlueC9naXRodWIvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLG9FQUFvRSxDQUFDO0FBQ25GLGNBQWMsNEVBQTRFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi90b2tlbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvZ2l0aHViLWF1dGguc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2dpdGh1Yi1sb2dpbi1idXR0b24vZ2l0aHViLWxvZ2luLWJ1dHRvbi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9naXRodWItaW50ZWdyYXRpb24tY2FyZC9naXRodWItaW50ZWdyYXRpb24tY2FyZC5jb21wb25lbnQnO1xuIl19
@@ -0,0 +1,205 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Inject, Injectable, Input, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+
5
+ const KOJINX_API_BASE_URL = new InjectionToken('KOJINX_API_BASE_URL');
6
+ const KOJINX_AUTH_TOKEN = new InjectionToken('KOJINX_AUTH_TOKEN');
7
+ const KOJINX_OPEN_EXTERNAL = new InjectionToken('KOJINX_OPEN_EXTERNAL');
8
+ const KOJINX_AUTH_SUCCESS_CALLBACK = new InjectionToken('KOJINX_AUTH_SUCCESS_CALLBACK');
9
+ const KOJINX_UNLINK_LOCAL_CALLBACK = new InjectionToken('KOJINX_UNLINK_LOCAL_CALLBACK');
10
+
11
+ class GithubAuthService {
12
+ constructor(zone, getApiUrl, getToken, openExternal, authSuccess, unlinkLocal) {
13
+ this.zone = zone;
14
+ this.getApiUrl = getApiUrl;
15
+ this.getToken = getToken;
16
+ this.openExternal = openExternal;
17
+ this.authSuccess = authSuccess;
18
+ this.unlinkLocal = unlinkLocal;
19
+ this.setupTauriListener();
20
+ }
21
+ async linkGithub() {
22
+ const url = `${this.getApiUrl()}/api/auth/link-github`;
23
+ const token = await this.getToken();
24
+ const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
25
+ if (res.ok) {
26
+ const data = await res.json();
27
+ if (data.url)
28
+ await this.openExternal(data.url);
29
+ }
30
+ }
31
+ async unlinkGithub() {
32
+ const url = `${this.getApiUrl()}/api/auth/unlink-github`;
33
+ const token = await this.getToken();
34
+ const res = await fetch(url, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` } });
35
+ if (res.ok) {
36
+ await this.unlinkLocal();
37
+ }
38
+ }
39
+ initiateOAuth() {
40
+ const url = `${this.getApiUrl()}/api/auth/github`;
41
+ this.openExternal(url);
42
+ }
43
+ async setupTauriListener() {
44
+ try {
45
+ const { listen } = await import('@tauri-apps/api/event');
46
+ await listen('oauth-success', (event) => {
47
+ this.zone.run(() => {
48
+ this.authSuccess(event.payload.token);
49
+ });
50
+ });
51
+ }
52
+ catch (e) { }
53
+ }
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubAuthService, deps: [{ token: i0.NgZone }, { token: KOJINX_API_BASE_URL }, { token: KOJINX_AUTH_TOKEN }, { token: KOJINX_OPEN_EXTERNAL }, { token: KOJINX_AUTH_SUCCESS_CALLBACK }, { token: KOJINX_UNLINK_LOCAL_CALLBACK }], target: i0.ɵɵFactoryTarget.Injectable }); }
55
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubAuthService, providedIn: 'root' }); }
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubAuthService, decorators: [{
58
+ type: Injectable,
59
+ args: [{ providedIn: 'root' }]
60
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: undefined, decorators: [{
61
+ type: Inject,
62
+ args: [KOJINX_API_BASE_URL]
63
+ }] }, { type: undefined, decorators: [{
64
+ type: Inject,
65
+ args: [KOJINX_AUTH_TOKEN]
66
+ }] }, { type: undefined, decorators: [{
67
+ type: Inject,
68
+ args: [KOJINX_OPEN_EXTERNAL]
69
+ }] }, { type: undefined, decorators: [{
70
+ type: Inject,
71
+ args: [KOJINX_AUTH_SUCCESS_CALLBACK]
72
+ }] }, { type: undefined, decorators: [{
73
+ type: Inject,
74
+ args: [KOJINX_UNLINK_LOCAL_CALLBACK]
75
+ }] }] });
76
+
77
+ class GithubLoginButtonComponent {
78
+ constructor(githubAuth) {
79
+ this.githubAuth = githubAuth;
80
+ this.text = 'Continue with GitHub';
81
+ this.isLoading = false;
82
+ }
83
+ login() {
84
+ this.githubAuth.initiateOAuth();
85
+ }
86
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubLoginButtonComponent, deps: [{ token: GithubAuthService }], target: i0.ɵɵFactoryTarget.Component }); }
87
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: GithubLoginButtonComponent, isStandalone: true, selector: "github-login-button", inputs: { text: "text", isLoading: "isLoading" }, ngImport: i0, template: `
88
+ <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">
89
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
90
+ <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" />
91
+ </svg>
92
+ {{ text }}
93
+ </button>
94
+ `, isInline: true }); }
95
+ }
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubLoginButtonComponent, decorators: [{
97
+ type: Component,
98
+ args: [{
99
+ selector: 'github-login-button',
100
+ standalone: true,
101
+ template: `
102
+ <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">
103
+ <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
104
+ <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" />
105
+ </svg>
106
+ {{ text }}
107
+ </button>
108
+ `
109
+ }]
110
+ }], ctorParameters: () => [{ type: GithubAuthService }], propDecorators: { text: [{
111
+ type: Input
112
+ }], isLoading: [{
113
+ type: Input
114
+ }] } });
115
+
116
+ class GithubIntegrationCardComponent {
117
+ constructor(githubAuth) {
118
+ this.githubAuth = githubAuth;
119
+ this.isConnected = false;
120
+ }
121
+ link() {
122
+ this.githubAuth.linkGithub();
123
+ }
124
+ unlink() {
125
+ this.githubAuth.unlinkGithub();
126
+ }
127
+ 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
+ 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
+ <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
130
+ <div class="flex items-start justify-between">
131
+ <div class="flex items-center gap-4">
132
+ <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
133
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
134
+ <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
+ </svg>
136
+ </div>
137
+ <div>
138
+ <h3 class="text-white font-medium">GitHub</h3>
139
+ <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
140
+ </div>
141
+ </div>
142
+ @if (isConnected) {
143
+ <div class="flex flex-col items-end gap-2">
144
+ <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">
145
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
146
+ Connected
147
+ </span>
148
+ <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
149
+ </div>
150
+ } @else {
151
+ <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">
152
+ Connect
153
+ </button>
154
+ }
155
+ </div>
156
+ </div>
157
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
158
+ }
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: GithubIntegrationCardComponent, decorators: [{
160
+ type: Component,
161
+ args: [{
162
+ selector: 'github-integration-card',
163
+ standalone: true,
164
+ imports: [CommonModule],
165
+ template: `
166
+ <div class="bg-black/30 border border-white/5 rounded-xl p-6 hover:border-white/10 transition-colors">
167
+ <div class="flex items-start justify-between">
168
+ <div class="flex items-center gap-4">
169
+ <div class="w-12 h-12 rounded-xl bg-[#24292e] flex items-center justify-center">
170
+ <svg class="w-6 h-6 text-white" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
171
+ <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
+ </svg>
173
+ </div>
174
+ <div>
175
+ <h3 class="text-white font-medium">GitHub</h3>
176
+ <p class="text-white/60 text-sm mt-1">Connect your repositories and manage PRs directly from Kojinx.</p>
177
+ </div>
178
+ </div>
179
+ @if (isConnected) {
180
+ <div class="flex flex-col items-end gap-2">
181
+ <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">
182
+ <span class="w-1.5 h-1.5 rounded-full bg-emerald-400"></span>
183
+ Connected
184
+ </span>
185
+ <button (click)="unlink()" class="text-xs text-red-400 hover:text-red-300 transition-colors">Disconnect</button>
186
+ </div>
187
+ } @else {
188
+ <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">
189
+ Connect
190
+ </button>
191
+ }
192
+ </div>
193
+ </div>
194
+ `
195
+ }]
196
+ }], ctorParameters: () => [{ type: GithubAuthService }], propDecorators: { isConnected: [{
197
+ type: Input
198
+ }] } });
199
+
200
+ /**
201
+ * Generated bundle index. Do not edit.
202
+ */
203
+
204
+ export { GithubAuthService, GithubIntegrationCardComponent, GithubLoginButtonComponent, KOJINX_API_BASE_URL, KOJINX_AUTH_SUCCESS_CALLBACK, KOJINX_AUTH_TOKEN, KOJINX_OPEN_EXTERNAL, KOJINX_UNLINK_LOCAL_CALLBACK };
205
+ //# sourceMappingURL=kojinx-github.mjs.map
@@ -0,0 +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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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@kojinx/github" />
5
+ export * from './public-api';
@@ -0,0 +1,11 @@
1
+ import { GithubAuthService } from '../../services/github-auth.service';
2
+ import * as i0 from "@angular/core";
3
+ export declare class GithubIntegrationCardComponent {
4
+ private githubAuth;
5
+ isConnected: boolean;
6
+ constructor(githubAuth: GithubAuthService);
7
+ link(): void;
8
+ unlink(): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<GithubIntegrationCardComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<GithubIntegrationCardComponent, "github-integration-card", never, { "isConnected": { "alias": "isConnected"; "required": false; }; }, {}, never, never, true, never>;
11
+ }
@@ -0,0 +1,11 @@
1
+ import { GithubAuthService } from '../../services/github-auth.service';
2
+ import * as i0 from "@angular/core";
3
+ export declare class GithubLoginButtonComponent {
4
+ private githubAuth;
5
+ text: string;
6
+ isLoading: boolean;
7
+ constructor(githubAuth: GithubAuthService);
8
+ login(): void;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<GithubLoginButtonComponent, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<GithubLoginButtonComponent, "github-login-button", never, { "text": { "alias": "text"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; }, {}, never, never, true, never>;
11
+ }
@@ -0,0 +1,17 @@
1
+ import { NgZone } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class GithubAuthService {
4
+ private zone;
5
+ private getApiUrl;
6
+ private getToken;
7
+ private openExternal;
8
+ private authSuccess;
9
+ private unlinkLocal;
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>;
12
+ unlinkGithub(): Promise<void>;
13
+ initiateOAuth(): void;
14
+ private setupTauriListener;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<GithubAuthService, never>;
16
+ static ɵprov: i0.ɵɵInjectableDeclaration<GithubAuthService>;
17
+ }
@@ -0,0 +1,6 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export declare const KOJINX_API_BASE_URL: InjectionToken<() => string>;
3
+ export declare const KOJINX_AUTH_TOKEN: InjectionToken<() => Promise<string | null>>;
4
+ export declare const KOJINX_OPEN_EXTERNAL: InjectionToken<(url: string) => Promise<void>>;
5
+ export declare const KOJINX_AUTH_SUCCESS_CALLBACK: InjectionToken<(token: string) => Promise<void>>;
6
+ export declare const KOJINX_UNLINK_LOCAL_CALLBACK: InjectionToken<() => Promise<void>>;
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@kojinx/github",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^17.3.0",
6
+ "@angular/core": "^17.3.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/kojinx-github.mjs",
13
+ "typings": "index.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "esm2022": "./esm2022/kojinx-github.mjs",
21
+ "esm": "./esm2022/kojinx-github.mjs",
22
+ "default": "./fesm2022/kojinx-github.mjs"
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,4 @@
1
+ export * from './lib/tokens';
2
+ export * from './lib/services/github-auth.service';
3
+ export * from './lib/components/github-login-button/github-login-button.component';
4
+ export * from './lib/components/github-integration-card/github-integration-card.component';