Repository: cosmicjs/simple-react-blog
Branch: main
Commit: 016d6cbe9a9a
Files: 28
Total size: 41.2 KB
Directory structure:
gitextract_02v00mju/
├── .gitignore
├── README.md
├── app/
│ ├── author/
│ │ └── [slug]/
│ │ └── page.tsx
│ ├── layout.tsx
│ ├── page.tsx
│ └── posts/
│ └── [slug]/
│ └── page.tsx
├── components/
│ ├── ArrowLeft.tsx
│ ├── ArrowRight.tsx
│ ├── AuthorAttribution.tsx
│ ├── AuthorAvatar.tsx
│ ├── Banner.tsx
│ ├── CosmicLogo.tsx
│ ├── Footer.tsx
│ ├── Header.tsx
│ ├── OBMLogo.tsx
│ ├── PostCard.tsx
│ ├── SiteLogo.tsx
│ ├── SuggestedPostCard.tsx
│ └── Tag.tsx
├── helpers.ts
├── lib/
│ ├── cosmic.ts
│ └── types.ts
├── next.config.js
├── package.json
├── postcss.config.js
├── styles/
│ └── globals.css
├── tailwind.config.js
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
.env
================================================
FILE: README.md
================================================
# Simple React Blog

## NOTE: this repo is now a mirror of the [Simple Next.js Blog](https://github.com/cosmicjs/simple-nextjs-blog)
### [View Demo](https://cosmic-nextjs-blog.vercel.app/)
### React + Next.js + Cosmic
This blog uses Next.js to create a React blog. It uses Next.js 13 and the new `app` organization structure which takes advantage of [React Server Components](https://nextjs.org/docs/getting-started/react-essentials#server-components). It connects to the Cosmic API via the [Cosmic JavaScript SDK](https://www.npmjs.com/package/@cosmicjs/sdk).
## Getting Started
1. Log in to Cosmic and install the [Simple Next.js Blog template](https://www.cosmicjs.com/marketplace/templates/simple-nextjs-blog).
2. Run the following commands to install the code locally.
```
git clone https://github.com/cosmicjs/simple-nextjs-blog
cd simple-nextjs-blog
```
#### Environment Variables
1. Create an `.env.local` file to gain API access to your Cosmic Bucket. To do this, run:
```
cp .env.example .env.local
```
2. Find your API access keys at Bucket Settings > API Access after logging into [your Cosmic dashboard](https://app.cosmicjs.com/login) and add them to the `.env.local` file. It should look something like this:
```
NEXT_PUBLIC_COSMIC_BUCKET_SLUG=your-bucket-slug
NEXT_PUBLIC_COSMIC_READ_KEY=your-bucket-read-key
```
#### Run in development
Install all dependencies and run in development mode.
```
yarn
yarn dev
```
Open [http://localhost:3000](http://localhost:3000).
## Deploy to Vercel
Use the following button to deploy to Vercel . You will need to add API accesss keys as environment variables. Find these in Bucket Settings > API Access .
================================================
FILE: app/author/[slug]/page.tsx
================================================
import React from 'react';
import PostCard from '../../../components/PostCard';
import { getAuthor, getAuthorPosts } from '../../../lib/cosmic';
export async function generateMetadata({ params }: { params: { id: string; slug: string } }) {
const author = await getAuthor({ params });
return {
title: `${author.title} posts | Simple React Blog`,
};
}
export default async ({ params }: { params: { id: string; slug: string } }) => {
const author = await getAuthor({ params });
const posts = await getAuthorPosts({ authorId: author.id });
return (
Posts by {author.title}
{!posts && 'You must add at least one Post to your Bucket'}
{posts &&
posts.map((post) => {
return (
);
})}
);
};
================================================
FILE: app/layout.tsx
================================================
import React from 'react';
import '../styles/globals.css';
import { getGlobalData } from '../lib/cosmic';
import Generator from 'next/font/local';
import Banner from '../components/Banner';
import Header from '../components/Header';
import Footer from '../components/Footer';
const sans = Generator({
src: '../fonts/Generator-Variable.ttf',
variable: '--font-sans',
});
export async function generateMetadata() {
const siteData = await getGlobalData();
return {
title: siteData.metadata.site_title,
description: siteData.metadata.site_tag,
};
}
export default async function RootLayout({ children }: { children: React.ReactNode }) {
const siteData = await getGlobalData();
return (
{children}
);
}
================================================
FILE: app/page.tsx
================================================
import React from 'react';
import PostCard from '../components/PostCard';
import { getAllPosts } from '../lib/cosmic';
export default async function Page(): Promise {
const posts = await getAllPosts();
return (
{!posts && 'You must add at least one Post to your Bucket'}
{posts &&
posts.map((post) => {
return (
);
})}
);
}
================================================
FILE: app/posts/[slug]/page.tsx
================================================
import React from 'react';
import Link from 'next/link';
import Image from 'next/image';
import ArrowLeft from '../../../components/ArrowLeft';
import { getPost } from '../../../lib/cosmic';
import { getRelatedPosts } from '../../../lib/cosmic';
import SuggestedPostCard from '../../../components/SuggestedPostCard';
import Tag from '../../../components/Tag';
import AuthorAvatar from '../../../components/AuthorAvatar';
import AuthorAttribution from '../../../components/AuthorAttribution';
export async function generateMetadata({ params }: { params: { slug: string } }) {
const post = await getPost({ params });
return {
title: `${post.title} | Simple Next 13 Blog`,
};
}
export default async ({ params }: { params: { slug: string } }) => {
const post = await getPost({ params });
const suggestedPosts = await getRelatedPosts({ params });
return (
<>
{post && post.metadata.hero?.imgix_url && (
)}
{!post && Post Not found
}
{post && {post.title}}
{post && (
<>
{post.metadata.categories && post.metadata.categories.map((category) => {category.title} )}
>
)}
{suggestedPosts && (
Suggested Posts
{suggestedPosts
// .filter((nextPost) => nextPost?.id !== post?.id)
.slice(0, 2)
.map((post) => {
return ;
})}
)}
>
);
};
================================================
FILE: components/ArrowLeft.tsx
================================================
export default function ArrowRight({ className }: { className?: string }): JSX.Element {
return (
);
}
================================================
FILE: components/ArrowRight.tsx
================================================
export default function ArrowRight({ className }: { className?: string }): JSX.Element {
return (
);
}
================================================
FILE: components/AuthorAttribution.tsx
================================================
import { Post } from '../lib/types';
import helpers from '../helpers';
export default function AuthorAttribution({ post }: { post: Post }): JSX.Element {
return (
);
}
================================================
FILE: components/AuthorAvatar.tsx
================================================
import Image from 'next/image';
import Link from 'next/link';
import { Post } from '../lib/types';
export default function AuthorAvatar({ post }: { post: Post }): JSX.Element {
return (
);
}
================================================
FILE: components/Banner.tsx
================================================
import React from 'react';
export default function Banner(): JSX.Element {
return (
);
}
================================================
FILE: components/CosmicLogo.tsx
================================================
export default function CosmicLogo(): JSX.Element {
return (
);
}
================================================
FILE: components/Footer.tsx
================================================
import React from 'react';
import CosmicLogo from './CosmicLogo';
export default function Footer(): JSX.Element {
return (
);
}
================================================
FILE: components/Header.tsx
================================================
import React from 'react';
import SiteLogo from './SiteLogo';
import { GlobalData } from '../lib/types';
export default function Header({ name }: { name: GlobalData }): JSX.Element {
return (
);
}
================================================
FILE: components/OBMLogo.tsx
================================================
export default function OBMLogo({ className }: { className?: string }): JSX.Element {
return (
);
}
================================================
FILE: components/PostCard.tsx
================================================
import React from 'react';
import Link from 'next/link';
import Image from 'next/image';
import helpers from '../helpers';
import ArrowRight from './ArrowRight';
import Tag from './Tag';
import { Post } from '../lib/types';
import AuthorAttribution from './AuthorAttribution';
import AuthorAvatar from './AuthorAvatar';
export default function PostCard({ post }: { post: Post }) {
return (
{post.metadata.hero?.imgix_url && (
)}
{post.title}
{post.metadata.categories && post.metadata.categories.map((category) => {category.title} )}
{post.metadata.categories && post.metadata.categories.map((category) => {category.title} )}
);
}
================================================
FILE: components/SiteLogo.tsx
================================================
import Link from 'next/link';
import OBMLogo from './OBMLogo';
import { GlobalData } from '../lib/types';
export default function SiteLogo({ siteData }: { siteData: GlobalData }): JSX.Element {
return (
{siteData.metadata.site_title}
{siteData.metadata.site_tag}
);
}
================================================
FILE: components/SuggestedPostCard.tsx
================================================
import React from 'react';
import Link from 'next/link';
import Image from 'next/image';
import helpers from '../helpers';
import { Post } from '../lib/types';
export default function PostCard({ post }: { post: Post }) {
return (
{post.metadata.hero?.imgix_url && (
)}
{post.title}
);
}
================================================
FILE: components/Tag.tsx
================================================
import React from 'react';
export default function Tag({ children }: { children: React.ReactNode }): JSX.Element {
return (
{children}
);
}
================================================
FILE: helpers.ts
================================================
const helpers = {
// @ts-ignore
friendlyDate: function (a) {
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var day = days[a.getDay()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
var sec = a.getSeconds();
var time_friendly = this.getTime(a);
var time = {
day: day,
date: date,
month: month,
year: year,
hour: hour,
min: min,
sec: sec,
time_friendly: time_friendly,
};
return time;
},
// @ts-ignore
getTime: function (date) {
var hours = date.getHours();
var minutes = date.getMinutes();
var ampm = hours >= 12 ? 'pm' : 'am';
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
minutes = minutes < 10 ? '0' + minutes : minutes;
var strTime = hours + ':' + minutes + ampm;
return strTime;
},
// @ts-ignore
stringToFriendlyDate: function (date_string) {
const date = helpers.friendlyDate(new Date(date_string));
const friendly_date = `${date.month} ${date.date}, ${date.year}`;
return friendly_date;
},
};
export default helpers;
================================================
FILE: lib/cosmic.ts
================================================
import { createBucketClient } from '@cosmicjs/sdk';
import { Post } from './types';
import { GlobalData } from './types';
import { Author } from './types';
const cosmic = createBucketClient({
// @ts-ignore
bucketSlug: process.env.NEXT_PUBLIC_COSMIC_BUCKET_SLUG ?? '',
// @ts-ignore
readKey: process.env.NEXT_PUBLIC_COSMIC_READ_KEY ?? '',
});
export default cosmic;
export async function getGlobalData(): Promise {
// Get global data
try {
const data: any = await Promise.resolve(
cosmic.objects
.findOne({
type: 'globals',
slug: 'header',
})
.props('metadata.site_title,metadata.site_tag')
.depth(1)
);
const siteData: GlobalData = data.object;
return Promise.resolve(siteData);
} catch (error) {
console.log('Oof', error);
}
return Promise.resolve({} as GlobalData);
}
export async function getAllPosts(): Promise {
try {
// Get all posts
const data: any = await Promise.resolve(
cosmic.objects
.find({
type: 'posts',
})
.props('id,type,slug,title,metadata,created_at')
.depth(1)
);
const posts: Post[] = await data.objects;
return Promise.resolve(posts);
} catch (error) {
console.log('Oof', error);
}
return Promise.resolve([]);
}
export async function getPost({ params }: { params: { slug: string } }): Promise {
try {
// Get post
const data: any = await Promise.resolve(
cosmic.objects
.findOne({
type: 'posts',
slug: params.slug,
})
.props(['id', 'type', 'slug', 'title', 'metadata', 'created_at'])
.depth(1)
);
const post = await data.object;
return post;
} catch (error) {
console.log('Oof', error);
}
return Promise.resolve({} as Post);
}
export async function getRelatedPosts({ params }: { params: { slug: string } }): Promise {
try {
// Get suggested posts
const data: any = await Promise.resolve(
cosmic.objects
.find({
type: 'posts',
slug: {
$ne: params?.slug,
},
})
.props(['id', 'type', 'slug', 'title', 'metadata', 'created_at'])
.sort('random')
.depth(1)
);
const suggestedPosts: Post[] = await data.objects;
return Promise.resolve(suggestedPosts);
} catch (error) {
console.log('Oof', error);
}
return Promise.resolve([]);
}
export async function getAuthor({ params }: { params: { id: string; slug: string } }): Promise {
try {
const data: any = await Promise.resolve(
cosmic.objects
.findOne({
type: 'authors',
slug: params.slug,
})
.props('id,title')
.depth(1)
);
const author = await data.object;
return Promise.resolve(author);
} catch (error) {
console.log('Oof', error);
}
return Promise.resolve({} as Author);
}
export async function getAuthorPosts({ authorId }: { authorId: string }): Promise {
try {
// Get Author's posts
const data: any = await Promise.resolve(
cosmic.objects
.find({
type: 'posts',
'metadata.author': authorId,
})
.props(['id', 'type', 'slug', 'title', 'metadata', 'created_at'])
.sort('random')
.depth(1)
);
const authorPosts: Post[] = await data.objects;
return Promise.resolve(authorPosts);
} catch (error) {
console.log('Oof', error);
}
return Promise.resolve([]);
}
================================================
FILE: lib/types.ts
================================================
export interface GlobalData {
metadata: {
site_title: string;
site_tag: string;
};
}
export interface Post {
id: string;
slug: string;
title: string;
metadata: {
published_date: string;
content: string;
hero?: {
imgix_url: string | null | undefined;
};
author?: {
slug: string | null | undefined;
title: string | null | undefined;
metadata: {
image?: {
imgix_url: string | null | undefined;
};
};
};
teaser: string;
categories: {
title: string;
}[];
};
}
export interface Author {
id: string;
slug: string;
title: string;
metadata: {
image?: {
imgix_url: string | null | undefined;
};
};
}
================================================
FILE: next.config.js
================================================
/** @type {import('next').NextConfig} */
module.exports = {
swcMinify: true,
images: {
domains: ['imgix.cosmicjs.com'],
formats: ['image/avif', 'image/webp'],
},
}
================================================
FILE: package.json
================================================
{
"name": "simple-nextjs-blog",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbo",
"build": "next build",
"start": "next start"
},
"dependencies": {
"@cosmicjs/sdk": "^1.0.5",
"next": "^13.4.4",
"react": "18.1.0",
"react-dom": "18.1.0",
"typescript": "^5.0.4"
},
"engines": {
"node": ">=18"
},
"devDependencies": {
"@types/node": "^20.2.5",
"@types/react": "^18.2.7",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.24",
"prettier": "^2.8.8",
"prettier-plugin-tailwindcss": "^0.3.0",
"tailwindcss": "^3.3.2"
}
}
================================================
FILE: postcss.config.js
================================================
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
================================================
FILE: styles/globals.css
================================================
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
h2 {
@apply text-zinc-700 dark:text-zinc-300 text-3xl font-bold mt-2 mb-4 leading-tight tracking-tight;
}
h3 {
@apply text-zinc-700 dark:text-zinc-300 text-xl font-semibold mt-2 mb-4 leading-snug tracking-tight;
}
p {
@apply text-zinc-600 dark:text-zinc-400 pb-4 last-of-type:pb-0 leading-relaxed tracking-normal;
}
}
================================================
FILE: tailwind.config.js
================================================
/** @type {import('tailwindcss').Config} */
const defaultTheme = require('tailwindcss/defaultTheme');
module.exports = {
content: ['./app/**/*.{js,ts,jsx,tsx,mdx}', './pages/**/*.{js,ts,jsx,tsx,mdx}', './components/**/*.{js,ts,jsx,tsx,mdx}'],
theme: {
extend: {
fontFamily: {
sans: ['var(--font-sans)', ...defaultTheme.fontFamily.sans],
},
},
},
plugins: [],
};
================================================
FILE: tsconfig.json
================================================
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */
/* Projects */
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
"jsx": "preserve" /* Specify what JSX code is generated. */,
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
/* Modules */
"module": "commonjs" /* Specify what module code is generated. */,
// "rootDir": "./", /* Specify the root folder within your source files. */
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
// "resolveJsonModule": true, /* Enable importing .json files. */
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
// "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */
/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
/* Type Checking */
"strict": true /* Enable all strict type-checking options. */,
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
}
}