WebPack Update
This commit is contained in:
		
							parent
							
								
									1238a1ff7c
								
							
						
					
					
						commit
						f8edbdd581
					
				|  | @ -119,7 +119,7 @@ export class PageHandler | |||
|   private _maxPreloadingDurationMS:number = 2000;  | ||||
|    | ||||
|   private static _localHost = "http://localhost:8080"; | ||||
|   private static _localNetworkRegexPattern = /^(http:\/\/\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d?:XXXX)/ | ||||
|   private static _localNetworkRegexPattern = /^(http:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}?:XXXX)/ | ||||
|   private static _localNetworkRegex = RegExpUtility.createRegExp( this._localNetworkRegexPattern, "XXXX", 8080 + "" ); | ||||
|   private _isHTMLMode:boolean = false; | ||||
|   private _fileLocation:string = ""; | ||||
|  | @ -186,17 +186,25 @@ export class PageHandler | |||
|   get isLocalNetwork() | ||||
|   { | ||||
|     let adress = this.trimmedLocation; | ||||
| 
 | ||||
|     // console.log( "Checking adress for localhost", adress, PageHandler._localHost, PageHandler._localNetworkRegex );
 | ||||
|      | ||||
|     if ( adress.startsWith( PageHandler._localHost ) ) | ||||
|     { | ||||
|       console.log( "Is starting with localhost" ); | ||||
|       return true; | ||||
|     } | ||||
|      | ||||
|     // console.log( "Not starting with localhost" );
 | ||||
| 
 | ||||
|     if ( PageHandler._localNetworkRegex.test( adress ) ) | ||||
|     { | ||||
|       // console.log( "Is starting with localhost regex" );
 | ||||
|       return true; | ||||
|     } | ||||
| 
 | ||||
|     // console.log( "Not starting with localhost regex" );
 | ||||
| 
 | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|  | @ -234,7 +242,7 @@ export class PageHandler | |||
|     } | ||||
|     else | ||||
|     { | ||||
|       console.log( "LOADING PAGE DATA FROM JSON" ); | ||||
|       console.log( "LOADING PAGE DATA FROM JSON", this.isLocalNetwork, pagesPath ); | ||||
|       let pagesData = await Loader.loadJSON<PagesJSON>( pagesPath ); | ||||
|       pages = pagesData.pages; | ||||
|     }  | ||||
|  |  | |||
|  | @ -0,0 +1,86 @@ | |||
| import { JSDOM } from "jsdom"; | ||||
| 
 | ||||
