Typescript SPA framework