@copilotkitnext/angular 0.0.1 → 0.0.4
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 +248 -0
- package/dist/README.md +248 -0
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +10 -10
- package/dist/components/chat/copilot-chat-message-view.component.d.ts +42 -42
- package/dist/components/chat/copilot-chat-view.component.d.ts +14 -14
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +384 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +286 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +27 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.component.mjs +433 -0
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +202 -0
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +321 -0
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +38 -0
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +666 -0
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +45 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +296 -0
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +188 -0
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +216 -0
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +25 -0
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +199 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +137 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +207 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +35 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +34 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +341 -0
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +52 -0
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +55 -0
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +19 -0
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +110 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +93 -0
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +443 -0
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +479 -0
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +214 -0
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +153 -0
- package/dist/esm2022/copilotkitnext-angular.mjs +5 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +65 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +145 -0
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +26 -0
- package/dist/esm2022/core/copilotkit.providers.mjs +34 -0
- package/dist/esm2022/core/copilotkit.service.mjs +430 -0
- package/dist/esm2022/core/copilotkit.types.mjs +12 -0
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +217 -0
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +218 -0
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +94 -0
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +130 -0
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +266 -0
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +181 -0
- package/dist/esm2022/index.mjs +70 -0
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +211 -0
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +144 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +6 -0
- package/dist/esm2022/lib/slots/slot.utils.mjs +222 -0
- package/dist/esm2022/lib/utils.mjs +10 -0
- package/dist/esm2022/services/resize-observer.service.mjs +152 -0
- package/dist/esm2022/services/scroll-position.service.mjs +124 -0
- package/dist/esm2022/types/frontend-tool.mjs +2 -0
- package/dist/esm2022/types/human-in-the-loop.mjs +2 -0
- package/dist/esm2022/utils/agent-context.utils.mjs +114 -0
- package/dist/esm2022/utils/agent.utils.mjs +204 -0
- package/dist/esm2022/utils/chat-config.utils.mjs +186 -0
- package/dist/esm2022/utils/copilotkit.utils.mjs +20 -0
- package/dist/esm2022/utils/frontend-tool.utils.mjs +228 -0
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +296 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +163 -164
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/styles.css +0 -27
- package/package.json +23 -20
- package/vitest.config.mts +32 -21
- package/.turbo/turbo-build.log +0 -39
- package/.turbo/turbo-check-types.log +0 -0
- package/.turbo/turbo-test.log +0 -71
- package/README-agent-context.md +0 -310
- package/ng-package.json +0 -19
- package/slots.md +0 -331
- package/src/components/chat/__tests__/copilot-chat-assistant-message.component.spec.ts +0 -282
- package/src/components/chat/__tests__/copilot-chat-input.component.spec.ts +0 -419
- package/src/components/chat/__tests__/copilot-chat-message-view.component.spec.ts +0 -372
- package/src/components/chat/__tests__/copilot-chat-user-message.component.spec.ts +0 -249
- package/src/components/chat/copilot-chat-assistant-message-buttons.component.ts +0 -292
- package/src/components/chat/copilot-chat-assistant-message-renderer.component.ts +0 -472
- package/src/components/chat/copilot-chat-assistant-message-toolbar.component.ts +0 -29
- package/src/components/chat/copilot-chat-assistant-message.component.ts +0 -463
- package/src/components/chat/copilot-chat-assistant-message.types.ts +0 -50
- package/src/components/chat/copilot-chat-audio-recorder.component.ts +0 -241
- package/src/components/chat/copilot-chat-buttons.component.ts +0 -308
- package/src/components/chat/copilot-chat-buttons.component.ts.bak +0 -471
- package/src/components/chat/copilot-chat-input-defaults.ts +0 -47
- package/src/components/chat/copilot-chat-input.component.ts +0 -512
- package/src/components/chat/copilot-chat-input.types.ts +0 -148
- package/src/components/chat/copilot-chat-message-view-cursor.component.ts +0 -51
- package/src/components/chat/copilot-chat-message-view.component.ts +0 -233
- package/src/components/chat/copilot-chat-message-view.types.ts +0 -39
- package/src/components/chat/copilot-chat-textarea.component.ts +0 -220
- package/src/components/chat/copilot-chat-tool-calls-view.component.ts +0 -261
- package/src/components/chat/copilot-chat-toolbar.component.ts +0 -35
- package/src/components/chat/copilot-chat-tools-menu.component.ts +0 -185
- package/src/components/chat/copilot-chat-user-message-branch-navigation.component.ts +0 -121
- package/src/components/chat/copilot-chat-user-message-buttons.component.ts +0 -170
- package/src/components/chat/copilot-chat-user-message-renderer.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message-toolbar.component.ts +0 -37
- package/src/components/chat/copilot-chat-user-message.component.ts +0 -247
- package/src/components/chat/copilot-chat-user-message.types.ts +0 -42
- package/src/components/chat/copilot-chat-view-disclaimer.component.ts +0 -51
- package/src/components/chat/copilot-chat-view-feather.component.ts +0 -47
- package/src/components/chat/copilot-chat-view-handlers.service.ts +0 -14
- package/src/components/chat/copilot-chat-view-input-container.component.ts +0 -87
- package/src/components/chat/copilot-chat-view-scroll-to-bottom-button.component.ts +0 -79
- package/src/components/chat/copilot-chat-view-scroll-view.component.ts +0 -322
- package/src/components/chat/copilot-chat-view.component.ts +0 -420
- package/src/components/chat/copilot-chat-view.types.ts +0 -52
- package/src/components/chat/copilot-chat.component.ts +0 -232
- package/src/components/copilotkit-tool-render.component.ts +0 -169
- package/src/core/__tests__/copilotkit.service.spec.ts +0 -1051
- package/src/core/__tests__/copilotkit.service.wildcard.spec.ts +0 -316
- package/src/core/chat-configuration/__tests__/chat-configuration.service.spec.ts +0 -287
- package/src/core/chat-configuration/chat-configuration.providers.ts +0 -71
- package/src/core/chat-configuration/chat-configuration.service.ts +0 -162
- package/src/core/chat-configuration/chat-configuration.types.ts +0 -57
- package/src/core/copilotkit.providers.ts +0 -59
- package/src/core/copilotkit.service.ts +0 -542
- package/src/core/copilotkit.types.ts +0 -132
- package/src/directives/__tests__/copilotkit-agent-context.directive.spec.ts +0 -384
- package/src/directives/__tests__/copilotkit-agent.directive.spec.ts +0 -253
- package/src/directives/__tests__/copilotkit-chat-config.directive.spec.ts +0 -385
- package/src/directives/__tests__/copilotkit-config.directive.spec.ts +0 -69
- package/src/directives/__tests__/copilotkit-frontend-tool-simple.directive.spec.ts +0 -60
- package/src/directives/__tests__/copilotkit-frontend-tool.directive.spec.ts +0 -108
- package/src/directives/__tests__/copilotkit-human-in-the-loop.directive.spec.ts +0 -452
- package/src/directives/copilotkit-agent-context.directive.ts +0 -138
- package/src/directives/copilotkit-agent.directive.ts +0 -225
- package/src/directives/copilotkit-chat-config.directive.ts +0 -241
- package/src/directives/copilotkit-config.directive.ts +0 -81
- package/src/directives/copilotkit-frontend-tool.directive.ts +0 -145
- package/src/directives/copilotkit-human-in-the-loop.directive.ts +0 -281
- package/src/directives/stick-to-bottom.directive.ts +0 -204
- package/src/index.ts +0 -105
- package/src/lib/directives/tooltip.directive.ts +0 -292
- package/src/lib/slots/__tests__/slot.utils.spec.ts +0 -377
- package/src/lib/slots/copilot-slot.component.ts +0 -135
- package/src/lib/slots/index.ts +0 -3
- package/src/lib/slots/slot.types.ts +0 -64
- package/src/lib/slots/slot.utils.ts +0 -289
- package/src/lib/utils.ts +0 -10
- package/src/public-api.ts +0 -1
- package/src/services/resize-observer.service.ts +0 -181
- package/src/services/scroll-position.service.ts +0 -169
- package/src/styles/globals.css +0 -266
- package/src/styles/index.css +0 -3
- package/src/test-setup.ts +0 -15
- package/src/testing/index.ts +0 -3
- package/src/testing/testing.utils.ts +0 -248
- package/src/types/frontend-tool.ts +0 -44
- package/src/types/human-in-the-loop.ts +0 -52
- package/src/utils/__tests__/agent.utils.spec.ts +0 -234
- package/src/utils/__tests__/chat-config.utils.spec.ts +0 -306
- package/src/utils/__tests__/frontend-tool-inject.spec.ts +0 -350
- package/src/utils/__tests__/frontend-tool-integration.spec.ts +0 -199
- package/src/utils/__tests__/frontend-tool.utils.spec.ts +0 -272
- package/src/utils/__tests__/human-in-the-loop.utils.spec.ts +0 -365
- package/src/utils/agent-context.utils.ts +0 -133
- package/src/utils/agent.utils.ts +0 -239
- package/src/utils/chat-config.utils.ts +0 -221
- package/src/utils/copilotkit.utils.ts +0 -20
- package/src/utils/frontend-tool.utils.ts +0 -266
- package/src/utils/human-in-the-loop.utils.ts +0 -359
- package/tsconfig.spec.json +0 -12
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { Injectable, ElementRef, NgZone, OnDestroy } from '@angular/core';
|
|
2
|
-
import { ScrollDispatcher, ViewportRuler } from '@angular/cdk/scrolling';
|
|
3
|
-
import { Observable, Subject, BehaviorSubject, fromEvent, merge, animationFrameScheduler } from 'rxjs';
|
|
4
|
-
import {
|
|
5
|
-
takeUntil,
|
|
6
|
-
debounceTime,
|
|
7
|
-
throttleTime,
|
|
8
|
-
distinctUntilChanged,
|
|
9
|
-
map,
|
|
10
|
-
observeOn,
|
|
11
|
-
startWith
|
|
12
|
-
} from 'rxjs/operators';
|
|
13
|
-
|
|
14
|
-
export interface ScrollState {
|
|
15
|
-
isAtBottom: boolean;
|
|
16
|
-
scrollTop: number;
|
|
17
|
-
scrollHeight: number;
|
|
18
|
-
clientHeight: number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
@Injectable({
|
|
22
|
-
providedIn: 'root'
|
|
23
|
-
})
|
|
24
|
-
export class ScrollPositionService implements OnDestroy {
|
|
25
|
-
private destroy$ = new Subject<void>();
|
|
26
|
-
private scrollStateSubject = new BehaviorSubject<ScrollState>({
|
|
27
|
-
isAtBottom: true,
|
|
28
|
-
scrollTop: 0,
|
|
29
|
-
scrollHeight: 0,
|
|
30
|
-
clientHeight: 0
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
public scrollState$ = this.scrollStateSubject.asObservable();
|
|
34
|
-
|
|
35
|
-
constructor(
|
|
36
|
-
private scrollDispatcher: ScrollDispatcher,
|
|
37
|
-
private viewportRuler: ViewportRuler,
|
|
38
|
-
private ngZone: NgZone
|
|
39
|
-
) {}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Monitor scroll position of an element
|
|
43
|
-
* @param element The element to monitor
|
|
44
|
-
* @param threshold Pixels from bottom to consider "at bottom" (default 10)
|
|
45
|
-
*/
|
|
46
|
-
monitorScrollPosition(
|
|
47
|
-
element: ElementRef<HTMLElement> | HTMLElement,
|
|
48
|
-
threshold: number = 10
|
|
49
|
-
): Observable<ScrollState> {
|
|
50
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
51
|
-
|
|
52
|
-
// Create scroll observable
|
|
53
|
-
const scroll$ = merge(
|
|
54
|
-
fromEvent(el, 'scroll'),
|
|
55
|
-
this.viewportRuler.change(150) // Monitor viewport changes
|
|
56
|
-
).pipe(
|
|
57
|
-
startWith(null), // Emit initial state
|
|
58
|
-
throttleTime(16, animationFrameScheduler, { trailing: true }), // ~60fps
|
|
59
|
-
map(() => this.getScrollState(el, threshold)),
|
|
60
|
-
distinctUntilChanged((a, b) =>
|
|
61
|
-
a.isAtBottom === b.isAtBottom &&
|
|
62
|
-
a.scrollTop === b.scrollTop &&
|
|
63
|
-
a.scrollHeight === b.scrollHeight
|
|
64
|
-
),
|
|
65
|
-
takeUntil(this.destroy$)
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
// Subscribe and update subject
|
|
69
|
-
scroll$.subscribe(state => {
|
|
70
|
-
this.scrollStateSubject.next(state);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
return scroll$;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Scroll element to bottom with smooth animation
|
|
78
|
-
* @param element The element to scroll
|
|
79
|
-
* @param smooth Whether to use smooth scrolling
|
|
80
|
-
*/
|
|
81
|
-
scrollToBottom(
|
|
82
|
-
element: ElementRef<HTMLElement> | HTMLElement,
|
|
83
|
-
smooth: boolean = true
|
|
84
|
-
): void {
|
|
85
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
86
|
-
|
|
87
|
-
this.ngZone.runOutsideAngular(() => {
|
|
88
|
-
if (smooth && 'scrollBehavior' in document.documentElement.style) {
|
|
89
|
-
el.scrollTo({
|
|
90
|
-
top: el.scrollHeight,
|
|
91
|
-
behavior: 'smooth'
|
|
92
|
-
});
|
|
93
|
-
} else {
|
|
94
|
-
el.scrollTop = el.scrollHeight;
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Check if element is at bottom
|
|
101
|
-
* @param element The element to check
|
|
102
|
-
* @param threshold Pixels from bottom to consider "at bottom"
|
|
103
|
-
*/
|
|
104
|
-
isAtBottom(
|
|
105
|
-
element: ElementRef<HTMLElement> | HTMLElement,
|
|
106
|
-
threshold: number = 10
|
|
107
|
-
): boolean {
|
|
108
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
109
|
-
return this.getScrollState(el, threshold).isAtBottom;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Get current scroll state of element
|
|
114
|
-
*/
|
|
115
|
-
public getScrollState(element: HTMLElement, threshold: number): ScrollState {
|
|
116
|
-
const scrollTop = element.scrollTop;
|
|
117
|
-
const scrollHeight = element.scrollHeight;
|
|
118
|
-
const clientHeight = element.clientHeight;
|
|
119
|
-
const distanceFromBottom = scrollHeight - scrollTop - clientHeight;
|
|
120
|
-
const isAtBottom = distanceFromBottom <= threshold;
|
|
121
|
-
|
|
122
|
-
return {
|
|
123
|
-
isAtBottom,
|
|
124
|
-
scrollTop,
|
|
125
|
-
scrollHeight,
|
|
126
|
-
clientHeight
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Create a ResizeObserver for element size changes
|
|
132
|
-
* @param element The element to observe
|
|
133
|
-
* @param debounceMs Debounce time in milliseconds
|
|
134
|
-
*/
|
|
135
|
-
observeResize(
|
|
136
|
-
element: ElementRef<HTMLElement> | HTMLElement,
|
|
137
|
-
debounceMs: number = 250
|
|
138
|
-
): Observable<ResizeObserverEntry> {
|
|
139
|
-
const el = element instanceof ElementRef ? element.nativeElement : element;
|
|
140
|
-
const resize$ = new Subject<ResizeObserverEntry>();
|
|
141
|
-
|
|
142
|
-
const resizeObserver = new ResizeObserver((entries) => {
|
|
143
|
-
const entry = entries[0];
|
|
144
|
-
if (entry) {
|
|
145
|
-
this.ngZone.run(() => {
|
|
146
|
-
resize$.next(entry);
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
resizeObserver.observe(el);
|
|
152
|
-
|
|
153
|
-
// Cleanup on destroy
|
|
154
|
-
this.destroy$.subscribe(() => {
|
|
155
|
-
resizeObserver.disconnect();
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
return resize$.pipe(
|
|
159
|
-
debounceTime(debounceMs),
|
|
160
|
-
takeUntil(this.destroy$)
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
ngOnDestroy(): void {
|
|
165
|
-
this.destroy$.next();
|
|
166
|
-
this.destroy$.complete();
|
|
167
|
-
this.scrollStateSubject.complete();
|
|
168
|
-
}
|
|
169
|
-
}
|
package/src/styles/globals.css
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
@import "tailwindcss";
|
|
2
|
-
@plugin "@tailwindcss/typography";
|
|
3
|
-
@source "../**/*.{ts,html}";
|
|
4
|
-
@source "../../apps/angular/storybook/stories/**/*.{ts,html}";
|
|
5
|
-
|
|
6
|
-
@import "tw-animate-css";
|
|
7
|
-
|
|
8
|
-
@custom-variant dark (&:is(.dark *));
|
|
9
|
-
|
|
10
|
-
:root {
|
|
11
|
-
--background: oklch(1 0 0);
|
|
12
|
-
--foreground: oklch(0.145 0 0);
|
|
13
|
-
--card: oklch(1 0 0);
|
|
14
|
-
--card-foreground: oklch(0.145 0 0);
|
|
15
|
-
--popover: oklch(1 0 0);
|
|
16
|
-
--popover-foreground: oklch(0.145 0 0);
|
|
17
|
-
--primary: oklch(0.205 0 0);
|
|
18
|
-
--primary-foreground: oklch(0.985 0 0);
|
|
19
|
-
--secondary: oklch(0.97 0 0);
|
|
20
|
-
--secondary-foreground: oklch(0.205 0 0);
|
|
21
|
-
--muted: oklch(0.97 0 0);
|
|
22
|
-
--muted-foreground: oklch(0.556 0 0);
|
|
23
|
-
--accent: oklch(0.97 0 0);
|
|
24
|
-
--accent-foreground: oklch(0.205 0 0);
|
|
25
|
-
--destructive: oklch(0.577 0.245 27.325);
|
|
26
|
-
--destructive-foreground: oklch(0.577 0.245 27.325);
|
|
27
|
-
--border: oklch(0.922 0 0);
|
|
28
|
-
--input: oklch(0.922 0 0);
|
|
29
|
-
--ring: oklch(0.708 0 0);
|
|
30
|
-
--chart-1: oklch(0.646 0.222 41.116);
|
|
31
|
-
--chart-2: oklch(0.6 0.118 184.704);
|
|
32
|
-
--chart-3: oklch(0.398 0.07 227.392);
|
|
33
|
-
--chart-4: oklch(0.828 0.189 84.429);
|
|
34
|
-
--chart-5: oklch(0.769 0.188 70.08);
|
|
35
|
-
--radius: 0.625rem;
|
|
36
|
-
--sidebar: oklch(0.985 0 0);
|
|
37
|
-
--sidebar-foreground: oklch(0.145 0 0);
|
|
38
|
-
--sidebar-primary: oklch(0.205 0 0);
|
|
39
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
40
|
-
--sidebar-accent: oklch(0.97 0 0);
|
|
41
|
-
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
42
|
-
--sidebar-border: oklch(0.922 0 0);
|
|
43
|
-
--sidebar-ring: oklch(0.708 0 0);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.dark {
|
|
47
|
-
--background: oklch(0.145 0 0);
|
|
48
|
-
--foreground: oklch(0.985 0 0);
|
|
49
|
-
--card: oklch(0.145 0 0);
|
|
50
|
-
--card-foreground: oklch(0.985 0 0);
|
|
51
|
-
--popover: oklch(0.145 0 0);
|
|
52
|
-
--popover-foreground: oklch(0.985 0 0);
|
|
53
|
-
--primary: oklch(0.985 0 0);
|
|
54
|
-
--primary-foreground: oklch(0.205 0 0);
|
|
55
|
-
--secondary: oklch(0.269 0 0);
|
|
56
|
-
--secondary-foreground: oklch(0.985 0 0);
|
|
57
|
-
--muted: oklch(0.269 0 0);
|
|
58
|
-
--muted-foreground: oklch(0.708 0 0);
|
|
59
|
-
--accent: oklch(0.269 0 0);
|
|
60
|
-
--accent-foreground: oklch(0.985 0 0);
|
|
61
|
-
--destructive: oklch(0.396 0.141 25.723);
|
|
62
|
-
--destructive-foreground: oklch(0.637 0.237 25.331);
|
|
63
|
-
--border: oklch(0.269 0 0);
|
|
64
|
-
--input: oklch(0.269 0 0);
|
|
65
|
-
--ring: oklch(0.556 0 0);
|
|
66
|
-
--chart-1: oklch(0.488 0.243 264.376);
|
|
67
|
-
--chart-2: oklch(0.696 0.17 162.48);
|
|
68
|
-
--chart-3: oklch(0.769 0.188 70.08);
|
|
69
|
-
--chart-4: oklch(0.627 0.265 303.9);
|
|
70
|
-
--chart-5: oklch(0.645 0.246 16.439);
|
|
71
|
-
--sidebar: oklch(0.205 0 0);
|
|
72
|
-
--sidebar-foreground: oklch(0.985 0 0);
|
|
73
|
-
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
74
|
-
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
75
|
-
--sidebar-accent: oklch(0.269 0 0);
|
|
76
|
-
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
77
|
-
--sidebar-border: oklch(0.269 0 0);
|
|
78
|
-
--sidebar-ring: oklch(0.439 0 0);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
@theme inline {
|
|
82
|
-
--color-background: var(--background);
|
|
83
|
-
--color-foreground: var(--foreground);
|
|
84
|
-
--color-card: var(--card);
|
|
85
|
-
--color-card-foreground: var(--card-foreground);
|
|
86
|
-
--color-popover: var(--popover);
|
|
87
|
-
--color-popover-foreground: var(--popover-foreground);
|
|
88
|
-
--color-primary: var(--primary);
|
|
89
|
-
--color-primary-foreground: var(--primary-foreground);
|
|
90
|
-
--color-secondary: var(--secondary);
|
|
91
|
-
--color-secondary-foreground: var(--secondary-foreground);
|
|
92
|
-
--color-muted: var(--muted);
|
|
93
|
-
--color-muted-foreground: var(--muted-foreground);
|
|
94
|
-
--color-accent: var(--accent);
|
|
95
|
-
--color-accent-foreground: var(--accent-foreground);
|
|
96
|
-
--color-destructive: var(--destructive);
|
|
97
|
-
--color-destructive-foreground: var(--destructive-foreground);
|
|
98
|
-
--color-border: var(--border);
|
|
99
|
-
--color-input: var(--input);
|
|
100
|
-
--color-ring: var(--ring);
|
|
101
|
-
--color-chart-1: var(--chart-1);
|
|
102
|
-
--color-chart-2: var(--chart-2);
|
|
103
|
-
--color-chart-3: var(--chart-3);
|
|
104
|
-
--color-chart-4: var(--chart-4);
|
|
105
|
-
--color-chart-5: var(--chart-5);
|
|
106
|
-
--radius-sm: calc(var(--radius) - 4px);
|
|
107
|
-
--radius-md: calc(var(--radius) - 2px);
|
|
108
|
-
--radius-lg: var(--radius);
|
|
109
|
-
--radius-xl: calc(var(--radius) + 4px);
|
|
110
|
-
--color-sidebar: var(--sidebar);
|
|
111
|
-
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
112
|
-
--color-sidebar-primary: var(--sidebar-primary);
|
|
113
|
-
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
114
|
-
--color-sidebar-accent: var(--sidebar-accent);
|
|
115
|
-
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
116
|
-
--color-sidebar-border: var(--sidebar-border);
|
|
117
|
-
--color-sidebar-ring: var(--sidebar-ring);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
@theme {
|
|
121
|
-
--animate-pulse-cursor: pulse-cursor 0.9s cubic-bezier(0.4, 0, 0.2, 1)
|
|
122
|
-
infinite;
|
|
123
|
-
@keyframes pulse-cursor {
|
|
124
|
-
0%,
|
|
125
|
-
100% {
|
|
126
|
-
transform: scale(1);
|
|
127
|
-
opacity: 1;
|
|
128
|
-
}
|
|
129
|
-
50% {
|
|
130
|
-
transform: scale(1.5);
|
|
131
|
-
opacity: 0.8;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
@layer base {
|
|
137
|
-
* {
|
|
138
|
-
@apply border-border outline-ring/50;
|
|
139
|
-
}
|
|
140
|
-
body {
|
|
141
|
-
@apply bg-background text-foreground;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/* Shiki styles removed - Angular uses highlight.js instead */
|
|
146
|
-
|
|
147
|
-
.prose {
|
|
148
|
-
-webkit-font-smoothing: antialiased;
|
|
149
|
-
-moz-osx-font-smoothing: grayscale;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
.prose
|
|
153
|
-
:where(code):not(
|
|
154
|
-
:where([class~="not-prose"], [class~="not-prose"] *)
|
|
155
|
-
)::before {
|
|
156
|
-
content: none;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
.prose
|
|
160
|
-
:where(code):not(
|
|
161
|
-
:where([class~="not-prose"], [class~="not-prose"] *)
|
|
162
|
-
)::after {
|
|
163
|
-
content: none;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
.prose :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *)) {
|
|
167
|
-
font-weight: 400;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
.prose h1 {
|
|
171
|
-
margin-block-end: 8px;
|
|
172
|
-
margin-bottom: 8px;
|
|
173
|
-
font-size: 24px;
|
|
174
|
-
font-weight: 600;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
.prose h2 {
|
|
178
|
-
margin-block-end: 4px;
|
|
179
|
-
margin-block-start: 16px;
|
|
180
|
-
margin-top: 16px;
|
|
181
|
-
margin-bottom: 4px;
|
|
182
|
-
font-size: 20px;
|
|
183
|
-
font-weight: 600;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
.prose h3 {
|
|
187
|
-
margin-block-end: 4px;
|
|
188
|
-
margin-block-start: 16px;
|
|
189
|
-
margin-top: 16px;
|
|
190
|
-
margin-bottom: 4px;
|
|
191
|
-
font-size: 18px;
|
|
192
|
-
font-weight: 600;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
.prose p {
|
|
196
|
-
margin-block-start: 8px;
|
|
197
|
-
margin-block-end: 4px;
|
|
198
|
-
margin-top: 4px;
|
|
199
|
-
margin-bottom: 8px;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
.prose a {
|
|
203
|
-
color: #2964aa;
|
|
204
|
-
text-decoration: none;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
.prose a:hover {
|
|
208
|
-
color: #749ac8;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
.prose
|
|
212
|
-
:where(blockquote p:first-of-type):not(
|
|
213
|
-
:where([class~="not-prose"], [class~="not-prose"] *)
|
|
214
|
-
)::before {
|
|
215
|
-
content: none;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
.prose blockquote {
|
|
219
|
-
font-style: normal;
|
|
220
|
-
font-weight: 400;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
.prose input[type="checkbox"] {
|
|
224
|
-
appearance: none;
|
|
225
|
-
background-color: #fff;
|
|
226
|
-
background-origin: border-box;
|
|
227
|
-
border-color: #9b9b9b;
|
|
228
|
-
border-width: 1px;
|
|
229
|
-
color: #004f99;
|
|
230
|
-
display: inline-block;
|
|
231
|
-
flex-shrink: 0;
|
|
232
|
-
height: 1rem;
|
|
233
|
-
padding: 0;
|
|
234
|
-
-webkit-print-color-adjust: exact;
|
|
235
|
-
print-color-adjust: exact;
|
|
236
|
-
-webkit-user-select: none;
|
|
237
|
-
user-select: none;
|
|
238
|
-
vertical-align: middle;
|
|
239
|
-
width: 1rem;
|
|
240
|
-
border-radius: 2px;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
.prose input[type="checkbox"]:checked {
|
|
244
|
-
background-color: #004f99;
|
|
245
|
-
border-color: #004f99;
|
|
246
|
-
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E");
|
|
247
|
-
background-position: center;
|
|
248
|
-
background-repeat: no-repeat;
|
|
249
|
-
background-size: 100% 100%;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
.prose em {
|
|
253
|
-
@apply text-foreground;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
.prose hr {
|
|
257
|
-
margin-block-start: 0px;
|
|
258
|
-
margin-block-end: 0px;
|
|
259
|
-
margin-top: 28px;
|
|
260
|
-
margin-bottom: 28px;
|
|
261
|
-
color: rgb(13, 13, 13);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
.prose td {
|
|
265
|
-
@apply text-foreground;
|
|
266
|
-
}
|
package/src/styles/index.css
DELETED
package/src/test-setup.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
import 'zone.js';
|
|
3
|
-
import 'zone.js/testing';
|
|
4
|
-
import { getTestBed } from '@angular/core/testing';
|
|
5
|
-
import {
|
|
6
|
-
BrowserDynamicTestingModule,
|
|
7
|
-
platformBrowserDynamicTesting
|
|
8
|
-
} from '@angular/platform-browser-dynamic/testing';
|
|
9
|
-
|
|
10
|
-
// Initialize Angular testing environment
|
|
11
|
-
getTestBed().initTestEnvironment(
|
|
12
|
-
BrowserDynamicTestingModule,
|
|
13
|
-
platformBrowserDynamicTesting(),
|
|
14
|
-
{ teardown: { destroyAfterEach: true } }
|
|
15
|
-
);
|
package/src/testing/index.ts
DELETED
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { TestBed, TestModuleMetadata } from "@angular/core/testing";
|
|
2
|
-
import { DestroyRef } from "@angular/core";
|
|
3
|
-
import { provideCopilotKit } from "../core/copilotkit.providers";
|
|
4
|
-
import { provideCopilotChatConfiguration } from "../core/chat-configuration/chat-configuration.providers";
|
|
5
|
-
import { CopilotKitCoreConfig } from "@copilotkitnext/core";
|
|
6
|
-
import { CopilotChatConfiguration } from "../core/chat-configuration/chat-configuration.types";
|
|
7
|
-
import { vi } from "vitest";
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Creates a CopilotKit testing module with mock providers.
|
|
11
|
-
* Simplifies test setup and provides consistent mocking across tests.
|
|
12
|
-
*
|
|
13
|
-
* @param config - Optional CopilotKit configuration
|
|
14
|
-
* @param chatConfig - Optional chat configuration
|
|
15
|
-
* @param additionalProviders - Additional providers to include
|
|
16
|
-
* @returns Configured TestBed instance
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```typescript
|
|
20
|
-
* describe('MyComponent', () => {
|
|
21
|
-
* beforeEach(() => {
|
|
22
|
-
* createCopilotKitTestingModule({
|
|
23
|
-
* runtimeUrl: 'test-url'
|
|
24
|
-
* });
|
|
25
|
-
* });
|
|
26
|
-
*
|
|
27
|
-
* it('should work', () => {
|
|
28
|
-
* const fixture = TestBed.createComponent(MyComponent);
|
|
29
|
-
* // ...
|
|
30
|
-
* });
|
|
31
|
-
* });
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
/**
|
|
35
|
-
* Mock DestroyRef implementation for testing
|
|
36
|
-
*/
|
|
37
|
-
export class MockDestroyRef implements DestroyRef {
|
|
38
|
-
private callbacks: Array<() => void> = [];
|
|
39
|
-
|
|
40
|
-
onDestroy(callback: () => void): () => void {
|
|
41
|
-
this.callbacks.push(callback);
|
|
42
|
-
return () => {
|
|
43
|
-
const index = this.callbacks.indexOf(callback);
|
|
44
|
-
if (index > -1) {
|
|
45
|
-
this.callbacks.splice(index, 1);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Method to trigger destroy for testing
|
|
51
|
-
destroy(): void {
|
|
52
|
-
this.callbacks.forEach((cb) => cb());
|
|
53
|
-
this.callbacks = [];
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function createCopilotKitTestingModule(
|
|
58
|
-
config?: Partial<CopilotKitCoreConfig>,
|
|
59
|
-
chatConfig?: Partial<CopilotChatConfiguration>,
|
|
60
|
-
additionalProviders?: any[]
|
|
61
|
-
): any {
|
|
62
|
-
const mockDestroyRef = new MockDestroyRef();
|
|
63
|
-
|
|
64
|
-
const metadata: TestModuleMetadata = {
|
|
65
|
-
providers: [
|
|
66
|
-
{ provide: DestroyRef, useValue: mockDestroyRef },
|
|
67
|
-
...provideCopilotKit(
|
|
68
|
-
config
|
|
69
|
-
? {
|
|
70
|
-
runtimeUrl: config.runtimeUrl,
|
|
71
|
-
headers: config.headers as Record<string, string> | undefined,
|
|
72
|
-
properties: config.properties,
|
|
73
|
-
agents: config.agents,
|
|
74
|
-
}
|
|
75
|
-
: {}
|
|
76
|
-
),
|
|
77
|
-
...(chatConfig ? provideCopilotChatConfiguration(chatConfig) : []),
|
|
78
|
-
...(additionalProviders ?? []),
|
|
79
|
-
],
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const testBed = TestBed.configureTestingModule(metadata);
|
|
83
|
-
// Attach the mock to TestBed for testing access
|
|
84
|
-
(testBed as any).mockDestroyRef = mockDestroyRef;
|
|
85
|
-
return testBed;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Creates a mock CopilotKitCore instance for testing.
|
|
90
|
-
* Provides all necessary methods with vi.fn() mocks.
|
|
91
|
-
*
|
|
92
|
-
* @returns Mock CopilotKitCore instance
|
|
93
|
-
*
|
|
94
|
-
* @example
|
|
95
|
-
* ```typescript
|
|
96
|
-
* const mockCore = createMockCopilotKitCore();
|
|
97
|
-
* vi.spyOn(mockCore, 'addContext').mockReturnValue('context-id');
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
export function createMockCopilotKitCore() {
|
|
101
|
-
return {
|
|
102
|
-
addContext: vi.fn().mockImplementation(() => "context-id-" + Math.random()),
|
|
103
|
-
removeContext: vi.fn(),
|
|
104
|
-
addTool: vi.fn().mockImplementation(() => "tool-id-" + Math.random()),
|
|
105
|
-
removeTool: vi.fn(),
|
|
106
|
-
setRuntimeUrl: vi.fn(),
|
|
107
|
-
setHeaders: vi.fn(),
|
|
108
|
-
setProperties: vi.fn(),
|
|
109
|
-
setAgents: vi.fn(),
|
|
110
|
-
getAgent: vi.fn(),
|
|
111
|
-
subscribe: vi.fn(() => vi.fn()), // Returns unsubscribe function
|
|
112
|
-
getMessages: vi.fn(() => []),
|
|
113
|
-
getState: vi.fn(() => ({})),
|
|
114
|
-
send: vi.fn(),
|
|
115
|
-
render: vi.fn(),
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Creates a mock Agent instance for testing.
|
|
121
|
-
* Provides all necessary methods with vi.fn() mocks.
|
|
122
|
-
*
|
|
123
|
-
* @param id - Agent ID
|
|
124
|
-
* @returns Mock Agent instance
|
|
125
|
-
*
|
|
126
|
-
* @example
|
|
127
|
-
* ```typescript
|
|
128
|
-
* const mockAgent = createMockAgent('test-agent');
|
|
129
|
-
* vi.spyOn(mockAgent, 'subscribe').mockReturnValue({ unsubscribe: vi.fn() });
|
|
130
|
-
* ```
|
|
131
|
-
*/
|
|
132
|
-
export function createMockAgent(id: string = "test-agent") {
|
|
133
|
-
return {
|
|
134
|
-
id,
|
|
135
|
-
getMessages: vi.fn(() => []),
|
|
136
|
-
getState: vi.fn(() => ({})),
|
|
137
|
-
subscribe: vi.fn(() => ({ unsubscribe: vi.fn() })),
|
|
138
|
-
send: vi.fn(),
|
|
139
|
-
render: vi.fn(),
|
|
140
|
-
isRunning: vi.fn(() => false),
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Helper to create a test host component for directive testing.
|
|
146
|
-
* Reduces boilerplate in directive test files.
|
|
147
|
-
*
|
|
148
|
-
* @param template - Component template
|
|
149
|
-
* @param componentClass - Optional component class definition
|
|
150
|
-
* @returns Component class
|
|
151
|
-
*
|
|
152
|
-
* @example
|
|
153
|
-
* ```typescript
|
|
154
|
-
* const TestComponent = createTestHostComponent(`
|
|
155
|
-
* <div copilotkitAgent [agentId]="agentId"></div>
|
|
156
|
-
* `, {
|
|
157
|
-
* agentId: 'test-agent'
|
|
158
|
-
* });
|
|
159
|
-
* ```
|
|
160
|
-
*/
|
|
161
|
-
export function createTestHostComponent(
|
|
162
|
-
template: string,
|
|
163
|
-
componentClass: Record<string, any> = {}
|
|
164
|
-
): any {
|
|
165
|
-
return class TestHostComponent {
|
|
166
|
-
constructor() {
|
|
167
|
-
Object.assign(this, componentClass);
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Waits for Angular change detection to complete.
|
|
174
|
-
* Useful for testing async operations.
|
|
175
|
-
*
|
|
176
|
-
* @param fixture - Component fixture
|
|
177
|
-
* @param timeout - Maximum wait time in ms
|
|
178
|
-
* @returns Promise that resolves when stable
|
|
179
|
-
*
|
|
180
|
-
* @example
|
|
181
|
-
* ```typescript
|
|
182
|
-
* await waitForStable(fixture);
|
|
183
|
-
* expect(component.isReady).toBe(true);
|
|
184
|
-
* ```
|
|
185
|
-
*/
|
|
186
|
-
export async function waitForStable(
|
|
187
|
-
fixture: any,
|
|
188
|
-
timeout: number = 1000
|
|
189
|
-
): Promise<void> {
|
|
190
|
-
return new Promise((resolve, reject) => {
|
|
191
|
-
const startTime = Date.now();
|
|
192
|
-
|
|
193
|
-
const check = () => {
|
|
194
|
-
fixture.detectChanges();
|
|
195
|
-
|
|
196
|
-
if (fixture.isStable()) {
|
|
197
|
-
resolve();
|
|
198
|
-
} else if (Date.now() - startTime > timeout) {
|
|
199
|
-
reject(new Error("Fixture did not stabilize within timeout"));
|
|
200
|
-
} else {
|
|
201
|
-
setTimeout(check, 10);
|
|
202
|
-
}
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
check();
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* Creates a mock render function for tool testing.
|
|
211
|
-
*
|
|
212
|
-
* @returns Mock render function
|
|
213
|
-
*/
|
|
214
|
-
export function createMockToolRender() {
|
|
215
|
-
return vi.fn().mockImplementation((props: any) => {
|
|
216
|
-
return { type: "mock-render", props };
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* Creates a mock tool handler for testing.
|
|
222
|
-
*
|
|
223
|
-
* @param returnValue - Value to return from handler
|
|
224
|
-
* @returns Mock handler function
|
|
225
|
-
*/
|
|
226
|
-
export function createMockToolHandler(returnValue: any = "mock-result") {
|
|
227
|
-
return vi.fn().mockResolvedValue(returnValue);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Helper to test directive lifecycle methods.
|
|
232
|
-
*
|
|
233
|
-
* @param directive - Directive instance
|
|
234
|
-
* @param changes - SimpleChanges to apply
|
|
235
|
-
*/
|
|
236
|
-
export function triggerLifecycle(directive: any, changes?: any): void {
|
|
237
|
-
if (directive.ngOnInit) {
|
|
238
|
-
directive.ngOnInit();
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if (changes && directive.ngOnChanges) {
|
|
242
|
-
directive.ngOnChanges(changes);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
if (directive.ngOnDestroy) {
|
|
246
|
-
directive.ngOnDestroy();
|
|
247
|
-
}
|
|
248
|
-
}
|