Commit 93f0bb75 authored by William Amouh's avatar William Amouh
Browse files

Merge branch 'master' into 'main'

first commit

See merge request !1
parents 452364fc c2d907e0
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
/.DS_Store/
.env.local
.env.development.local
.env.test.local
.env.production.local
.env
/.idea/
.idea/crema.iml
.idea/dictionaries/yogi0.xml
.idea/inspectionProfiles/Project_Default.xml
.idea/misc.xml
.idea/modules.xml
.idea/vcs.xml
.idea/workspace.xml
.idea/*
npm-debug.log*
yarn-debug.log*
yarn-error.log*
yarn.lock
.eslintcache
# Burger ordering Typescript app
# Aplication use case for Singleton and Builder Pattern
## This application is made in typescript:
## Install the projet:
```bash
$ npm install
```
```bash
$ npx ts-node src/index.ts
```
\ No newline at end of file
{
"name": "demo",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"devDependencies": {
"typescript": "^4.4.4"
}
},
"node_modules/typescript": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
"integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
}
},
"dependencies": {
"typescript": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
"integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
"dev": true
}
}
}
{
"devDependencies": {
"typescript": "^4.4.4"
}
}
import {Item} from "./Item"
export default class Burger {
public items: Item[] = []
public cost: number = 0
addItems(item: Item, numberItems: number= 1): void {
for(let i=0; i < numberItems; i++){
this.items.push(item)
}
}
showItems(): void {
console.log('Items');
for(let i=0; i < this.items.length; i++){
console.log('Item: '+ incrementI(i) +' name: '+this.items[i].name+' price: '+ this.items[i].price +'');
}
}
getCost(): number {
for(let i=0; i < this.items.length; i++){
this.cost += this.items[i].price
}
return this.cost
}
}
const incrementI = (i: number) =>{
return i+1
}
\ No newline at end of file
import Burger from "./Burger"
import { Bun, Patty, Cheese, Tomato } from './Item'
const bun = new Bun()
const tomato = new Tomato()
const patty = new Patty()
const cheese = new Cheese()
export default class BurgerBuilder {
public location: string = ''
prepareCheeseBurger(): Burger {
const burger = new Burger()
burger.addItems(bun, 2)
burger.addItems(patty)
burger.addItems(cheese)
return burger
}
prepareVeganBurger(): Burger {
const burger = new Burger()
burger.addItems(bun, 2)
burger.addItems(tomato)
return burger
}
prepareCheeseTomatoBurger(): Burger {
const burger = new Burger()
burger.addItems(bun, 2)
burger.addItems(patty)
burger.addItems(cheese)
burger.addItems(tomato)
return burger
}
}
import Burger from "./Burger"
import BurgerBuilder from "./BurgerBuilder"
import {smsRouter} from './smsRouterInstance'
const burgerBuilder = new BurgerBuilder
export interface Delivery {
delivery: Burger
name: string
}
export interface Orders {
phone_number: number
deliveries: Delivery[]
location: string
}
export class BurgerCashier {
public phone_number: number = 123
getDeliveries(orders: string[]): Delivery[] {
const deliveries: Delivery[] = []
for(let element of orders){
if(element === 'cheeseBurger')
deliveries.push({delivery: burgerBuilder.prepareCheeseBurger(), name : 'cheeseBurger'})
if(element === 'veganBurger')
deliveries.push({delivery: burgerBuilder.prepareVeganBurger(), name : 'veganBurger'})
if(element === 'cheeseTomatoBurger')
deliveries.push({delivery: burgerBuilder.prepareCheeseTomatoBurger(), name : 'cheeseTomatoBurger'})
}
return deliveries
}
addSmsToRouter(order: Orders): void {
smsRouter.deliveryQueue.push({
phone_number: order.phone_number,
deliveries: order.deliveries,
location: order.location
})
smsRouter.sendSms({
phone_number: order.phone_number,
deliveries: order.deliveries,
location: order.location
})
}
}
export class Item {
public name: string = '';
public price: number = 0;
getName(): string {
return this.name
}
getPrice(): number {
return this.price
}
}
export class Bun extends Item {
constructor(name: string = 'Bun', price: number = 5) {
super();
this.name = name
this.price = price
}
}
export class Cheese extends Item {
constructor(name: string = 'Cheese', price: number = 4) {
super();
this.name = name
this.price = price
}
}
export class Patty extends Item {
constructor(name: string = 'Patty', price: number = 7) {
super();
this.name = name
this.price = price
}
}
export class Tomato extends Item {
constructor(name: string = 'Tomato', price: number = 2) {
super();
this.name = name
this.price = price
}
}
import {Orders} from "./BurgerCashier";
/**
* The SmsRouter class (Singleton) defines the `getInstance` method that lets clients access
* the unique singleton instance.
*/
export default class SmsRouter {
private static instance: SmsRouter;
public deliveryQueue: Orders [] = []
/**
* The Singleton's constructor should always be private to prevent direct
* construction calls with the `new` operator.
*/
private constructor() { }
/**
* The static method that controls the access to the smsRouter instance.
*
* This implementation let you subclass the SmsRouter class while keeping
* just one instance of each subclass around.
*/
public static getInstance(): SmsRouter {
if (!SmsRouter.instance) {
SmsRouter.instance = new SmsRouter();
}
return SmsRouter.instance;
}
/**
* Finally, any SmsRouter should send a sms to a phone number
* executed on its instance.
*/
public sendSms(data: Orders): void {
console.log('SMS to: '+ data.phone_number +' Your order is ready and will be delivered at the address: '+ data.location);
console.log('ORDERS: ');
for(let item of data.deliveries){
console.log('<<--------------------------->>');
console.log(item.name.toUpperCase());
console.log('<<--------------------------->>');
console.log('This burger is made of: ');
item.delivery.showItems()
console.log('This burger costs: ');
console.log(item.delivery.getCost()+'');
}
}
public clearDeliveryQueue() {
this.deliveryQueue = []
}
}
import SmsRouter from './SmsRouter'
export const smsRouter = SmsRouter.getInstance();
\ No newline at end of file
import {BurgerCashier} from './classes/BurgerCashier'
const burgerCashier = new BurgerCashier()
const deliveries = burgerCashier.getDeliveries(['cheeseBurger', 'cheeseTomatoBurger', 'veganBurger'])
burgerCashier.addSmsToRouter({
phone_number: 897645,
deliveries: deliveries,
location: 'Banhnofstrasse 123, 94469 Deggendorf, Germany'
})
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Projects */
// "incremental": true, /* Enable incremental compilation */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
// "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": "es5", /* 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 TC39 stage 2 draft 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. */
/* Modules */
"module": "commonjs", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
// "moduleResolution": "node", /* 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. */
// "resolveJsonModule": true, /* Enable importing .json files */
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`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. */
// "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. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "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. */
/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "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, /* Type catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when a 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, /* Include 'undefined' in index signature results */
// "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. */
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment