Skip to content

Instantly share code, notes, and snippets.

View lydemann's full-sized avatar

Christian Lüdemann lydemann

View GitHub Profile
@lydemann
lydemann / date-picker.component.ts
Last active January 31, 2023 07:08
date-picker.component.ts
class DateErrorStateMatcher implements ErrorStateMatcher {
private hasError: boolean = undefined;
constructor(hasError$: Observable<boolean>, destroy$: Observable<void>) {
hasError$.pipe(takeUntil(destroy$)).subscribe(hasError => {
this.hasError = hasError;
});
}
public isErrorState(
@lydemann
lydemann / exponential-backoff-retry.spec.ts
Created November 16, 2022 16:30
exponential-backoff-retry.spec.ts
import { fakeAsync, tick } from '@angular/core/testing';
import { of, throwError } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
import {
exponentialBackoffRetry,
RETRY_COUNT,
RETRY_TIME,
} from './exponential-backoff-retry';
describe('exponentialBackoffRetry', () => {
@lydemann
lydemann / exponential-backoff-retry.ts
Created November 16, 2022 16:30
exponential-backoff-retry.ts
import { Observable, pipe, range, throwError, zip, of, timer } from 'rxjs';
import { map, mergeMap, retryWhen } from 'rxjs/operators';
export const RETRY_COUNT = 3;
export const RETRY_TIME = 500;
export function exponentialBackoffRetry<T>(
maxTries: number = RETRY_COUNT,
delay: number = RETRY_TIME,
) {
@lydemann
lydemann / graphql-helpers.ts
Created March 7, 2021 11:00
graphql-helpers.ts
import { ApolloCache } from '@apollo/client/core';
import { DocumentNode } from 'graphql';
export interface EntityObject {
id: string;
}
export function createInCache<ReadQueryResponseT>(
toCreate: EntityObject,
readQuery: DocumentNode,
@lydemann
lydemann / todo-list.effects.spec.ts
Last active September 9, 2022 15:48
todo-list.effects.spec.ts
describe('TodoListEffects', () => {
let actions: Observable<any>;
let effects: TodoListEffects;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
TodoListEffects,
provideMockActions(() => actions),
mockProvider(TodoListResourcesService),
function containsInNestedObjectBF(obj, val) {
const queue = [obj];
while (queue.length > 0) {
const currentObj = queue.shift();
if (currentObj === val) {
return true;
}
@lydemann
lydemann / server.ts
Created November 18, 2021 18:23
server.ts
import { ApolloServer, AuthenticationError } from 'apollo-server-express';
import responseCachePlugin from 'apollo-server-plugin-response-cache';
import * as express from 'express';
import admin from 'firebase-admin';
import { AuthIdentity, RequestContext } from './auth-identity';
import { resolvers } from './resolvers';
import { typeDefs } from './schema';
/* Async verification with user token */
@lydemann
lydemann / server.ts
Created November 18, 2021 18:22
server.ts
import { ApolloServer, AuthenticationError } from 'apollo-server-express';
import responseCachePlugin from 'apollo-server-plugin-response-cache';
import * as express from 'express';
import admin from 'firebase-admin';
import { AuthIdentity, RequestContext } from './auth-identity';
import { resolvers } from './resolvers';
import { typeDefs } from './schema';
/* Async verification with user token */
@lydemann
lydemann / main.ts
Created November 18, 2021 18:19
main.ts
import { region } from 'firebase-functions';
import { gqlServer } from './app/server';
import { environment } from './environments/environment';
const dotenvJSON = require('dotenv-json');
if (environment.production) {
dotenvJSON({ path: __dirname + '/assets/env.json' });
} else {
dotenvJSON({ path: __dirname + '/assets/env.local.json' });
}
@lydemann
lydemann / protractor.conf.js
Created September 17, 2018 14:25
protractor.conf.js
// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts
const { SpecReporter } = require('jasmine-spec-reporter');
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./src/**/*.e2e-spec.ts'
],