@marketeer-intelligence/framework-device 0.1.0-alpha.1
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/README.md +3 -0
- package/dist/ConfigureEnvironmentVariables.d.ts +10 -0
- package/dist/ConfigureEnvironmentVariables.d.ts.map +1 -0
- package/dist/ConfigureEnvironmentVariables.js +32 -0
- package/dist/ConfigureEnvironmentVariables.js.map +1 -0
- package/dist/ConnectToMongoDb.d.ts +9 -0
- package/dist/ConnectToMongoDb.d.ts.map +1 -0
- package/dist/ConnectToMongoDb.js +29 -0
- package/dist/ConnectToMongoDb.js.map +1 -0
- package/dist/DisconnectFromMongoDb.d.ts +8 -0
- package/dist/DisconnectFromMongoDb.d.ts.map +1 -0
- package/dist/DisconnectFromMongoDb.js +26 -0
- package/dist/DisconnectFromMongoDb.js.map +1 -0
- package/dist/InstrumentMongoDbCollection.d.ts +12 -0
- package/dist/InstrumentMongoDbCollection.d.ts.map +1 -0
- package/dist/InstrumentMongoDbCollection.js +58 -0
- package/dist/InstrumentMongoDbCollection.js.map +1 -0
- package/dist/MongoDbUri.d.ts +11 -0
- package/dist/MongoDbUri.d.ts.map +1 -0
- package/dist/MongoDbUri.js +39 -0
- package/dist/MongoDbUri.js.map +1 -0
- package/dist/SecurityMongoDbCollection.d.ts +12 -0
- package/dist/SecurityMongoDbCollection.d.ts.map +1 -0
- package/dist/SecurityMongoDbCollection.js +67 -0
- package/dist/SecurityMongoDbCollection.js.map +1 -0
- package/dist/SecurityTableParaser.d.ts +8 -0
- package/dist/SecurityTableParaser.d.ts.map +1 -0
- package/dist/SecurityTableParaser.js +72 -0
- package/dist/SecurityTableParaser.js.map +1 -0
- package/dist/StaticWebpageScraper.d.ts +13 -0
- package/dist/StaticWebpageScraper.d.ts.map +1 -0
- package/dist/StaticWebpageScraper.js +51 -0
- package/dist/StaticWebpageScraper.js.map +1 -0
- package/dist/Webpage.d.ts +11 -0
- package/dist/Webpage.d.ts.map +1 -0
- package/dist/Webpage.js +22 -0
- package/dist/Webpage.js.map +1 -0
- package/dist/WebpageBody.d.ts +11 -0
- package/dist/WebpageBody.d.ts.map +1 -0
- package/dist/WebpageBody.js +34 -0
- package/dist/WebpageBody.js.map +1 -0
- package/dist/WebpageUrl.d.ts +11 -0
- package/dist/WebpageUrl.d.ts.map +1 -0
- package/dist/WebpageUrl.js +39 -0
- package/dist/WebpageUrl.js.map +1 -0
- package/dist/dataSource.d.ts +4 -0
- package/dist/dataSource.d.ts.map +1 -0
- package/dist/dataSource.js +12 -0
- package/dist/dataSource.js.map +1 -0
- package/dist/dataStore.d.ts +5 -0
- package/dist/dataStore.d.ts.map +1 -0
- package/dist/dataStore.js +9 -0
- package/dist/dataStore.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/task.d.ts +6 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +12 -0
- package/dist/task.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
import { IJob, Status } from './index.js';
|
2
|
+
export declare class ConfigureEnvironmentVariables implements IJob {
|
3
|
+
private _configured;
|
4
|
+
private constructor();
|
5
|
+
private static _instance;
|
6
|
+
static create(): ConfigureEnvironmentVariables;
|
7
|
+
get configured(): boolean;
|
8
|
+
run(): Promise<Status<Error>>;
|
9
|
+
}
|
10
|
+
//# sourceMappingURL=ConfigureEnvironmentVariables.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ConfigureEnvironmentVariables.d.ts","sourceRoot":"","sources":["../src/ConfigureEnvironmentVariables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAE,MAAM,EAAU,MAAM,YAAY,CAAA;AAGzD,qBAAa,6BAA8B,YAAW,IAAI;IACxD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO;IAGP,OAAO,CAAC,MAAM,CAAC,SAAS,CAA+B;IACvD,MAAM,CAAC,MAAM,IAAI,6BAA6B;IAK9C,IAAI,UAAU,YAEb;IACK,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CAepC"}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
import { Failure, Success } from './index.js';
|
2
|
+
import dotenv from 'dotenv-safe';
|
3
|
+
export class ConfigureEnvironmentVariables {
|
4
|
+
_configured;
|
5
|
+
constructor() {
|
6
|
+
this._configured = false;
|
7
|
+
}
|
8
|
+
static _instance;
|
9
|
+
static create() {
|
10
|
+
return (this._instance || (this._instance = new ConfigureEnvironmentVariables()));
|
11
|
+
}
|
12
|
+
get configured() {
|
13
|
+
return this._configured;
|
14
|
+
}
|
15
|
+
async run() {
|
16
|
+
try {
|
17
|
+
if (!this._configured) {
|
18
|
+
dotenv.config();
|
19
|
+
this._configured = true;
|
20
|
+
console.log('environment variables have been loaded');
|
21
|
+
}
|
22
|
+
return Success.create();
|
23
|
+
}
|
24
|
+
catch (error) {
|
25
|
+
if (error instanceof Error) {
|
26
|
+
return Failure.create(error);
|
27
|
+
}
|
28
|
+
throw error;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
//# sourceMappingURL=ConfigureEnvironmentVariables.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ConfigureEnvironmentVariables.js","sourceRoot":"","sources":["../src/ConfigureEnvironmentVariables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAgB,OAAO,EAAC,MAAM,YAAY,CAAA;AACzD,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,MAAM,OAAO,6BAA6B;IAChC,WAAW,CAAS;IAC5B;QACE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;IAC1B,CAAC;IACO,MAAM,CAAC,SAAS,CAA+B;IACvD,MAAM,CAAC,MAAM;QACX,OAAO,CACL,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,6BAA6B,EAAE,CAAC,CACzE,CAAA;IACH,CAAC;IACD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IACD,KAAK,CAAC,GAAG;QACP,IAAI;YACF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,MAAM,CAAC,MAAM,EAAE,CAAA;gBACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;gBACvB,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;aACtD;YACD,OAAO,OAAO,CAAC,MAAM,EAAE,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { IJob, MongoDbUri, Status } from './index.js';
|
2
|
+
export declare class ConnectToMongoDb implements IJob {
|
3
|
+
private _uri;
|
4
|
+
private constructor();
|
5
|
+
private static _instance;
|
6
|
+
static create(uri: MongoDbUri): ConnectToMongoDb;
|
7
|
+
run(): Promise<Status<Error>>;
|
8
|
+
}
|
9
|
+
//# sourceMappingURL=ConnectToMongoDb.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ConnectToMongoDb.d.ts","sourceRoot":"","sources":["../src/ConnectToMongoDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAE,UAAU,EAAE,MAAM,EAAU,MAAM,YAAY,CAAA;AAGrE,qBAAa,gBAAiB,YAAW,IAAI;IACvB,OAAO,CAAC,IAAI;IAAhC,OAAO;IACP,OAAO,CAAC,MAAM,CAAC,SAAS,CAAkB;IAC1C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,gBAAgB;IAG1C,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CAiBpC"}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import { Failure, Success } from './index.js';
|
2
|
+
import mongoose from 'mongoose';
|
3
|
+
export class ConnectToMongoDb {
|
4
|
+
_uri;
|
5
|
+
constructor(_uri) {
|
6
|
+
this._uri = _uri;
|
7
|
+
}
|
8
|
+
static _instance;
|
9
|
+
static create(uri) {
|
10
|
+
return this._instance || (this._instance = new ConnectToMongoDb(uri));
|
11
|
+
}
|
12
|
+
async run() {
|
13
|
+
try {
|
14
|
+
if (mongoose.connection.readyState !== mongoose.ConnectionStates.connected) {
|
15
|
+
mongoose.set('strictQuery', false);
|
16
|
+
await mongoose.connect(this._uri.value);
|
17
|
+
console.log('connected to MongoDb');
|
18
|
+
}
|
19
|
+
return Success.create();
|
20
|
+
}
|
21
|
+
catch (error) {
|
22
|
+
if (error instanceof Error) {
|
23
|
+
return Failure.create(error);
|
24
|
+
}
|
25
|
+
throw error;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
//# sourceMappingURL=ConnectToMongoDb.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ConnectToMongoDb.js","sourceRoot":"","sources":["../src/ConnectToMongoDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAA4B,OAAO,EAAC,MAAM,YAAY,CAAA;AACrE,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,OAAO,gBAAgB;IACC;IAA5B,YAA4B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IACxC,MAAM,CAAC,SAAS,CAAkB;IAC1C,MAAM,CAAC,MAAM,CAAC,GAAe;QAC3B,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAA;IACvE,CAAC;IACD,KAAK,CAAC,GAAG;QACP,IAAI;YACF,IACE,QAAQ,CAAC,UAAU,CAAC,UAAU,KAAK,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EACtE;gBACA,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;gBAClC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACvC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;aACpC;YACD,OAAO,OAAO,CAAC,MAAM,EAAE,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { IJob, Status } from './index.js';
|
2
|
+
export declare class DisconnectFromMongoDb implements IJob {
|
3
|
+
private constructor();
|
4
|
+
private static _instance;
|
5
|
+
static create(): DisconnectFromMongoDb;
|
6
|
+
run(): Promise<Status<Error>>;
|
7
|
+
}
|
8
|
+
//# sourceMappingURL=DisconnectFromMongoDb.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DisconnectFromMongoDb.d.ts","sourceRoot":"","sources":["../src/DisconnectFromMongoDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAE,MAAM,EAAU,MAAM,YAAY,CAAA;AAGzD,qBAAa,qBAAsB,YAAW,IAAI;IAChD,OAAO;IACP,OAAO,CAAC,MAAM,CAAC,SAAS,CAAuB;IAC/C,MAAM,CAAC,MAAM,IAAI,qBAAqB;IAGhC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CAiBpC"}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { Failure, Success } from './index.js';
|
2
|
+
import mongoose from 'mongoose';
|
3
|
+
export class DisconnectFromMongoDb {
|
4
|
+
constructor() { }
|
5
|
+
static _instance;
|
6
|
+
static create() {
|
7
|
+
return this._instance || (this._instance = new DisconnectFromMongoDb());
|
8
|
+
}
|
9
|
+
async run() {
|
10
|
+
try {
|
11
|
+
if (mongoose.connection.readyState === mongoose.ConnectionStates.connected) {
|
12
|
+
await mongoose.disconnect();
|
13
|
+
await mongoose.connection.close();
|
14
|
+
console.log('disconnected from MongoDb');
|
15
|
+
}
|
16
|
+
return Success.create();
|
17
|
+
}
|
18
|
+
catch (error) {
|
19
|
+
if (error instanceof Error) {
|
20
|
+
return Failure.create(error);
|
21
|
+
}
|
22
|
+
throw error;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=DisconnectFromMongoDb.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"DisconnectFromMongoDb.js","sourceRoot":"","sources":["../src/DisconnectFromMongoDb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAgB,OAAO,EAAC,MAAM,YAAY,CAAA;AACzD,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,OAAO,qBAAqB;IAChC,gBAAuB,CAAC;IAChB,MAAM,CAAC,SAAS,CAAuB;IAC/C,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAqB,EAAE,CAAC,CAAA;IACzE,CAAC;IACD,KAAK,CAAC,GAAG;QACP,IAAI;YACF,IACE,QAAQ,CAAC,UAAU,CAAC,UAAU,KAAK,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EACtE;gBACA,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAA;gBAC3B,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;gBACjC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;aACzC;YACD,OAAO,OAAO,CAAC,MAAM,EAAE,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { IStorable, Instrument, Status } from './index.js';
|
2
|
+
export declare class InstrumentMongoDbCollection implements IStorable<Instrument[]> {
|
3
|
+
private readonly _name;
|
4
|
+
private readonly _schema;
|
5
|
+
private _model;
|
6
|
+
private constructor();
|
7
|
+
private static _instance;
|
8
|
+
static create(): InstrumentMongoDbCollection;
|
9
|
+
upsert(instrument: Instrument): Promise<Status<Error>>;
|
10
|
+
store(instruments: Instrument[]): Promise<Status<Error>>;
|
11
|
+
}
|
12
|
+
//# sourceMappingURL=InstrumentMongoDbCollection.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"InstrumentMongoDbCollection.d.ts","sourceRoot":"","sources":["../src/InstrumentMongoDbCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,UAAU,EAEV,MAAM,EAEP,MAAM,YAAY,CAAA;AAenB,qBAAa,2BAA4B,YAAW,SAAS,CAAC,UAAU,EAAE,CAAC;IACzE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAarB;IACH,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO;IAMP,OAAO,CAAC,MAAM,CAAC,SAAS,CAA6B;IACrD,MAAM,CAAC,MAAM,IAAI,2BAA2B;IAKtC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAgBtD,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CAmB/D"}
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import { Failure, Success, } from './index.js';
|
2
|
+
import { Schema as MongooseSchema, model as mongooseModel, } from 'mongoose';
|
3
|
+
export class InstrumentMongoDbCollection {
|
4
|
+
_name = 'instruments';
|
5
|
+
_schema = new MongooseSchema({
|
6
|
+
isin: { type: String, required: true, unique: true },
|
7
|
+
symbol: { type: String, required: true, unique: true },
|
8
|
+
name: { type: String, required: true },
|
9
|
+
cfi: { type: String, required: true },
|
10
|
+
published: { type: String, required: true },
|
11
|
+
}, {
|
12
|
+
collection: this._name,
|
13
|
+
timestamps: true,
|
14
|
+
});
|
15
|
+
_model;
|
16
|
+
constructor() {
|
17
|
+
this._model = mongooseModel(this._name, this._schema);
|
18
|
+
}
|
19
|
+
static _instance;
|
20
|
+
static create() {
|
21
|
+
return (this._instance || (this._instance = new InstrumentMongoDbCollection()));
|
22
|
+
}
|
23
|
+
async upsert(instrument) {
|
24
|
+
try {
|
25
|
+
await this._model.updateOne({ isin: instrument.value.isin }, { $set: instrument.value }, { upsert: true, new: true });
|
26
|
+
return Success.create();
|
27
|
+
}
|
28
|
+
catch (error) {
|
29
|
+
if (error instanceof Error) {
|
30
|
+
return Failure.create(error);
|
31
|
+
}
|
32
|
+
console.log(error);
|
33
|
+
return Failure.create(new Error('unknown error'));
|
34
|
+
}
|
35
|
+
}
|
36
|
+
async store(instruments) {
|
37
|
+
try {
|
38
|
+
for (const [index, instrument] of instruments.entries()) {
|
39
|
+
try {
|
40
|
+
await this.upsert(instrument);
|
41
|
+
}
|
42
|
+
catch (error) {
|
43
|
+
console.log(`instrument #${index + 1} is skipped`);
|
44
|
+
console.log(error instanceof Error ? error.message : error);
|
45
|
+
continue;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
return Success.create();
|
49
|
+
}
|
50
|
+
catch (error) {
|
51
|
+
if (error instanceof Error) {
|
52
|
+
return Failure.create(error);
|
53
|
+
}
|
54
|
+
throw error;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
//# sourceMappingURL=InstrumentMongoDbCollection.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"InstrumentMongoDbCollection.js","sourceRoot":"","sources":["../src/InstrumentMongoDbCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAKP,OAAO,GACR,MAAM,YAAY,CAAA;AACnB,OAAO,EAGL,MAAM,IAAI,cAAc,EACxB,KAAK,IAAI,aAAa,GACvB,MAAM,UAAU,CAAA;AASjB,MAAM,OAAO,2BAA2B;IACrB,KAAK,GAAG,aAAa,CAAA;IACrB,OAAO,GACtB,IAAI,cAAc,CAChB;QACE,IAAI,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC;QAClD,MAAM,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC;QACpD,IAAI,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAC;QACpC,GAAG,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAC;QACnC,SAAS,EAAE,EAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAC;KAC1C,EACD;QACE,UAAU,EAAE,IAAI,CAAC,KAAK;QACtB,UAAU,EAAE,IAAI;KACjB,CACF,CAAA;IACK,MAAM,CAAyC;IACvD;QACE,IAAI,CAAC,MAAM,GAAG,aAAa,CACzB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CACb,CAAA;IACH,CAAC;IACO,MAAM,CAAC,SAAS,CAA6B;IACrD,MAAM,CAAC,MAAM;QACX,OAAO,CACL,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,2BAA2B,EAAE,CAAC,CACvE,CAAA;IACH,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,UAAsB;QACjC,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CACzB,EAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,EAAC,EAC7B,EAAC,IAAI,EAAE,UAAU,CAAC,KAAK,EAAC,EACxB,EAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAC,CAC1B,CAAA;YACD,OAAO,OAAO,CAAC,MAAM,EAAE,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAClB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;SAClD;IACH,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,WAAyB;QACnC,IAAI;YACF,KAAK,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE;gBACvD,IAAI;oBACF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;iBAC9B;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,CAAC,aAAa,CAAC,CAAA;oBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;oBAC3D,SAAQ;iBACT;aACF;YACD,OAAO,OAAO,CAAC,MAAM,EAAE,CAAA;SACxB;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Feedback, IValueObject } from '@marketeer-intelligence/infrastructure';
|
2
|
+
export type MongoDbUriValue = Readonly<string>;
|
3
|
+
export declare function isMongoDbUriValue(candidate: unknown): candidate is MongoDbUriValue;
|
4
|
+
export declare class MongoDbUri implements IValueObject<MongoDbUriValue> {
|
5
|
+
private _value;
|
6
|
+
private constructor();
|
7
|
+
static create(candidate: unknown): Feedback<MongoDbUri, Error>;
|
8
|
+
get value(): MongoDbUriValue;
|
9
|
+
}
|
10
|
+
export declare function isMongoDbUri(candidate: unknown): candidate is MongoDbUri;
|
11
|
+
//# sourceMappingURL=MongoDbUri.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"MongoDbUri.d.ts","sourceRoot":"","sources":["../src/MongoDbUri.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAER,YAAY,EACb,MAAM,wCAAwC,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;AAK9C,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,OAAO,GACjB,SAAS,IAAI,eAAe,CAI9B;AAED,qBAAa,UAAW,YAAW,YAAY,CAAC,eAAe,CAAC;IAC1C,OAAO,CAAC,MAAM;IAAlC,OAAO;IACP,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAgB9D,IAAI,KAAK,IAAI,eAAe,CAE3B;CACF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI,UAAU,CAExE"}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { Failure, Result, } from '@marketeer-intelligence/infrastructure';
|
2
|
+
const testPattern = /^mongodb(?:\+srv)?:\/\/(?:[^:\n\r]+:[^@\n\r]+@)?(?:[^\/\n\r]+|\[[^\]]+\])(?::[0-9]+)?\/(?:[^\?\/\n\r]*)?(?:\?[^\n\r]*)?$/;
|
3
|
+
export function isMongoDbUriValue(candidate) {
|
4
|
+
if (typeof candidate !== 'string')
|
5
|
+
return false;
|
6
|
+
if (!testPattern.test(candidate))
|
7
|
+
return false;
|
8
|
+
return true;
|
9
|
+
}
|
10
|
+
export class MongoDbUri {
|
11
|
+
_value;
|
12
|
+
constructor(_value) {
|
13
|
+
this._value = _value;
|
14
|
+
}
|
15
|
+
static create(candidate) {
|
16
|
+
try {
|
17
|
+
if (!isMongoDbUriValue(candidate)) {
|
18
|
+
const msg = 'invalid MongoDbUri creation value';
|
19
|
+
const error = new Error(msg);
|
20
|
+
return Failure.create(error);
|
21
|
+
}
|
22
|
+
const mongoDbUri = new MongoDbUri(candidate);
|
23
|
+
return Result.create(mongoDbUri);
|
24
|
+
}
|
25
|
+
catch (error) {
|
26
|
+
if (error instanceof Error) {
|
27
|
+
return Failure.create(error);
|
28
|
+
}
|
29
|
+
throw error;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
get value() {
|
33
|
+
return this._value;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
export function isMongoDbUri(candidate) {
|
37
|
+
return candidate instanceof MongoDbUri;
|
38
|
+
}
|
39
|
+
//# sourceMappingURL=MongoDbUri.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"MongoDbUri.js","sourceRoot":"","sources":["../src/MongoDbUri.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,MAAM,GAEP,MAAM,wCAAwC,CAAA;AAI/C,MAAM,WAAW,GACf,0HAA0H,CAAA;AAE5H,MAAM,UAAU,iBAAiB,CAC/B,SAAkB;IAElB,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,OAAO,UAAU;IACO;IAA5B,YAA4B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,SAAkB;QAC9B,IAAI;YACF,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE;gBACjC,MAAM,GAAG,GAAG,mCAAmC,CAAA;gBAC/C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;YAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;SACjC;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,OAAO,SAAS,YAAY,UAAU,CAAA;AACxC,CAAC"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { IStorable, Security, Status } from './index.js';
|
2
|
+
export declare class SecurityMongoDbCollection implements IStorable<Security[]> {
|
3
|
+
private readonly _name;
|
4
|
+
private readonly _schema;
|
5
|
+
private _model;
|
6
|
+
private constructor();
|
7
|
+
private static _instance;
|
8
|
+
static create(): SecurityMongoDbCollection;
|
9
|
+
upsert(security: Security): Promise<Status<Error>>;
|
10
|
+
store(securities: Security[]): Promise<Status<Error>>;
|
11
|
+
}
|
12
|
+
//# sourceMappingURL=SecurityMongoDbCollection.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SecurityMongoDbCollection.d.ts","sourceRoot":"","sources":["../src/SecurityMongoDbCollection.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,QAAQ,EAER,MAAM,EAEP,MAAM,YAAY,CAAA;AAenB,qBAAa,yBAA0B,YAAW,SAAS,CAAC,QAAQ,EAAE,CAAC;IACrE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAsBrB;IACH,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO;IAMP,OAAO,CAAC,MAAM,CAAC,SAAS,CAA2B;IACnD,MAAM,CAAC,MAAM,IAAI,yBAAyB;IAGpC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAgBlD,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;CAmB5D"}
|
@@ -0,0 +1,67 @@
|
|
1
|
+
import { Failure, Success, } from './index.js';
|
2
|
+
import { Schema as MongooseSchema, model as mongooseModel, } from 'mongoose';
|
3
|
+
export class SecurityMongoDbCollection {
|
4
|
+
_name = 'securities';
|
5
|
+
_schema = new MongooseSchema({
|
6
|
+
instrument: {
|
7
|
+
type: {
|
8
|
+
isin: { type: String, required: true, unique: true },
|
9
|
+
symbol: { type: String, required: true, unique: true },
|
10
|
+
name: { type: String, required: true },
|
11
|
+
cfi: { type: String, required: true },
|
12
|
+
published: { type: String, required: true },
|
13
|
+
},
|
14
|
+
required: true,
|
15
|
+
unique: true,
|
16
|
+
},
|
17
|
+
type: { type: String, required: false },
|
18
|
+
market: { type: String, required: false },
|
19
|
+
industry: { type: String, required: false },
|
20
|
+
}, {
|
21
|
+
collection: this._name,
|
22
|
+
timestamps: true,
|
23
|
+
});
|
24
|
+
_model;
|
25
|
+
constructor() {
|
26
|
+
this._model = mongooseModel(this._name, this._schema);
|
27
|
+
}
|
28
|
+
static _instance;
|
29
|
+
static create() {
|
30
|
+
return this._instance || (this._instance = new SecurityMongoDbCollection());
|
31
|
+
}
|
32
|
+
async upsert(security) {
|
33
|
+
try {
|
34
|
+
await this._model.updateOne({ 'instrument.isin': security.value.instrument.isin }, { $set: security.value }, { upsert: true, new: true });
|
35
|
+
return Success.create();
|
36
|
+
}
|
37
|
+
catch (error) {
|
38
|
+
if (error instanceof Error) {
|
39
|
+
return Failure.create(error);
|
40
|
+
}
|
41
|
+
console.log(error);
|
42
|
+
return Failure.create(new Error('unknown error'));
|
43
|
+
}
|
44
|
+
}
|
45
|
+
async store(securities) {
|
46
|
+
try {
|
47
|
+
for (const [index, security] of securities.entries()) {
|
48
|
+
try {
|
49
|
+
await this.upsert(security);
|
50
|
+
}
|
51
|
+
catch (error) {
|
52
|
+
console.log(`security #${index + 1} is skipped`);
|
53
|
+
console.log(error instanceof Error ? error.message : error);
|
54
|
+
continue;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
return Success.create();
|
58
|
+
}
|
59
|
+
catch (error) {
|
60
|
+
if (error instanceof Error) {
|
61
|
+
return Failure.create(error);
|
62
|
+
}
|
63
|
+
throw error;
|
64
|
+
}
|
65
|
+
}
|
66
|
+
}
|
67
|
+
//# sourceMappingURL=SecurityMongoDbCollection.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SecurityMongoDbCollection.js","sourceRoot":"","sources":["../src/SecurityMongoDbCollection.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { Security, IWebpageBodyParser, Feedback, WebpageBody } from './index.js';
|
2
|
+
export declare class SecurityTableParaser implements IWebpageBodyParser<Security[]> {
|
3
|
+
private constructor();
|
4
|
+
private static _instance;
|
5
|
+
static create(): SecurityTableParaser;
|
6
|
+
parse(webpageBody: WebpageBody): Promise<Feedback<Security[], Error>>;
|
7
|
+
}
|
8
|
+
//# sourceMappingURL=SecurityTableParaser.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SecurityTableParaser.d.ts","sourceRoot":"","sources":["../src/SecurityTableParaser.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EAIR,WAAW,EACZ,MAAM,YAAY,CAAA;AAyBnB,qBAAa,oBAAqB,YAAW,kBAAkB,CAAC,QAAQ,EAAE,CAAC;IACzE,OAAO;IACP,OAAO,CAAC,MAAM,CAAC,SAAS,CAAsB;IAC9C,MAAM,CAAC,MAAM,IAAI,oBAAoB;IAG/B,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;CA4D5E"}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import { Security, Failure, isFailure, Result, } from './index.js';
|
2
|
+
import { JSDOM } from 'jsdom';
|
3
|
+
import { DateTime } from 'luxon';
|
4
|
+
function isRowValue(candidate) {
|
5
|
+
if (!Array.isArray(candidate))
|
6
|
+
return false;
|
7
|
+
if (candidate.length !== 10)
|
8
|
+
return false;
|
9
|
+
return candidate.every(element => typeof element === 'string');
|
10
|
+
}
|
11
|
+
export class SecurityTableParaser {
|
12
|
+
constructor() { }
|
13
|
+
static _instance;
|
14
|
+
static create() {
|
15
|
+
return this._instance || (this._instance = new SecurityTableParaser());
|
16
|
+
}
|
17
|
+
async parse(webpageBody) {
|
18
|
+
try {
|
19
|
+
const dom = new JSDOM(webpageBody.value);
|
20
|
+
const tableOrNull = dom.window.document.querySelector('table.h4');
|
21
|
+
if (tableOrNull === null) {
|
22
|
+
const msg = 'did not find a table element for parsing';
|
23
|
+
const error = new Error(msg);
|
24
|
+
return Failure.create(error);
|
25
|
+
}
|
26
|
+
const rows = tableOrNull.querySelectorAll('tbody tr:not([align="center"])');
|
27
|
+
const securities = [];
|
28
|
+
for (const [index, row] of rows.entries()) {
|
29
|
+
const cells = Array.from(row.querySelectorAll('td'));
|
30
|
+
const contents = cells.map(cell => cell.textContent === null ? '' : cell.textContent.trim());
|
31
|
+
if (!isRowValue(contents)) {
|
32
|
+
const reason = 'not an array of 10 strings';
|
33
|
+
console.log(`row ${index + 1} is skipped (${reason})`);
|
34
|
+
continue;
|
35
|
+
}
|
36
|
+
const securityValue = {
|
37
|
+
instrument: {
|
38
|
+
isin: contents[1],
|
39
|
+
symbol: contents[2],
|
40
|
+
name: contents[3],
|
41
|
+
cfi: contents[8],
|
42
|
+
published: DateTime.fromFormat(contents[7], 'yyyy/MM/dd').toISO(),
|
43
|
+
},
|
44
|
+
};
|
45
|
+
const withTypeValue = contents[5] === ''
|
46
|
+
? { ...securityValue }
|
47
|
+
: { ...securityValue, type: contents[5] };
|
48
|
+
const withMarketValue = contents[4] === ''
|
49
|
+
? { ...withTypeValue }
|
50
|
+
: { ...withTypeValue, market: contents[4] };
|
51
|
+
const withIndustryValue = contents[6] === ''
|
52
|
+
? { ...withMarketValue }
|
53
|
+
: { ...withMarketValue, industry: contents[6] };
|
54
|
+
const securityOrError = Security.create(withIndustryValue);
|
55
|
+
if (isFailure(securityOrError)) {
|
56
|
+
const { message } = securityOrError.error;
|
57
|
+
console.log(`row ${index + 1} is skipped (${message})`);
|
58
|
+
continue;
|
59
|
+
}
|
60
|
+
securities.push(securityOrError.value);
|
61
|
+
}
|
62
|
+
return Result.create(securities);
|
63
|
+
}
|
64
|
+
catch (error) {
|
65
|
+
if (error instanceof Error) {
|
66
|
+
return Failure.create(error);
|
67
|
+
}
|
68
|
+
throw error;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}
|
72
|
+
//# sourceMappingURL=SecurityTableParaser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SecurityTableParaser.js","sourceRoot":"","sources":["../src/SecurityTableParaser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { Feedback, IValueObject, IWebpageScraper, WebpageUrlValue } from './index.js';
|
2
|
+
import { WebpageBody } from './WebpageBody.js';
|
3
|
+
export interface IWebpageBodyParser<DATA> {
|
4
|
+
parse(webpageBody: WebpageBody): Promise<Feedback<DATA, Error>>;
|
5
|
+
}
|
6
|
+
export declare class StaticWebpageScraper<DATA> implements IWebpageScraper<DATA> {
|
7
|
+
private _url;
|
8
|
+
private bodyParser;
|
9
|
+
private constructor();
|
10
|
+
static create<DATA>(url: IValueObject<WebpageUrlValue>, bodyParser: IWebpageBodyParser<DATA>): StaticWebpageScraper<DATA>;
|
11
|
+
scrapPage(): Promise<Feedback<DATA, Error>>;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=StaticWebpageScraper.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"StaticWebpageScraper.d.ts","sourceRoot":"","sources":["../src/StaticWebpageScraper.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,YAAY,EACZ,eAAe,EAEf,eAAe,EAGhB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAE5C,MAAM,WAAW,kBAAkB,CAAC,IAAI;IACtC,KAAK,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;CAChE;AAED,qBAAa,oBAAoB,CAAC,IAAI,CAAE,YAAW,eAAe,CAAC,IAAI,CAAC;IAEpE,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,UAAU;IAFpB,OAAO;IAIP,MAAM,CAAC,MAAM,CAAC,IAAI,EAChB,GAAG,EAAE,YAAY,CAAC,eAAe,CAAC,EAClC,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,GACnC,oBAAoB,CAAC,IAAI,CAAC;IAGvB,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAoClD"}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { Failure, isFailure, } from './index.js';
|
2
|
+
import got from 'got';
|
3
|
+
import iconv from 'iconv-lite';
|
4
|
+
import { WebpageBody } from './WebpageBody.js';
|
5
|
+
export class StaticWebpageScraper {
|
6
|
+
_url;
|
7
|
+
bodyParser;
|
8
|
+
constructor(_url, bodyParser) {
|
9
|
+
this._url = _url;
|
10
|
+
this.bodyParser = bodyParser;
|
11
|
+
}
|
12
|
+
static create(url, bodyParser) {
|
13
|
+
return new StaticWebpageScraper(url, bodyParser);
|
14
|
+
}
|
15
|
+
async scrapPage() {
|
16
|
+
try {
|
17
|
+
const response = await got(this._url.value, { responseType: 'buffer' });
|
18
|
+
if (response.statusCode !== 200) {
|
19
|
+
const { statusCode } = response;
|
20
|
+
const statusMessage = response.statusMessage || 'status message is unavailable';
|
21
|
+
const msg = `${statusCode}: ${statusMessage}`;
|
22
|
+
const error = new Error(msg);
|
23
|
+
return Failure.create(error);
|
24
|
+
}
|
25
|
+
const contentType = typeof response.headers['content-type'] === 'string'
|
26
|
+
? response.headers['content-type'].toLowerCase()
|
27
|
+
: undefined;
|
28
|
+
const encoding = contentType === undefined || !contentType.includes('charset=')
|
29
|
+
? 'utf-8'
|
30
|
+
: contentType.split('charset=')[1].split(';')[0];
|
31
|
+
if (!iconv.encodingExists(encoding)) {
|
32
|
+
const msg = `${this._url.value} is encoded with unsupported "${encoding}" encoding`;
|
33
|
+
const error = new Error(msg);
|
34
|
+
return Failure.create(error);
|
35
|
+
}
|
36
|
+
const decoded = iconv.decode(response.body, encoding);
|
37
|
+
const webpageBodyOrError = WebpageBody.create(decoded);
|
38
|
+
if (isFailure(webpageBodyOrError))
|
39
|
+
return webpageBodyOrError;
|
40
|
+
const { value: webpageBody } = webpageBodyOrError;
|
41
|
+
return await this.bodyParser.parse(webpageBody);
|
42
|
+
}
|
43
|
+
catch (error) {
|
44
|
+
if (error instanceof Error) {
|
45
|
+
return Failure.create(error);
|
46
|
+
}
|
47
|
+
throw error;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
//# sourceMappingURL=StaticWebpageScraper.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"StaticWebpageScraper.js","sourceRoot":"","sources":["../src/StaticWebpageScraper.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAMP,SAAS,GAEV,MAAM,YAAY,CAAA;AACnB,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,KAAK,MAAM,YAAY,CAAA;AAC9B,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAA;AAM5C,MAAM,OAAO,oBAAoB;IAErB;IACA;IAFV,YACU,IAAmC,EACnC,UAAoC;QADpC,SAAI,GAAJ,IAAI,CAA+B;QACnC,eAAU,GAAV,UAAU,CAA0B;IAC3C,CAAC;IACJ,MAAM,CAAC,MAAM,CACX,GAAkC,EAClC,UAAoC;QAEpC,OAAO,IAAI,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAClD,CAAC;IACD,KAAK,CAAC,SAAS;QACb,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAC,YAAY,EAAE,QAAQ,EAAC,CAAC,CAAA;YACrE,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE;gBAC/B,MAAM,EAAC,UAAU,EAAC,GAAG,QAAQ,CAAA;gBAC7B,MAAM,aAAa,GACjB,QAAQ,CAAC,aAAa,IAAI,+BAA+B,CAAA;gBAC3D,MAAM,GAAG,GAAG,GAAG,UAAU,KAAK,aAAa,EAAE,CAAA;gBAC7C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,WAAW,GACf,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,QAAQ;gBAClD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE;gBAChD,CAAC,CAAC,SAAS,CAAA;YACf,MAAM,QAAQ,GACZ,WAAW,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC5D,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;gBACnC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,iCAAiC,QAAQ,YAAY,CAAA;gBACnF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACrD,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACtD,IAAI,SAAS,CAAC,kBAAkB,CAAC;gBAAE,OAAO,kBAAkB,CAAA;YAC5D,MAAM,EAAC,KAAK,EAAE,WAAW,EAAC,GAAG,kBAAkB,CAAA;YAC/C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;SAChD;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Feedback, IFetchable } from './index.js';
|
2
|
+
export interface IWebpageScraper<DATA> {
|
3
|
+
scrapPage(): Promise<Feedback<DATA, Error>>;
|
4
|
+
}
|
5
|
+
export declare class Webpage<DATA> implements IFetchable<DATA> {
|
6
|
+
private scraper;
|
7
|
+
private constructor();
|
8
|
+
static create<DATA>(scraper: IWebpageScraper<DATA>): Webpage<DATA>;
|
9
|
+
fetchData(): Promise<Feedback<DATA, Error>>;
|
10
|
+
}
|
11
|
+
//# sourceMappingURL=Webpage.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Webpage.d.ts","sourceRoot":"","sources":["../src/Webpage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,QAAQ,EAAE,UAAU,EAAC,MAAM,YAAY,CAAA;AAExD,MAAM,WAAW,eAAe,CAAC,IAAI;IACnC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;CAC5C;AAED,qBAAa,OAAO,CAAC,IAAI,CAAE,YAAW,UAAU,CAAC,IAAI,CAAC;IAChC,OAAO,CAAC,OAAO;IAAnC,OAAO;IACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAG5D,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;CAUlD"}
|
package/dist/Webpage.js
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
import { Failure } from './index.js';
|
2
|
+
export class Webpage {
|
3
|
+
scraper;
|
4
|
+
constructor(scraper) {
|
5
|
+
this.scraper = scraper;
|
6
|
+
}
|
7
|
+
static create(scraper) {
|
8
|
+
return new Webpage(scraper);
|
9
|
+
}
|
10
|
+
async fetchData() {
|
11
|
+
try {
|
12
|
+
return await this.scraper.scrapPage();
|
13
|
+
}
|
14
|
+
catch (error) {
|
15
|
+
if (error instanceof Error) {
|
16
|
+
return Failure.create(error);
|
17
|
+
}
|
18
|
+
throw error;
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
//# sourceMappingURL=Webpage.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Webpage.js","sourceRoot":"","sources":["../src/Webpage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAuB,MAAM,YAAY,CAAA;AAMxD,MAAM,OAAO,OAAO;IACU;IAA5B,YAA4B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;IAAG,CAAC;IAC9D,MAAM,CAAC,MAAM,CAAO,OAA8B;QAChD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;IACD,KAAK,CAAC,SAAS;QACb,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA;SACtC;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Feedback, IValueObject } from './index.js';
|
2
|
+
export type WebpageBodyValue = Readonly<string>;
|
3
|
+
export declare function isWebpageBodyValue(candidate: unknown): candidate is WebpageBodyValue;
|
4
|
+
export declare class WebpageBody implements IValueObject<WebpageBodyValue> {
|
5
|
+
private _value;
|
6
|
+
private constructor();
|
7
|
+
static create(candidate: unknown): Feedback<WebpageBody, Error>;
|
8
|
+
get value(): WebpageBodyValue;
|
9
|
+
}
|
10
|
+
export declare function isWebpageBody(candidate: unknown): candidate is WebpageBody;
|
11
|
+
//# sourceMappingURL=WebpageBody.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"WebpageBody.d.ts","sourceRoot":"","sources":["../src/WebpageBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,QAAQ,EAAE,YAAY,EAAS,MAAM,YAAY,CAAA;AAElE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;AAE/C,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,OAAO,GACjB,SAAS,IAAI,gBAAgB,CAE/B;AAED,qBAAa,WAAY,YAAW,YAAY,CAAC,gBAAgB,CAAC;IAC5C,OAAO,CAAC,MAAM;IAAlC,OAAO;IACP,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAgB/D,IAAI,KAAK,IAAI,gBAAgB,CAE5B;CACF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI,WAAW,CAE1E"}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
import { Failure, Result } from './index.js';
|
2
|
+
export function isWebpageBodyValue(candidate) {
|
3
|
+
return typeof candidate === 'string';
|
4
|
+
}
|
5
|
+
export class WebpageBody {
|
6
|
+
_value;
|
7
|
+
constructor(_value) {
|
8
|
+
this._value = _value;
|
9
|
+
}
|
10
|
+
static create(candidate) {
|
11
|
+
try {
|
12
|
+
if (!isWebpageBodyValue(candidate)) {
|
13
|
+
const msg = 'invalid WebpageBody creation value';
|
14
|
+
const error = new Error(msg);
|
15
|
+
return Failure.create(error);
|
16
|
+
}
|
17
|
+
const webpageBody = new WebpageBody(candidate);
|
18
|
+
return Result.create(webpageBody);
|
19
|
+
}
|
20
|
+
catch (error) {
|
21
|
+
if (error instanceof Error) {
|
22
|
+
return Failure.create(error);
|
23
|
+
}
|
24
|
+
throw error;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
get value() {
|
28
|
+
return this._value;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
export function isWebpageBody(candidate) {
|
32
|
+
return candidate instanceof WebpageBody;
|
33
|
+
}
|
34
|
+
//# sourceMappingURL=WebpageBody.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"WebpageBody.js","sourceRoot":"","sources":["../src/WebpageBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAA0B,MAAM,EAAC,MAAM,YAAY,CAAA;AAIlE,MAAM,UAAU,kBAAkB,CAChC,SAAkB;IAElB,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAA;AACtC,CAAC;AAED,MAAM,OAAO,WAAW;IACM;IAA5B,YAA4B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IACxD,MAAM,CAAC,MAAM,CAAC,SAAkB;QAC9B,IAAI;YACF,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE;gBAClC,MAAM,GAAG,GAAG,oCAAoC,CAAA;gBAChD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAA;YAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;SAClC;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,SAAkB;IAC9C,OAAO,SAAS,YAAY,WAAW,CAAA;AACzC,CAAC"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Feedback, IValueObject } from '@marketeer-intelligence/infrastructure';
|
2
|
+
export type WebpageUrlValue = Readonly<string>;
|
3
|
+
export declare function isWebpageUrlValue(candidate: unknown): candidate is WebpageUrlValue;
|
4
|
+
export declare class WebpageUrl implements IValueObject<WebpageUrlValue> {
|
5
|
+
private _value;
|
6
|
+
private constructor();
|
7
|
+
static create(candidate: unknown): Feedback<WebpageUrl, Error>;
|
8
|
+
get value(): WebpageUrlValue;
|
9
|
+
}
|
10
|
+
export declare function isWebpageUrl(candidate: unknown): candidate is WebpageUrl;
|
11
|
+
//# sourceMappingURL=WebpageUrl.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"WebpageUrl.d.ts","sourceRoot":"","sources":["../src/WebpageUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EAER,YAAY,EACb,MAAM,wCAAwC,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;AAK9C,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,OAAO,GACjB,SAAS,IAAI,eAAe,CAI9B;AAED,qBAAa,UAAW,YAAW,YAAY,CAAC,eAAe,CAAC;IAC1C,OAAO,CAAC,MAAM;IAAlC,OAAO;IACP,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC;IAgB9D,IAAI,KAAK,IAAI,eAAe,CAE3B;CACF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,IAAI,UAAU,CAExE"}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { Failure, Result, } from '@marketeer-intelligence/infrastructure';
|
2
|
+
const testPattern = /^(http|https):\/\/([\w\d]+\.)?[\w\d]+\.[\w\d]{2,}(\/[\w\d]+)?$/;
|
3
|
+
export function isWebpageUrlValue(candidate) {
|
4
|
+
if (typeof candidate !== 'string')
|
5
|
+
return false;
|
6
|
+
if (!testPattern.test(candidate))
|
7
|
+
return false;
|
8
|
+
return true;
|
9
|
+
}
|
10
|
+
export class WebpageUrl {
|
11
|
+
_value;
|
12
|
+
constructor(_value) {
|
13
|
+
this._value = _value;
|
14
|
+
}
|
15
|
+
static create(candidate) {
|
16
|
+
try {
|
17
|
+
if (!isWebpageUrlValue(candidate)) {
|
18
|
+
const msg = 'invalid WebpageUrl creation value';
|
19
|
+
const error = new Error(msg);
|
20
|
+
return Failure.create(error);
|
21
|
+
}
|
22
|
+
const webpageUrl = new WebpageUrl(candidate);
|
23
|
+
return Result.create(webpageUrl);
|
24
|
+
}
|
25
|
+
catch (error) {
|
26
|
+
if (error instanceof Error) {
|
27
|
+
return Failure.create(error);
|
28
|
+
}
|
29
|
+
throw error;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
get value() {
|
33
|
+
return this._value;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
export function isWebpageUrl(candidate) {
|
37
|
+
return candidate instanceof WebpageUrl;
|
38
|
+
}
|
39
|
+
//# sourceMappingURL=WebpageUrl.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"WebpageUrl.js","sourceRoot":"","sources":["../src/WebpageUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,MAAM,GAEP,MAAM,wCAAwC,CAAA;AAI/C,MAAM,WAAW,GACf,gEAAgE,CAAA;AAElE,MAAM,UAAU,iBAAiB,CAC/B,SAAkB;IAElB,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAA;IAC9C,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,OAAO,UAAU;IACO;IAA5B,YAA4B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IACvD,MAAM,CAAC,MAAM,CAAC,SAAkB;QAC9B,IAAI;YACF,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE;gBACjC,MAAM,GAAG,GAAG,mCAAmC,CAAA;gBAC/C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;gBAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAA;YAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;SACjC;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,KAAK,YAAY,KAAK,EAAE;gBAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;aAC7B;YACD,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,OAAO,SAAS,YAAY,UAAU,CAAA;AACxC,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dataSource.d.ts","sourceRoot":"","sources":["../src/dataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,QAAQ,EAMT,MAAM,YAAY,CAAA;AAEnB,QAAA,MAAM,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAOjC,CAAA;AAEJ,OAAO,EAAC,QAAQ,EAAC,CAAA"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { SecurityTableParaser, StaticWebpageScraper, Webpage, WebpageUrl, isFailure, } from './index.js';
|
2
|
+
const security = (() => {
|
3
|
+
const url = 'https://isin.twse.com.tw/isin/class_main.jsp';
|
4
|
+
const urlOrError = WebpageUrl.create(url);
|
5
|
+
if (isFailure(urlOrError))
|
6
|
+
throw urlOrError.error;
|
7
|
+
const parser = SecurityTableParaser.create();
|
8
|
+
const scraper = StaticWebpageScraper.create(urlOrError.value, parser);
|
9
|
+
return Webpage.create(scraper);
|
10
|
+
})();
|
11
|
+
export { security };
|
12
|
+
//# sourceMappingURL=dataSource.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dataSource.js","sourceRoot":"","sources":["../src/dataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,oBAAoB,EACpB,oBAAoB,EACpB,OAAO,EACP,UAAU,EACV,SAAS,GACV,MAAM,YAAY,CAAA;AAEnB,MAAM,QAAQ,GAA2B,CAAC,GAAG,EAAE;IAC7C,MAAM,GAAG,GAAG,8CAA8C,CAAA;IAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzC,IAAI,SAAS,CAAC,UAAU,CAAC;QAAE,MAAM,UAAU,CAAC,KAAK,CAAA;IACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAA;IAC5C,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACrE,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAChC,CAAC,CAAC,EAAE,CAAA;AAEJ,OAAO,EAAC,QAAQ,EAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dataStore.d.ts","sourceRoot":"","sources":["../src/dataStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,QAAQ,EAGT,MAAM,YAAY,CAAA;AAEnB,QAAA,MAAM,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAEpC,CAAA;AAEJ,QAAA,MAAM,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAEhC,CAAA;AAEJ,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAC,CAAA"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { SecurityMongoDbCollection, InstrumentMongoDbCollection, } from './index.js';
|
2
|
+
const instrument = (() => {
|
3
|
+
return InstrumentMongoDbCollection.create();
|
4
|
+
})();
|
5
|
+
const security = (() => {
|
6
|
+
return SecurityMongoDbCollection.create();
|
7
|
+
})();
|
8
|
+
export { instrument, security };
|
9
|
+
//# sourceMappingURL=dataStore.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dataStore.js","sourceRoot":"","sources":["../src/dataStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,YAAY,CAAA;AAEnB,MAAM,UAAU,GAA4B,CAAC,GAAG,EAAE;IAChD,OAAO,2BAA2B,CAAC,MAAM,EAAE,CAAA;AAC7C,CAAC,CAAC,EAAE,CAAA;AAEJ,MAAM,QAAQ,GAA0B,CAAC,GAAG,EAAE;IAC5C,OAAO,yBAAyB,CAAC,MAAM,EAAE,CAAA;AAC3C,CAAC,CAAC,EAAE,CAAA;AAEJ,OAAO,EAAC,UAAU,EAAE,QAAQ,EAAC,CAAA"}
|
package/dist/index.d.ts
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
export * from '@marketeer-intelligence/infrastructure';
|
2
|
+
export { ConfigureEnvironmentVariables } from './ConfigureEnvironmentVariables.js';
|
3
|
+
export { MongoDbUriValue, isMongoDbUriValue, MongoDbUri, isMongoDbUri, } from './MongoDbUri.js';
|
4
|
+
export { ConnectToMongoDb } from './ConnectToMongoDb.js';
|
5
|
+
export { DisconnectFromMongoDb } from './DisconnectFromMongoDb.js';
|
6
|
+
export * as task from './task.js';
|
7
|
+
export { WebpageUrlValue, isWebpageUrlValue, WebpageUrl, isWebpageUrl, } from './WebpageUrl.js';
|
8
|
+
export * as dataSource from './dataSource.js';
|
9
|
+
export { WebpageBodyValue, isWebpageBodyValue, WebpageBody, isWebpageBody, } from './WebpageBody.js';
|
10
|
+
export { IWebpageScraper, Webpage } from './Webpage.js';
|
11
|
+
export { IWebpageBodyParser, StaticWebpageScraper, } from './StaticWebpageScraper.js';
|
12
|
+
export { SecurityTableParaser } from './SecurityTableParaser.js';
|
13
|
+
export { InstrumentMongoDbCollection } from './InstrumentMongoDbCollection.js';
|
14
|
+
export { SecurityMongoDbCollection } from './SecurityMongoDbCollection.js';
|
15
|
+
export * as dataStore from './dataStore.js';
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAA;AAEtD,OAAO,EAAC,6BAA6B,EAAC,MAAM,oCAAoC,CAAA;AAChF,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,eAAe,EAAE,OAAO,EAAC,MAAM,cAAc,CAAA;AACrD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,kCAAkC,CAAA;AAC5E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAA;AACxE,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
export * from '@marketeer-intelligence/infrastructure';
|
2
|
+
export { ConfigureEnvironmentVariables } from './ConfigureEnvironmentVariables.js';
|
3
|
+
export { isMongoDbUriValue, MongoDbUri, isMongoDbUri, } from './MongoDbUri.js';
|
4
|
+
export { ConnectToMongoDb } from './ConnectToMongoDb.js';
|
5
|
+
export { DisconnectFromMongoDb } from './DisconnectFromMongoDb.js';
|
6
|
+
export * as task from './task.js';
|
7
|
+
export { isWebpageUrlValue, WebpageUrl, isWebpageUrl, } from './WebpageUrl.js';
|
8
|
+
export * as dataSource from './dataSource.js';
|
9
|
+
export { isWebpageBodyValue, WebpageBody, isWebpageBody, } from './WebpageBody.js';
|
10
|
+
export { Webpage } from './Webpage.js';
|
11
|
+
export { StaticWebpageScraper, } from './StaticWebpageScraper.js';
|
12
|
+
export { SecurityTableParaser } from './SecurityTableParaser.js';
|
13
|
+
export { InstrumentMongoDbCollection } from './InstrumentMongoDbCollection.js';
|
14
|
+
export { SecurityMongoDbCollection } from './SecurityMongoDbCollection.js';
|
15
|
+
export * as dataStore from './dataStore.js';
|
16
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wCAAwC,CAAA;AAEtD,OAAO,EAAC,6BAA6B,EAAC,MAAM,oCAAoC,CAAA;AAChF,OAAO,EAEL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAC,qBAAqB,EAAC,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAEL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAEL,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAkB,OAAO,EAAC,MAAM,cAAc,CAAA;AACrD,OAAO,EAEL,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAC,oBAAoB,EAAC,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAC,2BAA2B,EAAC,MAAM,kCAAkC,CAAA;AAC5E,OAAO,EAAC,yBAAyB,EAAC,MAAM,gCAAgC,CAAA;AACxE,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA"}
|
package/dist/task.d.ts
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
import { IJob, MongoDbUri } from './index.js';
|
2
|
+
declare const configureEnvironmentVariables: IJob;
|
3
|
+
declare const makeConnectToMongoDb: (uri: MongoDbUri) => IJob;
|
4
|
+
declare const disconnectFromMongoDb: IJob;
|
5
|
+
export { configureEnvironmentVariables, makeConnectToMongoDb, disconnectFromMongoDb, };
|
6
|
+
//# sourceMappingURL=task.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,IAAI,EACJ,UAAU,EACX,MAAM,YAAY,CAAA;AAEnB,QAAA,MAAM,6BAA6B,EAAE,IAEjC,CAAA;AAEJ,QAAA,MAAM,oBAAoB,QAAS,UAAU,KAAG,IAE/C,CAAA;AAED,QAAA,MAAM,qBAAqB,EAAE,IAEzB,CAAA;AAEJ,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,GACtB,CAAA"}
|
package/dist/task.js
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
import { ConfigureEnvironmentVariables, ConnectToMongoDb, DisconnectFromMongoDb, } from './index.js';
|
2
|
+
const configureEnvironmentVariables = (() => {
|
3
|
+
return ConfigureEnvironmentVariables.create();
|
4
|
+
})();
|
5
|
+
const makeConnectToMongoDb = (uri) => {
|
6
|
+
return ConnectToMongoDb.create(uri);
|
7
|
+
};
|
8
|
+
const disconnectFromMongoDb = (() => {
|
9
|
+
return DisconnectFromMongoDb.create();
|
10
|
+
})();
|
11
|
+
export { configureEnvironmentVariables, makeConnectToMongoDb, disconnectFromMongoDb, };
|
12
|
+
//# sourceMappingURL=task.js.map
|
package/dist/task.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,qBAAqB,GAGtB,MAAM,YAAY,CAAA;AAEnB,MAAM,6BAA6B,GAAS,CAAC,GAAG,EAAE;IAChD,OAAO,6BAA6B,CAAC,MAAM,EAAE,CAAA;AAC/C,CAAC,CAAC,EAAE,CAAA;AAEJ,MAAM,oBAAoB,GAAG,CAAC,GAAe,EAAQ,EAAE;IACrD,OAAO,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACrC,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAS,CAAC,GAAG,EAAE;IACxC,OAAO,qBAAqB,CAAC,MAAM,EAAE,CAAA;AACvC,CAAC,CAAC,EAAE,CAAA;AAEJ,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,GACtB,CAAA"}
|
package/package.json
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
{
|
2
|
+
"name": "@marketeer-intelligence/framework-device",
|
3
|
+
"version": "0.1.0-alpha.1",
|
4
|
+
"description": "framework/device layer modules for marketeer-intelligence app",
|
5
|
+
"author": "juniorCitizen1978 <juniorCitizen1978@gmail.com>",
|
6
|
+
"private": false,
|
7
|
+
"license": "MIT",
|
8
|
+
"repository": {
|
9
|
+
"type": "git",
|
10
|
+
"url": "git+ssh://git@github.com/marketeer-intelligence/framework-device.git"
|
11
|
+
},
|
12
|
+
"bugs": {
|
13
|
+
"url": "https://github.com/marketeer-intelligence/framework-device/issues"
|
14
|
+
},
|
15
|
+
"homepage": "https://github.com/marketeer-intelligence/framework-device#readme",
|
16
|
+
"type": "module",
|
17
|
+
"main": "dist/index.js",
|
18
|
+
"types": "dist/index.d.ts",
|
19
|
+
"files": [
|
20
|
+
"/dist",
|
21
|
+
"README.md"
|
22
|
+
],
|
23
|
+
"dependencies": {
|
24
|
+
"@marketeer-intelligence/infrastructure": "^0.1.0-alpha.9",
|
25
|
+
"dotenv-safe": "^8.2.0",
|
26
|
+
"got": "^12.6.0",
|
27
|
+
"iconv-lite": "^0.6.3",
|
28
|
+
"jsdom": "^21.1.1",
|
29
|
+
"luxon": "^3.3.0",
|
30
|
+
"mongoose": "^7.0.2"
|
31
|
+
},
|
32
|
+
"devDependencies": {
|
33
|
+
"@types/dotenv-safe": "^8.1.2",
|
34
|
+
"@types/jsdom": "^21.1.0",
|
35
|
+
"@types/luxon": "^3.2.0",
|
36
|
+
"@types/node": "^18.15.3",
|
37
|
+
"@typescript-eslint/eslint-plugin": "^5.55.0",
|
38
|
+
"@typescript-eslint/parser": "^5.55.0",
|
39
|
+
"eslint": "^8.36.0",
|
40
|
+
"eslint-config-prettier": "^8.7.0",
|
41
|
+
"prettier": "^2.8.4",
|
42
|
+
"rimraf": "^4.4.0",
|
43
|
+
"typescript": "^4.9.5"
|
44
|
+
},
|
45
|
+
"scripts": {
|
46
|
+
"prebuild": "rimraf dist",
|
47
|
+
"build": "tsc",
|
48
|
+
"publish_new": "npm install & npm run build & git add . & git commit -m \"update\" & git push origin main & npm publish"
|
49
|
+
}
|
50
|
+
}
|