feat: scaffolding

This commit is contained in:
2026-02-03 12:55:49 -08:00
parent c8a82646f8
commit 8f3aeb9391
12 changed files with 190 additions and 111 deletions
+4
View File
@@ -0,0 +1,4 @@
{
"name": "@library/frontend-e2e",
"version": "0.0.1"
}
+14 -6
View File
@@ -1,13 +1,21 @@
import { getGreeting } from '../support/app.po'; /**
* @copyright 2026 NHCarrigan
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
*/
describe('frontend-e2e', () => { import { getGreeting } from "../support/app.po";
beforeEach(() => cy.visit('/'));
it('should display welcome message', () => { describe("frontend-e2e", () => {
beforeEach(() => {
cy.visit("/");
});
it("should display welcome message", () => {
// Custom command example, see `../support/commands.ts` file // Custom command example, see `../support/commands.ts` file
cy.login('my-email@something.com', 'myPassword'); cy.login("my-email@something.com", "myPassword");
// Function helper example, see `../support/app.po.ts` file // Function helper example, see `../support/app.po.ts` file
getGreeting().contains(/Welcome/); getGreeting().contains(/Welcome/);
}); });
}); });
+7 -1
View File
@@ -1 +1,7 @@
export const getGreeting = () => cy.get('h1'); /**
* @copyright 2026 NHCarrigan
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
*/
export const getGreeting = (): Cypress.Chainable => cy.get("h1");
+25 -20
View File
@@ -1,35 +1,40 @@
/**
* @copyright 2026 NHCarrigan
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
*/
/// <reference types="cypress" /> /// <reference types="cypress" />
// *********************************************** /**
// This example commands.ts shows you how to * This example commands.ts shows you how to
// create various custom commands and overwrite * create various custom commands and overwrite
// existing commands. * existing commands.
// *
// For more comprehensive examples of custom * For more comprehensive examples of custom
// commands please read more here: * commands please read more here:
// https://on.cypress.io/custom-commands * https://on.cypress.io/custom-commands
// *********************************************** */
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace -- Required for Cypress type extensions
declare namespace Cypress { declare namespace Cypress {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Subject is required for type definition
interface Chainable<Subject> { interface Chainable<Subject> {
login(email: string, password: string): void; login: (email: string, password: string) => void;
} }
} }
// -- This is a parent command -- // -- This is a parent command --
Cypress.Commands.add('login', (email, password) => { Cypress.Commands.add("login", (email, password) => {
console.log('Custom command example: Login', email, password); // eslint-disable-next-line no-console -- Example command for demonstration
console.log("Custom command example: Login", email, password);
}); });
//
// -- This is a child command -- // -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... }) // Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command -- // -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... }) // Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command -- // -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
+22 -15
View File
@@ -1,17 +1,24 @@
// *********************************************************** /**
// This example support/e2e.ts is processed and * @copyright 2026 NHCarrigan
// loaded automatically before your test files. * @license Naomi's Public License
// * @author Naomi Carrigan
// This is a great place to put global configuration and */
// behavior that modifies Cypress.
// /**
// You can change the location of this file or turn off * This example support/e2e.ts is processed and
// automatically serving support files with the * loaded automatically before your test files.
// 'supportFile' configuration option. *
// * This is a great place to put global configuration and
// You can read more here: * behavior that modifies Cypress.
// https://on.cypress.io/configuration *
// *********************************************************** * You can change the location of this file or turn off
* automatically serving support files with the
* 'supportFile' configuration option.
*
* You can read more here:
* https://on.cypress.io/configuration
*/
// Import commands.ts using ES2015 syntax: // Import commands.ts using ES2015 syntax:
import './commands'; // eslint-disable-next-line import/no-unassigned-import -- Side effects import for Cypress commands
import "./commands.ts";
+13
View File
@@ -1,8 +1,21 @@
import nhcarrigan from '@nhcarrigan/eslint-config'; import nhcarrigan from '@nhcarrigan/eslint-config';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __dirname = dirname(fileURLToPath(import.meta.url));
export default [ export default [
...nhcarrigan, ...nhcarrigan,
{ {
ignores: ['**/dist', '**/out-tsc', 'node_modules'], ignores: ['**/dist', '**/out-tsc', 'node_modules'],
}, },
{
files: ['**/*.ts'],
languageOptions: {
parserOptions: {
project: './tsconfig.lib.json',
tsconfigRootDir: __dirname,
},
},
},
]; ];
+4
View File
@@ -0,0 +1,4 @@
{
"name": "@library/shared-types",
"version": "0.0.1"
}
+9 -4
View File
@@ -1,4 +1,9 @@
export * from './lib/game.types'; /**
export * from './lib/book.types'; * @copyright 2026 NHCarrigan
export * from './lib/music.types'; * @license Naomi's Public License
export * from './lib/auth.types'; * @author Naomi Carrigan
*/
export * from "./lib/game.types";
export * from "./lib/book.types";
export * from "./lib/music.types";
export type * from "./lib/auth.types";
+10 -1
View File
@@ -1,3 +1,9 @@
/**
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
export interface User { export interface User {
id: string; id: string;
email: string; email: string;
@@ -7,7 +13,10 @@ export interface User {
} }
export interface JwtPayload { export interface JwtPayload {
sub: string; // user id /**
* User id.
*/
sub: string;
email: string; email: string;
username: string; username: string;
iat?: number; iat?: number;
+27 -21
View File
@@ -1,34 +1,40 @@
/**
* @copyright 2026 NHCarrigan
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
*/
export enum BookStatus { export enum BookStatus {
READING = 'READING', reading = "READING",
FINISHED = 'FINISHED', finished = "FINISHED",
TO_READ = 'TO_READ', toRead = "TO_READ",
} }
export interface Book { export interface Book {
id: string; id: string;
title: string; title: string;
author: string; author: string;
isbn?: string; isbn?: string;
status: BookStatus; status: BookStatus;
dateAdded: Date; dateAdded: Date;
dateFinished?: Date; dateFinished?: Date;
rating?: number; rating?: number;
notes?: string; notes?: string;
coverImage?: string; coverImage?: string;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
} }
export interface CreateBookDto { export interface CreateBookDto {
title: string; title: string;
author: string; author: string;
isbn?: string; isbn?: string;
status: BookStatus; status: BookStatus;
rating?: number; rating?: number;
notes?: string; notes?: string;
coverImage?: string; coverImage?: string;
} }
export interface UpdateBookDto extends Partial<CreateBookDto> { export interface UpdateBookDto extends Partial<CreateBookDto> {
dateFinished?: Date; dateFinished?: Date;
} }
+25 -19
View File
@@ -1,32 +1,38 @@
/**
* @copyright 2026 NHCarrigan
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
*/
export enum GameStatus { export enum GameStatus {
PLAYING = 'PLAYING', playing = "PLAYING",
COMPLETED = 'COMPLETED', completed = "COMPLETED",
BACKLOG = 'BACKLOG', backlog = "BACKLOG",
} }
export interface Game { export interface Game {
id: string; id: string;
title: string; title: string;
platform?: string; platform?: string;
status: GameStatus; status: GameStatus;
dateAdded: Date; dateAdded: Date;
dateCompleted?: Date; dateCompleted?: Date;
rating?: number; rating?: number;
notes?: string; notes?: string;
coverImage?: string; coverImage?: string;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
} }
export interface CreateGameDto { export interface CreateGameDto {
title: string; title: string;
platform?: string; platform?: string;
status: GameStatus; status: GameStatus;
rating?: number; rating?: number;
notes?: string; notes?: string;
coverImage?: string; coverImage?: string;
} }
export interface UpdateGameDto extends Partial<CreateGameDto> { export interface UpdateGameDto extends Partial<CreateGameDto> {
dateCompleted?: Date; dateCompleted?: Date;
} }
+30 -24
View File
@@ -1,40 +1,46 @@
/**
* @copyright 2026 NHCarrigan
* @copyright 2026 NHCarrigan
* @license Naomi's Public License
*/
export enum MusicType { export enum MusicType {
ALBUM = 'ALBUM', album = "ALBUM",
SINGLE = 'SINGLE', single = "SINGLE",
EP = 'EP', ep = "EP",
} }
export enum MusicStatus { export enum MusicStatus {
LISTENING = 'LISTENING', listening = "LISTENING",
COMPLETED = 'COMPLETED', completed = "COMPLETED",
WANT_TO_LISTEN = 'WANT_TO_LISTEN', wantToListen = "WANT_TO_LISTEN",
} }
export interface Music { export interface Music {
id: string; id: string;
title: string; title: string;
artist: string; artist: string;
type: MusicType; type: MusicType;
status: MusicStatus; status: MusicStatus;
dateAdded: Date; dateAdded: Date;
dateCompleted?: Date; dateCompleted?: Date;
rating?: number; rating?: number;
notes?: string; notes?: string;
coverArt?: string; coverArt?: string;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
} }
export interface CreateMusicDto { export interface CreateMusicDto {
title: string; title: string;
artist: string; artist: string;
type: MusicType; type: MusicType;
status: MusicStatus; status: MusicStatus;
rating?: number; rating?: number;
notes?: string; notes?: string;
coverArt?: string; coverArt?: string;
} }
export interface UpdateMusicDto extends Partial<CreateMusicDto> { export interface UpdateMusicDto extends Partial<CreateMusicDto> {
dateCompleted?: Date; dateCompleted?: Date;
} }