@hanivanrizky/nestjs-browser-action 0.21.0 → 0.23.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/README.md +78 -45
- package/dist/browser-action.module-definition.d.ts +1 -0
- package/dist/browser-action.module.d.ts +7 -0
- package/dist/browser-action.module.js +203 -28
- package/dist/browser-action.module.js.map +1 -1
- package/dist/common/index.d.ts +1 -0
- package/dist/common/index.js +18 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/tokens.d.ts +9 -0
- package/dist/common/tokens.js +47 -0
- package/dist/common/tokens.js.map +1 -0
- package/dist/constants/browser-action.constants.d.ts +1 -0
- package/dist/constants/browser-action.constants.js +2 -1
- package/dist/constants/browser-action.constants.js.map +1 -1
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/inject-browser.decorator.d.ts +2 -1
- package/dist/decorators/inject-browser.decorator.js +2 -1
- package/dist/decorators/inject-browser.decorator.js.map +1 -1
- package/dist/decorators/inject-page-controller.decorator.d.ts +2 -0
- package/dist/decorators/inject-page-controller.decorator.js +8 -0
- package/dist/decorators/inject-page-controller.decorator.js.map +1 -0
- package/dist/decorators/inject-page.decorator.d.ts +2 -1
- package/dist/decorators/inject-page.decorator.js +2 -1
- package/dist/decorators/inject-page.decorator.js.map +1 -1
- package/dist/examples/named-browser-example.d.ts +1 -0
- package/dist/examples/named-browser-example.js +183 -0
- package/dist/examples/named-browser-example.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/browser-action-options.d.ts +6 -0
- package/dist/operators/capture.operator.d.ts +11 -0
- package/dist/operators/capture.operator.js +62 -0
- package/dist/operators/capture.operator.js.map +1 -0
- package/dist/operators/container.operator.d.ts +13 -0
- package/dist/operators/container.operator.js +149 -0
- package/dist/operators/container.operator.js.map +1 -0
- package/dist/operators/extraction.operator.d.ts +22 -0
- package/dist/operators/extraction.operator.js +204 -0
- package/dist/operators/extraction.operator.js.map +1 -0
- package/dist/operators/index.d.ts +5 -0
- package/dist/operators/index.js +14 -0
- package/dist/operators/index.js.map +1 -0
- package/dist/operators/pagination.operator.d.ts +24 -0
- package/dist/operators/pagination.operator.js +182 -0
- package/dist/operators/pagination.operator.js.map +1 -0
- package/dist/operators/workflow.operator.d.ts +35 -0
- package/dist/operators/workflow.operator.js +501 -0
- package/dist/operators/workflow.operator.js.map +1 -0
- package/dist/services/browser-action.service.d.ts +6 -29
- package/dist/services/browser-action.service.js +28 -968
- package/dist/services/browser-action.service.js.map +1 -1
- package/dist/services/browser-health-check.d.ts +11 -0
- package/dist/services/browser-health-check.js +30 -0
- package/dist/services/browser-health-check.js.map +1 -0
- package/dist/services/browser-holder.d.ts +7 -0
- package/dist/services/browser-holder.js +26 -0
- package/dist/services/browser-holder.js.map +1 -0
- package/dist/services/browser-manager.service.js.map +1 -1
- package/dist/services/browser-pool.service.d.ts +0 -4
- package/dist/services/browser-pool.service.js +12 -103
- package/dist/services/browser-pool.service.js.map +1 -1
- package/dist/services/named-browser-shutdown.d.ts +11 -0
- package/dist/services/named-browser-shutdown.js +51 -0
- package/dist/services/named-browser-shutdown.js.map +1 -0
- package/dist/services/page-controller.d.ts +39 -0
- package/dist/services/page-controller.js +325 -0
- package/dist/services/page-controller.js.map +1 -0
- package/dist/services/page-session.d.ts +26 -0
- package/dist/services/page-session.js +135 -0
- package/dist/services/page-session.js.map +1 -0
- package/dist/services/page.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/browser-launcher.d.ts +6 -0
- package/dist/utils/browser-launcher.js +100 -0
- package/dist/utils/browser-launcher.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<a href="https://www.npmjs.com/package/@hanivanrizky/nestjs-browser-action" target="_blank"><img src="https://img.shields.io/npm/v/@hanivanrizky/nestjs-browser-action.svg" alt="NPM Version" /></a>
|
|
11
11
|
<a href="https://www.npmjs.com/package/@hanivanrizky/nestjs-browser-action" target="_blank"><img src="https://img.shields.io/npm/l/@hanivanrizky/nestjs-browser-action.svg" alt="Package License" /></a>
|
|
12
12
|
<a href="https://www.npmjs.com/package/@hanivanrizky/nestjs-browser-action" target="_blank"><img src="https://img.shields.io/npm/dm/@hanivanrizky/nestjs-browser-action.svg" alt="NPM Downloads" /></a>
|
|
13
|
-
<img src="https://img.shields.io/badge/tests-
|
|
13
|
+
<img src="https://img.shields.io/badge/tests-481%20passed-brightgreen.svg" alt="Tests: 481 passed" />
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
> **⚠️ Status: Experimental** — personal use only; API subject to change.
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
- **(.\_.) Remote Chrome**: Connect to remote Chrome instances via CDP (browserURL / browserWSEndpoint)
|
|
40
40
|
- **(>\_<) TLS Fingerprint**: Capture the browser's own TLS/HTTP handshake (ja3/ja4, ciphers, http2 akamai, headers) for use with `nestjs-xpath-parser`'s CycleTLS engine
|
|
41
41
|
- **(☆^O^☆) TypeScript Generics**: Full generic type support for type-safe results
|
|
42
|
-
- **(o_o) Fully Tested**:
|
|
42
|
+
- **(o_o) Fully Tested**: 463 tests across 51 suites
|
|
43
|
+
- **(☆^O^☆) Named Browsers & Pages (v0.22+)**: persistent named browser/page pairs with `PageController` — cookies/state carry over across calls, no open/close per scrape
|
|
43
44
|
|
|
44
45
|
## Installation
|
|
45
46
|
|
|
@@ -53,69 +54,93 @@ npm install @hanivanrizky/nestjs-browser-action
|
|
|
53
54
|
|
|
54
55
|
## Quick Start
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
Two ways to use this library — pick whichever fits your workload. Both are
|
|
58
|
+
fully supported; neither is deprecated.
|
|
57
59
|
|
|
58
|
-
**
|
|
60
|
+
- **[Named Browser + Pages](#option-a-named-browser--pages)** — persistent
|
|
61
|
+
browser/page pairs. Cookies, localStorage, and navigation state carry over
|
|
62
|
+
between calls. Best for login sessions and authenticated crawls.
|
|
63
|
+
- **[Browser Pool](#option-b-browser-pool)** — a pool of browsers, each
|
|
64
|
+
`scrape()` call opens and closes a fresh page. Best for one-shot,
|
|
65
|
+
stateless scraping.
|
|
66
|
+
|
|
67
|
+
### Option A: Named Browser + Pages
|
|
59
68
|
|
|
60
69
|
```typescript
|
|
61
70
|
import { Module } from '@nestjs/common';
|
|
62
71
|
import { BrowserActionModule } from '@hanivanrizky/nestjs-browser-action';
|
|
63
72
|
|
|
64
73
|
@Module({
|
|
65
|
-
imports: [
|
|
74
|
+
imports: [
|
|
75
|
+
BrowserActionModule.forRoot({ name: 'stealth', cloak: { headless: true } }),
|
|
76
|
+
BrowserActionModule.forFeature(['products'], 'stealth'),
|
|
77
|
+
],
|
|
66
78
|
})
|
|
67
79
|
export class AppModule {}
|
|
68
80
|
```
|
|
69
81
|
|
|
70
|
-
**With pool and cookie options:**
|
|
71
|
-
|
|
72
82
|
```typescript
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
83
|
+
import { Injectable } from '@nestjs/common';
|
|
84
|
+
import {
|
|
85
|
+
InjectPageController,
|
|
86
|
+
PageController,
|
|
87
|
+
} from '@hanivanrizky/nestjs-browser-action';
|
|
75
88
|
|
|
76
|
-
@
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
89
|
+
@Injectable()
|
|
90
|
+
export class YourService {
|
|
91
|
+
constructor(
|
|
92
|
+
@InjectPageController('products', 'stealth')
|
|
93
|
+
private readonly products: PageController,
|
|
94
|
+
) {}
|
|
95
|
+
|
|
96
|
+
async scrapeProducts() {
|
|
97
|
+
const result = await this.products.evaluateWebsite({
|
|
98
|
+
url: 'https://www.scrapingcourse.com/ecommerce/',
|
|
99
|
+
patterns: [
|
|
100
|
+
{
|
|
101
|
+
key: 'container',
|
|
102
|
+
patternType: 'css',
|
|
103
|
+
returnType: 'text',
|
|
104
|
+
patterns: ['.product'],
|
|
105
|
+
meta: { isContainer: true },
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
key: 'name',
|
|
109
|
+
patternType: 'css',
|
|
110
|
+
returnType: 'text',
|
|
111
|
+
patterns: ['h2.woocommerce-loop-product__title'],
|
|
112
|
+
pipes: { trim: true },
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return result.results;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
86
120
|
```
|
|
87
121
|
|
|
88
|
-
|
|
122
|
+
Async config, cookies, and the `maxPages` page-count guard are covered in
|
|
123
|
+
[Named Browsers & Pages](docs/features/named-browsers.md), along with
|
|
124
|
+
decorators, auto-recreate semantics, and a pool ↔ controller migration table.
|
|
125
|
+
|
|
126
|
+
### Option B: Browser Pool
|
|
127
|
+
|
|
128
|
+
A pool of browsers; each `scrape()`/`scrapeAll()`/`evaluateWebsite()` call
|
|
129
|
+
opens a fresh page and closes it when done. No persistent navigation state
|
|
130
|
+
between calls.
|
|
89
131
|
|
|
90
132
|
```typescript
|
|
91
133
|
import { Module } from '@nestjs/common';
|
|
92
134
|
import { BrowserActionModule } from '@hanivanrizky/nestjs-browser-action';
|
|
93
|
-
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
94
135
|
|
|
95
136
|
@Module({
|
|
96
137
|
imports: [
|
|
97
|
-
|
|
98
|
-
BrowserActionModule.forRootAsync({
|
|
99
|
-
imports: [ConfigModule],
|
|
100
|
-
useFactory: (configService: ConfigService) => ({
|
|
101
|
-
pool: {
|
|
102
|
-
min: configService.get<number>('POOL_MIN', 2),
|
|
103
|
-
max: configService.get<number>('POOL_MAX', 10),
|
|
104
|
-
},
|
|
105
|
-
cloak: {
|
|
106
|
-
proxy: { server: configService.get<string>('PROXY_URL', '') },
|
|
107
|
-
},
|
|
108
|
-
logLevel: configService.get<string>('LOG_LEVEL', 'log'),
|
|
109
|
-
}),
|
|
110
|
-
inject: [ConfigService],
|
|
111
|
-
}),
|
|
138
|
+
BrowserActionModule.forRoot({ pool: { min: 2, max: 10 } }),
|
|
112
139
|
],
|
|
113
140
|
})
|
|
114
141
|
export class AppModule {}
|
|
115
142
|
```
|
|
116
143
|
|
|
117
|
-
### Inject the Service
|
|
118
|
-
|
|
119
144
|
```typescript
|
|
120
145
|
import { Injectable } from '@nestjs/common';
|
|
121
146
|
import { BrowserActionService } from '@hanivanrizky/nestjs-browser-action';
|
|
@@ -142,13 +167,6 @@ export class YourService {
|
|
|
142
167
|
patterns: ['h2.woocommerce-loop-product__title'],
|
|
143
168
|
pipes: { trim: true },
|
|
144
169
|
},
|
|
145
|
-
{
|
|
146
|
-
key: 'price',
|
|
147
|
-
patternType: 'css',
|
|
148
|
-
returnType: 'text',
|
|
149
|
-
patterns: ['.price'],
|
|
150
|
-
pipes: { trim: true },
|
|
151
|
-
},
|
|
152
170
|
],
|
|
153
171
|
});
|
|
154
172
|
|
|
@@ -157,6 +175,12 @@ export class YourService {
|
|
|
157
175
|
}
|
|
158
176
|
```
|
|
159
177
|
|
|
178
|
+
> `BrowserActionModule.forRoot()`/`forRootAsync()` without a `name` gives
|
|
179
|
+
> you pool mode; pass `name` for named-browser mode (Option A). Async config
|
|
180
|
+
> and cookies work the same way on both — see the
|
|
181
|
+
> [migration table](docs/features/named-browsers.md#migration-pool-method--controller-method)
|
|
182
|
+
> if you're moving code between the two.
|
|
183
|
+
|
|
160
184
|
## Documentation
|
|
161
185
|
|
|
162
186
|
### Features
|
|
@@ -166,6 +190,7 @@ export class YourService {
|
|
|
166
190
|
- [Data Cleaning Pipes](docs/features/pipes.md) - Transform extracted data with pipes
|
|
167
191
|
- [Cookie Management](docs/features/cookies.md) - Session persistence
|
|
168
192
|
- [Workflow Actions](docs/methods/workflow.md) - Declarative step-by-step automation
|
|
193
|
+
- [Named Browsers & Pages](docs/features/named-browsers.md) - Persistent named browser/page pairs with `PageController`
|
|
169
194
|
|
|
170
195
|
### Reference
|
|
171
196
|
|
|
@@ -331,6 +356,14 @@ pnpm format
|
|
|
331
356
|
4. Push to the branch (`git push origin feature/yourusername/amazing-feature`)
|
|
332
357
|
5. Open a Pull Request
|
|
333
358
|
|
|
359
|
+
## Acknowledgments
|
|
360
|
+
|
|
361
|
+
The [Named Browsers & Pages](#option-a-named-browser--pages) DI pattern
|
|
362
|
+
(`forRoot({ name })` + `forFeature(pages, name)` +
|
|
363
|
+
`@InjectBrowser`/`@InjectPage`/`@InjectPageController`) was inspired by
|
|
364
|
+
[oblakstudio/nestjs-puppeteer](https://github.com/oblakstudio/nestjs-puppeteer).
|
|
365
|
+
Thanks to the maintainers for the clean named-instance design.
|
|
366
|
+
|
|
334
367
|
## License
|
|
335
368
|
|
|
336
369
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
@@ -4,4 +4,5 @@ export type BrowserActionModuleOptions = BrowserActionOptions;
|
|
|
4
4
|
export interface BrowserActionAsyncModuleOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
5
5
|
useFactory: (...args: unknown[]) => Promise<BrowserActionModuleOptions> | BrowserActionModuleOptions;
|
|
6
6
|
inject?: Array<Type | string | symbol>;
|
|
7
|
+
name?: string;
|
|
7
8
|
}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
|
+
import type { Browser } from 'puppeteer-core';
|
|
2
3
|
import { BrowserActionModuleOptions, BrowserActionAsyncModuleOptions } from './browser-action.module-definition';
|
|
4
|
+
declare function launchNamedBrowser(options: BrowserActionModuleOptions): Promise<Browser>;
|
|
5
|
+
export declare const __test__launchNamedBrowser: typeof launchNamedBrowser;
|
|
3
6
|
export declare class BrowserActionModule {
|
|
4
7
|
static register(options: BrowserActionModuleOptions): DynamicModule;
|
|
5
8
|
static forRoot(options: BrowserActionModuleOptions): DynamicModule;
|
|
9
|
+
private static forNamedBrowser;
|
|
6
10
|
static forRootAsync(options: BrowserActionAsyncModuleOptions): DynamicModule;
|
|
11
|
+
private static forNamedBrowserAsync;
|
|
12
|
+
static forFeature(pages: string[], browserName?: string): DynamicModule;
|
|
7
13
|
onModuleDestroy(): Promise<void>;
|
|
8
14
|
}
|
|
15
|
+
export {};
|
|
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
};
|
|
8
8
|
var BrowserActionModule_1;
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.BrowserActionModule = void 0;
|
|
10
|
+
exports.BrowserActionModule = exports.__test__launchNamedBrowser = void 0;
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
12
|
const browser_pool_service_1 = require("./services/browser-pool.service");
|
|
13
13
|
const browser_manager_service_1 = require("./services/browser-manager.service");
|
|
@@ -15,7 +15,77 @@ const page_service_1 = require("./services/page.service");
|
|
|
15
15
|
const browser_action_service_1 = require("./services/browser-action.service");
|
|
16
16
|
const cookie_service_1 = require("./services/cookie.service");
|
|
17
17
|
const cleansing_service_1 = require("./services/cleansing.service");
|
|
18
|
+
const named_browser_shutdown_1 = require("./services/named-browser-shutdown");
|
|
19
|
+
const browser_holder_1 = require("./services/browser-holder");
|
|
20
|
+
const browser_health_check_1 = require("./services/browser-health-check");
|
|
18
21
|
const constants_1 = require("./constants");
|
|
22
|
+
const tokens_1 = require("./common/tokens");
|
|
23
|
+
const browser_launcher_1 = require("./utils/browser-launcher");
|
|
24
|
+
const logger_util_1 = require("./utils/logger.util");
|
|
25
|
+
const pipe_engine_1 = require("./pipes/pipe-engine");
|
|
26
|
+
const operators_1 = require("./operators");
|
|
27
|
+
const page_session_1 = require("./services/page-session");
|
|
28
|
+
const page_controller_1 = require("./services/page-controller");
|
|
29
|
+
const browser_action_constants_1 = require("./constants/browser-action.constants");
|
|
30
|
+
const POOL_MODE_SERVICES = [
|
|
31
|
+
browser_pool_service_1.BrowserPoolService,
|
|
32
|
+
browser_manager_service_1.BrowserManagerService,
|
|
33
|
+
page_service_1.PageService,
|
|
34
|
+
browser_action_service_1.BrowserActionService,
|
|
35
|
+
cookie_service_1.CookieService,
|
|
36
|
+
cleansing_service_1.CleansingService,
|
|
37
|
+
];
|
|
38
|
+
const POOL_MODE_EXPORTS = [
|
|
39
|
+
browser_manager_service_1.BrowserManagerService,
|
|
40
|
+
page_service_1.PageService,
|
|
41
|
+
browser_action_service_1.BrowserActionService,
|
|
42
|
+
cookie_service_1.CookieService,
|
|
43
|
+
cleansing_service_1.CleansingService,
|
|
44
|
+
];
|
|
45
|
+
function resolveLogLevel(logLevel) {
|
|
46
|
+
return (Array.isArray(logLevel) ? logLevel[0] : logLevel) || 'log';
|
|
47
|
+
}
|
|
48
|
+
async function launchNamedBrowser(options) {
|
|
49
|
+
const logger = new logger_util_1.LoggerWithLevel('BrowserActionModule', resolveLogLevel(options.logLevel));
|
|
50
|
+
if (options.remote) {
|
|
51
|
+
return await (0, browser_launcher_1.connectRemoteBrowser)(options.remote, logger);
|
|
52
|
+
}
|
|
53
|
+
const browser = await (0, browser_launcher_1.launchLocalBrowser)(options, undefined, logger);
|
|
54
|
+
logger.warn('Call app.enableShutdownHooks() in main.ts to ensure graceful browser cleanup on Ctrl+C');
|
|
55
|
+
const childProcess = browser.process();
|
|
56
|
+
if (childProcess) {
|
|
57
|
+
process.once('exit', () => {
|
|
58
|
+
if (!childProcess.killed)
|
|
59
|
+
childProcess.kill();
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return browser;
|
|
63
|
+
}
|
|
64
|
+
exports.__test__launchNamedBrowser = launchNamedBrowser;
|
|
65
|
+
function namedBrowserHolderProvider(name) {
|
|
66
|
+
return {
|
|
67
|
+
provide: (0, tokens_1.getBrowserHolderToken)(name),
|
|
68
|
+
useFactory: (browser) => new browser_holder_1.BrowserHolder(browser),
|
|
69
|
+
inject: [(0, tokens_1.getBrowserToken)(name)],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function getHealthCheckToken(name) {
|
|
73
|
+
return `${(0, tokens_1.getBrowserToken)(name)}HealthCheck`;
|
|
74
|
+
}
|
|
75
|
+
function namedBrowserHealthCheckProvider(name, optionsToken) {
|
|
76
|
+
return {
|
|
77
|
+
provide: getHealthCheckToken(name),
|
|
78
|
+
useFactory: (holder, options) => {
|
|
79
|
+
if (!options.healthCheck)
|
|
80
|
+
return undefined;
|
|
81
|
+
const logger = new logger_util_1.LoggerWithLevel('BrowserActionModule', resolveLogLevel(options.logLevel));
|
|
82
|
+
const check = new browser_health_check_1.BrowserHealthCheck(name, holder, logger);
|
|
83
|
+
check.start(options.healthCheck.intervalMs);
|
|
84
|
+
return check;
|
|
85
|
+
},
|
|
86
|
+
inject: [(0, tokens_1.getBrowserHolderToken)(name), optionsToken],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
19
89
|
let BrowserActionModule = BrowserActionModule_1 = class BrowserActionModule {
|
|
20
90
|
static register(options) {
|
|
21
91
|
const optionsProvider = {
|
|
@@ -29,31 +99,55 @@ let BrowserActionModule = BrowserActionModule_1 = class BrowserActionModule {
|
|
|
29
99
|
};
|
|
30
100
|
}
|
|
31
101
|
static forRoot(options) {
|
|
102
|
+
if (options.name)
|
|
103
|
+
return this.forNamedBrowser(options);
|
|
32
104
|
const optionsProvider = {
|
|
33
105
|
provide: constants_1.BROWSER_ACTION_OPTIONS,
|
|
34
106
|
useValue: options,
|
|
35
107
|
};
|
|
36
108
|
return {
|
|
37
109
|
module: BrowserActionModule_1,
|
|
110
|
+
providers: [optionsProvider, ...POOL_MODE_SERVICES],
|
|
111
|
+
exports: [...POOL_MODE_EXPORTS],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
static forNamedBrowser(options) {
|
|
115
|
+
const name = options.name;
|
|
116
|
+
(0, tokens_1.claimBrowserName)(name);
|
|
117
|
+
if (options.remote)
|
|
118
|
+
(0, browser_launcher_1.validateRemoteOptions)(options.remote);
|
|
119
|
+
const optionsProvider = {
|
|
120
|
+
provide: (0, tokens_1.getNamedOptionsToken)(name),
|
|
121
|
+
useValue: options,
|
|
122
|
+
};
|
|
123
|
+
const browserProvider = {
|
|
124
|
+
provide: (0, tokens_1.getBrowserToken)(name),
|
|
125
|
+
useFactory: () => launchNamedBrowser(options),
|
|
126
|
+
};
|
|
127
|
+
const holderProvider = namedBrowserHolderProvider(name);
|
|
128
|
+
const optionsToken = (0, tokens_1.getNamedOptionsToken)(name);
|
|
129
|
+
const healthCheckProvider = namedBrowserHealthCheckProvider(name, optionsToken);
|
|
130
|
+
const shutdownProvider = {
|
|
131
|
+
provide: `${(0, tokens_1.getBrowserToken)(name)}Shutdown`,
|
|
132
|
+
useFactory: (holder, healthCheck) => new named_browser_shutdown_1.NamedBrowserShutdown(name, holder, !!options.remote, healthCheck),
|
|
133
|
+
inject: [(0, tokens_1.getBrowserHolderToken)(name), getHealthCheckToken(name)],
|
|
134
|
+
};
|
|
135
|
+
return {
|
|
136
|
+
module: BrowserActionModule_1,
|
|
137
|
+
global: true,
|
|
38
138
|
providers: [
|
|
39
139
|
optionsProvider,
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
cookie_service_1.CookieService,
|
|
45
|
-
cleansing_service_1.CleansingService,
|
|
46
|
-
],
|
|
47
|
-
exports: [
|
|
48
|
-
browser_manager_service_1.BrowserManagerService,
|
|
49
|
-
page_service_1.PageService,
|
|
50
|
-
browser_action_service_1.BrowserActionService,
|
|
51
|
-
cookie_service_1.CookieService,
|
|
52
|
-
cleansing_service_1.CleansingService,
|
|
140
|
+
browserProvider,
|
|
141
|
+
holderProvider,
|
|
142
|
+
healthCheckProvider,
|
|
143
|
+
shutdownProvider,
|
|
53
144
|
],
|
|
145
|
+
exports: [browserProvider, holderProvider, optionsProvider],
|
|
54
146
|
};
|
|
55
147
|
}
|
|
56
148
|
static forRootAsync(options) {
|
|
149
|
+
if (options.name)
|
|
150
|
+
return this.forNamedBrowserAsync(options);
|
|
57
151
|
const asyncOptionsProvider = {
|
|
58
152
|
provide: constants_1.BROWSER_ACTION_OPTIONS,
|
|
59
153
|
useFactory: async (...args) => {
|
|
@@ -64,22 +158,103 @@ let BrowserActionModule = BrowserActionModule_1 = class BrowserActionModule {
|
|
|
64
158
|
return {
|
|
65
159
|
module: BrowserActionModule_1,
|
|
66
160
|
imports: options.imports || [],
|
|
67
|
-
providers: [
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
161
|
+
providers: [asyncOptionsProvider, ...POOL_MODE_SERVICES],
|
|
162
|
+
exports: [...POOL_MODE_EXPORTS],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
static forNamedBrowserAsync(options) {
|
|
166
|
+
const name = options.name;
|
|
167
|
+
(0, tokens_1.claimBrowserName)(name);
|
|
168
|
+
const optionsToken = (0, tokens_1.getNamedOptionsToken)(name);
|
|
169
|
+
const optionsProvider = {
|
|
170
|
+
provide: optionsToken,
|
|
171
|
+
useFactory: async (...args) => {
|
|
172
|
+
const resolved = await options.useFactory(...args);
|
|
173
|
+
if (resolved.remote)
|
|
174
|
+
(0, browser_launcher_1.validateRemoteOptions)(resolved.remote);
|
|
175
|
+
return resolved;
|
|
176
|
+
},
|
|
177
|
+
inject: options.inject || [],
|
|
178
|
+
};
|
|
179
|
+
const browserProvider = {
|
|
180
|
+
provide: (0, tokens_1.getBrowserToken)(name),
|
|
181
|
+
useFactory: (resolved) => launchNamedBrowser(resolved),
|
|
182
|
+
inject: [optionsToken],
|
|
183
|
+
};
|
|
184
|
+
const holderProvider = namedBrowserHolderProvider(name);
|
|
185
|
+
const healthCheckProvider = namedBrowserHealthCheckProvider(name, optionsToken);
|
|
186
|
+
const shutdownProvider = {
|
|
187
|
+
provide: `${(0, tokens_1.getBrowserToken)(name)}Shutdown`,
|
|
188
|
+
useFactory: (holder, resolved, healthCheck) => new named_browser_shutdown_1.NamedBrowserShutdown(name, holder, !!resolved.remote, healthCheck),
|
|
189
|
+
inject: [
|
|
190
|
+
(0, tokens_1.getBrowserHolderToken)(name),
|
|
191
|
+
optionsToken,
|
|
192
|
+
getHealthCheckToken(name),
|
|
75
193
|
],
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
194
|
+
};
|
|
195
|
+
return {
|
|
196
|
+
module: BrowserActionModule_1,
|
|
197
|
+
global: true,
|
|
198
|
+
imports: options.imports || [],
|
|
199
|
+
providers: [
|
|
200
|
+
optionsProvider,
|
|
201
|
+
browserProvider,
|
|
202
|
+
holderProvider,
|
|
203
|
+
healthCheckProvider,
|
|
204
|
+
shutdownProvider,
|
|
82
205
|
],
|
|
206
|
+
exports: [browserProvider, holderProvider, optionsProvider],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
static forFeature(pages, browserName = 'default') {
|
|
210
|
+
const providers = pages.flatMap((pageName) => {
|
|
211
|
+
const pageProvider = {
|
|
212
|
+
provide: (0, tokens_1.getPageToken)(pageName, browserName),
|
|
213
|
+
useFactory: async (browser) => await browser.newPage(),
|
|
214
|
+
inject: [(0, tokens_1.getBrowserToken)(browserName)],
|
|
215
|
+
};
|
|
216
|
+
const controllerProvider = {
|
|
217
|
+
provide: (0, tokens_1.getPageControllerToken)(pageName, browserName),
|
|
218
|
+
useFactory: (holder, page, options) => {
|
|
219
|
+
const debugLen = options.debugLogMaxLength ?? browser_action_constants_1.DEFAULT_DEBUG_LOG_MAX_LENGTH;
|
|
220
|
+
const logger = new logger_util_1.LoggerWithLevel(`PageController:${browserName}/${pageName}`, resolveLogLevel(options.logLevel));
|
|
221
|
+
const pipeEngine = new pipe_engine_1.PipeEngine();
|
|
222
|
+
const extraction = new operators_1.ExtractionOperator(pipeEngine, logger);
|
|
223
|
+
const container = new operators_1.ContainerOperator(extraction, pipeEngine, logger);
|
|
224
|
+
const cleansingService = new cleansing_service_1.CleansingService(options);
|
|
225
|
+
const cookieService = new cookie_service_1.CookieService(options);
|
|
226
|
+
const workflow = new operators_1.WorkflowOperator(extraction, container, pipeEngine, cleansingService, logger, () => cookieService);
|
|
227
|
+
const pagination = new operators_1.PaginationOperator(logger);
|
|
228
|
+
const capture = new operators_1.CaptureOperator(logger);
|
|
229
|
+
const session = new page_session_1.PageSession(browserName, holder, page, options, logger);
|
|
230
|
+
return new page_controller_1.PageController(session, extraction, container, workflow, pagination, capture, logger, debugLen);
|
|
231
|
+
},
|
|
232
|
+
inject: [
|
|
233
|
+
(0, tokens_1.getBrowserHolderToken)(browserName),
|
|
234
|
+
(0, tokens_1.getPageToken)(pageName, browserName),
|
|
235
|
+
(0, tokens_1.getNamedOptionsToken)(browserName),
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
return [pageProvider, controllerProvider];
|
|
239
|
+
});
|
|
240
|
+
const pageCountGuardProvider = {
|
|
241
|
+
provide: `${(0, tokens_1.getBrowserToken)(browserName)}PageCountGuard_${pages.join(',')}`,
|
|
242
|
+
useFactory: (options) => {
|
|
243
|
+
const total = (0, tokens_1.registerPages)(browserName, pages.length);
|
|
244
|
+
const max = options.maxPages ?? browser_action_constants_1.DEFAULT_MAX_PAGES_WARNING;
|
|
245
|
+
if (total > max) {
|
|
246
|
+
const logger = new logger_util_1.LoggerWithLevel('BrowserActionModule', resolveLogLevel(options.logLevel));
|
|
247
|
+
logger.warn(`Named browser "${browserName}" has ${total} registered pages, ` +
|
|
248
|
+
`exceeding the configured maxPages (${max}). This is a sanity ` +
|
|
249
|
+
`warning, not an enforced limit — review your forFeature() calls.`);
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
inject: [(0, tokens_1.getNamedOptionsToken)(browserName)],
|
|
253
|
+
};
|
|
254
|
+
return {
|
|
255
|
+
module: BrowserActionModule_1,
|
|
256
|
+
providers: [...providers, pageCountGuardProvider],
|
|
257
|
+
exports: providers,
|
|
83
258
|
};
|
|
84
259
|
}
|
|
85
260
|
async onModuleDestroy() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-action.module.js","sourceRoot":"","sources":["../src/browser-action.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"browser-action.module.js","sourceRoot":"","sources":["../src/browser-action.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './tokens';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./tokens"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function getBrowserToken(name: string): string;
|
|
2
|
+
export declare function getPageToken(page: string, name: string): string;
|
|
3
|
+
export declare function getPageControllerToken(page: string, name: string): string;
|
|
4
|
+
export declare function getBrowserHolderToken(name: string): string;
|
|
5
|
+
export declare function getNamedOptionsToken(name: string): string;
|
|
6
|
+
export declare function claimBrowserName(name: string): void;
|
|
7
|
+
export declare function releaseBrowserName(name: string): void;
|
|
8
|
+
export declare function registerPages(browserName: string, count: number): number;
|
|
9
|
+
export declare function releasePageCount(browserName: string): void;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getBrowserToken = getBrowserToken;
|
|
4
|
+
exports.getPageToken = getPageToken;
|
|
5
|
+
exports.getPageControllerToken = getPageControllerToken;
|
|
6
|
+
exports.getBrowserHolderToken = getBrowserHolderToken;
|
|
7
|
+
exports.getNamedOptionsToken = getNamedOptionsToken;
|
|
8
|
+
exports.claimBrowserName = claimBrowserName;
|
|
9
|
+
exports.releaseBrowserName = releaseBrowserName;
|
|
10
|
+
exports.registerPages = registerPages;
|
|
11
|
+
exports.releasePageCount = releasePageCount;
|
|
12
|
+
function getBrowserToken(name) {
|
|
13
|
+
return `${name}BrowserActionBrowser`;
|
|
14
|
+
}
|
|
15
|
+
function getPageToken(page, name) {
|
|
16
|
+
return `${name}_${page}BrowserActionPage`;
|
|
17
|
+
}
|
|
18
|
+
function getPageControllerToken(page, name) {
|
|
19
|
+
return `${name}_${page}BrowserActionPageController`;
|
|
20
|
+
}
|
|
21
|
+
function getBrowserHolderToken(name) {
|
|
22
|
+
return `${getBrowserToken(name)}Holder`;
|
|
23
|
+
}
|
|
24
|
+
function getNamedOptionsToken(name) {
|
|
25
|
+
return `BROWSER_ACTION_OPTIONS:${name}`;
|
|
26
|
+
}
|
|
27
|
+
const registeredBrowserNames = new Set();
|
|
28
|
+
function claimBrowserName(name) {
|
|
29
|
+
if (registeredBrowserNames.has(name)) {
|
|
30
|
+
throw new Error(`BrowserActionModule: a browser with name "${name}" is already registered. ` +
|
|
31
|
+
`Each forRoot()/forRootAsync() call must use a unique \`name\`.`);
|
|
32
|
+
}
|
|
33
|
+
registeredBrowserNames.add(name);
|
|
34
|
+
}
|
|
35
|
+
function releaseBrowserName(name) {
|
|
36
|
+
registeredBrowserNames.delete(name);
|
|
37
|
+
}
|
|
38
|
+
const pageCountByBrowser = new Map();
|
|
39
|
+
function registerPages(browserName, count) {
|
|
40
|
+
const total = (pageCountByBrowser.get(browserName) ?? 0) + count;
|
|
41
|
+
pageCountByBrowser.set(browserName, total);
|
|
42
|
+
return total;
|
|
43
|
+
}
|
|
44
|
+
function releasePageCount(browserName) {
|
|
45
|
+
pageCountByBrowser.delete(browserName);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/common/tokens.ts"],"names":[],"mappings":";;AAAA,0CAEC;AAED,oCAEC;AAED,wDAEC;AAED,sDAEC;AAED,oDAEC;AASD,4CAQC;AAED,gDAEC;AAYD,sCAIC;AAED,4CAEC;AA3DD,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,GAAG,IAAI,sBAAsB,CAAC;AACvC,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAY;IACrD,OAAO,GAAG,IAAI,IAAI,IAAI,mBAAmB,CAAC;AAC5C,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAY,EAAE,IAAY;IAC/D,OAAO,GAAG,IAAI,IAAI,IAAI,6BAA6B,CAAC;AACtD,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAY;IAChD,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1C,CAAC;AAED,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,0BAA0B,IAAI,EAAE,CAAC;AAC1C,CAAC;AAOD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjD,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,2BAA2B;YAC1E,gEAAgE,CACnE,CAAC;IACJ,CAAC;IACD,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAY;IAC7C,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAUD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAErD,SAAgB,aAAa,CAAC,WAAmB,EAAE,KAAa;IAC9D,MAAM,KAAK,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IACjE,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,gBAAgB,CAAC,WAAmB;IAClD,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_COOKIE_OPTIONS = exports.TLS_CAPTURE_URL = exports.DEFAULT_ERROR_SCREENSHOT_FILENAME = exports.DEFAULT_SCREENSHOT_FILENAME = exports.DEFAULT_SCROLL_DELAY_MS = exports.DEFAULT_NAVIGATION_TIMEOUT = exports.DEFAULT_DEBUG_LOG_MAX_LENGTH = exports.DEFAULT_ACTION_TIMEOUT = exports.DEFAULT_CONTEXT_OPTIONS = exports.ERROR_MESSAGES = exports.AVAILABILITY_CHECK_INTERVAL_MS = exports.DEFAULT_REMOTE_OPTIONS = exports.DEFAULT_LAUNCH_OPTIONS = exports.DEFAULT_POOL_OPTIONS = exports.BROWSER_ACTION_OPTIONS = void 0;
|
|
3
|
+
exports.DEFAULT_MAX_PAGES_WARNING = exports.DEFAULT_COOKIE_OPTIONS = exports.TLS_CAPTURE_URL = exports.DEFAULT_ERROR_SCREENSHOT_FILENAME = exports.DEFAULT_SCREENSHOT_FILENAME = exports.DEFAULT_SCROLL_DELAY_MS = exports.DEFAULT_NAVIGATION_TIMEOUT = exports.DEFAULT_DEBUG_LOG_MAX_LENGTH = exports.DEFAULT_ACTION_TIMEOUT = exports.DEFAULT_CONTEXT_OPTIONS = exports.ERROR_MESSAGES = exports.AVAILABILITY_CHECK_INTERVAL_MS = exports.DEFAULT_REMOTE_OPTIONS = exports.DEFAULT_LAUNCH_OPTIONS = exports.DEFAULT_POOL_OPTIONS = exports.BROWSER_ACTION_OPTIONS = void 0;
|
|
4
4
|
exports.BROWSER_ACTION_OPTIONS = 'BROWSER_ACTION_OPTIONS';
|
|
5
5
|
exports.DEFAULT_POOL_OPTIONS = {
|
|
6
6
|
min: 2,
|
|
@@ -41,4 +41,5 @@ exports.DEFAULT_COOKIE_OPTIONS = {
|
|
|
41
41
|
autoLoad: false,
|
|
42
42
|
defaultSessionName: 'default',
|
|
43
43
|
};
|
|
44
|
+
exports.DEFAULT_MAX_PAGES_WARNING = 5;
|
|
44
45
|
//# sourceMappingURL=browser-action.constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-action.constants.js","sourceRoot":"","sources":["../../src/constants/browser-action.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAElD,QAAA,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,KAAK;IACvB,QAAQ,EAAE,aAAsB;CACjC,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,IAAI;CACf,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,IAAI;CACR,CAAC;AAEE,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAErC,QAAA,cAAc,GAAG;IAC5B,oBAAoB,EAClB,2EAA2E;IAC7E,oBAAoB,EAClB,iEAAiE;CAC3D,CAAC;AAEE,QAAA,uBAAuB,GAAG;IACrC,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;KACb;CACF,CAAC;AAGW,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,4BAA4B,GAAG,GAAG,CAAC;AACnC,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAC9B,QAAA,2BAA2B,GAAG,YAAY,CAAC;AAC3C,QAAA,iCAAiC,GAAG,OAAO,CAAC;AAG5C,QAAA,eAAe,GAAG,6BAA6B,CAAC;AAEhD,QAAA,sBAAsB,GAAG;IACpC,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,kBAAkB,EAAE,SAAS;CACrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"browser-action.constants.js","sourceRoot":"","sources":["../../src/constants/browser-action.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAElD,QAAA,oBAAoB,GAAG;IAClC,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,EAAE;IACP,aAAa,EAAE,KAAK;IACpB,gBAAgB,EAAE,KAAK;IACvB,QAAQ,EAAE,aAAsB;CACjC,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,IAAI;CACf,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,IAAI;CACR,CAAC;AAEE,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAErC,QAAA,cAAc,GAAG;IAC5B,oBAAoB,EAClB,2EAA2E;IAC7E,oBAAoB,EAClB,iEAAiE;CAC3D,CAAC;AAEE,QAAA,uBAAuB,GAAG;IACrC,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;KACb;CACF,CAAC;AAGW,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,4BAA4B,GAAG,GAAG,CAAC;AACnC,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAC9B,QAAA,2BAA2B,GAAG,YAAY,CAAC;AAC3C,QAAA,iCAAiC,GAAG,OAAO,CAAC;AAG5C,QAAA,eAAe,GAAG,6BAA6B,CAAC;AAEhD,QAAA,sBAAsB,GAAG;IACpC,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,WAAW;IACvB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;IACf,kBAAkB,EAAE,SAAS;CACrB,CAAC;AAME,QAAA,yBAAyB,GAAG,CAAC,CAAC"}
|
package/dist/decorators/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./inject-browser.decorator"), exports);
|
|
18
18
|
__exportStar(require("./inject-page.decorator"), exports);
|
|
19
|
+
__exportStar(require("./inject-page-controller.decorator"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|