Compare commits
No commits in common. "75c91799027149b5aeefbed5311403e8f1e8388b" and "b2d5f75065f017e742297297d87ce83ecbd029f0" have entirely different histories.
75c9179902
...
b2d5f75065
@ -6,6 +6,7 @@ const initialise = async () =>
|
|||||||
{
|
{
|
||||||
// Création d'un convertisseur parsant des données transmises en HTML
|
// Création d'un convertisseur parsant des données transmises en HTML
|
||||||
let converter=new FreeDatas2HTML("HTML");
|
let converter=new FreeDatas2HTML("HTML");
|
||||||
|
// converter.parser.setRemoteSource({ url: "http://localhost:8080/datas/posts.json", withCredentials:true, headers: [{ key:"Authorization", value:"Token YWxhZGRpbjpvcGVuc2VzYW1l" }] });
|
||||||
converter.datasViewElt={ id:"datas" };
|
converter.datasViewElt={ id:"datas" };
|
||||||
await converter.run();
|
await converter.run();
|
||||||
// Adaptation du rendu suivant la taille de l'écran
|
// Adaptation du rendu suivant la taille de l'écran
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
const { compare }=require('natural-orderby');
|
const { compare }=require('natural-orderby');
|
||||||
const errors=require("./errors.js");
|
const errors=require("./errors.js");
|
||||||
|
|
||||||
import { Counter, Datas, DatasRenders, DOMElement, Paginations, Parsers, ParseErrors, RemoteSources, Selectors, SortingFields, SortingFunctions } from "./freeDatas2HTMLInterfaces";
|
import { Counter, Datas, DatasRenders, DOMElement, Paginations, Parsers, ParseErrors, RemoteSource, Selectors, SortingFields, SortingFunctions } from "./freeDatas2HTMLInterfaces";
|
||||||
import { Pagination} from "./freeDatas2HTMLPagination";
|
import { Pagination} from "./freeDatas2HTMLPagination";
|
||||||
import { ParserForCSV} from "./freeDatas2HTMLParserForCSV";
|
import { ParserForCSV} from "./freeDatas2HTMLParserForCSV";
|
||||||
import { ParserForHTML} from "./freeDatas2HTMLParserForHTML";
|
import { ParserForHTML} from "./freeDatas2HTMLParserForHTML";
|
||||||
@ -20,7 +20,12 @@ export class FreeDatas2HTML
|
|||||||
public datasHTML: string = "";
|
public datasHTML: string = "";
|
||||||
// Le parseur :
|
// Le parseur :
|
||||||
public parser: Parsers; // public pour permettre de charger un parseur tiers après instanciation
|
public parser: Parsers; // public pour permettre de charger un parseur tiers après instanciation
|
||||||
// Type de données à traiter
|
|
||||||
|
// Données distantes :
|
||||||
|
//private _datasRemoteSource: RemoteSource|undefined=undefined;
|
||||||
|
// Ou locales :
|
||||||
|
//private _datas2Parse:string|undefined=undefined;
|
||||||
|
// Dans tous les cas, besoin d'un type :
|
||||||
public datasType: "CSV"|"HTML"|"JSON"|undefined;
|
public datasType: "CSV"|"HTML"|"JSON"|undefined;
|
||||||
|
|
||||||
// Le nom des champs trouvés dans les données :
|
// Le nom des champs trouvés dans les données :
|
||||||
@ -48,7 +53,7 @@ export class FreeDatas2HTML
|
|||||||
// J'initialiser avec des valeurs par défaut pouvant être surchargées par les setters
|
// J'initialiser avec des valeurs par défaut pouvant être surchargées par les setters
|
||||||
// Attention, si je transmets datasRemoteSource ici, il ne passera pas par un new RemoteSources()
|
// Attention, si je transmets datasRemoteSource ici, il ne passera pas par un new RemoteSources()
|
||||||
// Il doit donc déjà avoir été testé
|
// Il doit donc déjà avoir été testé
|
||||||
constructor(datasType:"CSV"|"HTML"|"JSON", datas2Parse="", datasRemoteSource?:RemoteSources)
|
constructor(datasType:"CSV"|"HTML"|"JSON", datas2Parse="", datasRemoteSource?:RemoteSource)
|
||||||
{
|
{
|
||||||
this.datasRender=new Render(this);
|
this.datasRender=new Render(this);
|
||||||
switch (datasType)
|
switch (datasType)
|
||||||
|
@ -65,7 +65,7 @@ export interface ParseResults
|
|||||||
}
|
}
|
||||||
export interface Parsers
|
export interface Parsers
|
||||||
{
|
{
|
||||||
datasRemoteSource: RemoteSources;
|
datasRemoteSource: RemoteSource;
|
||||||
setRemoteSource(settings : RemoteSourceSettings): void;
|
setRemoteSource(settings : RemoteSourceSettings): void;
|
||||||
datas2Parse?: string;
|
datas2Parse?: string;
|
||||||
document2Parse?: HTMLDocument;
|
document2Parse?: HTMLDocument;
|
||||||
@ -78,7 +78,7 @@ export interface RemoteSourceSettings
|
|||||||
headers?: { key:string, value:string }[];
|
headers?: { key:string, value:string }[];
|
||||||
withCredentials?: boolean;
|
withCredentials?: boolean;
|
||||||
}
|
}
|
||||||
export interface RemoteSources extends RemoteSourceSettings
|
export interface RemoteSource extends RemoteSourceSettings
|
||||||
{
|
{
|
||||||
getFetchSettings() : {};
|
getFetchSettings() : {};
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
const Papa=require("papaparse");
|
const Papa = require("papaparse");
|
||||||
const errors= require("./errors.js");
|
const errors = require("./errors.js");
|
||||||
import { RemoteSource } from "./freeDatas2HTMLRemoteSource";
|
import { RemoteSources } from "./freeDatas2HTMLRemoteSources";
|
||||||
|
|
||||||
import { ParseResults, Parsers, RemoteSources, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
import { ParseResults, Parsers, RemoteSource, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
||||||
|
interface PapaParseOptions
|
||||||
// Options de Papa Parse
|
|
||||||
// cf. https://www.papaparse.com/docs#config
|
|
||||||
interface PublicPapaParseOptions
|
|
||||||
{
|
{
|
||||||
delimiter: string;
|
delimiter: string;
|
||||||
newline: string;
|
newline: string;
|
||||||
@ -14,25 +11,28 @@ interface PublicPapaParseOptions
|
|||||||
escapeChar: string;
|
escapeChar: string;
|
||||||
transformHeader?(field: string, index: number): string;
|
transformHeader?(field: string, index: number): string;
|
||||||
preview: number;
|
preview: number;
|
||||||
comments: false|string;
|
comments: false|string,
|
||||||
fastMode: boolean|undefined;
|
fastMode: boolean|undefined;
|
||||||
transform?(value: string): string;
|
transform?(value: string): string;
|
||||||
}
|
}
|
||||||
interface PrivatePapaParseOptions
|
interface PrivatePapaParseOptions
|
||||||
{
|
{
|
||||||
header: boolean;
|
header: boolean; // nécessaire pour obtenir le nom des champs
|
||||||
download: boolean;
|
download: boolean;
|
||||||
downloadRequestHeaders: undefined| { [index: string]:string };
|
downloadRequestHeaders: undefined| { [index: string]:string|boolean|number } ;
|
||||||
skipEmptyLines: string;
|
skipEmptyLines: string;
|
||||||
withCredentials: boolean|undefined;
|
withCredentials: boolean|undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ParserForCSV implements Parsers
|
export class ParserForCSV implements Parsers
|
||||||
{
|
{
|
||||||
private _datasRemoteSource: RemoteSources;
|
private _datasRemoteSource: RemoteSource;
|
||||||
private _datas2Parse:string="";
|
private _datas2Parse:string="";
|
||||||
private _parseResults:ParseResults|undefined=undefined;
|
private _parseResults:ParseResults|undefined=undefined;
|
||||||
public options: PublicPapaParseOptions =
|
|
||||||
|
// Ouverture de certaines options de Papa Parse :
|
||||||
|
// cf. https://www.papaparse.com/docs#config
|
||||||
|
public options: PapaParseOptions =
|
||||||
{
|
{
|
||||||
delimiter: "",
|
delimiter: "",
|
||||||
newline: "",
|
newline: "",
|
||||||
@ -55,20 +55,20 @@ export class ParserForCSV implements Parsers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// L'instance d'une autre classe que RemoteSource peut être passée au constructeur
|
// L'instance d'une autre classe que RemoteSource peut être passée au constructeur
|
||||||
constructor(datasRemoteSource?: RemoteSources)
|
constructor(datasRemoteSource?: RemoteSource)
|
||||||
{
|
{
|
||||||
if(datasRemoteSource !== undefined)
|
if(datasRemoteSource !== undefined)
|
||||||
this._datasRemoteSource=datasRemoteSource;
|
this._datasRemoteSource=datasRemoteSource;
|
||||||
else
|
else
|
||||||
this._datasRemoteSource=new RemoteSource({ url:"" });
|
this._datasRemoteSource=new RemoteSources({ url:"" });
|
||||||
}
|
}
|
||||||
|
|
||||||
public setRemoteSource(source: RemoteSourceSettings)
|
public setRemoteSource(source: RemoteSourceSettings)
|
||||||
{
|
{
|
||||||
this._datasRemoteSource=new RemoteSource(source);
|
this._datasRemoteSource=new RemoteSources(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
get datasRemoteSource() : RemoteSources
|
get datasRemoteSource() : RemoteSource
|
||||||
{
|
{
|
||||||
return this._datasRemoteSource;
|
return this._datasRemoteSource;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
const errors=require("./errors.js");
|
const errors=require("./errors.js");
|
||||||
import { ParseErrors, ParseResults, Parsers, RemoteSources, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
import { ParseErrors, ParseResults, Parsers, RemoteSource, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
||||||
import { RemoteSource } from "./freeDatas2HTMLRemoteSource";
|
import { RemoteSources } from "./freeDatas2HTMLRemoteSources";
|
||||||
|
|
||||||
export class ParserForHTML implements Parsers
|
export class ParserForHTML implements Parsers
|
||||||
{
|
{
|
||||||
private _datasRemoteSource: RemoteSources;
|
private _datasRemoteSource: RemoteSource;
|
||||||
private _document2Parse: HTMLDocument=document;
|
private _document2Parse: HTMLDocument=document;
|
||||||
private _parseResults: ParseResults|undefined=undefined;
|
private _parseResults: ParseResults|undefined=undefined;
|
||||||
private _fieldsSelector: string="table > thead > tr > th";
|
private _fieldsSelector: string="table > thead > tr > th";
|
||||||
@ -12,20 +12,20 @@ export class ParserForHTML implements Parsers
|
|||||||
private _datasSelector: string="tr > td";
|
private _datasSelector: string="tr > td";
|
||||||
|
|
||||||
// L'instance d'une autre classe que RemoteSource peut être passée au constructeur
|
// L'instance d'une autre classe que RemoteSource peut être passée au constructeur
|
||||||
constructor(datasRemoteSource?: RemoteSources)
|
constructor(datasRemoteSource?: RemoteSource)
|
||||||
{
|
{
|
||||||
if(datasRemoteSource !== undefined)
|
if(datasRemoteSource !== undefined)
|
||||||
this._datasRemoteSource=datasRemoteSource;
|
this._datasRemoteSource=datasRemoteSource;
|
||||||
else
|
else
|
||||||
this._datasRemoteSource=new RemoteSource({ url:"" });
|
this._datasRemoteSource=new RemoteSources({ url:"" });
|
||||||
}
|
}
|
||||||
|
|
||||||
public setRemoteSource(source: RemoteSourceSettings)
|
public setRemoteSource(source: RemoteSourceSettings)
|
||||||
{
|
{
|
||||||
this._datasRemoteSource=new RemoteSource(source);
|
this._datasRemoteSource=new RemoteSources(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
get datasRemoteSource() : RemoteSources
|
get datasRemoteSource() : RemoteSource
|
||||||
{
|
{
|
||||||
return this._datasRemoteSource;
|
return this._datasRemoteSource;
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,29 @@
|
|||||||
const errors = require("./errors.js");
|
const errors = require("./errors.js");
|
||||||
import { RemoteSource } from "./freeDatas2HTMLRemoteSource";
|
import { RemoteSources } from "./freeDatas2HTMLRemoteSources";
|
||||||
|
|
||||||
import { ParseErrors, ParseResults, Parsers, RemoteSources, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
import { ParseErrors, ParseResults, Parsers, RemoteSource, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
||||||
|
|
||||||
export class ParserForJSON implements Parsers
|
export class ParserForJSON implements Parsers
|
||||||
{
|
{
|
||||||
private _datasRemoteSource: RemoteSources;
|
private _datasRemoteSource: RemoteSource;
|
||||||
private _datas2Parse: string="";
|
private _datas2Parse: string="";
|
||||||
private _parseResults: ParseResults|undefined=undefined;
|
private _parseResults: ParseResults|undefined=undefined;
|
||||||
|
|
||||||
// L'instance d'une autre classe que RemoteSource peut être passée au constructeur
|
// L'instance d'une autre classe que RemoteSource peut être passée au constructeur
|
||||||
constructor(datasRemoteSource?: RemoteSources)
|
constructor(datasRemoteSource?: RemoteSource)
|
||||||
{
|
{
|
||||||
if(datasRemoteSource !== undefined)
|
if(datasRemoteSource !== undefined)
|
||||||
this._datasRemoteSource=datasRemoteSource;
|
this._datasRemoteSource=datasRemoteSource;
|
||||||
else
|
else
|
||||||
this._datasRemoteSource=new RemoteSource({ url:"" });
|
this._datasRemoteSource=new RemoteSources({ url:"" });
|
||||||
}
|
}
|
||||||
|
|
||||||
public setRemoteSource(source: RemoteSourceSettings)
|
public setRemoteSource(source: RemoteSourceSettings)
|
||||||
{
|
{
|
||||||
this._datasRemoteSource=new RemoteSource(source);
|
this._datasRemoteSource=new RemoteSources(source);
|
||||||
}
|
}
|
||||||
|
|
||||||
get datasRemoteSource() : RemoteSources
|
get datasRemoteSource() : RemoteSource
|
||||||
{
|
{
|
||||||
return this._datasRemoteSource;
|
return this._datasRemoteSource;
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,17 @@
|
|||||||
const errors = require("./errors.js");
|
const errors = require("./errors.js");
|
||||||
|
|
||||||
import { RemoteSources, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
import { RemoteSource, RemoteSourceSettings } from "./freeDatas2HTMLInterfaces";
|
||||||
|
|
||||||
export class RemoteSource implements RemoteSources
|
export class RemoteSources implements RemoteSource
|
||||||
{
|
{
|
||||||
public allowedUrlProtocol: string[]=["https:","http:"];
|
public allowedUrlProtocol: string[]=["https:","http:"];
|
||||||
private _url: string="";
|
private _url: string;
|
||||||
private _headers: { key:string, value:string }[]=[];
|
private _headers: { key:string, value:string }[]=[];
|
||||||
private _withCredentials: boolean=false;
|
private _withCredentials: boolean=false;
|
||||||
|
|
||||||
constructor(RemoteSettings: RemoteSourceSettings)
|
constructor(RemoteSettings: RemoteSourceSettings)
|
||||||
{
|
{
|
||||||
// Le fait de ne pas utiliser le préfixe _ implique de passer par les setters
|
this._url=RemoteSettings.url;
|
||||||
// Mais l'url n'est testée que si elle n'est pas vide.
|
|
||||||
if(RemoteSettings.url !== "")
|
|
||||||
this.url=RemoteSettings.url;
|
|
||||||
if(RemoteSettings.headers !== undefined)
|
if(RemoteSettings.headers !== undefined)
|
||||||
this.headers=RemoteSettings.headers;
|
this.headers=RemoteSettings.headers;
|
||||||
if(RemoteSettings.withCredentials !== undefined)
|
if(RemoteSettings.withCredentials !== undefined)
|
||||||
@ -29,13 +26,12 @@ export class RemoteSource implements RemoteSources
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
const checkUrl=new URL(url);// peut générer une erreur si url bidon
|
const checkUrl=new URL(url);// peut déjà générer une erreur si url bidon
|
||||||
if(this.allowedUrlProtocol.indexOf(checkUrl.protocol) === -1)
|
if(this.allowedUrlProtocol.indexOf(checkUrl.protocol) === -1)
|
||||||
throw new Error();
|
throw new Error();
|
||||||
}
|
}
|
||||||
catch(e)
|
catch(e)
|
||||||
{
|
{
|
||||||
console.error(e);
|
|
||||||
throw new Error(errors.remoteSourceUrlFail);
|
throw new Error(errors.remoteSourceUrlFail);
|
||||||
}
|
}
|
||||||
this._url=url.trim();
|
this._url=url.trim();
|
||||||
@ -49,8 +45,7 @@ export class RemoteSource implements RemoteSources
|
|||||||
|
|
||||||
set headers(headers: { key:string, value:string }[])
|
set headers(headers: { key:string, value:string }[])
|
||||||
{
|
{
|
||||||
// cf. https://developer.mozilla.org/fr/docs/Glossary/Forbidden_header_name
|
const forbiddenHeadersNames: string[]=["Accept-Charset","Accept-Encoding","Access-Control-Request-Headers","Access-Control-Request-Method","Connection","Content-Length","Cookie","Cookie2","Date","DNT","Expect","Host","Keep-Alive","Origin","Referer","TE","Trailer","Transfer-Encoding","Upgrade","Via"]; // cf. https://developer.mozilla.org/fr/docs/Glossary/Forbidden_header_name
|
||||||
const forbiddenHeadersNames: string[]=["Accept-Charset","Accept-Encoding","Access-Control-Request-Headers","Access-Control-Request-Method","Connection","Content-Length","Cookie","Cookie2","Date","DNT","Expect","Host","Keep-Alive","Origin","Referer","TE","Trailer","Transfer-Encoding","Upgrade","Via"];
|
|
||||||
for(let header of headers)
|
for(let header of headers)
|
||||||
{
|
{
|
||||||
header.key=header.key.trim();
|
header.key=header.key.trim();
|
||||||
@ -84,7 +79,7 @@ export class RemoteSource implements RemoteSources
|
|||||||
for(let header of this._headers)
|
for(let header of this._headers)
|
||||||
headers.append(header.key, header.value);
|
headers.append(header.key, header.value);
|
||||||
}
|
}
|
||||||
const credentials: RequestCredentials|undefined=(this._withCredentials) ? "include" : "omit";
|
const credentials : RequestCredentials|undefined=(this._withCredentials) ? "include" : "omit";
|
||||||
return { method:"GET", headers:headers, credentials:credentials };
|
return { method: "GET", headers: headers, credentials: credentials };
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
const Papa = require("papaparse");
|
const Papa = require("papaparse");
|
||||||
import { RemoteSourceSettings } from "../src/freeDatas2HTMLInterfaces";
|
import { RemoteSource, RemoteSourceSettings } from "../src/freeDatas2HTMLInterfaces";
|
||||||
import { ParserForCSV as Parser } from "../src/freeDatas2HTMLParserForCSV";
|
import { ParserForCSV as Parser } from "../src/freeDatas2HTMLParserForCSV";
|
||||||
const errors=require("../src/errors.js");
|
const errors=require("../src/errors.js");
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { RemoteSource } from "../src/freeDatas2HTMLInterfaces";
|
||||||
import { ParserForHTML as Parser } from "../src/freeDatas2HTMLParserForHTML";
|
import { ParserForHTML as Parser } from "../src/freeDatas2HTMLParserForHTML";
|
||||||
const errors=require("../src/errors.js");
|
const errors=require("../src/errors.js");
|
||||||
const fixtures=require("./fixtures.js");
|
const fixtures=require("./fixtures.js");
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { RemoteSource } from "../src/freeDatas2HTMLInterfaces";
|
||||||
import { ParserForJSON as Parser } from "../src/freeDatas2HTMLParserForJSON";
|
import { ParserForJSON as Parser } from "../src/freeDatas2HTMLParserForJSON";
|
||||||
const errors=require("../src/errors.js");
|
const errors=require("../src/errors.js");
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
import { RemoteSource } from "../src/freeDatas2HTMLRemoteSource";
|
import { RemoteSources } from "../src/freeDatas2HTMLRemoteSources";
|
||||||
const errors=require("../src/errors.js");
|
const errors=require("../src/errors.js");
|
||||||
|
|
||||||
describe("Tests des urls distantes", () =>
|
describe("Tests des urls distantes", () =>
|
||||||
{
|
{
|
||||||
let source: RemoteSource;
|
let source: RemoteSources;
|
||||||
|
|
||||||
beforeEach( () =>
|
beforeEach( () =>
|
||||||
{
|
{
|
||||||
source=new RemoteSource({ url:"http://localhost:8080/" });
|
source=new RemoteSources({ url:"http://localhost:8080/" });
|
||||||
});
|
});
|
||||||
|
|
||||||
it("Doit générer une erreur si l'url fournie est une chaîne vide.", () =>
|
it("Doit générer une erreur si l'url fournie est une chaîne vide.", () =>
|
||||||
@ -47,4 +47,5 @@ describe("Tests des urls distantes", () =>
|
|||||||
headers.append("userName", "Toto");
|
headers.append("userName", "Toto");
|
||||||
expect(source.getFetchSettings()).toEqual({ method: "GET", headers: headers, credentials: "include" });
|
expect(source.getFetchSettings()).toEqual({ method: "GET", headers: headers, credentials: "include" });
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
Loading…
Reference in New Issue
Block a user