Skip to content
This repository was archived by the owner on Jan 24, 2023. It is now read-only.

Commit 34ced94

Browse files
committedJun 21, 2019
add src folder
1 parent 7ed90e8 commit 34ced94

28 files changed

+8097
-9706
lines changed
 

‎package-lock.json

-9,672
This file was deleted.

‎src/app/app.component.html

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<div class="todoapp">
2+
<h1>todos</h1>
3+
</div>
4+
<app-todo></app-todo>

‎src/app/app.component.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { Component, NgZone } from '@angular/core';
2+
3+
@Component({
4+
selector: 'app-root',
5+
templateUrl: './app.component.html'
6+
})
7+
export class AppComponent {
8+
9+
constructor(private zone: NgZone) {
10+
(window as any).ngZone = zone;
11+
}
12+
}

‎src/app/app.module.ts

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import {BrowserModule} from '@angular/platform-browser';
2+
import {NgModule} from '@angular/core';
3+
import {FormsModule} from '@angular/forms';
4+
// import {AutofocusModule} from 'angular-autofocus-fix';
5+
import {RouterModule, Routes} from '@angular/router';
6+
7+
import {TodoComponent} from './components/todo/todo.component';
8+
import {TodoService} from './todo.service';
9+
import {AppComponent} from './app.component';
10+
import { TodosListComponent } from './components/todos-list/todos-list.component';
11+
12+
13+
const routes: Routes = [
14+
{path: '', component: TodoComponent, pathMatch: 'full'},
15+
{path: ':filter', component: TodoComponent}
16+
];
17+
18+
@NgModule({
19+
declarations: [
20+
AppComponent,
21+
TodoComponent,
22+
TodosListComponent
23+
],
24+
imports: [
25+
BrowserModule,
26+
FormsModule,
27+
// AutofocusModule,
28+
RouterModule.forRoot(routes, {useHash: true})
29+
],
30+
providers: [TodoService],
31+
bootstrap: [AppComponent]
32+
})
33+
export class AppModule {}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import {Todo} from './todo.model';
2+
3+
export enum Filter {
4+
ALL = 'SHOW_ALL', ACTIVE = 'SHOW_ACTIVE', COMPLETED = 'SHOW_COMPLETED'
5+
}
6+
7+
export class FilterUtil {
8+
static fromString(filter: string): Filter {
9+
switch (filter) {
10+
case 'completed':
11+
return Filter.COMPLETED;
12+
case 'active':
13+
return Filter.ACTIVE;
14+
case 'all':
15+
default:
16+
return Filter.ALL;
17+
}
18+
}
19+
20+
static accepts(todo: Todo, filter?: Filter): boolean {
21+
switch (filter) {
22+
case Filter.ACTIVE:
23+
return !todo.completed;
24+
case Filter.COMPLETED:
25+
return todo.completed;
26+
case Filter.ALL:
27+
default:
28+
return true;
29+
}
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<section class="todoapp">
2+
<header class="header">
3+
<input class="new-todo" placeholder="What needs to be done?"
4+
#todo [(ngModel)]="newTodo" (keyup.enter)="create(todo.value)">
5+
</header>
6+
<app-todos-list [todos]="todos"
7+
(toggleAll)="toggleAll($event)"
8+
(toggle)="toggle($event)"
9+
(update)="update($event)"
10+
(delete)="delete($event)"></app-todos-list>
11+
<footer *ngIf="todos.length > 0" class="footer">
12+
<span class="todo-count"><strong>{{remaining}}</strong> item{{remaining !== 1 ? 's' : ''}} left</span>
13+
14+
<ul class="filters">
15+
<li><a [routerLink]="['']" [ngClass]="{'selected': filter == 'SHOW_ALL'}">All</a></li>
16+
<li><a [routerLink]="['', 'active']" [ngClass]="{'selected': filter == 'SHOW_ACTIVE'}">Active</a></li>
17+
<li><a [routerLink]="['', 'completed']" [ngClass]="{'selected': filter == 'SHOW_COMPLETED'}">Completed</a>
18+
</li>
19+
</ul>
20+
21+
<button *ngIf="completed > 0" class="clear-completed" (click)="clearCompleted()">Clear completed</button>
22+
</footer>
23+
</section>
24+
<footer class="info">
25+
<p>Double-click to edit a todo</p>
26+
<p>Based on <a href="http://todomvc.com">TodoMVC</a></p>
27+
</footer>
+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { ChangeDetectionStrategy, Component, DoCheck, OnDestroy, OnInit } from '@angular/core';
2+
import { ActivatedRoute } from '@angular/router';
3+
import { Subscription } from 'rxjs';
4+
5+
import { Todo, TodoUtils } from './todo.model';
6+
import { Filter, FilterUtil } from './filter.model';
7+
import { TodoService } from '../../todo.service';
8+
9+
10+
@Component({
11+
selector: 'app-todo',
12+
templateUrl: './todo.component.html',
13+
changeDetection: ChangeDetectionStrategy.OnPush
14+
})
15+
export class TodoComponent implements OnInit, DoCheck, OnDestroy {
16+
17+
private routeSubscription: Subscription;
18+
19+
newTodo = '';
20+
currentTodo: Todo;
21+
snapshot: Todo;
22+
23+
filter = Filter.ALL;
24+
todos: Todo[];
25+
filteredTodos: Todo[];
26+
27+
28+
constructor(private todoService: TodoService, private route: ActivatedRoute) {
29+
}
30+
31+
// ~ lifecycle
32+
33+
ngOnInit() {
34+
this.routeSubscription = this.route.params.subscribe(params => {
35+
this.filter = FilterUtil.fromString(params['filter']);
36+
});
37+
}
38+
39+
ngDoCheck() {
40+
this.todos = this.todoService.findAll();
41+
this.filteredTodos = this.todos.filter((t) => FilterUtil.accepts(t, this.filter));
42+
// this.todos.forEach(t => t.completed ? this.completed++ : this.remaining++);
43+
}
44+
45+
ngOnDestroy(): void {
46+
this.routeSubscription.unsubscribe();
47+
}
48+
49+
// ~ crud
50+
51+
create(todo: string) {
52+
if (todo.trim().length === 0) {
53+
return;
54+
}
55+
this.todoService.create(todo);
56+
this.newTodo = '';
57+
}
58+
59+
update(todo: Todo) {
60+
this.currentTodo = null;
61+
this.snapshot = null;
62+
this.todoService.update(todo);
63+
}
64+
65+
delete(todo: Todo) {
66+
this.todoService.delete(todo);
67+
}
68+
69+
toggle(todo: Todo) {
70+
this.todoService.toggle(todo);
71+
}
72+
73+
toggleAll(completed: boolean) {
74+
this.todoService.toggleAll(completed);
75+
}
76+
77+
clearCompleted() {
78+
this.todoService.clearCompleted();
79+
}
80+
}

‎src/app/components/todo/todo.model.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
export class Todo {
2+
id: number;
3+
title: string;
4+
completed: boolean;
5+
6+
constructor(id: number, title: string, completed?: boolean) {
7+
this.id = id;
8+
this.title = title;
9+
this.completed = completed ? completed : false;
10+
}
11+
}
12+
13+
export class TodoUtils {
14+
15+
static copy(todo: Todo) {
16+
const copy = new Todo(null, null);
17+
this.copyProperties(todo, copy);
18+
return copy;
19+
}
20+
21+
static copyProperties(src: Todo, dest: Todo) {
22+
dest.id = src.id;
23+
dest.title = src.title;
24+
dest.completed = src.completed;
25+
}
26+
}

‎src/app/components/todos-list/todos-list.component.css

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { TodosListComponent } from './todos-list.component';
4+
5+
describe('TodosListComponent', () => {
6+
let component: TodosListComponent;
7+
let fixture: ComponentFixture<TodosListComponent>;
8+
9+
beforeEach(async(() => {
10+
TestBed.configureTestingModule({
11+
declarations: [ TodosListComponent ]
12+
})
13+
.compileComponents();
14+
}));
15+
16+
beforeEach(() => {
17+
fixture = TestBed.createComponent(TodosListComponent);
18+
component = fixture.componentInstance;
19+
fixture.detectChanges();
20+
});
21+
22+
it('should create', () => {
23+
expect(component).toBeTruthy();
24+
});
25+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { ChangeDetectionStrategy, Component, DoCheck, EventEmitter, Input, Output } from '@angular/core';
2+
import { Todo, TodoUtils } from '../todo/todo.model';
3+
4+
@Component({
5+
selector: 'app-todos-list',
6+
template: `
7+
<section *ngIf="todos.length > 0" class="main">
8+
<input class="toggle-all" id="toggle-all" type="checkbox"
9+
#inputToggleAll [checked]="allCompleted" (click)="toggleAll.emit()">
10+
<label for="toggle-all">Mark all as complete</label>
11+
<ul class="todo-list">
12+
<!--TODO: do something with filtered todos here-->
13+
<li *ngFor="let todo of todos"
14+
[ngClass]="{'completed' : todo.completed, 'editing': todo == currentTodo}">
15+
<div class="view">
16+
<input class="toggle" type="checkbox" (change)="toggle.emit(todo)" [checked]="todo.completed">
17+
<label *ngIf="currentTodo?.id != todo.id" (dblclick)="edit(todo)">{{todo.title}}</label>
18+
<button (click)="delete.emit(todo)" class="destroy"></button>
19+
</div>
20+
<input *ngIf="currentTodo == todo" [(ngModel)]="currentTodo.title"
21+
(keyup.enter)="update.emit(currentTodo)"
22+
(keyup.esc)="cancelEdit()"
23+
class="edit">
24+
</li>
25+
</ul>
26+
</section>
27+
`,
28+
styleUrls: ['./todos-list.component.css'],
29+
changeDetection: ChangeDetectionStrategy.OnPush
30+
})
31+
export class TodosListComponent implements DoCheck {
32+
@Input() todos: Todo[];
33+
@Output() toggleAll = new EventEmitter<boolean>();
34+
@Output() toggle = new EventEmitter<Todo>();
35+
@Output() update = new EventEmitter<Todo>();
36+
@Output() delete = new EventEmitter<Todo>();
37+
38+
allCompleted = false;
39+
completed: number;
40+
remaining: number;
41+
42+
currentTodo: Todo;
43+
snapshot: Todo;
44+
45+
constructor() {
46+
}
47+
48+
ngDoCheck() {
49+
this.remaining = this.completed = 0;
50+
this.allCompleted = this.todos.length === this.completed;
51+
}
52+
53+
edit(todo: Todo) {
54+
this.currentTodo = todo;
55+
this.snapshot = TodoUtils.copy(todo);
56+
}
57+
58+
cancelEdit() {
59+
TodoUtils.copyProperties(this.snapshot, this.currentTodo);
60+
this.currentTodo = null;
61+
this.snapshot = null;
62+
}
63+
}

‎src/app/todo.service.ts

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { Injectable } from '@angular/core';
2+
3+
import { Todo } from './components/todo/todo.model';
4+
5+
@Injectable()
6+
export class TodoService {
7+
8+
private static STORAGE_KEY = 'todos-angular-5';
9+
private lastInsertId = 0;
10+
private todos: Todo[] = [];
11+
12+
constructor() {
13+
this.fetch();
14+
if (this.todos.length > 0) {
15+
this.lastInsertId = this.todos[this.todos.length - 1].id;
16+
}
17+
}
18+
19+
create(todo: string): Todo {
20+
todo = todo.trim();
21+
if (todo.length === 0) {
22+
return;
23+
}
24+
const newTodo = new Todo(++this.lastInsertId, todo);
25+
this.todos = [...this.todos, newTodo];
26+
this.save();
27+
return newTodo;
28+
}
29+
30+
findAll() {
31+
return this.todos;
32+
}
33+
34+
update(todoToUpdate: Todo) {
35+
36+
this.save();
37+
}
38+
39+
delete(todo: Todo) {
40+
this.todos = this.todos.filter((t) => t !== todo);
41+
this.save();
42+
}
43+
44+
toggle(todoToUpdate: Todo) {
45+
this.todos = this.todos.map((todo) => todo.id === todoToUpdate.id ? {...todo, completed: !todo.completed} : todo);
46+
this.save();
47+
}
48+
49+
toggleAll(completed: boolean) {
50+
this.todos = this.todos.map((t) => ({...t, completed}));
51+
this.save();
52+
}
53+
54+
clearCompleted() {
55+
this.todos = this.todos.filter((t) => !t.completed);
56+
this.save();
57+
}
58+
59+
remaining() {
60+
return this.todos
61+
.filter(t => !t.completed)
62+
.length;
63+
}
64+
65+
completed() {
66+
return this.todos
67+
.filter(t => t.completed)
68+
.length;
69+
}
70+
71+
private fetch() {
72+
const persistedValue = localStorage.getItem(TodoService.STORAGE_KEY);
73+
try {
74+
this.todos = JSON.parse(persistedValue || '[]');
75+
} catch (ignore) {
76+
this.todos = [];
77+
}
78+
}
79+
80+
private save(): void {
81+
localStorage.setItem(TodoService.STORAGE_KEY, JSON.stringify(this.todos));
82+
}
83+
}

‎src/assets/.gitkeep

Whitespace-only changes.

‎src/assets/angular-diagnostic.js

+328
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
// const origSetTimeout = window.setTimeout;
2+
// window.setTimeout = function(...args) {
3+
//
4+
// };
5+
const CANVAS_NODE_ID = 'TraceUpdatesWebNodePresenter';
6+
7+
const OUTLINE_COLOR = '#f0f0f0';
8+
9+
const COLORS = [
10+
// coolest
11+
'#55cef6',
12+
'#55f67b',
13+
'#a5f655',
14+
'#f4f655',
15+
'#f6a555',
16+
'#f66855',
17+
// hottest
18+
'#ff0000',
19+
];
20+
21+
const HOTTEST_COLOR = COLORS[COLORS.length - 1];
22+
const DURATION = 2500;
23+
24+
class Tracer {
25+
_canvas;
26+
_pool = new Map();
27+
_drawing;
28+
29+
present(measurement) {
30+
console.log('new measurement');
31+
var data;
32+
if (this._pool.has(measurement)) {
33+
data = this._pool.get(measurement);
34+
} else {
35+
data = {};
36+
}
37+
38+
data = {
39+
expiration: Date.now() + DURATION,
40+
hit: data.hit + 1,
41+
};
42+
43+
this._pool = this._pool.set(measurement, data);
44+
45+
if (this._drawing) {
46+
return;
47+
}
48+
49+
this._drawing = true;
50+
Zone.root.run(() => {
51+
requestAnimationFrame(this._draw.bind(this));
52+
});
53+
}
54+
55+
_draw() {
56+
var now = Date.now();
57+
var minExpiration = Number.MAX_VALUE;
58+
59+
const temp = new Map();
60+
for (let [measurement, data] of this._pool.entries()) {
61+
if (data.expiration < now) {
62+
// already passed the expiration time.
63+
} else {
64+
// TODO what does this even do?
65+
console.log('setting', minExpiration);
66+
minExpiration = Math.min(data.expiration, minExpiration);
67+
console.log('setting', minExpiration);
68+
temp.set(measurement, data);
69+
}
70+
}
71+
this._pool = temp;
72+
73+
this.drawImpl(this._pool);
74+
75+
if (this._pool.size > 0) {
76+
// debugger;
77+
if (this._clearTimer != null) {
78+
clearTimeout(this._clearTimer);
79+
}
80+
this._clearTimer = Zone.root.run(() => {
81+
setTimeout(this._redraw.bind(this), minExpiration - now);
82+
});
83+
}
84+
85+
this._drawing = false;
86+
console.log('set drawing false');
87+
}
88+
89+
_redraw() {
90+
this._clearTimer = null;
91+
if (!this._drawing && this._pool.size > 0) {
92+
this._drawing = true;
93+
this._draw();
94+
}
95+
}
96+
97+
drawImpl(pool) {
98+
this._ensureCanvas();
99+
var canvas = this._canvas;
100+
var ctx = canvas.getContext('2d');
101+
ctx.clearRect(
102+
0,
103+
0,
104+
canvas.width,
105+
canvas.height
106+
);
107+
for (const [measurement, data] of pool.entries()) {
108+
const color = COLORS[data.hit - 1] || HOTTEST_COLOR;
109+
drawBorder(ctx, measurement, 1, color);
110+
}
111+
}
112+
113+
114+
clearImpl() {
115+
var canvas = this._canvas;
116+
if (canvas === null) {
117+
return;
118+
}
119+
120+
if (!canvas.parentNode) {
121+
return;
122+
}
123+
124+
var ctx = canvas.getContext('2d');
125+
ctx.clearRect(
126+
0,
127+
0,
128+
canvas.width,
129+
canvas.height
130+
);
131+
132+
canvas.parentNode.removeChild(canvas);
133+
this._canvas = null;
134+
}
135+
136+
_ensureCanvas() {
137+
var canvas = this._canvas;
138+
if (canvas === null || canvas === undefined) {
139+
canvas =
140+
window.document.getElementById(CANVAS_NODE_ID) ||
141+
window.document.createElement('canvas');
142+
143+
canvas.id = CANVAS_NODE_ID;
144+
canvas.width = window.screen.availWidth;
145+
canvas.height = window.screen.availHeight;
146+
canvas.style.cssText = `
147+
xx-background-color: red;
148+
xx-opacity: 0.5;
149+
bottom: 0;
150+
left: 0;
151+
pointer-events: none;
152+
position: fixed;
153+
right: 0;
154+
top: 0;
155+
z-index: 1000000000;
156+
`;
157+
}
158+
159+
if (!canvas.parentNode) {
160+
var root = window.document.documentElement;
161+
root.insertBefore(canvas, root.firstChild);
162+
}
163+
this._canvas = canvas;
164+
}
165+
}
166+
167+
168+
function drawBorder(ctx, measurement, borderWidth, borderColor) {
169+
// outline
170+
ctx.lineWidth = 1;
171+
ctx.strokeStyle = OUTLINE_COLOR;
172+
173+
ctx.strokeRect(
174+
measurement.left - 1,
175+
measurement.top - 1,
176+
measurement.width + 2,
177+
measurement.height + 2,
178+
);
179+
180+
// inset
181+
ctx.lineWidth = 1;
182+
ctx.strokeStyle = OUTLINE_COLOR;
183+
ctx.strokeRect(
184+
measurement.left + borderWidth,
185+
measurement.top + borderWidth,
186+
measurement.width - borderWidth,
187+
measurement.height - borderWidth,
188+
);
189+
ctx.strokeStyle = borderColor;
190+
191+
192+
// if (measurement.should_update) {
193+
ctx.setLineDash([0]);
194+
// } else {
195+
// ctx.setLineDash([0]);
196+
// }
197+
198+
// border
199+
ctx.lineWidth = '' + borderWidth;
200+
ctx.strokeRect(
201+
measurement.left + Math.floor(borderWidth / 2),
202+
measurement.top + Math.floor(borderWidth / 2),
203+
measurement.width - borderWidth,
204+
measurement.height - borderWidth,
205+
);
206+
207+
ctx.setLineDash([0]);
208+
}
209+
210+
let borderRemovals = [];
211+
212+
213+
// export type Measurement = {
214+
// bottom: number,
215+
// expiration: number,
216+
// height: number,
217+
// id: string,
218+
// left: number,
219+
// right: number,
220+
// scrollX: number,
221+
// scrollY: number,
222+
// top: number,
223+
// width: number,
224+
// };
225+
226+
const createMeasurement = (rect) => {
227+
return {
228+
left: rect.left,
229+
top: rect.top,
230+
width: rect.width,
231+
height: rect.height,
232+
}
233+
};
234+
235+
const createDiv = (rect, spanText) => {
236+
const div = document.createElement('div');
237+
div.style.position = 'fixed';
238+
div.style.height = rect.height + 1 + 'px';
239+
div.style.width = rect.width + 1 + 'px';
240+
div.style.top = rect.top + 'px';
241+
div.style.left = rect.left + 'px';
242+
div.style.border = '1px solid blue';
243+
div.style.animation = 'hide 15000ms forwards';
244+
245+
const span = document.createElement('span');
246+
span.style.position = 'fixed';
247+
span.style.top = rect.top + 'px';
248+
span.style.left = rect.left + 'px';
249+
span.textContent = spanText;
250+
251+
div.appendChild(span);
252+
return div;
253+
};
254+
255+
const refs = {};
256+
257+
const tracer = new Tracer();
258+
259+
const monkeyPatchTemplate = (instance, isRoot = false) => {
260+
const origTemplate = instance[1].template;
261+
instance[1].template = function (...args) {
262+
console.debug('Calling the original template function');
263+
origTemplate(...args);
264+
console.debug('After the original template function');
265+
const tagName = instance[0].tagName;
266+
console.log('CD for ', tagName);
267+
// if (refs[tagName]) {
268+
// document.body.removeChild(refs[tagName]);
269+
// }
270+
271+
tracer.present(createMeasurement(instance[0].getBoundingClientRect()));
272+
// const runOutsideZone = () => {
273+
// setTimeout(() => {
274+
// // const div = createDiv(instance[0].getBoundingClientRect(), tagName);
275+
// // refs[tagName] = div;
276+
// // document.body.appendChild(div);
277+
// // Zone.root.run(() => {
278+
// // // TODO should this event listener be removed as well?
279+
// // div.addEventListener('animationend', () => {
280+
// // console.log('Removing the div');
281+
// // document.body.removeChild(div);
282+
// // delete refs[tagName];
283+
// // });
284+
// // });
285+
// });
286+
// };
287+
//
288+
// Zone.root.run(runOutsideZone);
289+
}
290+
};
291+
292+
const loopComponents = (parentNode) => {
293+
const components = parentNode[1].components;
294+
if (!components) {
295+
return;
296+
}
297+
for (let i = 0; i < components.length; i++) {
298+
console.log('found component ' + parentNode[components[i]][0].tagName);
299+
monkeyPatchTemplate(parentNode[components[i]]);
300+
loopComponents(parentNode[components[i]]);
301+
}
302+
};
303+
304+
const findRootNode = (node) => {
305+
if (!node || !node.childNodes) {
306+
return;
307+
}
308+
const childNodes = node.childNodes;
309+
for (let i = 0; i < childNodes.length; i++) {
310+
let childNode = childNodes[i];
311+
if (childNode.__ngContext__) {
312+
const instance = childNode.__ngContext__.debug._raw_lView[20];
313+
monkeyPatchTemplate(instance, true);
314+
loopComponents(instance)
315+
} else {
316+
findRootNode(childNode);
317+
}
318+
}
319+
}
320+
;
321+
322+
setTimeout(() => {
323+
console.debug('booting the plugin');
324+
325+
findRootNode(document.body);
326+
}, 2000);
327+
328+

‎src/assets/tracing.js

+198
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
const CANVAS_NODE_ID = 'TraceUpdatesWebNodePresenter';
2+
3+
const OUTLINE_COLOR = '#f0f0f0';
4+
5+
const COLORS = [
6+
// coolest
7+
'#55cef6',
8+
'#55f67b',
9+
'#a5f655',
10+
'#f4f655',
11+
'#f6a555',
12+
'#f66855',
13+
// hottest
14+
'#ff0000',
15+
];
16+
17+
const HOTTEST_COLOR = COLORS[COLORS.length - 1];
18+
const DURATION = 250;
19+
20+
export class Tracer {
21+
_canvas;
22+
_pool = new Map();
23+
_drawing;
24+
25+
present(measurement) {
26+
var data;
27+
if (this._pool.has(measurement)) {
28+
data = this._pool.get(measurement);
29+
} else {
30+
data = {};
31+
}
32+
33+
data = {
34+
expiration: Date.now() + DURATION,
35+
hit: data.hit + 1,
36+
};
37+
38+
this._pool = this._pool.set(measurement, data);
39+
40+
if (this._drawing) {
41+
return;
42+
}
43+
44+
this._drawing = true;
45+
requestAnimationFrame(this._draw);
46+
}
47+
48+
_draw() {
49+
var now = Date.now();
50+
var minExpiration = Number.MAX_VALUE;
51+
52+
this._pool = this._pool.forEach(_pool => {
53+
for (const [measurement, data] of _pool.entries()) {
54+
if (data.expiration < now) {
55+
// already passed the expiration time.
56+
_pool.delete(measurement);
57+
} else {
58+
// TODO what does this even do?
59+
minExpiration = Math.min(data.expiration, minExpiration);
60+
}
61+
}
62+
});
63+
64+
this.drawImpl(this._pool);
65+
66+
if (this._pool.size > 0) {
67+
if (this._clearTimer != null) {
68+
clearTimeout(this._clearTimer);
69+
}
70+
this._clearTimer = Zone.root.run(() => {
71+
setTimeout(this._redraw, minExpiration - now);
72+
});
73+
}
74+
75+
this._drawing = false;
76+
}
77+
78+
_redraw() {
79+
this._clearTimer = null;
80+
if (!this._drawing && this._pool.size > 0) {
81+
this._drawing = true;
82+
this._draw();
83+
}
84+
}
85+
86+
drawImpl(pool) {
87+
this._ensureCanvas();
88+
var canvas = this._canvas;
89+
var ctx = canvas.getContext('2d');
90+
ctx.clearRect(
91+
0,
92+
0,
93+
canvas.width,
94+
canvas.height
95+
);
96+
for (const [measurement, data] of pool.entries()) {
97+
const color = COLORS[data.hit - 1] || HOTTEST_COLOR;
98+
drawBorder(ctx, measurement, 1, color);
99+
}
100+
}
101+
102+
103+
clearImpl() {
104+
var canvas = this._canvas;
105+
if (canvas === null) {
106+
return;
107+
}
108+
109+
if (!canvas.parentNode) {
110+
return;
111+
}
112+
113+
var ctx = canvas.getContext('2d');
114+
ctx.clearRect(
115+
0,
116+
0,
117+
canvas.width,
118+
canvas.height
119+
);
120+
121+
canvas.parentNode.removeChild(canvas);
122+
this._canvas = null;
123+
}
124+
125+
_ensureCanvas() {
126+
var canvas = this._canvas;
127+
if (canvas === null) {
128+
canvas =
129+
window.document.getElementById(CANVAS_NODE_ID) ||
130+
window.document.createElement('canvas');
131+
132+
canvas.id = CANVAS_NODE_ID;
133+
canvas.width = window.screen.availWidth;
134+
canvas.height = window.screen.availHeight;
135+
canvas.style.cssText = `
136+
xx-background-color: red;
137+
xx-opacity: 0.5;
138+
bottom: 0;
139+
left: 0;
140+
pointer-events: none;
141+
position: fixed;
142+
right: 0;
143+
top: 0;
144+
z-index: 1000000000;
145+
`;
146+
}
147+
148+
if (!canvas.parentNode) {
149+
var root = window.document.documentElement;
150+
root.insertBefore(canvas, root.firstChild);
151+
}
152+
this._canvas = canvas;
153+
}
154+
}
155+
156+
157+
function drawBorder(ctx, measurement, borderWidth, borderColor) {
158+
// outline
159+
ctx.lineWidth = 1;
160+
ctx.strokeStyle = OUTLINE_COLOR;
161+
162+
ctx.strokeRect(
163+
measurement.left- 1,
164+
measurement.top - 1,
165+
measurement.width + 2,
166+
measurement.height + 2,
167+
);
168+
169+
// inset
170+
ctx.lineWidth = 1;
171+
ctx.strokeStyle = OUTLINE_COLOR;
172+
ctx.strokeRect(
173+
measurement.left + borderWidth,
174+
measurement.top + borderWidth,
175+
measurement.width - borderWidth,
176+
measurement.height - borderWidth,
177+
);
178+
ctx.strokeStyle = borderColor;
179+
180+
181+
// if (measurement.should_update) {
182+
ctx.setLineDash([2]);
183+
// } else {
184+
// ctx.setLineDash([0]);
185+
// }
186+
187+
// border
188+
ctx.lineWidth = '' + borderWidth;
189+
ctx.strokeRect(
190+
measurement.left + Math.floor(borderWidth / 2),
191+
measurement.top + Math.floor(borderWidth / 2),
192+
measurement.width - borderWidth,
193+
measurement.height - borderWidth,
194+
);
195+
196+
ctx.setLineDash([0]);
197+
}
198+

‎src/environments/environment.prod.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const environment = {
2+
production: true
3+
};

‎src/environments/environment.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// The file contents for the current environment will overwrite these during build.
2+
// The build system defaults to the dev environment which uses `environment.ts`, but if you do
3+
// `ng build --env=prod` then `environment.prod.ts` will be used instead.
4+
// The list of which env maps to which file can be found in `.angular-cli.json`.
5+
6+
export const environment = {
7+
production: false
8+
};

‎src/favicon.ico

5.3 KB
Binary file not shown.

‎src/index.html

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>AngularTodomvc</title>
6+
<base href="/">
7+
8+
<meta name="viewport" content="width=device-width, initial-scale=1">
9+
<link rel="icon" type="image/x-icon" href="favicon.ico">
10+
<script type="text/javascript" src="assets/angular-diagnostic.js"></script>
11+
</head>
12+
<body>
13+
<app-root></app-root>
14+
</body>
15+
</html>

‎src/main.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { enableProdMode } from '@angular/core';
2+
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
3+
4+
import { AppModule } from './app/app.module';
5+
6+
enableProdMode();
7+
8+
platformBrowserDynamic().bootstrapModule(AppModule)
9+
.catch(err => console.log(err));

‎src/polyfills.ts

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
3+
4+
/**
5+
* Required to support Web Animations `@angular/platform-browser/animations`.
6+
* Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
7+
**/
8+
// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
9+
10+
11+
12+
/***************************************************************************************************
13+
* Zone JS is required by default for Angular itself.
14+
*/
15+
import 'zone.js/dist/zone'; // Included with Angular CLI.
16+
17+
18+
19+
/***************************************************************************************************
20+
* APPLICATION IMPORTS
21+
*/

‎src/styles.css

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
@import '~todomvc-common/base.css';
2+
@import '~todomvc-app-css/index.css';
3+
4+
@keyframes hide {
5+
0% {
6+
opacity: 1;
7+
}
8+
100% {
9+
opacity: 0;
10+
}
11+
}

‎src/test.ts

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
2+
3+
import 'zone.js/dist/long-stack-trace-zone';
4+
import 'zone.js/dist/proxy.js';
5+
import 'zone.js/dist/sync-test';
6+
import 'zone.js/dist/jasmine-patch';
7+
import 'zone.js/dist/async-test';
8+
import 'zone.js/dist/fake-async-test';
9+
import { getTestBed } from '@angular/core/testing';
10+
import {
11+
BrowserDynamicTestingModule,
12+
platformBrowserDynamicTesting
13+
} from '@angular/platform-browser-dynamic/testing';
14+
15+
// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
16+
declare const __karma__: any;
17+
declare const require: any;
18+
19+
// Prevent Karma from running prematurely.
20+
__karma__.loaded = function () {};
21+
22+
// First, initialize the Angular testing environment.
23+
getTestBed().initTestEnvironment(
24+
BrowserDynamicTestingModule,
25+
platformBrowserDynamicTesting()
26+
);
27+
// Then we find all the tests.
28+
const context = require.context('./', true, /\.spec\.ts$/);
29+
// And load the modules.
30+
context.keys().map(context);
31+
// Finally, start Karma to run the tests.
32+
__karma__.start();

‎src/tsconfig.app.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"extends": "../tsconfig.json",
3+
"compilerOptions": {
4+
"outDir": "../out-tsc/app",
5+
"baseUrl": "./",
6+
"types": []
7+
},
8+
"exclude": [
9+
"test.ts",
10+
"**/*.spec.ts"
11+
],
12+
"angularCompilerOptions": {
13+
"enableIvy": true
14+
}
15+
}

‎src/tsconfig.spec.json

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"extends": "../tsconfig.json",
3+
"compilerOptions": {
4+
"outDir": "../out-tsc/spec",
5+
"baseUrl": "./",
6+
"types": [
7+
"jasmine",
8+
"node"
9+
]
10+
},
11+
"files": [
12+
"test.ts",
13+
"polyfills.ts"
14+
],
15+
"include": [
16+
"**/*.spec.ts",
17+
"**/*.d.ts"
18+
]
19+
}

‎src/typings.d.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/* SystemJS module definition */
2+
declare var module: NodeModule;
3+
interface NodeModule {
4+
id: string;
5+
}

‎yarn-error.log

+7,005
Large diffs are not rendered by default.

‎yarn.lock

+44-34
Original file line numberDiff line numberDiff line change
@@ -1054,7 +1054,7 @@ blocking-proxy@^1.0.0:
10541054
dependencies:
10551055
minimist "^1.2.0"
10561056

1057-
bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3:
1057+
bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
10581058
version "3.5.5"
10591059
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
10601060
integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
@@ -1190,12 +1190,12 @@ browserslist@4.5.5:
11901190
node-releases "^1.1.14"
11911191

11921192
browserslist@^4.5.4:
1193-
version "4.6.2"
1194-
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f"
1195-
integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q==
1193+
version "4.6.3"
1194+
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.3.tgz#0530cbc6ab0c1f3fc8c819c72377ba55cf647f05"
1195+
integrity sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==
11961196
dependencies:
1197-
caniuse-lite "^1.0.30000974"
1198-
electron-to-chromium "^1.3.150"
1197+
caniuse-lite "^1.0.30000975"
1198+
electron-to-chromium "^1.3.164"
11991199
node-releases "^1.1.23"
12001200

12011201
browserstack@^1.5.1:
@@ -1273,21 +1273,21 @@ bytes@3.1.0:
12731273
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
12741274

12751275
cacache@^11.0.1, cacache@^11.0.2, cacache@^11.3.1, cacache@^11.3.2:
1276-
version "11.3.2"
1277-
resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
1278-
integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
1276+
version "11.3.3"
1277+
resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc"
1278+
integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==
12791279
dependencies:
1280-
bluebird "^3.5.3"
1280+
bluebird "^3.5.5"
12811281
chownr "^1.1.1"
12821282
figgy-pudding "^3.5.1"
1283-
glob "^7.1.3"
1283+
glob "^7.1.4"
12841284
graceful-fs "^4.1.15"
12851285
lru-cache "^5.1.1"
12861286
mississippi "^3.0.0"
12871287
mkdirp "^0.5.1"
12881288
move-concurrently "^1.0.1"
12891289
promise-inflight "^1.0.1"
1290-
rimraf "^2.6.2"
1290+
rimraf "^2.6.3"
12911291
ssri "^6.0.1"
12921292
unique-filename "^1.1.1"
12931293
y18n "^4.0.0"
@@ -1336,11 +1336,16 @@ camelcase@^5.0.0:
13361336
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
13371337
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
13381338

1339-
caniuse-lite@1.0.30000974, caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000960, caniuse-lite@^1.0.30000974:
1339+
caniuse-lite@1.0.30000974:
13401340
version "1.0.30000974"
13411341
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8"
13421342
integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww==
13431343

1344+
caniuse-lite@^1.0.30000957, caniuse-lite@^1.0.30000960, caniuse-lite@^1.0.30000975:
1345+
version "1.0.30000976"
1346+
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000976.tgz#d30fe12662cb2a21e130d307db9907513ca830a2"
1347+
integrity sha512-tleNB1IwPRqZiod6nUNum63xQCMN96BUO2JTeiwuRM7p9d616EHsMBjBWJMudX39qCaPuWY8KEWzMZq7A9XQMQ==
1348+
13441349
canonical-path@1.0.0:
13451350
version "1.0.0"
13461351
resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d"
@@ -1716,9 +1721,9 @@ core-js@^2.2.0, core-js@^2.4.0:
17161721
integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
17171722

17181723
core-js@^3.1.3:
1719-
version "3.1.3"
1720-
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.3.tgz#95700bca5f248f5f78c0ec63e784eca663ec4138"
1721-
integrity sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==
1724+
version "3.1.4"
1725+
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07"
1726+
integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==
17221727

17231728
core-util-is@1.0.2, core-util-is@~1.0.0:
17241729
version "1.0.2"
@@ -2115,10 +2120,10 @@ ee-first@1.1.1:
21152120
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
21162121
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
21172122

2118-
electron-to-chromium@^1.3.124, electron-to-chromium@^1.3.150:
2119-
version "1.3.161"
2120-
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.161.tgz#48cb3de7a53d07c1ce654e8bc6e3f6b602f1ee3c"
2121-
integrity sha512-i8cuS1zf7TW2t/NrfiaF8amTggCH4yLRe7Pirdf6gVDESP146jXO9NXttM8bJk1aupwA1NVMoaikBSbnTHgZGA==
2123+
electron-to-chromium@^1.3.124, electron-to-chromium@^1.3.164:
2124+
version "1.3.167"
2125+
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.167.tgz#6c22e5384a6b54fb13136ca5b3ade5daac9bf894"
2126+
integrity sha512-84IjpeRudjP43Q0+K7tlS7ESoHOl0W6CIdzs5reS9p+sAjCQEDiaAyiXN2v1qLUdL+Of6ZSaH4Cq6bl+sfzy8A==
21222127

21232128
elliptic@^6.0.0:
21242129
version "6.4.1"
@@ -2740,7 +2745,7 @@ glob@7.1.3:
27402745
once "^1.3.0"
27412746
path-is-absolute "^1.0.0"
27422747

2743-
glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3:
2748+
glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
27442749
version "7.1.4"
27452750
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
27462751
integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
@@ -3115,16 +3120,21 @@ inflight@^1.0.4:
31153120
once "^1.3.0"
31163121
wrappy "1"
31173122

3118-
inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
3119-
version "2.0.3"
3120-
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
3121-
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
3123+
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
3124+
version "2.0.4"
3125+
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
3126+
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
31223127

31233128
inherits@2.0.1:
31243129
version "2.0.1"
31253130
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
31263131
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
31273132

3133+
inherits@2.0.3:
3134+
version "2.0.3"
3135+
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
3136+
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
3137+
31283138
ini@1.3.5, ini@^1.3.4, ini@~1.3.0:
31293139
version "1.3.5"
31303140
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
@@ -3854,9 +3864,9 @@ lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5:
38543864
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
38553865

38563866
log4js@^4.0.0:
3857-
version "4.3.1"
3858-
resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.3.1.tgz#026cb6fb3cd5b9c4682a96478c356c97b497686e"
3859-
integrity sha512-nPGS7w7kBnzNm1j8JycFxwLCbIMae8tHCo0cCdx/khB20Tcod8SZThYEB9E0c27ObcTGA1mlPowaf3hantQ/FA==
3867+
version "4.3.2"
3868+
resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.3.2.tgz#2c1d97c2ebeb5172d92df63ebf8750af4a1d91ea"
3869+
integrity sha512-72GjgSP+ifL156MD/bXEhE7UlFLKS2KkCXujodb1nl1z6PpKhCfS+41dyNQ7zKi4iM49TQl+aWLEISXGLcGCCQ==
38603870
dependencies:
38613871
date-format "^2.0.0"
38623872
debug "^4.1.1"
@@ -4858,9 +4868,9 @@ prepend-http@^2.0.0:
48584868
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
48594869

48604870
process-nextick-args@~2.0.0:
4861-
version "2.0.0"
4862-
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
4863-
integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==
4871+
version "2.0.1"
4872+
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
4873+
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
48644874

48654875
process@^0.11.10:
48664876
version "0.11.10"
@@ -4934,9 +4944,9 @@ pseudomap@^1.0.2:
49344944
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
49354945

49364946
psl@^1.1.24:
4937-
version "1.1.32"
4938-
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db"
4939-
integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==
4947+
version "1.1.33"
4948+
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.33.tgz#5533d9384ca7aab86425198e10e8053ebfeab661"
4949+
integrity sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==
49404950

49414951
public-encrypt@^4.0.0:
49424952
version "4.0.3"

0 commit comments

Comments
 (0)
This repository has been archived.