| export class DOMShim | ||||
| { | ||||
|   private static _instance:DOMShim = null; | ||||
|    | ||||
| 
 | ||||
|   static get $():DOMShim | ||||
|   { | ||||
|     if ( this._instance ) | ||||
|     { | ||||
|       return this._instance | ||||
|     } | ||||
| 
 | ||||
|     this._instance = new DOMShim(); | ||||
|     return this._instance; | ||||
|   }  | ||||
| 
 | ||||
|   private _applied = false; | ||||
|   private _jsDOM:JSDOM; | ||||
| 
 | ||||
|   constructor() | ||||
|   { | ||||
|     this._apply(); | ||||
|   } | ||||
| 
 | ||||
|   setDocument( html:string ) | ||||
|   { | ||||
|     this._jsDOM = new JSDOM( html ); | ||||
|     ( global as any ).window   = this._jsDOM.window; | ||||
|     ( global as any ).document = this._jsDOM.window.document; | ||||
|   } | ||||
| 
 | ||||
|   get jsdom(){ return this._jsDOM; } | ||||
|    | ||||
|   private _apply() | ||||
|   { | ||||
|     if ( this._applied ) | ||||
|     { | ||||
|       return; | ||||
|     } | ||||
|      | ||||
|     this._addHTMLNodeDefinition(); | ||||
|     this._addDOMParser();     | ||||
| 
 | ||||
|     this._applied = true; | ||||
|   } | ||||
| 
 | ||||
|    | ||||
|   private _addHTMLNodeDefinition() | ||||
|   { | ||||
|     ( global as any ).Node =  | ||||
|     { | ||||
|       ELEMENT_NODE: 1, | ||||
|       ATTRIBUTE_NODE: 2, | ||||
|       TEXT_NODE:3, | ||||
|       CDATA_SECTION_NODE:4, | ||||
|       PROCESSING_INSTRUCTION_NODE:7, | ||||
|       COMMENT_NODE:8, | ||||
|       DOCUMENT_NODE:9, | ||||
|       DOCUMENT_TYPE_NODE:10, | ||||
|       DOCUMENT_FRAGMENT_NODE:11 | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   private _addDOMParser() | ||||
|   { | ||||
|     DOMParserShim.implementation = ( html:string, type:string = "html" )=> | ||||
|     { | ||||
|       return new JSDOM( html, {contentType:type} ).window.document; | ||||
|     } | ||||
| 
 | ||||
|     global.DOMParser = DOMParserShim; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| export class DOMParserShim | ||||
| {   | ||||
|   static implementation:( html:string, type:string )=>Document; | ||||
|   parseFromString( html:string, type:string ):Document | ||||
|   { | ||||
|     return DOMParserShim.implementation( html, type ); | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,373 @@ | |||
| import { promises as fs } from "fs"; | ||||
| import * as path from "path"; | ||||
| 
 | ||||
| import { RJLog } from "../log/RJLog"; | ||||
| import { PathReference } from "./PathReference"; | ||||
| import { DOMShim } from "../DOMShim"; | ||||
| import { DateMath } from "../../browser/date/DateMath"; | ||||
| 
 | ||||
| export class Files | ||||
| { | ||||
|   static parentPath( filePath:string ) | ||||
|   { | ||||
|     return path.dirname( filePath ); | ||||
|   } | ||||
| 
 | ||||
|   static async forAllIn( filePath:string, filter:(p:PathReference)=>Promise<boolean> = null, action:(p:PathReference)=>Promise<void> = null ):Promise<PathReference[]> | ||||
|   { | ||||
|     let files = await fs.readdir( filePath ); | ||||
| 
 | ||||
|     let root = new PathReference( filePath ); | ||||
|     let pathReferences = files.map( f => root.createRelative( f ) ); | ||||
| 
 | ||||
|     if ( filter ) | ||||
|     {  | ||||
|       let filteredPaths = []; | ||||
| 
 | ||||
|       for ( let p of pathReferences ) | ||||
|       { | ||||
|         if ( await filter( p ) ) | ||||
|         { | ||||
|           filteredPaths.push( p ); | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       pathReferences = filteredPaths; | ||||
| 
 | ||||
|     }; | ||||
| 
 | ||||
|     for ( let p of pathReferences ) | ||||
|     { | ||||
|       let isDirectory = await p.isDirectory(); | ||||
| 
 | ||||
|       if ( isDirectory ) | ||||
|       { | ||||
|         await this.forAllIn( p.absolutePath, filter, action ); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if ( action ) | ||||
|     { | ||||
|       for ( let p of pathReferences ) | ||||
|       { | ||||
|         await action( p ); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( pathReferences ); | ||||
|   } | ||||
| 
 | ||||
|   static async forDirectChildrenIn( filePath:string, filter:(p:PathReference)=>Promise<boolean> = null, action:(p:PathReference)=>Promise<void> = null ):Promise<PathReference[]> | ||||
|   { | ||||
|     let files = await fs.readdir( filePath ); | ||||
| 
 | ||||
|     let root = new PathReference( filePath ); | ||||
|     let pathReferences = files.map( f => root.createRelative( f ) ); | ||||
| 
 | ||||
|     if ( filter ) | ||||
|     {  | ||||
|       let filteredPaths = []; | ||||
| 
 | ||||
|       for ( let p of pathReferences ) | ||||
|       { | ||||
|         if ( await filter( p ) ) | ||||
|         { | ||||
|           filteredPaths.push( p ); | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       pathReferences = filteredPaths; | ||||
| 
 | ||||
|     }; | ||||
| 
 | ||||
|     if ( action ) | ||||
|     { | ||||
|       for ( let p of pathReferences ) | ||||
|       { | ||||
|         await action( p ); | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( pathReferences ); | ||||
| 
 | ||||
|   } | ||||
|    | ||||
|   static joinPaths( pathFragments:string[] ) | ||||
|   { | ||||
|     return path.join.apply( path, pathFragments ); | ||||
|   } | ||||
| 
 | ||||
|   static async existsIn( directoryPath:string, fileName:string ):Promise<boolean> | ||||
|   { | ||||
|     let combinedPath = Files.joinPaths( [ directoryPath, fileName ] ); | ||||
|     let result = await Files.exists( combinedPath ); | ||||
| 
 | ||||
|     return Promise.resolve( result ); | ||||
|   } | ||||
| 
 | ||||
|   static async getStatistics( filePath:string ) | ||||
|   { | ||||
|     return fs.stat( filePath ); | ||||
|   } | ||||
| 
 | ||||
|   static async getModificationDate( filePath:string ):Promise<Date> | ||||
|   { | ||||
|     let stats = await this.getStatistics( filePath ); | ||||
| 
 | ||||
|     if ( ! stats ) | ||||
|     { | ||||
|       return Promise.resolve( null ); | ||||
|     } | ||||
| 
 | ||||
|     return new Date( stats.mtimeMs ); | ||||
|   } | ||||
| 
 | ||||
|   static async isNewerThan( filePath:string, date:Date ):Promise<boolean> | ||||
|   { | ||||
|     let mDate = await this.getModificationDate( filePath ); | ||||
| 
 | ||||
|     return Promise.resolve( DateMath.isAfter( mDate, date ) ); | ||||
|   }  | ||||
| 
 | ||||
|   static async isDirectory( filePath:string ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       let stats = await fs.stat( filePath );   | ||||
|        | ||||
|       return Promise.resolve( stats !== null && stats !== undefined && stats.isDirectory() ); | ||||
|     } | ||||
|     catch( e ) | ||||
|     { | ||||
|       return false; | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( false );     | ||||
|   } | ||||
| 
 | ||||
|   static async isFile( filePath:string ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       let stats = await fs.stat( filePath );   | ||||
|        | ||||
|       return Promise.resolve( stats !== null && stats !== undefined && stats.isFile() ); | ||||
|     } | ||||
|     catch( e ) | ||||
|     { | ||||
|       return false; | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( false );     | ||||
|   } | ||||
| 
 | ||||
|   static async isSymbolicLink( filePath:string ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       let stats = await fs.stat( filePath );   | ||||
|        | ||||
|       return Promise.resolve( stats !== null && stats !== undefined && stats.isSymbolicLink() ); | ||||
|     } | ||||
|     catch( e ) | ||||
|     { | ||||
|       return false; | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( false );     | ||||
|   } | ||||
| 
 | ||||
|   static async exists( filePath:string ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       let stats = await fs.stat( filePath );   | ||||
|        | ||||
|       return Promise.resolve( stats !== null && stats !== undefined ); | ||||
|     } | ||||
|     catch( e ) | ||||
|     { | ||||
|       return false; | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( false );     | ||||
|   } | ||||
| 
 | ||||
|   static async ensureDirectoryExists( path:string ):Promise<void> | ||||
|   { | ||||
|     let exists = await Files.exists( path ); | ||||
| 
 | ||||
|     if ( exists ) | ||||
|     { | ||||
|       return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
|     await fs.mkdir( path, { recursive: true } ); | ||||
| 
 | ||||
|     return Promise.resolve(); | ||||
|   } | ||||
| 
 | ||||
|   static async ensureParentDirectoryExists( filePath:string ):Promise<void> | ||||
|   { | ||||
|     let path = Files.parentPath( filePath ); | ||||
|     let exists = await Files.exists( path ); | ||||
| 
 | ||||
|     if ( exists ) | ||||
|     { | ||||
|       return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
|     await fs.mkdir( path ); | ||||
| 
 | ||||
|     return Promise.resolve(); | ||||
|   } | ||||
| 
 | ||||
|   static async deleteFile( filePath:string ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       await fs.unlink( filePath ); | ||||
|     } | ||||
|     catch( e )  | ||||
|     { | ||||
|       return Promise.resolve( false ); | ||||
|     }  | ||||
| 
 | ||||
|     return Promise.resolve( true ); | ||||
|      | ||||
|   } | ||||
| 
 | ||||
|    | ||||
|   static async loadUTF8( filePath:string ):Promise<string> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       let data = await fs.readFile( filePath ); | ||||
|       let stringData = data.toString(); | ||||
|       return Promise.resolve( stringData ); | ||||
|     } | ||||
|     catch ( exception ) | ||||
|     {  | ||||
|       RJLog.log( exception ); | ||||
|     } | ||||
|      | ||||
|     return Promise.resolve( null ); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|    | ||||
| 
 | ||||
|   static async moveFile( oldPath:string, newPath:string ) | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       await fs.rename( oldPath, newPath ); | ||||
|     } | ||||
|     catch ( e ) | ||||
|     { | ||||
|       await fs.copyFile( oldPath, newPath ); | ||||
|       await fs.unlink( oldPath ); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   static async loadJSON<T>( filePath:string ):Promise<T> | ||||
|   { | ||||
|     let text = await Files.loadUTF8( filePath ); | ||||
| 
 | ||||
|     if ( text === null ) | ||||
|     { | ||||
|       return Promise.resolve( null ); | ||||
|     } | ||||
|      | ||||
|     try | ||||
|     { | ||||
|       let jsonObject = JSON.parse( text ); | ||||
| 
 | ||||
|       return Promise.resolve( jsonObject as T ); | ||||
|     } | ||||
|     catch ( exception ) | ||||
|     { | ||||
|       RJLog.log( exception ); | ||||
|     } | ||||
| 
 | ||||
|     return Promise.resolve( null ); | ||||
|   } | ||||
| 
 | ||||
|   static async saveUTF8( filePath:string, text:string ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       await fs.writeFile( filePath, text ); | ||||
|       return Promise.resolve( true ); | ||||
|     } | ||||
|     catch ( exception ) | ||||
|     {  | ||||
|       RJLog.log( exception ); | ||||
|     } | ||||
|      | ||||
|     return Promise.resolve( false ); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   static async saveJSON<T>( filePath:string, data:T ):Promise<boolean> | ||||
|   { | ||||
|     try | ||||
|     { | ||||
|       let jsonData = JSON.stringify( data ); | ||||
|       let result = await Files.saveUTF8( filePath, jsonData ); | ||||
| 
 | ||||
|       return Promise.resolve( result ); | ||||
|     } | ||||
|     catch( e )  | ||||
|     { | ||||
|       RJLog.log( e ); | ||||
|     } | ||||
| 
 | ||||
|      | ||||
|     return Promise.resolve( false ); | ||||
|   } | ||||
| 
 | ||||
|   static async saveXML( filePath:string, rootElement:Element ):Promise<void> | ||||
|   { | ||||
|     let domShim = DOMShim.$;   | ||||
| 
 | ||||
|     let nodeName = rootElement.nodeName; | ||||
|     let xmlHeader = `<?xml version="1.0" encoding="UTF-8" standalone="no"?>` + "\n"; | ||||
|     let serializedXML = `${xmlHeader}<${nodeName}>${rootElement.innerHTML}</${nodeName}>` ; | ||||
| 
 | ||||
|     //RJLog.log( rootElement, serializedXML );
 | ||||
| 
 | ||||
|     await Files.saveUTF8( filePath, serializedXML ); | ||||
| 
 | ||||
|     return Promise.resolve(); | ||||
|   } | ||||
| 
 | ||||
|   static async loadXML( filePath:string ):Promise<Document> | ||||
|   { | ||||
|     let domShim = DOMShim.$;  | ||||
| 
 | ||||
|     let stringData = await Files.loadUTF8( filePath ); | ||||
|     let parser = new DOMParser(); | ||||
|     let xmlDoc = parser.parseFromString( stringData, "text/xml" ); | ||||
|     return xmlDoc; | ||||
|   } | ||||
| 
 | ||||
|   static async loadHTML( filePath:string ):Promise<Document> | ||||
|   { | ||||
|     let domShim = DOMShim.$;  | ||||
| 
 | ||||
|     let stringData = await Files.loadUTF8( filePath ); | ||||
|     let parser = new DOMParser(); | ||||
|     let xmlDoc = parser.parseFromString( stringData, "text/html" ); | ||||
|     return xmlDoc; | ||||
|   } | ||||
| 
 | ||||
|   static async saveHTML( filePath:string, rootElement:Element ):Promise<void> | ||||
|   { | ||||
|     let domShim = DOMShim.$;   | ||||
| 
 | ||||
|     await Files.saveUTF8( filePath, rootElement.outerHTML ); | ||||
| 
 | ||||
|     return Promise.resolve(); | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,4 @@ | |||
| export class FilesSync | ||||
| { | ||||
|    | ||||
| } | ||||
|  | @ -0,0 +1,26 @@ | |||
| import { PathReference } from "./PathReference" | ||||
| 
 | ||||
| export type PathReferenceFilter = (p:PathReference)=>Promise<boolean>; | ||||
| 
 | ||||
| export class PathFilter | ||||
| { | ||||
|   static get HTML() | ||||
|   { | ||||
|     return PathFilter.forFileExtension( ".html" ); | ||||
|   } | ||||
| 
 | ||||
|   static get JSON() | ||||
|   { | ||||
|     return PathFilter.forFileExtension( ".json" ); | ||||
|   } | ||||
| 
 | ||||
|   static forFileExtension( extension:string ):PathReferenceFilter | ||||
|   { | ||||
|     let filter = ( p:PathReference )=> | ||||
|     { | ||||
|       return p.isFileWithExtension( extension ); | ||||
|     } | ||||
| 
 | ||||
|     return filter; | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,151 @@ | |||
| 
 | ||||
| import { RegExpUtility } from "../../browser/text/RegExpUtitlity"; | ||||
| import { Files } from "./Files"; | ||||
| 
 | ||||
| 
 | ||||
| export class PathReference | ||||
| { | ||||
|   _parentReference:PathReference; | ||||
|   _relative:boolean; | ||||
|   _path:string; | ||||
|   _cachedAbsolutePath:string; | ||||
| 
 | ||||
|   constructor( absolutePath:string ) | ||||
|   { | ||||
|     this._path = RegExpUtility.normalizePath( absolutePath ); | ||||
|     this._relative = false; | ||||
|     this._parentReference = null;     | ||||
|   }   | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   createRelative( path:string ) | ||||
|   { | ||||
|     path = RegExpUtility.normalizePath( path ); | ||||
|     let link = new PathReference( path ); | ||||
|     link._relative = true; | ||||
|     link._parentReference = this; | ||||
| 
 | ||||
|     return link; | ||||
|   } | ||||
| 
 | ||||
|   createRelativeFromAbsolute( otherAbsolutePath:string, isFile:boolean ) | ||||
|   { | ||||
|     otherAbsolutePath = RegExpUtility.normalizePath( otherAbsolutePath ); | ||||
| 
 | ||||
|     if ( ! isFile ) | ||||
|     { | ||||
|       let relativePath = RegExpUtility.createRelativeDirectoryPath( this.absolutePath, otherAbsolutePath ); | ||||
|       return this.createRelative( relativePath ) | ||||
|     }  | ||||
| 
 | ||||
|     let filePath   = RegExpUtility.fileNameOrLastPath( otherAbsolutePath ); | ||||
|     let parentPath = RegExpUtility.parentPath( otherAbsolutePath );     | ||||
|      | ||||
|     let relativePath = RegExpUtility.createRelativeDirectoryPath( this.absolutePath, parentPath ); | ||||
|     relativePath = RegExpUtility.join( relativePath, filePath ); | ||||
| 
 | ||||
|     return this.createRelative( relativePath ) | ||||
|   } | ||||
| 
 | ||||
|   get isRelative() | ||||
|   { | ||||
|     return this._relative; | ||||
|   } | ||||
| 
 | ||||
|   get relativePath() | ||||
|   { | ||||
|     return this._path; | ||||
|   } | ||||
| 
 | ||||
|   get fileName() | ||||
|   { | ||||
|     return RegExpUtility.fileNameOrLastPath( this._path ); | ||||
|   } | ||||
| 
 | ||||
|   get fileNameWithoutExtension() | ||||
|   { | ||||
|     return RegExpUtility.trimFileTypeExtension( this.fileName ); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   pathEndsWith( extension:string ) | ||||
|   { | ||||
|     return this._path.toLowerCase().endsWith( extension.toLowerCase() ); | ||||
|   } | ||||
| 
 | ||||
|   async isFileWithExtension( extension:string ) | ||||
|   { | ||||
|     if ( ! this.pathEndsWith( extension ) ) | ||||
|     { | ||||
|       return false; | ||||
|     }  | ||||
| 
 | ||||
|     return this.isFile(); | ||||
|   } | ||||
| 
 | ||||
|   get absolutePath() | ||||
|   { | ||||
|     if ( ! this._relative ) | ||||
|     { | ||||
|       return this._path; | ||||
|     } | ||||
| 
 | ||||
|     if ( this._cachedAbsolutePath ) | ||||
|     { | ||||
|       return this._cachedAbsolutePath; | ||||
|     } | ||||
| 
 | ||||
|     let cachedAbsolutePath = RegExpUtility.join( this._parentReference.absolutePath, this._path ); | ||||
|     cachedAbsolutePath = RegExpUtility.resolvePath( cachedAbsolutePath ); | ||||
| 
 | ||||
|     this._cachedAbsolutePath = cachedAbsolutePath; | ||||
| 
 | ||||
|     return this._cachedAbsolutePath; | ||||
|   } | ||||
| 
 | ||||
|   async exists():Promise<boolean> | ||||
|   { | ||||
|     return Files.exists( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async isFile():Promise<boolean> | ||||
|   { | ||||
|     return Files.isFile( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async isDirectory():Promise<boolean> | ||||
|   { | ||||
|     return Files.isDirectory( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async isSymbolicLink():Promise<boolean> | ||||
|   { | ||||
|     return Files.isSymbolicLink( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async loadUTF8() | ||||
|   { | ||||
|     return Files.loadUTF8( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async loadHTML() | ||||
|   { | ||||
|     return Files.loadHTML( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async saveHTML( rootElement:Element ) | ||||
|   { | ||||
|     return Files.saveHTML( this.absolutePath, rootElement ); | ||||
|   } | ||||
| 
 | ||||
|   async loadXML() | ||||
|   { | ||||
|     return Files.loadXML( this.absolutePath ); | ||||
|   } | ||||
| 
 | ||||
|   async loadJSON<T>() | ||||
|   { | ||||
|     return Files.loadJSON<T>( this.absolutePath ); | ||||
|   } | ||||
| } | ||||
|  | @ -1,8 +1,8 @@ | |||
| { | ||||
|   "compilerOptions": { | ||||
|     "target": "ESNext", | ||||
|     "module": "CommonJS", | ||||
|     "lib": ["ESNext"], | ||||
|      | ||||
|     "module": "es2022",  | ||||
|     "target": "es2015", | ||||
|     "moduleResolution": "Node", | ||||
|     "types": ["node"] | ||||
|   } | ||||
|  |  | |||
|  | @ -2,23 +2,100 @@ | |||
| import * as fs from "fs"; | ||||
| import * as path from "path"; | ||||
| import { RJLog } from "../log/RJLog"; | ||||
| import { spawn } from "child_process"; | ||||
| 
 | ||||
| export class PagesInfo | ||||
| { | ||||
|   pages:string[] = []; | ||||
| } | ||||
| 
 | ||||
| export class PHPServerSettings | ||||
| { | ||||
|   phpPaths:string[] = [ "D:\\apps\\php\\php.exe", "C:\\apps\\php\\php.exe" ]; | ||||
|   relativeWebPath:string; | ||||
|   routerPath:string; | ||||
|   port:number = 8081; | ||||
| } | ||||
| 
 | ||||
| export class PHPPagesBuilder | ||||
| { | ||||
|   inputDir:string; | ||||
|   outputDir:string; | ||||
| 
 | ||||
|   constructor( source:string, build:string )  | ||||
|   static hasServer = false; | ||||
| 
 | ||||
|   constructor( source:string, build:string, settings:PHPServerSettings )  | ||||
|   { | ||||
|     this.inputDir = source;  | ||||
|     this.outputDir = build; | ||||
| 
 | ||||
|     this.startServer( settings ); | ||||
|   } | ||||
| 
 | ||||
|   startServer( settings:PHPServerSettings ) | ||||
|   { | ||||
|     if ( settings == null ) | ||||
|     { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     if ( PHPPagesBuilder.hasServer ) | ||||
|     { | ||||
|       return; | ||||
|     }   | ||||
| 
 | ||||
| 
 | ||||
|     PHPPagesBuilder.hasServer = true; | ||||
| 
 | ||||
|     let phpPath = PHPPagesBuilder.getPHPPath( settings ); | ||||
| 
 | ||||
|     if ( ! phpPath ) | ||||
|     { | ||||
|       RJLog.error( "PHP was not found!"); | ||||
|       RJLog.error( "Ensure PHP is installed and the paths in the settings are configured correctly."); | ||||
|       RJLog.log( "PHP paths from settings of '" + process.argv[ 2 ] + "': "); | ||||
|       RJLog.log( '"' + settings.phpPaths.join( ", " ) + '"' ); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     let workdingDir = process.cwd(); | ||||
|    | ||||
|     let webPath = path.join( workdingDir, settings.relativeWebPath ); | ||||
|     let routerPath = path.join( webPath, "_router_.php" ); | ||||
| 
 | ||||
|     let port = settings.port; | ||||
|     let spawnedProcess = spawn( phpPath,["-S", "0.0.0.0:" + port, routerPath, "-t", webPath ] ); | ||||
| 
 | ||||
|     spawnedProcess.stdout.on( "data", data => { console.log( data + "" ); }  ); | ||||
| 
 | ||||
|     spawnedProcess.stderr.on( "data", data => { console.log( data + "" ); }  ); | ||||
| 
 | ||||
|     spawnedProcess.on( 'error', (error) => { | ||||
|         console.log(`error: ${error.message}`); | ||||
|     }); | ||||
| 
 | ||||
|     spawnedProcess.on( "close", code => { | ||||
|         console.log(`child process exited with code ${code}`); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   static getPHPPath( settings:PHPServerSettings ) | ||||
|   { | ||||
|     for ( let path of settings.phpPaths ) | ||||
|     { | ||||
|       let exists = fs.existsSync( path ); | ||||
|        | ||||
|       if ( exists ) | ||||
|       { | ||||
|         RJLog.log( "Starting php server from:", path ); | ||||
|         return path; | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   filterFiles( fileName:string )  | ||||
|   { | ||||
|     if ( fileName.startsWith( "__" ) ) | ||||
|  |  | |||
|  | @ -0,0 +1,127 @@ | |||
| 
 | ||||
| import * as fs from "fs"; | ||||
| import * as path from "path"; | ||||
| import { RJLog } from "../log/RJLog"; | ||||
| import { Files } from "../files/Files"; | ||||
| import { PathReference } from "../files/PathReference"; | ||||
| 
 | ||||
| export class TemplatesInfo | ||||
| { | ||||
|   templates:string[] = []; | ||||
| } | ||||
| 
 | ||||
| export class TemplatesIndexBuilder | ||||
| { | ||||
|   inputDir:string; | ||||
|   outputDir:string; | ||||
| 
 | ||||
|   constructor( source:string, build:string )  | ||||
|   { | ||||
|     this.inputDir = source;  | ||||
|     this.outputDir = build; | ||||
|   } | ||||
| 
 | ||||
|   filterFiles( fileName:string )  | ||||
|   { | ||||
|     if ( fileName.startsWith( "__" ) ) | ||||
|     { | ||||
|       return false; | ||||
|     } | ||||
|      | ||||
|     return fileName.endsWith( ".html" ); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   apply( compiler:any )  | ||||
|   { | ||||
|     compiler.hooks.afterCompile.tapAsync( "TemplatesIndexBuilder",  | ||||
|       async ( compilation:any, callback:any ) =>  | ||||
|       { | ||||
|         await Files.forAllIn( this.inputDir, null,  | ||||
|           async ( p:PathReference ) => | ||||
|           { | ||||
|             if ( await p.isDirectory() ) | ||||
|             { | ||||
|               return Promise.resolve(); | ||||
|             } | ||||
| 
 | ||||
|             let fileName = p.fileName; | ||||
| 
 | ||||
|             if ( ! this.filterFiles( fileName ) ) | ||||
|             {  | ||||
|               return Promise.resolve(); | ||||
|             } | ||||
| 
 | ||||
|             compilation.fileDependencies.add( p.absolutePath ); | ||||
| 
 | ||||
|             return Promise.resolve(); | ||||
|           } | ||||
|         );          | ||||
| 
 | ||||
|         callback(); | ||||
| 
 | ||||
|       } | ||||
|     ); | ||||
| 
 | ||||
|     compiler.hooks.emit.tapAsync( "TemplatesIndexBuilder",  | ||||
|       async ( compilation:any, callback:any ) =>  | ||||
|       { | ||||
|         let templates = new TemplatesInfo();         | ||||
|         let templatesPathReference = new PathReference( path.resolve( this.inputDir ) ); | ||||
| 
 | ||||
|         // RJLog.log( templatesPathReference.absolutePath );
 | ||||
| 
 | ||||
|         await Files.forAllIn( templatesPathReference.absolutePath, null,  | ||||
|           async ( p:PathReference ) => | ||||
|           { | ||||
|             if ( await p.isDirectory() ) | ||||
|             { | ||||
|               return Promise.resolve(); | ||||
|             } | ||||
| 
 | ||||
|             let fileName = p.fileName; | ||||
| 
 | ||||
|             if ( ! this.filterFiles( fileName ) ) | ||||
|             {  | ||||
|               return Promise.resolve(); | ||||
|             } | ||||
| 
 | ||||
|             let absoluteFilePath = p.absolutePath; | ||||
|             let inputRelativePath = templatesPathReference.createRelativeFromAbsolute( absoluteFilePath, true ); | ||||
| 
 | ||||
|             // RJLog.log( "Abs to Rel", absoluteFilePath, inputRelativePath.relativePath );
 | ||||
|             let outputFileName = path.join( this.outputDir, inputRelativePath.relativePath ); | ||||
| 
 | ||||
|             templates.templates.push( inputRelativePath.relativePath ); | ||||
| 
 | ||||
|             let content = fs.readFileSync( p.absolutePath, "utf-8" ); | ||||
| 
 | ||||
|             // RJLog.log( "Adding", p.absolutePath, outputFileName );
 | ||||
|             compilation.assets[ outputFileName ] =  | ||||
|             { | ||||
|               source: () => content, | ||||
|               size: () => content.length, | ||||
|             }; | ||||
|                | ||||
| 
 | ||||
|             return Promise.resolve(); | ||||
|           } | ||||
|         );          | ||||
| 
 | ||||
|         let templatesPath = path.join( this.outputDir, "index.json" ); | ||||
| 
 | ||||
|         let templatesJSON = JSON.stringify( templates, null, "  " ); | ||||
| 
 | ||||
|         compilation.assets[ templatesPath ] =  | ||||
|         { | ||||
|           source: () => templatesJSON, | ||||
|           size: () => templatesJSON.length, | ||||
|         }; | ||||
| 
 | ||||
|         callback(); | ||||
| 
 | ||||
|         return Promise.resolve(); | ||||
|       } | ||||
|     ); | ||||
|   } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Josef
						Josef