@ca-plant-list/ca-plant-list 0.1.22 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/config.json +16 -0
- package/data/exceptions.json +1 -0
- package/data/synonyms.csv +1970 -0
- package/data/taxa.csv +1827 -0
- package/lib/dataloader.js +19 -1
- package/lib/files.js +4 -0
- package/lib/genera.js +1 -1
- package/lib/html.js +5 -2
- package/lib/index.d.ts +189 -0
- package/lib/index.js +3 -3
- package/lib/taxa.js +49 -34
- package/lib/taxon.js +18 -8
- package/package.json +3 -2
- package/{build-site.js → scripts/build-site.js} +3 -3
- package/tsconfig.json +0 -14
package/lib/dataloader.js
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
import { CSV } from "./csv.js";
|
1
2
|
import { Taxa } from "./taxa.js";
|
2
3
|
import { Families } from "./families.js";
|
3
4
|
import { Exceptions } from "./exceptions.js";
|
5
|
+
import { Files } from "./files.js";
|
4
6
|
|
5
7
|
const OPTION_DEFS = [
|
6
8
|
{ name: "datadir", type: String, defaultValue: "./data" },
|
@@ -19,12 +21,28 @@ class DataLoader {
|
|
19
21
|
|
20
22
|
static load( options ) {
|
21
23
|
|
24
|
+
function getIncludeList() {
|
25
|
+
// Read inclusion list.
|
26
|
+
const includeFileName = "taxa_include.csv";
|
27
|
+
if ( !Files.exists( taxaDir + "/" + includeFileName ) ) {
|
28
|
+
console.log( includeFileName + " not found; loading all taxa" );
|
29
|
+
return true;
|
30
|
+
}
|
31
|
+
const includeCSV = CSV.parseFile( taxaDir, includeFileName );
|
32
|
+
const include = {};
|
33
|
+
for ( const row of includeCSV ) {
|
34
|
+
include[ row[ "taxon_name" ] ] = row;
|
35
|
+
}
|
36
|
+
return include;
|
37
|
+
}
|
38
|
+
|
22
39
|
const taxaDir = options.datadir;
|
23
40
|
|
24
41
|
console.log( "loading data" );
|
25
42
|
|
26
43
|
this.init( taxaDir );
|
27
|
-
|
44
|
+
|
45
|
+
Taxa.init( getIncludeList() );
|
28
46
|
|
29
47
|
}
|
30
48
|
|
package/lib/files.js
CHANGED
package/lib/genera.js
CHANGED
package/lib/html.js
CHANGED
@@ -41,8 +41,11 @@ export class HTML {
|
|
41
41
|
if ( escape && ( typeof text === "string" ) ) {
|
42
42
|
text = this.escapeText( text );
|
43
43
|
}
|
44
|
-
|
45
|
-
|
44
|
+
// If tag is empty, make it self-closing so it is XHTML (epub) compatible.
|
45
|
+
if ( text === "" ) {
|
46
|
+
return html + "/>";
|
47
|
+
}
|
48
|
+
return html + ">" + text + "</" + elName + ">";
|
46
49
|
}
|
47
50
|
|
48
51
|
/**
|
package/lib/index.d.ts
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
export class BasePageRenderer {
|
2
|
+
static render(outputDir: any, Taxa: any, familyCols: any): void;
|
3
|
+
static renderTools(outputDir: any, Taxa: any): void;
|
4
|
+
}
|
5
|
+
export class Config {
|
6
|
+
static "__#1@#config": {};
|
7
|
+
static "__#1@#packageDir": string;
|
8
|
+
static getConfigValue(prefix: any, name: any, subcat: any, dflt: any): any;
|
9
|
+
static getCountyCodes(): any;
|
10
|
+
static getLabel(name: any, dflt: any): any;
|
11
|
+
static getPackageDir(): string;
|
12
|
+
}
|
13
|
+
export class CSV {
|
14
|
+
static getMap(dir: any, fileName: any): {};
|
15
|
+
static "__#8@#getOptions"(fileName: any, columns: any, delimiter: any): {
|
16
|
+
relax_column_count_less: boolean;
|
17
|
+
};
|
18
|
+
static parseFile(dir: any, fileName: any, columns: boolean, delimiter: any): any;
|
19
|
+
static parseStream(dir: any, fileName: any, columns: boolean, delimiter: any, callback: any): Promise<void>;
|
20
|
+
}
|
21
|
+
export class DataLoader {
|
22
|
+
static getOptionDefs(): {
|
23
|
+
name: string;
|
24
|
+
type: StringConstructor;
|
25
|
+
defaultValue: string;
|
26
|
+
}[];
|
27
|
+
static init(taxaDir: any): void;
|
28
|
+
static load(options: any): void;
|
29
|
+
}
|
30
|
+
export class ErrorLog {
|
31
|
+
static "__#7@#errors": any[];
|
32
|
+
static log(...args: any[]): void;
|
33
|
+
static write(fileName: any): void;
|
34
|
+
}
|
35
|
+
export class Exceptions {
|
36
|
+
static "__#16@#exceptions": {};
|
37
|
+
static getExceptions(): [string, any][];
|
38
|
+
static getValue(name: any, cat: any, subcat: any, defaultValue: any): any;
|
39
|
+
static hasException(name: any, cat: any, subcat: any): boolean;
|
40
|
+
static init(dir: any): void;
|
41
|
+
}
|
42
|
+
export class Families {
|
43
|
+
static "__#10@#families": any;
|
44
|
+
static getFamily(familyName: any): any;
|
45
|
+
static init(): void;
|
46
|
+
static renderPages(outputDir: any, taxaColumns: any): void;
|
47
|
+
}
|
1
48
|
export class Files {
|
2
49
|
static copyDir(srcDir: any, targetDir: any): void;
|
3
50
|
static createFileFromStream(fileName: any, inStream: any): Promise<any>;
|
@@ -10,12 +57,35 @@ export class Files {
|
|
10
57
|
* @returns {Promise<Headers>} The Response headers.
|
11
58
|
*/
|
12
59
|
static fetch(url: string | URL, targetFileName: string | undefined, headers?: any): Promise<Headers>;
|
60
|
+
static getDirEntries(path: any): string[];
|
13
61
|
static mkdir(path: any): void;
|
14
62
|
static read(path: any): string;
|
15
63
|
static rmDir(dir: any): void;
|
16
64
|
static write(path: any, data: any, overwrite?: boolean): void;
|
17
65
|
static zipFileExtract(zipFilePath: any, fileNameToUnzip: any, targetFilePath: any): Promise<void>;
|
18
66
|
}
|
67
|
+
export class Genera {
|
68
|
+
static "__#4@#genera": any;
|
69
|
+
static addTaxon(taxon: any): void;
|
70
|
+
static getGenus(genusName: any): Genus;
|
71
|
+
static getFamily(genusName: any): any;
|
72
|
+
static init(dataDir: any): void;
|
73
|
+
}
|
74
|
+
declare class Genus {
|
75
|
+
constructor(data: any);
|
76
|
+
getTaxa(): any;
|
77
|
+
#private;
|
78
|
+
}
|
79
|
+
export {};
|
80
|
+
export class GenericPage {
|
81
|
+
constructor(outputDir: any, title: any, baseFileName: any, js: any);
|
82
|
+
getBaseFileName(): any;
|
83
|
+
getDefaultIntro(): string;
|
84
|
+
getOutputDir(): any;
|
85
|
+
getTitle(): any;
|
86
|
+
writeFile(html: any): void;
|
87
|
+
#private;
|
88
|
+
}
|
19
89
|
export namespace HTML_OPTIONS {
|
20
90
|
const OPEN_NEW: number;
|
21
91
|
const NO_ESCAPE: number;
|
@@ -55,8 +125,127 @@ export class HTML {
|
|
55
125
|
static textElement(elName: any, text: any, attributes?: {}): string;
|
56
126
|
static wrap(elName: any, text: any, attributes?: {}): string;
|
57
127
|
}
|
128
|
+
import { BasePageRenderer } from "./basepagerenderer.js";
|
129
|
+
import { Config } from "./config.js";
|
130
|
+
import { CSV } from "./csv.js";
|
131
|
+
import { DataLoader } from "./dataloader.js";
|
132
|
+
import { ErrorLog } from "./errorlog.js";
|
133
|
+
import { Exceptions } from "./exceptions.js";
|
134
|
+
import { Families } from "./families.js";
|
135
|
+
import { Files } from "./files.js";
|
136
|
+
import { HTML } from "./html.js";
|
137
|
+
import { Jekyll } from "./jekyll.js";
|
138
|
+
import { Taxa } from "./taxa.js";
|
139
|
+
import { TAXA_COLNAMES } from "./taxon.js";
|
140
|
+
import { Taxon } from "./taxon.js";
|
141
|
+
export { BasePageRenderer, Config, CSV, DataLoader, ErrorLog, Exceptions, Families, Files, HTML, Jekyll, Taxa, TAXA_COLNAMES, Taxon };
|
58
142
|
export class Jekyll {
|
59
143
|
static hasInclude(baseDir: any, path: any): boolean;
|
60
144
|
static include(path: any): string;
|
61
145
|
static writeInclude(baseDir: any, path: any, data: any): void;
|
62
146
|
}
|
147
|
+
export class Jepson {
|
148
|
+
static getEFloraLink(id: any): string;
|
149
|
+
}
|
150
|
+
export class RarePlants {
|
151
|
+
static getCESADescription(cesa: any): any;
|
152
|
+
static getFESADescription(fesa: any): any;
|
153
|
+
static getRPIRankDescription(rank: any): any;
|
154
|
+
static getRPIRankAndThreatDescriptions(rank: any): any[];
|
155
|
+
}
|
156
|
+
export class Taxa {
|
157
|
+
static "__#9@#taxa": {};
|
158
|
+
static "__#9@#sortedTaxa": any;
|
159
|
+
static getHTMLTable(taxa: any, columns?: {
|
160
|
+
title: string;
|
161
|
+
data: (t: any) => any;
|
162
|
+
}[]): string;
|
163
|
+
static getTaxa(): any;
|
164
|
+
static getTaxon(name: any): any;
|
165
|
+
static init(inclusionList: any, taxaMeta?: {}, taxonClass?: typeof Taxon, extraTaxa?: any[], extraSynonyms?: any[]): void;
|
166
|
+
static "__#9@#loadSyns"(synCSV: any, inclusionList: any): void;
|
167
|
+
static "__#9@#loadTaxa"(taxaCSV: any, inclusionList: any, taxaMeta: any, taxonClass: any): void;
|
168
|
+
}
|
169
|
+
export namespace TAXA_LIST_COLS {
|
170
|
+
namespace CESA {
|
171
|
+
const title: string;
|
172
|
+
function data(t: any): any;
|
173
|
+
}
|
174
|
+
namespace COMMON_NAME {
|
175
|
+
const title_1: string;
|
176
|
+
export { title_1 as title };
|
177
|
+
export function data_1(t: any): any;
|
178
|
+
export { data_1 as data };
|
179
|
+
}
|
180
|
+
namespace CNPS_RANK {
|
181
|
+
const title_2: string;
|
182
|
+
export { title_2 as title };
|
183
|
+
export function data_2(t: any): string;
|
184
|
+
export { data_2 as data };
|
185
|
+
}
|
186
|
+
namespace FESA {
|
187
|
+
const title_3: string;
|
188
|
+
export { title_3 as title };
|
189
|
+
export function data_3(t: any): any;
|
190
|
+
export { data_3 as data };
|
191
|
+
}
|
192
|
+
namespace SPECIES {
|
193
|
+
const title_4: string;
|
194
|
+
export { title_4 as title };
|
195
|
+
export function data_4(t: any): any;
|
196
|
+
export { data_4 as data };
|
197
|
+
}
|
198
|
+
namespace SPECIES_BARE {
|
199
|
+
const title_5: string;
|
200
|
+
export { title_5 as title };
|
201
|
+
export function data_5(t: any): any;
|
202
|
+
export { data_5 as data };
|
203
|
+
}
|
204
|
+
}
|
205
|
+
import { Taxon } from "./taxon.js";
|
206
|
+
export namespace TAXA_COLNAMES {
|
207
|
+
const COMMON_NAME: string;
|
208
|
+
}
|
209
|
+
export class Taxon {
|
210
|
+
constructor(data: any);
|
211
|
+
addSynonym(syn: any, type: any): void;
|
212
|
+
getBaseFileName(): any;
|
213
|
+
getCalfloraName(): any;
|
214
|
+
getCalfloraID(): any;
|
215
|
+
getCalfloraTaxonLink(): string;
|
216
|
+
getCESA(): any;
|
217
|
+
getCNDDBRank(): any;
|
218
|
+
getCommonNames(): any;
|
219
|
+
getFamily(): any;
|
220
|
+
getFESA(): any;
|
221
|
+
getFileName(ext?: string): string;
|
222
|
+
getGenus(): {
|
223
|
+
"__#5@#data": any;
|
224
|
+
getTaxa(): any;
|
225
|
+
};
|
226
|
+
getGenusName(): any;
|
227
|
+
getGlobalRank(): any;
|
228
|
+
getHTMLLink(href?: boolean, includeRPI?: boolean): string;
|
229
|
+
getINatID(): any;
|
230
|
+
getINatName(): any;
|
231
|
+
getINatSyn(): any;
|
232
|
+
getINatTaxonLink(): string;
|
233
|
+
getJepsonID(): any;
|
234
|
+
getName(): any;
|
235
|
+
getRPIID(): any;
|
236
|
+
getRPIRank(): any;
|
237
|
+
getRPIRankAndThreat(): any;
|
238
|
+
getRPIRankAndThreatTooltip(): string;
|
239
|
+
getRPITaxonLink(): string;
|
240
|
+
getStatus(): any;
|
241
|
+
getStatusDescription(): any;
|
242
|
+
getSynonyms(): any[];
|
243
|
+
isCANative(): boolean;
|
244
|
+
/**
|
245
|
+
* Determine whether a species is a local native.
|
246
|
+
* @returns {boolean} true if taxon is a local native; false if not a CA native, or native elsewhere in CA.
|
247
|
+
*/
|
248
|
+
isNative(): boolean;
|
249
|
+
isRare(): boolean;
|
250
|
+
#private;
|
251
|
+
}
|
package/lib/index.js
CHANGED
@@ -6,9 +6,9 @@ import { ErrorLog } from "./errorlog.js";
|
|
6
6
|
import { Exceptions } from "./exceptions.js";
|
7
7
|
import { Families } from "./families.js";
|
8
8
|
import { Files } from "./files.js";
|
9
|
-
import { HTML
|
9
|
+
import { HTML } from "./html.js";
|
10
10
|
import { Jekyll } from "./jekyll.js";
|
11
11
|
import { Taxa } from "./taxa.js";
|
12
|
-
import { Taxon } from "./taxon.js";
|
12
|
+
import { Taxon, TAXA_COLNAMES } from "./taxon.js";
|
13
13
|
|
14
|
-
export { BasePageRenderer, Config, CSV, DataLoader, ErrorLog, Exceptions, Families, Files, HTML,
|
14
|
+
export { BasePageRenderer, Config, CSV, DataLoader, ErrorLog, Exceptions, Families, Files, HTML, Jekyll, Taxa, TAXA_COLNAMES, Taxon };
|
package/lib/taxa.js
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
+
import { Config } from "./config.js";
|
1
2
|
import { Taxon } from "./taxon.js";
|
2
3
|
import { ErrorLog } from "./errorlog.js";
|
3
4
|
import { HTML } from "./html.js";
|
4
5
|
import { CSV } from "./csv.js";
|
5
6
|
import { RarePlants } from "./rareplants.js";
|
6
|
-
import { Exceptions } from "./exceptions.js";
|
7
7
|
|
8
8
|
const TAXA_LIST_COLS = {
|
9
9
|
CESA: {
|
@@ -75,57 +75,72 @@ class Taxa {
|
|
75
75
|
return this.#taxa[ name ];
|
76
76
|
}
|
77
77
|
|
78
|
-
static init(
|
78
|
+
static init( inclusionList, taxaMeta = {}, taxonClass = Taxon, extraTaxa = [], extraSynonyms = [] ) {
|
79
|
+
|
80
|
+
const dataDir = Config.getPackageDir() + "/data";
|
81
|
+
|
79
82
|
const taxaCSV = CSV.parseFile( dataDir, "taxa.csv" );
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
case "X": {
|
88
|
-
if ( this.#taxa[ name ] ) {
|
89
|
-
ErrorLog.log( name, "has multiple entries" );
|
90
|
-
}
|
91
|
-
const commonName = row[ "common name" ];
|
92
|
-
this.#taxa[ name ] = new Taxon(
|
93
|
-
name,
|
94
|
-
commonName,
|
95
|
-
status,
|
96
|
-
jepsonID,
|
97
|
-
row[ "calrecnum" ],
|
98
|
-
row[ "inat id" ],
|
99
|
-
row[ "RPI ID" ],
|
100
|
-
row[ "CRPR" ],
|
101
|
-
row[ "CESA" ],
|
102
|
-
row[ "FESA" ]
|
103
|
-
);
|
104
|
-
if ( !jepsonID && !Exceptions.hasException( name, "jepson", "badjepsonid" ) ) {
|
105
|
-
ErrorLog.log( name, "has no Jepson ID" );
|
106
|
-
}
|
107
|
-
break;
|
108
|
-
}
|
109
|
-
default:
|
110
|
-
ErrorLog.log( name, "has unrecognized status", status );
|
83
|
+
this.#loadTaxa( taxaCSV, inclusionList, taxaMeta, taxonClass );
|
84
|
+
this.#loadTaxa( extraTaxa, inclusionList, taxaMeta, taxonClass );
|
85
|
+
|
86
|
+
// Make sure everything in the inclusionList has been loaded.
|
87
|
+
for ( const name of Object.keys( inclusionList ) ) {
|
88
|
+
if ( !this.getTaxon( name ) ) {
|
89
|
+
ErrorLog.log( name, "not found in taxon list" );
|
111
90
|
}
|
112
91
|
}
|
113
92
|
|
114
93
|
this.#sortedTaxa = Object.values( this.#taxa ).sort( ( a, b ) => a.getName().localeCompare( b.getName() ) );
|
115
94
|
|
116
95
|
const synCSV = CSV.parseFile( dataDir, "synonyms.csv" );
|
96
|
+
this.#loadSyns( synCSV, inclusionList );
|
97
|
+
this.#loadSyns( extraSynonyms, inclusionList );
|
98
|
+
|
99
|
+
}
|
100
|
+
|
101
|
+
static #loadSyns( synCSV, inclusionList ) {
|
117
102
|
for ( const syn of synCSV ) {
|
118
103
|
const currName = syn[ "Current" ];
|
119
104
|
const taxon = this.getTaxon( currName );
|
120
105
|
if ( !taxon ) {
|
121
|
-
|
106
|
+
if ( inclusionList === true ) {
|
107
|
+
// If including all taxa, note the error.
|
108
|
+
console.log( "synonym target not found: " + currName );
|
109
|
+
}
|
122
110
|
continue;
|
123
111
|
}
|
124
112
|
taxon.addSynonym( syn[ "Former" ], syn[ "Type" ] );
|
125
113
|
}
|
114
|
+
}
|
115
|
+
|
116
|
+
static #loadTaxa( taxaCSV, inclusionList, taxaMeta, taxonClass ) {
|
117
|
+
for ( const row of taxaCSV ) {
|
118
|
+
|
119
|
+
const name = row[ "taxon_name" ];
|
120
|
+
|
121
|
+
let taxon_overrides = {};
|
122
|
+
if ( inclusionList !== true ) {
|
123
|
+
taxon_overrides = inclusionList[ name ];
|
124
|
+
if ( !taxon_overrides ) {
|
125
|
+
continue;
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
if ( this.#taxa[ name ] ) {
|
130
|
+
ErrorLog.log( name, "has multiple entries" );
|
131
|
+
}
|
132
|
+
|
133
|
+
const status = taxon_overrides[ "status" ];
|
134
|
+
if ( status !== undefined ) {
|
135
|
+
row[ "status" ] = status;
|
136
|
+
}
|
137
|
+
this.#taxa[ name ] = new taxonClass( row, taxaMeta[ name ] );
|
138
|
+
|
139
|
+
}
|
126
140
|
|
127
141
|
}
|
128
142
|
|
143
|
+
|
129
144
|
}
|
130
145
|
|
131
146
|
export { Taxa, TAXA_LIST_COLS };
|
package/lib/taxon.js
CHANGED
@@ -3,6 +3,10 @@ import { Genera } from "./genera.js";
|
|
3
3
|
import { HTML } from "./html.js";
|
4
4
|
import { RarePlants } from "./rareplants.js";
|
5
5
|
|
6
|
+
const TAXA_COLNAMES = {
|
7
|
+
COMMON_NAME: "common name"
|
8
|
+
};
|
9
|
+
|
6
10
|
class Taxon {
|
7
11
|
|
8
12
|
#name;
|
@@ -22,16 +26,22 @@ class Taxon {
|
|
22
26
|
#rankGlobal;
|
23
27
|
#synonyms = [];
|
24
28
|
|
25
|
-
constructor(
|
29
|
+
constructor( data ) {
|
30
|
+
const name = data[ "taxon_name" ];
|
31
|
+
const commonNames = data[ TAXA_COLNAMES.COMMON_NAME ];
|
32
|
+
const cesa = data[ "CESA" ];
|
33
|
+
const fesa = data[ "FESA" ];
|
34
|
+
const rankGlobal = data[ "GRank" ];
|
35
|
+
const rankCNDDB = data[ "SRank" ];
|
26
36
|
this.#name = name;
|
27
37
|
this.#genus = name.split( " " )[ 0 ];
|
28
38
|
this.#commonNames = commonNames ? commonNames.split( "," ).map( t => t.trim() ) : [];
|
29
|
-
this.#status = status;
|
30
|
-
this.#jepsonID =
|
31
|
-
this.#calRecNum =
|
32
|
-
this.#iNatID =
|
33
|
-
this.#rpiID =
|
34
|
-
this.#rankRPI =
|
39
|
+
this.#status = data[ "status" ];
|
40
|
+
this.#jepsonID = data[ "jepson id" ];
|
41
|
+
this.#calRecNum = data[ "calrecnum" ];
|
42
|
+
this.#iNatID = data[ "inat id" ];
|
43
|
+
this.#rpiID = data[ "RPI ID" ];
|
44
|
+
this.#rankRPI = data[ "CRPR" ];
|
35
45
|
this.#cesa = cesa ? cesa : undefined;
|
36
46
|
this.#fesa = fesa ? fesa : undefined;
|
37
47
|
this.#rankCNDDB = rankCNDDB ? rankCNDDB : undefined;
|
@@ -224,4 +234,4 @@ class Taxon {
|
|
224
234
|
|
225
235
|
}
|
226
236
|
|
227
|
-
export { Taxon };
|
237
|
+
export { TAXA_COLNAMES, Taxon };
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ca-plant-list/ca-plant-list",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.2.0",
|
4
4
|
"description": "Tools to create Jekyll files for a website listing plants in an area of California.",
|
5
5
|
"license": "MIT",
|
6
6
|
"repository": {
|
@@ -18,9 +18,10 @@
|
|
18
18
|
},
|
19
19
|
"types": "./lib/index.d.ts",
|
20
20
|
"bin": {
|
21
|
-
"ca-plant-list": "build-site.js"
|
21
|
+
"ca-plant-list": "scripts/build-site.js"
|
22
22
|
},
|
23
23
|
"dependencies": {
|
24
|
+
"@ca-plant-list/tools": "file:../ca-tools",
|
24
25
|
"command-line-args": "^5.2.1",
|
25
26
|
"command-line-usage": "^6.1.3",
|
26
27
|
"csv-parse": "^5.3.1",
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
2
|
|
3
|
-
import { DataLoader } from "
|
4
|
-
import { ErrorLog } from "
|
5
|
-
import { PageRenderer } from "
|
3
|
+
import { DataLoader } from "../lib/dataloader.js";
|
4
|
+
import { ErrorLog } from "../lib/errorlog.js";
|
5
|
+
import { PageRenderer } from "../lib/pagerenderer.js";
|
6
6
|
import commandLineArgs from "command-line-args";
|
7
7
|
|
8
8
|
const options = commandLineArgs( DataLoader.getOptionDefs() );
|
package/tsconfig.json
DELETED