Migrated the tool chain to angular-cli and updated all dependencies to their latest versions.
This commit is contained in:
		
							parent
							
								
									6dd65fd488
								
							
						
					
					
						commit
						038b42c967
					
				
					 68 changed files with 6266 additions and 909 deletions
				
			
		|  | @ -1,118 +0,0 @@ | |||
| .inputwrapper { | ||||
|     font-family: "ABeeZee", sans-serif; | ||||
|     margin: 0 1em 1em 1em; | ||||
| } | ||||
| 
 | ||||
| .textwrapper { | ||||
|     margin: 0 0 1em 0; | ||||
|     padding: 0 1em 0 0; | ||||
| } | ||||
| 
 | ||||
| .arrow_box { | ||||
|     position: relative; | ||||
|     background: #fff; | ||||
|     border: 1px solid #aaa; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:focus { | ||||
|     border-color: #888; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:hover { | ||||
|     border-color: #333; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:after, .arrow_box:before { | ||||
|     top: 100%; | ||||
|     left: 50%; | ||||
|     border: solid transparent; | ||||
|     content: " "; | ||||
|     height: 0; | ||||
|     width: 0; | ||||
|     position: absolute; | ||||
|     pointer-events: none; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:after { | ||||
|     border-color: rgba(255, 255, 255, 0); | ||||
|     border-top-color: #fff; | ||||
|     border-width: 1em; | ||||
|     margin-left: -1em; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:before { | ||||
|     border-color: rgba(170, 170, 170, 0); | ||||
|     border-top-color: #aaa; | ||||
|     border-width: calc(1em + 1px); | ||||
|     margin-left: calc(-1em - 1px); | ||||
| } | ||||
| 
 | ||||
| .arrow_box:focus:before { | ||||
|     border-color: rgba(136, 136, 136, 0); | ||||
|     border-top-color: #888; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:hover:before { | ||||
|     border-color: rgba(51, 51, 51, 0); | ||||
|     border-top-color: #333; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper > .arrow_box { | ||||
|     display: inline-block; | ||||
| } | ||||
| 
 | ||||
| .textinput { | ||||
|     background-color: #fff; | ||||
|     border: none; | ||||
|     color: #000; | ||||
|     font-family: "Free Monospaced", monospace; | ||||
|     height: 10em; | ||||
|     margin: 0; | ||||
|     padding: 0.5em; | ||||
|     resize: vertical; | ||||
|     width: 100%; | ||||
| } | ||||
| 
 | ||||
| .textinput:focus { | ||||
|     border-color: #888; | ||||
| } | ||||
| 
 | ||||
| .textinput:hover { | ||||
|     border-color: #333; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper { | ||||
|     margin: 0 0 1em 0; | ||||
|     padding: 0; | ||||
|     text-align: center; | ||||
| } | ||||
| 
 | ||||
| .select { | ||||
|     background-color: #fff; | ||||
|     border: none; | ||||
|     color: #000; | ||||
|     font-family: "ABeeZee", sans-serif; | ||||
|     margin: 0; | ||||
|     padding: 0.5em; | ||||
| } | ||||
| 
 | ||||
| .option { | ||||
|     /*    font-family: "ABeeZee", sans-serif;*/ | ||||
| } | ||||
| 
 | ||||
| .selectwrapper.error > .arrow_box { | ||||
|     border-color: red; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper.error > .arrow_box:before { | ||||
|     border-top-color: red; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper.error select { | ||||
|     color: red; | ||||
| } | ||||
| 
 | ||||
| .errormessage { | ||||
|     color: red; | ||||
|     text-align: center; | ||||
| } | ||||
|  | @ -1,16 +1,16 @@ | |||
| <div *ngFor="let step of steps" class="inputwrapper"> | ||||
|     <div class="textwrapper arrow_box"> | ||||
|         <textarea class="textinput" (keyup)="update(step)" placeholder="Please enter your input ..." | ||||
|                   [(ngModel)]="step.content">{{step.content}}</textarea> | ||||
|   <div class="textwrapper arrow_box"> | ||||
|     <textarea class="textinput" (keyup)="update(step)" placeholder="Please enter your input ..." | ||||
|               [(ngModel)]="step.content">{{step.content}}</textarea> | ||||
|   </div> | ||||
|   <div [ngClass]="{selectwrapper: true, error: step.error}"> | ||||
|     <div class="arrow_box"> | ||||
|       <select class="select" (change)="convert(step, $event)"> | ||||
|         <option id="undefined">Select conversion ...</option> | ||||
|         <option class="option" *ngFor="let c of converters" id="{{c.getId()}}">{{c.getDisplayname()}} | ||||
|         </option> | ||||
|       </select> | ||||
|     </div> | ||||
|     <div [ngClass]="{selectwrapper: true, error: step.error}"> | ||||
|         <div class="arrow_box"> | ||||
|             <select class="select" (change)="convert(step, $event)"> | ||||
|                 <option id="undefined">Select conversion ...</option> | ||||
|                 <option class="option" *ngFor="let c of converters" id="{{c.getId()}}">{{c.getDisplayname()}} | ||||
|                 </option> | ||||
|             </select> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div class="errormessage" *ngIf="step.error">{{step.message}}</div> | ||||
|   </div> | ||||
|   <div class="errormessage" *ngIf="step.error">{{step.message}}</div> | ||||
| </div> | ||||
|  |  | |||
							
								
								
									
										118
									
								
								src/app/app.component.scss
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/app/app.component.scss
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,118 @@ | |||
| .inputwrapper { | ||||
|   font-family: "ABeeZee", sans-serif; | ||||
|   margin: 0 1em 1em 1em; | ||||
| } | ||||
| 
 | ||||
| .textwrapper { | ||||
|   margin: 0 0 1em 0; | ||||
|   padding: 0 1em 0 0; | ||||
| } | ||||
| 
 | ||||
| .arrow_box { | ||||
|   position: relative; | ||||
|   background: #fff; | ||||
|   border: 1px solid #aaa; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:focus { | ||||
|   border-color: #888; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:hover { | ||||
|   border-color: #333; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:after, .arrow_box:before { | ||||
|   top: 100%; | ||||
|   left: 50%; | ||||
|   border: solid transparent; | ||||
|   content: " "; | ||||
|   height: 0; | ||||
|   width: 0; | ||||
|   position: absolute; | ||||
|   pointer-events: none; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:after { | ||||
|   border-color: rgba(255, 255, 255, 0); | ||||
|   border-top-color: #fff; | ||||
|   border-width: 1em; | ||||
|   margin-left: -1em; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:before { | ||||
|   border-color: rgba(170, 170, 170, 0); | ||||
|   border-top-color: #aaa; | ||||
|   border-width: calc(1em + 1px); | ||||
|   margin-left: calc(-1em - 1px); | ||||
| } | ||||
| 
 | ||||
| .arrow_box:focus:before { | ||||
|   border-color: rgba(136, 136, 136, 0); | ||||
|   border-top-color: #888; | ||||
| } | ||||
| 
 | ||||
| .arrow_box:hover:before { | ||||
|   border-color: rgba(51, 51, 51, 0); | ||||
|   border-top-color: #333; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper > .arrow_box { | ||||
|   display: inline-block; | ||||
| } | ||||
| 
 | ||||
| .textinput { | ||||
|   background-color: #fff; | ||||
|   border: none; | ||||
|   color: #000; | ||||
|   font-family: "Free Monospaced", monospace; | ||||
|   height: 10em; | ||||
|   margin: 0; | ||||
|   padding: 0.5em; | ||||
|   resize: vertical; | ||||
|   width: 100%; | ||||
| } | ||||
| 
 | ||||
| .textinput:focus { | ||||
|   border-color: #888; | ||||
| } | ||||
| 
 | ||||
| .textinput:hover { | ||||
|   border-color: #333; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper { | ||||
|   margin: 0 0 1em 0; | ||||
|   padding: 0; | ||||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| .select { | ||||
|   background-color: #fff; | ||||
|   border: none; | ||||
|   color: #000; | ||||
|   font-family: "ABeeZee", sans-serif; | ||||
|   margin: 0; | ||||
|   padding: 0.5em; | ||||
| } | ||||
| 
 | ||||
| .option { | ||||
|   /*    font-family: "ABeeZee", sans-serif;*/ | ||||
| } | ||||
| 
 | ||||
| .selectwrapper.error > .arrow_box { | ||||
|   border-color: red; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper.error > .arrow_box:before { | ||||
|   border-top-color: red; | ||||
| } | ||||
| 
 | ||||
| .selectwrapper.error select { | ||||
|   color: red; | ||||
| } | ||||
| 
 | ||||
| .errormessage { | ||||
|   color: red; | ||||
|   text-align: center; | ||||
| } | ||||
|  | @ -1,16 +1,32 @@ | |||
| import {TestBed} from "@angular/core/testing"; | ||||
| import {AppComponent} from "./app.component"; | ||||
| import {FormsModule} from "@angular/forms"; | ||||
| import {async, TestBed} from "@angular/core/testing"; | ||||
| 
 | ||||
| describe('App', () => { | ||||
|     beforeEach(() => { | ||||
|         TestBed.configureTestingModule({ | ||||
|             declarations: [AppComponent], | ||||
|             imports: [FormsModule] | ||||
|         }); | ||||
|     }); | ||||
|     it('should work', () => { | ||||
|         let fixture = TestBed.createComponent(AppComponent); | ||||
|         expect(fixture.componentInstance instanceof AppComponent).toBe(true, 'should create AppComponent'); | ||||
|     }); | ||||
| }); | ||||
| import {AppComponent} from "./app.component"; | ||||
| 
 | ||||
| describe('AppComponent', () => { | ||||
|   beforeEach(async(() => { | ||||
|     TestBed.configureTestingModule({ | ||||
|       declarations: [ | ||||
|         AppComponent | ||||
|       ], | ||||
|     }).compileComponents(); | ||||
|   })); | ||||
| 
 | ||||
|   it('should create the app', async(() => { | ||||
|     const fixture = TestBed.createComponent(AppComponent); | ||||
|     const app = fixture.debugElement.componentInstance; | ||||
|     expect(app).toBeTruthy(); | ||||
|   })); | ||||
| 
 | ||||
|   // it(`should have as title 'app works!'`, async(() => {
 | ||||
|   //   const fixture = TestBed.createComponent(AppComponent);
 | ||||
|   //   const app = fixture.debugElement.componentInstance;
 | ||||
|   //   expect(app.title).toEqual('app works!');
 | ||||
|   // }));
 | ||||
| 
 | ||||
|   // it('should render title in a h1 tag', async(() => {
 | ||||
|   //   const fixture = TestBed.createComponent(AppComponent);
 | ||||
|   //   fixture.detectChanges();
 | ||||
|   //   const compiled = fixture.debugElement.nativeElement;
 | ||||
|   //   expect(compiled.querySelector('h1').textContent).toContain('app works!');
 | ||||
|   // }));
 | ||||
| }); | ||||
|  |  | |||
|  | @ -1,61 +1,59 @@ | |||
| import {Component, OnInit} from "@angular/core"; | ||||
| import {ConverterRegistryService} from "./converterregistry.service"; | ||||
| import {InputComponentManagerService} from "./inputcomponentmanager.service"; | ||||
| import {Converter} from "./converter/converter"; | ||||
| import {NativeLibraryWrapperService} from "./nativelibrarywrapper.service"; | ||||
| import {InputComponentManagerService} from "./inputcomponentmanager.service"; | ||||
| import {ConverterRegistryService} from "./converterregistry.service"; | ||||
| import {Step} from "./step"; | ||||
| import "../assets/css/style.css"; | ||||
| import {Converter} from "./converter/converter"; | ||||
| 
 | ||||
| @Component({ | ||||
|     selector: "den-app", | ||||
|     templateUrl: "./app.component.html", | ||||
|     styleUrls: ["./app.component.css"], | ||||
|     providers: [ConverterRegistryService, InputComponentManagerService, NativeLibraryWrapperService] | ||||
|   selector: 'app-root', | ||||
|   templateUrl: './app.component.html', | ||||
|   styleUrls: ['./app.component.scss'], | ||||
|   providers: [ConverterRegistryService, InputComponentManagerService, NativeLibraryWrapperService] | ||||
| }) | ||||
| export class AppComponent extends OnInit { | ||||
|     public steps:Step[] = []; | ||||
|     public converters:Converter[] = []; | ||||
| export class AppComponent implements OnInit { | ||||
|   public steps: Step[] = []; | ||||
|   public converters: Converter[] = []; | ||||
| 
 | ||||
|     constructor(private converterRegistryService:ConverterRegistryService, private inputComponentManagerService:InputComponentManagerService) { | ||||
|         super(); | ||||
|     } | ||||
|   constructor(private converterRegistryService: ConverterRegistryService, private inputComponentManagerService: InputComponentManagerService) { | ||||
|   } | ||||
| 
 | ||||
|     convert(step:Step, $event:any):void { | ||||
|         step.selectedConverter = this.converterRegistryService.getConverter($event.target.selectedOptions[0].id); | ||||
|         this.update(step); | ||||
|     } | ||||
|   convert(step: Step, $event: any): void { | ||||
|     step.selectedConverter = this.converterRegistryService.getConverter($event.target.selectedOptions[0].id); | ||||
|     this.update(step); | ||||
|   } | ||||
| 
 | ||||
|     update(step:Step):void { | ||||
|         let converter:Converter = step.selectedConverter; | ||||
|   update(step: Step): void { | ||||
|     let converter: Converter = step.selectedConverter; | ||||
| 
 | ||||
|         if (converter !== undefined) { | ||||
|             let content:string = step.content; | ||||
|             let result:string; | ||||
|             try { | ||||
|                 result = converter.convert(content); | ||||
|             } catch (error) { | ||||
|                 if (typeof console === "object" && typeof console.log === "function") { | ||||
|                     console.log(error); | ||||
|                 } | ||||
|                 step.message = error.message; | ||||
|                 step.error = true; | ||||
|                 result = null; | ||||
|             } | ||||
|             if (result !== null) { | ||||
|                 step.message = ""; | ||||
|                 step.error = false; | ||||
|                 if (result !== "") { | ||||
|                     let nextComponent:Step = this.inputComponentManagerService.getNext(step); | ||||
|                     nextComponent.content = result; | ||||
|                     this.update(nextComponent); | ||||
|                 } | ||||
|             } | ||||
|     if (converter !== undefined) { | ||||
|       let content: string = step.content; | ||||
|       let result: string; | ||||
|       try { | ||||
|         result = converter.convert(content); | ||||
|       } catch (error) { | ||||
|         if (typeof console === "object" && typeof console.log === "function") { | ||||
|           console.log(error); | ||||
|         } | ||||
|         step.message = error.message; | ||||
|         step.error = true; | ||||
|         result = null; | ||||
|       } | ||||
|       if (result !== null) { | ||||
|         step.message = ""; | ||||
|         step.error = false; | ||||
|         if (result !== "") { | ||||
|           let nextComponent: Step = this.inputComponentManagerService.getNext(step); | ||||
|           nextComponent.content = result; | ||||
|           this.update(nextComponent); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|     ngOnInit():void { | ||||
|         this.converters = this.converterRegistryService.getAllConverters(); | ||||
|         this.steps = this.inputComponentManagerService.getAllComponents(); | ||||
|         this.inputComponentManagerService.getFirst(); | ||||
|     } | ||||
|   ngOnInit(): void { | ||||
|     this.converters = this.converterRegistryService.getAllConverters(); | ||||
|     this.steps = this.inputComponentManagerService.getAllComponents(); | ||||
|     this.inputComponentManagerService.getFirst(); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,17 +1,19 @@ | |||
| import {NgModule} from "@angular/core"; | ||||
| import {BrowserModule} from "@angular/platform-browser"; | ||||
| import {NgModule} from "@angular/core"; | ||||
| import {FormsModule} from "@angular/forms"; | ||||
| 
 | ||||
| import {AppComponent} from "./app.component"; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     imports: [ | ||||
|         BrowserModule, | ||||
|         FormsModule | ||||
|     ], | ||||
|     declarations: [ | ||||
|         AppComponent | ||||
|     ], | ||||
|     bootstrap: [AppComponent] | ||||
|   declarations: [ | ||||
|     AppComponent | ||||
|   ], | ||||
|   imports: [ | ||||
|     BrowserModule, | ||||
|     FormsModule | ||||
|   ], | ||||
|   providers: [], | ||||
|   bootstrap: [AppComponent] | ||||
| }) | ||||
| export class AppModule { | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class Base64Decoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Decode Base 64"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode Base 64"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "base64decode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "base64decode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         try { | ||||
|             return atob(input); | ||||
|         } catch (exception) { | ||||
|             throw new Error("Could not decode base64 string. Maybe corrupt input?"); | ||||
|         } | ||||
|   convert(input: string): string { | ||||
|     try { | ||||
|       return atob(input); | ||||
|     } catch (exception) { | ||||
|       throw new Error("Could not decode base64 string. Maybe corrupt input?"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class Base64Encoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Encode Base 64"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode Base 64"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "base64encode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "base64encode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         try { | ||||
|             return btoa(input); | ||||
|         } catch (exception) { | ||||
|             throw new Error("Could not encode base64 string. This should not happen, so why don't you just try again?"); | ||||
|         } | ||||
|   convert(input: string): string { | ||||
|     try { | ||||
|       return btoa(input); | ||||
|     } catch (exception) { | ||||
|       throw new Error("Could not encode base64 string. This should not happen, so why don't you just try again?"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class BinToDecConverter implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Convert binary to decimal"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Convert binary to decimal"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "bintodec"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "bintodec"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         let n:number = parseInt(input, 2); | ||||
|         if (isNaN(n)) { | ||||
|             throw new Error("The input seems not to be a valid binary number."); | ||||
|         } | ||||
|         return n.toString(10); | ||||
|   convert(input: string): string { | ||||
|     let n: number = parseInt(input, 2); | ||||
|     if (isNaN(n)) { | ||||
|       throw new Error("The input seems not to be a valid binary number."); | ||||
|     } | ||||
|     return n.toString(10); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| export interface Converter { | ||||
|     getDisplayname():string; | ||||
|     getId():string; | ||||
|     convert(input:string):string; | ||||
|   getDisplayname(): string; | ||||
|   getId(): string; | ||||
|   convert(input: string): string; | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class DecToBinConverter implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Convert decimal to binary"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Convert decimal to binary"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "dectobin"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "dectobin"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         let n:number = parseInt(input, 10); | ||||
|         if (isNaN(n)) { | ||||
|             throw new Error("The input seems not to be a valid integer."); | ||||
|         } | ||||
|         return n.toString(2); | ||||
|   convert(input: string): string { | ||||
|     let n: number = parseInt(input, 10); | ||||
|     if (isNaN(n)) { | ||||
|       throw new Error("The input seems not to be a valid integer."); | ||||
|     } | ||||
|     return n.toString(2); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class DecToHexConverter implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Convert decimal to hexadecimal"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Convert decimal to hexadecimal"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "dectohex"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "dectohex"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         let n:number = parseInt(input, 10); | ||||
|         if (isNaN(n)) { | ||||
|             throw new Error("The input seems not to be a valid integer."); | ||||
|         } | ||||
|         return n.toString(16); | ||||
|   convert(input: string): string { | ||||
|     let n: number = parseInt(input, 10); | ||||
|     if (isNaN(n)) { | ||||
|       throw new Error("The input seems not to be a valid integer."); | ||||
|     } | ||||
|     return n.toString(16); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class HexToDecConverter implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Convert hexadecimal to decimal"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Convert hexadecimal to decimal"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "hextodec"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "hextodec"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         let n:number = parseInt(input, 16); | ||||
|         if (isNaN(n)) { | ||||
|             throw new Error("The input seems not to be a valid hexadecimal number.") | ||||
|         } | ||||
|         return n.toString(10); | ||||
|   convert(input: string): string { | ||||
|     let n: number = parseInt(input, 16); | ||||
|     if (isNaN(n)) { | ||||
|       throw new Error("The input seems not to be a valid hexadecimal number.") | ||||
|     } | ||||
|     return n.toString(10); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class HTMLEntitiesDecoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Decode HTML entities"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode HTML entities"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "decodehtmlentities"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "decodehtmlentities"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return input | ||||
|             .replace(/\"\;/g, "\"") | ||||
|             .replace(/\>\;/g, ">") | ||||
|             .replace(/\<\;/g, "<") | ||||
|             .replace(/\&\;/g, "&"); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return input | ||||
|       .replace(/\"\;/g, "\"") | ||||
|       .replace(/\>\;/g, ">") | ||||
|       .replace(/\<\;/g, "<") | ||||
|       .replace(/\&\;/g, "&"); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class HTMLEntitiesEncoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Encode HTML entities"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode HTML entities"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "encodehtmlentities"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "encodehtmlentities"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return input | ||||
|             .replace(/\&/g, "&") | ||||
|             .replace(/\</g, "<") | ||||
|             .replace(/\>/g, ">") | ||||
|             .replace(/\"/g, """); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return input | ||||
|       .replace(/\&/g, "&") | ||||
|       .replace(/\</g, "<") | ||||
|       .replace(/\>/g, ">") | ||||
|       .replace(/\"/g, """); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,18 +3,18 @@ import {NativeLibraryWrapperService} from "../nativelibrarywrapper.service"; | |||
| 
 | ||||
| export class PunycodeDecoder implements Converter { | ||||
| 
 | ||||
|     constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|     } | ||||
|   constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|   } | ||||
| 
 | ||||
|     getDisplayname(): string { | ||||
|         return "Decode from punycode"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode from punycode"; | ||||
|   } | ||||
| 
 | ||||
|     getId(): string { | ||||
|         return "decodepunycode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "decodepunycode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input: string): string { | ||||
|         return this.nativeLibraryWrapperService.punycode.decode(input); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return this.nativeLibraryWrapperService.punycode.decode(input); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,18 +3,18 @@ import {NativeLibraryWrapperService} from "../nativelibrarywrapper.service"; | |||
| 
 | ||||
| export class PunycodeEncoder implements Converter { | ||||
| 
 | ||||
|     constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|     } | ||||
|   constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|   } | ||||
| 
 | ||||
|     getDisplayname(): string { | ||||
|         return "Encode as punycode"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode as punycode"; | ||||
|   } | ||||
| 
 | ||||
|     getId(): string { | ||||
|         return "encodepunycode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "encodepunycode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input: string): string { | ||||
|         return this.nativeLibraryWrapperService.punycode.encode(input); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return this.nativeLibraryWrapperService.punycode.encode(input); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,22 +3,22 @@ import {NativeLibraryWrapperService} from "../nativelibrarywrapper.service"; | |||
| 
 | ||||
| export class QuotedPrintableDecoder implements Converter { | ||||
| 
 | ||||
|     constructor(private nativeLibraryWrapperService:NativeLibraryWrapperService) { | ||||
|     } | ||||
|   constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|   } | ||||
| 
 | ||||
|     getDisplayname():string { | ||||
|         return "Decode quoted printable"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode quoted printable"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "decodequotedprintable"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "decodequotedprintable"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         try { | ||||
|             return this.nativeLibraryWrapperService.quotedPrintable.decode(input); | ||||
|         } catch (error) { | ||||
|             throw new Error("The input can not be interpreted as quoted-printable. May be corrupt?"); | ||||
|         } | ||||
|   convert(input: string): string { | ||||
|     try { | ||||
|       return this.nativeLibraryWrapperService.quotedPrintable.decode(input); | ||||
|     } catch (error) { | ||||
|       throw new Error("The input can not be interpreted as quoted-printable. May be corrupt?"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,18 +3,18 @@ import {NativeLibraryWrapperService} from "../nativelibrarywrapper.service"; | |||
| 
 | ||||
| export class QuotedPrintableEncoder implements Converter { | ||||
| 
 | ||||
|     constructor(private nativeLibraryWrapperService:NativeLibraryWrapperService) { | ||||
|     } | ||||
|   constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|   } | ||||
| 
 | ||||
|     getDisplayname():string { | ||||
|         return "Encode quoted printable"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode quoted printable"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "encodequotedprintable"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "encodequotedprintable"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return this.nativeLibraryWrapperService.quotedPrintable.encode(input); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return this.nativeLibraryWrapperService.quotedPrintable.encode(input); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,15 +1,15 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class URIComponentDecoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Decode URI component"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode URI component"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "uricomponentdecode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "uricomponentdecode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return decodeURIComponent(input); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return decodeURIComponent(input); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,17 +1,17 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class URIComponentEncoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Encode URI component"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode URI component"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "uricomponentencode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "uricomponentencode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return encodeURIComponent(input).replace(/[!'()*]/g, function (c) { | ||||
|             return '%' + c.charCodeAt(0).toString(16); | ||||
|         }); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return encodeURIComponent(input).replace(/[!'()*]/g, function (c) { | ||||
|       return '%' + c.charCodeAt(0).toString(16); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,15 +1,15 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class URIDecoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Decode URI"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode URI"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "uridecode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "uridecode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return decodeURI(input); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return decodeURI(input); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,15 +1,15 @@ | |||
| import {Converter} from "./converter"; | ||||
| 
 | ||||
| export class URIEncoder implements Converter { | ||||
|     getDisplayname():string { | ||||
|         return "Encode URI"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode URI"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "uriencode"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "uriencode"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         return encodeURI(input).replace(/%5B/g, '[').replace(/%5D/g, ']'); | ||||
|     } | ||||
|   convert(input: string): string { | ||||
|     return encodeURI(input).replace(/%5B/g, '[').replace(/%5D/g, ']'); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,22 +3,22 @@ import {NativeLibraryWrapperService} from "../nativelibrarywrapper.service"; | |||
| 
 | ||||
| export class UTF8Decoder implements Converter { | ||||
| 
 | ||||
|     constructor(private nativeLibraryWrapperService:NativeLibraryWrapperService) { | ||||
|     } | ||||
|   constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|   } | ||||
| 
 | ||||
|     getDisplayname():string { | ||||
|         return "Decode UTF-8"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Decode UTF-8"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "decodeutf8"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "decodeutf8"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         try { | ||||
|             return this.nativeLibraryWrapperService.utf8.decode(input); | ||||
|         } catch (error) { | ||||
|             throw new Error("The input can not be interpreted a valid UTF-8 encoded string. May be corrupt?"); | ||||
|         } | ||||
|   convert(input: string): string { | ||||
|     try { | ||||
|       return this.nativeLibraryWrapperService.utf8.decode(input); | ||||
|     } catch (error) { | ||||
|       throw new Error("The input can not be interpreted a valid UTF-8 encoded string. May be corrupt?"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,22 +3,22 @@ import {NativeLibraryWrapperService} from "../nativelibrarywrapper.service"; | |||
| 
 | ||||
| export class UTF8Encoder implements Converter { | ||||
| 
 | ||||
|     constructor(private nativeLibraryWrapperService:NativeLibraryWrapperService) { | ||||
|     } | ||||
|   constructor(private nativeLibraryWrapperService: NativeLibraryWrapperService) { | ||||
|   } | ||||
| 
 | ||||
|     getDisplayname():string { | ||||
|         return "Encode UTF-8"; | ||||
|     } | ||||
|   getDisplayname(): string { | ||||
|     return "Encode UTF-8"; | ||||
|   } | ||||
| 
 | ||||
|     getId():string { | ||||
|         return "encodeutf8"; | ||||
|     } | ||||
|   getId(): string { | ||||
|     return "encodeutf8"; | ||||
|   } | ||||
| 
 | ||||
|     convert(input:string):string { | ||||
|         try { | ||||
|             return this.nativeLibraryWrapperService.utf8.encode(input); | ||||
|         } catch (error) { | ||||
|             throw new Error("The input can not be encoded as UTF-8. May be corrupt?"); | ||||
|         } | ||||
|   convert(input: string): string { | ||||
|     try { | ||||
|       return this.nativeLibraryWrapperService.utf8.encode(input); | ||||
|     } catch (error) { | ||||
|       throw new Error("The input can not be encoded as UTF-8. May be corrupt?"); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -22,52 +22,52 @@ import {UTF8Decoder} from "./converter/utf8decoder"; | |||
| 
 | ||||
| @Injectable() | ||||
| export class ConverterRegistryService { | ||||
|     private converters:Converter[] = []; | ||||
|   private converters: Converter[] = []; | ||||
| 
 | ||||
|     constructor(private wrapper:NativeLibraryWrapperService) { | ||||
|         this.init(); | ||||
|     } | ||||
|   constructor(private wrapper: NativeLibraryWrapperService) { | ||||
|     this.init(); | ||||
|   } | ||||
| 
 | ||||
|     public getAllConverters():Converter[] { | ||||
|         return this.converters; | ||||
|     } | ||||
|   public getAllConverters(): Converter[] { | ||||
|     return this.converters; | ||||
|   } | ||||
| 
 | ||||
|     public getConverter(id:string):Converter { | ||||
|         for (let i = 0; i < this.converters.length; i++) { | ||||
|             if (this.converters[i].getId() == id) { | ||||
|                 return this.converters[i]; | ||||
|             } | ||||
|         } | ||||
|         return undefined; | ||||
|   public getConverter(id: string): Converter { | ||||
|     for (let i = 0; i < this.converters.length; i++) { | ||||
|       if (this.converters[i].getId() == id) { | ||||
|         return this.converters[i]; | ||||
|       } | ||||
|     } | ||||
|     return undefined; | ||||
|   } | ||||
| 
 | ||||
|     private init():void { | ||||
|         this.registerConverter(new Base64Encoder()); | ||||
|         this.registerConverter(new Base64Decoder()); | ||||
|         this.registerConverter(new URIEncoder()); | ||||
|         this.registerConverter(new URIDecoder()); | ||||
|         this.registerConverter(new URIComponentEncoder()); | ||||
|         this.registerConverter(new URIComponentDecoder()); | ||||
|         this.registerConverter(new HTMLEntitiesEncoder()); | ||||
|         this.registerConverter(new HTMLEntitiesDecoder()); | ||||
|         this.registerConverter(new QuotedPrintableEncoder(this.wrapper)); | ||||
|         this.registerConverter(new QuotedPrintableDecoder(this.wrapper)); | ||||
|         this.registerConverter(new DecToHexConverter()); | ||||
|         this.registerConverter(new HexToDecConverter()); | ||||
|         this.registerConverter(new DecToBinConverter()); | ||||
|         this.registerConverter(new BinToDecConverter()); | ||||
|         this.registerConverter(new PunycodeEncoder(this.wrapper)); | ||||
|         this.registerConverter(new PunycodeDecoder(this.wrapper)); | ||||
|         this.registerConverter(new UTF8Encoder(this.wrapper)); | ||||
|         this.registerConverter(new UTF8Decoder(this.wrapper)); | ||||
|     } | ||||
|   private init(): void { | ||||
|     this.registerConverter(new Base64Encoder()); | ||||
|     this.registerConverter(new Base64Decoder()); | ||||
|     this.registerConverter(new URIEncoder()); | ||||
|     this.registerConverter(new URIDecoder()); | ||||
|     this.registerConverter(new URIComponentEncoder()); | ||||
|     this.registerConverter(new URIComponentDecoder()); | ||||
|     this.registerConverter(new HTMLEntitiesEncoder()); | ||||
|     this.registerConverter(new HTMLEntitiesDecoder()); | ||||
|     this.registerConverter(new QuotedPrintableEncoder(this.wrapper)); | ||||
|     this.registerConverter(new QuotedPrintableDecoder(this.wrapper)); | ||||
|     this.registerConverter(new DecToHexConverter()); | ||||
|     this.registerConverter(new HexToDecConverter()); | ||||
|     this.registerConverter(new DecToBinConverter()); | ||||
|     this.registerConverter(new BinToDecConverter()); | ||||
|     this.registerConverter(new PunycodeEncoder(this.wrapper)); | ||||
|     this.registerConverter(new PunycodeDecoder(this.wrapper)); | ||||
|     this.registerConverter(new UTF8Encoder(this.wrapper)); | ||||
|     this.registerConverter(new UTF8Decoder(this.wrapper)); | ||||
|   } | ||||
| 
 | ||||
|     private registerConverter(converter:Converter):void { | ||||
|         this.converters.forEach((c:Converter) => { | ||||
|             if (c.getId() == converter.getId()) { | ||||
|                 throw new Error("Converter-ID " + converter.getId() + " is already registered!"); | ||||
|             } | ||||
|         }); | ||||
|         this.converters.push(converter); | ||||
|     } | ||||
|   private registerConverter(converter: Converter): void { | ||||
|     this.converters.forEach((c: Converter) => { | ||||
|       if (c.getId() == converter.getId()) { | ||||
|         throw new Error("Converter-ID " + converter.getId() + " is already registered!"); | ||||
|       } | ||||
|     }); | ||||
|     this.converters.push(converter); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -3,35 +3,35 @@ import {Step} from "./step"; | |||
| 
 | ||||
| @Injectable() | ||||
| export class InputComponentManagerService { | ||||
|     private components:Step[] = []; | ||||
|   private components: Step[] = []; | ||||
| 
 | ||||
|     public constructor() { | ||||
|     } | ||||
|   public constructor() { | ||||
|   } | ||||
| 
 | ||||
|     public register(component:Step):void { | ||||
|         this.components.push(component); | ||||
|     } | ||||
|   public register(component: Step): void { | ||||
|     this.components.push(component); | ||||
|   } | ||||
| 
 | ||||
|     public getAllComponents():Step[] { | ||||
|         return this.components; | ||||
|     } | ||||
|   public getAllComponents(): Step[] { | ||||
|     return this.components; | ||||
|   } | ||||
| 
 | ||||
|     public getNext(component:Step):Step { | ||||
|         let index:number = component.index; | ||||
|         if (index == this.components.length - 1) { | ||||
|             this.addComponent(); | ||||
|         } | ||||
|         return this.components[index + 1]; | ||||
|   public getNext(component: Step): Step { | ||||
|     let index: number = component.index; | ||||
|     if (index == this.components.length - 1) { | ||||
|       this.addComponent(); | ||||
|     } | ||||
|     return this.components[index + 1]; | ||||
|   } | ||||
| 
 | ||||
|     public getFirst():Step { | ||||
|         if (this.components.length == 0) { | ||||
|             this.addComponent(); | ||||
|         } | ||||
|         return this.components[0]; | ||||
|   public getFirst(): Step { | ||||
|     if (this.components.length == 0) { | ||||
|       this.addComponent(); | ||||
|     } | ||||
|     return this.components[0]; | ||||
|   } | ||||
| 
 | ||||
|     private addComponent():void { | ||||
|         this.register(new Step(this.components.length)); | ||||
|     } | ||||
| } | ||||
|   private addComponent(): void { | ||||
|     this.register(new Step(this.components.length)); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -2,16 +2,19 @@ import {Injectable} from "@angular/core"; | |||
| import {Punycode} from "./punycode"; | ||||
| import {Utf8} from "./utf8"; | ||||
| import {QuotedPrintable} from "./quotedprintable"; | ||||
| import * as QuotedPrintableNative from "quoted-printable"; | ||||
| import * as Utf8Native from "utf8"; | ||||
| import * as PunycodeNative from "punycode"; | ||||
| 
 | ||||
| @Injectable() | ||||
| export class NativeLibraryWrapperService { | ||||
|     public utf8:Utf8; | ||||
|     public quotedPrintable:QuotedPrintable; | ||||
|     public punycode:Punycode; | ||||
|   public utf8: Utf8; | ||||
|   public quotedPrintable: QuotedPrintable; | ||||
|   public punycode: Punycode; | ||||
| 
 | ||||
|     constructor() { | ||||
|         this.utf8 = require("utf8"); | ||||
|         this.quotedPrintable = require("quoted-printable"); | ||||
|         this.punycode = require("punycode"); | ||||
|     } | ||||
|   constructor() { | ||||
|     this.utf8 = Utf8Native; | ||||
|     this.quotedPrintable = QuotedPrintableNative; | ||||
|     this.punycode = PunycodeNative; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| export interface Punycode { | ||||
|     encode(input:string):string; | ||||
|     decode(input:string):string; | ||||
|   encode(input: string): string; | ||||
|   decode(input: string): string; | ||||
| } | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| export interface QuotedPrintable { | ||||
|     encode(input:string):string; | ||||
|     decode(input:string):string; | ||||
|   encode(input: string): string; | ||||
|   decode(input: string): string; | ||||
| } | ||||
|  |  | |||
|  | @ -1,13 +1,13 @@ | |||
| import {Converter} from "./converter/converter"; | ||||
| 
 | ||||
| export class Step { | ||||
|     public content:string = ""; | ||||
|     public selectedConverter:Converter = undefined; | ||||
|     public index:number; | ||||
|     public error:boolean = false; | ||||
|     public message:string = ""; | ||||
|   public content: string = ""; | ||||
|   public selectedConverter: Converter = undefined; | ||||
|   public index: number; | ||||
|   public error: boolean = false; | ||||
|   public message: string = ""; | ||||
| 
 | ||||
|     constructor(index:number) { | ||||
|         this.index = index; | ||||
|     } | ||||
| } | ||||
|   constructor(index: number) { | ||||
|     this.index = index; | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| export interface Utf8 { | ||||
|     encode(input:any):string; | ||||
|     decode(input:string):any; | ||||
|   encode(input: any): string; | ||||
|   decode(input: string): any; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue