@tstdl/base 0.84.32 → 0.84.33

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.
@@ -3,6 +3,7 @@ import type { Injectable } from '../container/interfaces.js';
3
3
  import { resolveArgumentType } from '../container/interfaces.js';
4
4
  import type { AsyncDisposable } from '../disposable/disposable.js';
5
5
  import { disposeAsync } from '../disposable/disposable.js';
6
+ import type { Logger } from '../logger/logger.js';
6
7
  import type { Record } from '../types.js';
7
8
  import type { Opaque } from 'type-fest';
8
9
  import type { NewBrowserContextOptions } from './browser-controller.js';
@@ -30,4 +31,5 @@ export declare class BrowserContextController implements AsyncDisposable, Inject
30
31
  newPage(options?: NewPageOptions): Promise<PageController>;
31
32
  waitForNoPages(): Promise<void>;
32
33
  waitForClose(): Promise<void>;
34
+ attachLogger(logger: Logger): void;
33
35
  }
@@ -28,6 +28,7 @@ var import_object = require("../utils/object/object.js");
28
28
  var import_type_guards = require("../utils/type-guards.js");
29
29
  var import_browser_controller = require("./browser-controller.js");
30
30
  var import_page_controller = require("./page-controller.js");
31
+ var import_utils = require("./utils.js");
31
32
  var __decorate = function(decorators, target, key, desc) {
32
33
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
33
34
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -89,6 +90,9 @@ let BrowserContextController = class BrowserContextController2 {
89
90
  async waitForClose() {
90
91
  return new Promise((resolve) => this.context.once("close", () => resolve()));
91
92
  }
93
+ attachLogger(logger) {
94
+ (0, import_utils.attachLogger)(this.context, logger);
95
+ }
92
96
  };
93
97
  BrowserContextController = __decorate([
94
98
  (0, import_decorators.injectable)({
@@ -1,6 +1,7 @@
1
1
  import type { Page } from 'playwright';
2
2
  import type { AsyncDisposable } from '../disposable/disposable.js';
3
3
  import { disposeAsync } from '../disposable/disposable.js';
4
+ import type { Logger } from '../logger/logger.js';
4
5
  import type { DocumentControllerOptions } from './document-controller.js';
5
6
  import { DocumentController } from './document-controller.js';
6
7
  import type { FrameControllerOptions } from './frame-controller.js';
@@ -27,4 +28,5 @@ export declare class PageController extends DocumentController<Page> implements
27
28
  frame(frameSelector: Parameters<Page['frame']>[0]): FrameController;
28
29
  renderPdf(options?: PdfRenderOptions & Abortable): Promise<Uint8Array>;
29
30
  renderPdfStream(options?: PdfRenderOptions & Abortable): ReadableStream<Uint8Array>;
31
+ attachLogger(logger: Logger): void;
30
32
  }
@@ -29,6 +29,7 @@ var import_type_guards = require("../utils/type-guards.js");
29
29
  var import_units = require("../utils/units.js");
30
30
  var import_document_controller = require("./document-controller.js");
31
31
  var import_frame_controller = require("./frame-controller.js");
32
+ var import_utils = require("./utils.js");
32
33
  class PageController extends import_document_controller.DocumentController {
33
34
  /** @deprecated should be avoided */
34
35
  page;
@@ -86,6 +87,9 @@ class PageController extends import_document_controller.DocumentController {
86
87
  });
87
88
  });
88
89
  }
90
+ attachLogger(logger) {
91
+ (0, import_utils.attachLogger)(this.page, logger);
92
+ }
89
93
  }
90
94
  function convertPdfOptions(options) {
91
95
  const margin = (0, import_type_guards.isUndefined)(options.margin) ? void 0 : (0, import_type_guards.isObject)(options.margin) ? options.margin : {
@@ -1,7 +1,12 @@
1
- import type { ElementHandle, LaunchOptions, Locator } from 'playwright';
1
+ import type { Logger } from '../logger/logger.js';
2
+ import type { BrowserContext, ElementHandle, Frame, LaunchOptions, Locator, Page } from 'playwright';
2
3
  import type { NewBrowserContextOptions } from './browser-controller.js';
3
4
  import type { NewBrowserOptions } from './browser.service.js';
4
5
  export declare function getLaunchOptions(options: NewBrowserOptions): LaunchOptions;
5
6
  export declare function mergeNewBrowserContextOptions(a: NewBrowserContextOptions | undefined, b?: NewBrowserContextOptions, c?: NewBrowserContextOptions): NewBrowserContextOptions;
7
+ export declare function attachLogger(loggable: Page | BrowserContext, logger: Logger): void;
6
8
  export declare function isLocator(locatorOrHandle: Locator | ElementHandle): locatorOrHandle is Locator;
7
- export declare function isElementHandle(locatorOrHandle: Locator | ElementHandle): locatorOrHandle is Locator;
9
+ export declare function isElementHandle(locatorOrHandle: Locator | ElementHandle): locatorOrHandle is ElementHandle;
10
+ export declare function isPage(pageOrFrameOrContext: Page | Frame | BrowserContext): pageOrFrameOrContext is Page;
11
+ export declare function isFrame(pageOrFrameOrContext: Page | Frame | BrowserContext): pageOrFrameOrContext is Frame;
12
+ export declare function isBrowserContext(pageOrFrameOrContext: Page | Frame | BrowserContext): pageOrFrameOrContext is BrowserContext;
package/browser/utils.js CHANGED
@@ -18,14 +18,19 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var utils_exports = {};
20
20
  __export(utils_exports, {
21
+ attachLogger: () => attachLogger,
21
22
  getLaunchOptions: () => getLaunchOptions,
23
+ isBrowserContext: () => isBrowserContext,
22
24
  isElementHandle: () => isElementHandle,
25
+ isFrame: () => isFrame,
23
26
  isLocator: () => isLocator,
27
+ isPage: () => isPage,
24
28
  mergeNewBrowserContextOptions: () => mergeNewBrowserContextOptions
25
29
  });
26
30
  module.exports = __toCommonJS(utils_exports);
27
31
  var import_object = require("../utils/object/object.js");
28
32
  var import_type_guards = require("../utils/type-guards.js");
33
+ const pageLoggerMap = /* @__PURE__ */ new WeakMap();
29
34
  function getLaunchOptions(options) {
30
35
  const { windowSize, browserArguments, headless } = options;
31
36
  const args = [`--window-size=${windowSize?.width ?? 1e3},${windowSize?.height ?? 1e3}`, ...browserArguments ?? []];
@@ -48,9 +53,64 @@ function mergeNewBrowserContextOptions(a, b, c) {
48
53
  extraHttpHeaders: (0, import_object.objectKeys)(mergedExtraHttpHeaders).length > 0 ? mergedExtraHttpHeaders : void 0
49
54
  };
50
55
  }
56
+ function getPageLogger(page, baseLogger) {
57
+ let pageLogger = pageLoggerMap.get(page);
58
+ if ((0, import_type_guards.isUndefined)(pageLogger)) {
59
+ pageLogger = baseLogger.subModule(crypto.randomUUID().slice(-12));
60
+ pageLoggerMap.set(page, pageLogger);
61
+ }
62
+ return pageLogger;
63
+ }
64
+ function attachLogger(loggable, logger) {
65
+ if (isPage(loggable)) {
66
+ loggable.on("close", () => pageLoggerMap.delete(loggable));
67
+ loggable.on("pageerror", (error) => logger.error(error));
68
+ }
69
+ loggable.on("console", (consoleMessage) => {
70
+ const page = consoleMessage.page();
71
+ const pageLogger = (0, import_type_guards.isNull)(page) ? logger : getPageLogger(page, logger);
72
+ const rawUrl = consoleMessage.page()?.url();
73
+ const parsedUrl = (0, import_type_guards.isString)(rawUrl) && rawUrl.length > 0 ? new URL(rawUrl) : rawUrl;
74
+ const url = (0, import_type_guards.isString)(parsedUrl) ? parsedUrl : `${parsedUrl?.protocol.startsWith("http") == true ? "" : parsedUrl?.protocol}${parsedUrl?.host}${parsedUrl?.pathname}`;
75
+ const location = consoleMessage.location();
76
+ const rawLocationText = location.lineNumber == 0 ? location.url : `${location.url}:${location.lineNumber}:${location.columnNumber}`;
77
+ const locationText = rawLocationText.length == 0 ? void 0 : rawLocationText;
78
+ const additions = Object.entries({ location: locationText }).filter(([_, value]) => (0, import_type_guards.isDefined)(value)).map(([key, value]) => `${key}: ${value}`).join(", ");
79
+ const message = `${url}: ${consoleMessage.text()}${additions.length > 0 ? ` (${additions})` : ""}`;
80
+ switch (consoleMessage.type()) {
81
+ case "debug":
82
+ pageLogger.debug(message);
83
+ break;
84
+ case "error":
85
+ pageLogger.error(message);
86
+ break;
87
+ case "warning":
88
+ pageLogger.warn(message);
89
+ break;
90
+ case "trace":
91
+ pageLogger.trace(message);
92
+ break;
93
+ case "clear":
94
+ break;
95
+ case "info":
96
+ default:
97
+ pageLogger.info(message);
98
+ break;
99
+ }
100
+ });
101
+ }
51
102
  function isLocator(locatorOrHandle) {
52
- return (0, import_type_guards.isFunction)(locatorOrHandle.count);
103
+ return locatorOrHandle.constructor.name == "Locator";
53
104
  }
54
105
  function isElementHandle(locatorOrHandle) {
55
- return (0, import_type_guards.isFunction)(locatorOrHandle.asElement);
106
+ return locatorOrHandle.constructor.name == "ElementHandle";
107
+ }
108
+ function isPage(pageOrFrameOrContext) {
109
+ return pageOrFrameOrContext.constructor.name == "Page";
110
+ }
111
+ function isFrame(pageOrFrameOrContext) {
112
+ return pageOrFrameOrContext.constructor.name == "Frame";
113
+ }
114
+ function isBrowserContext(pageOrFrameOrContext) {
115
+ return pageOrFrameOrContext.constructor.name == "BrowserContext";
56
116
  }
@@ -3,12 +3,15 @@ var import_node_fs = require("node:fs");
3
3
  var import_application = require("../../application/index.js");
4
4
  var import_browser_service = require("../../browser/browser.service.js");
5
5
  var import_container = require("../../container/container.js");
6
+ var import_logger = require("../../logger/logger.js");
6
7
  var import_timing = require("../../utils/timing.js");
7
8
  async function main() {
8
9
  const browserService = await import_container.container.resolveAsync(import_browser_service.BrowserService);
9
10
  const browser = await browserService.newBrowser({ headless: false });
10
11
  const context = await browser.newContext();
11
12
  const page = await context.newPage();
13
+ const logger = import_container.container.resolve(import_logger.Logger).subModule("BROWSER");
14
+ page.attachLogger(logger);
12
15
  await page.navigate("https://google.com");
13
16
  await page.getBySelector("//div[text() = 'Alle ablehnen']").click();
14
17
  await (0, import_timing.timeout)(1e3);
@@ -1,10 +1,11 @@
1
1
  import { LogLevel } from '../level.js';
2
- import type { LogErrorOptions } from '../logger.js';
2
+ import type { LogErrorOptions, LoggerForkOptions } from '../logger.js';
3
3
  import { Logger } from '../logger.js';
4
4
  export declare class ConsoleLogger extends Logger {
5
5
  private readonly entryPrefix;
6
6
  constructor(level: LogLevel, module?: string | string[], prefix?: string);
7
- fork(subModule: string): ConsoleLogger;
7
+ fork(options: LoggerForkOptions): ConsoleLogger;
8
+ subModule(subModule: string): ConsoleLogger;
8
9
  prefix(prefix: string): ConsoleLogger;
9
10
  protected log(level: LogLevel, entryOrError: string | Error, errorOptions?: LogErrorOptions): void;
10
11
  }
@@ -57,7 +57,12 @@ let ConsoleLogger = ConsoleLogger_1 = class ConsoleLogger2 extends import_logger
57
57
  const modulePrefix = (0, import_type_guards.isDefined)(this.module) ? this.module.map((m) => `[${m}]`).join(" ") : "";
58
58
  this.entryPrefix = `${modulePrefix}${modulePrefix.length > 0 ? " " : ""}${this.logPrefix}`;
59
59
  }
60
- fork(subModule) {
60
+ fork(options) {
61
+ const level = options.level ?? this.level;
62
+ const module2 = (0, import_type_guards.isDefined)(options.subModule) ? [...this.module ?? [], options.subModule] : this.module;
63
+ return new ConsoleLogger_1(level, module2, options.prefix);
64
+ }
65
+ subModule(subModule) {
61
66
  return new ConsoleLogger_1(this.level, [...this.module ?? [], subModule]);
62
67
  }
63
68
  prefix(prefix) {
@@ -1,5 +1,4 @@
1
- import type { Injectable } from '../container/index.js';
2
- import type { resolveArgumentType } from '../container/index.js';
1
+ import type { Injectable, resolveArgumentType } from '../container/index.js';
3
2
  import { LogLevel } from './level.js';
4
3
  export type LogEntry = string;
5
4
  export type LogEntryProvider = () => LogEntry;
@@ -15,6 +14,11 @@ export type LoggerArgument = string | undefined | {
15
14
  module?: string | string[];
16
15
  prefix?: string;
17
16
  };
17
+ export type LoggerForkOptions = {
18
+ subModule?: string;
19
+ prefix?: string;
20
+ level?: LogLevel;
21
+ };
18
22
  export declare abstract class Logger implements Injectable<LoggerArgument> {
19
23
  readonly level: LogLevel;
20
24
  readonly module?: string[];
@@ -29,7 +33,8 @@ export declare abstract class Logger implements Injectable<LoggerArgument> {
29
33
  debug(entry: LogEntryOrProvider): void;
30
34
  trace(entry: LogEntryOrProvider): void;
31
35
  private _log;
32
- abstract fork(subModule: string): Logger;
36
+ abstract fork(options: LoggerForkOptions): Logger;
37
+ abstract subModule(subModule: string): Logger;
33
38
  abstract prefix(prefix: string): Logger;
34
39
  protected abstract log(level: LogLevel, entry: LogEntry | Error, errorOptions?: LogErrorOptions): void;
35
40
  }
@@ -2,6 +2,7 @@ import { Logger } from '../logger.js';
2
2
  export declare class NoopLogger extends Logger {
3
3
  constructor();
4
4
  fork(): Logger;
5
+ subModule(): Logger;
5
6
  prefix(): Logger;
6
7
  protected log(): void;
7
8
  }
@@ -31,6 +31,9 @@ class NoopLogger extends import_logger.Logger {
31
31
  fork() {
32
32
  return this;
33
33
  }
34
+ subModule() {
35
+ return this;
36
+ }
34
37
  prefix() {
35
38
  return this;
36
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.84.32",
3
+ "version": "0.84.33",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -4,12 +4,15 @@ import { BrowserController } from '../browser/browser-controller.js';
4
4
  import { PdfRenderOptions } from '../browser/pdf-options.js';
5
5
  import type { Injectable } from '../container/index.js';
6
6
  import { resolveArgumentType } from '../container/index.js';
7
+ import { LogLevel } from '../logger/level.js';
8
+ import { Logger } from '../logger/logger.js';
7
9
  import type { TemplateField } from '../templates/index.js';
8
10
  import { Template, TemplateService } from '../templates/index.js';
9
11
  export declare class PdfServiceRenderOptions extends PdfRenderOptions {
10
12
  browserContext?: BrowserContextController;
11
13
  locale?: string;
12
14
  waitForNetworkIdle?: boolean;
15
+ log?: boolean | LogLevel;
13
16
  }
14
17
  export type PdfTemplateOptions = PdfRenderOptions;
15
18
  export declare class PdfTemplate<Context extends object = any> extends Template<{
@@ -28,9 +31,10 @@ export type PdfServiceArgument = PdfServiceOptions & {
28
31
  export declare class PdfService implements Injectable<PdfServiceArgument> {
29
32
  private readonly templateService;
30
33
  private readonly browserController;
34
+ private readonly logger;
31
35
  private readonly defaultLocale;
32
36
  readonly [resolveArgumentType]: PdfServiceArgument;
33
- constructor(templateService: TemplateService, browserController: BrowserController, options?: PdfServiceOptions);
37
+ constructor(templateService: TemplateService, browserController: BrowserController, logger: Logger, options?: PdfServiceOptions);
34
38
  /**
35
39
  * Renders HTML to pdf stream
36
40
  * @param html html to render
@@ -28,6 +28,8 @@ var import_browser_context_controller = require("../browser/browser-context-cont
28
28
  var import_browser_controller = require("../browser/browser-controller.js");
29
29
  var import_pdf_options = require("../browser/pdf-options.js");
30
30
  var import_container = require("../container/index.js");
31
+ var import_level = require("../logger/level.js");
32
+ var import_logger = require("../logger/logger.js");
31
33
  var import_schema = require("../schema/index.js");
32
34
  var import_templates = require("../templates/index.js");
33
35
  var import_finalize_stream = require("../utils/stream/finalize-stream.js");
@@ -57,6 +59,7 @@ class PdfServiceRenderOptions extends import_pdf_options.PdfRenderOptions {
57
59
  browserContext;
58
60
  locale;
59
61
  waitForNetworkIdle;
62
+ log;
60
63
  }
61
64
  __decorate([
62
65
  (0, import_schema.Optional)(),
@@ -70,6 +73,10 @@ __decorate([
70
73
  (0, import_schema.Optional)(),
71
74
  __metadata("design:type", Boolean)
72
75
  ], PdfServiceRenderOptions.prototype, "waitForNetworkIdle", void 0);
76
+ __decorate([
77
+ (0, import_schema.Optional)(),
78
+ __metadata("design:type", Object)
79
+ ], PdfServiceRenderOptions.prototype, "log", void 0);
73
80
  class PdfTemplate extends import_templates.Template {
74
81
  }
75
82
  __decorate([
@@ -80,10 +87,12 @@ const browserArguments = ["--font-render-hinting=none", "--disable-web-security"
80
87
  let PdfService = class PdfService2 {
81
88
  templateService;
82
89
  browserController;
90
+ logger;
83
91
  defaultLocale;
84
- constructor(templateService, browserController, options = {}) {
92
+ constructor(templateService, browserController, logger, options = {}) {
85
93
  this.templateService = templateService;
86
94
  this.browserController = browserController;
95
+ this.logger = logger;
87
96
  this.defaultLocale = options.locale;
88
97
  }
89
98
  /**
@@ -155,6 +164,11 @@ let PdfService = class PdfService2 {
155
164
  return (0, import_readable_stream_from_promise.readableStreamFromPromise)(async () => {
156
165
  const context = options.browserContext ?? await this.browserController.newContext({ locale: options.locale ?? this.defaultLocale });
157
166
  const page = await context.newPage();
167
+ if ((0, import_type_guards.isDefined)(options.log) && options.log != false) {
168
+ const level = options.log == true ? import_level.LogLevel.Info : options.log;
169
+ const logger = this.logger.fork({ level, subModule: "PAGE" });
170
+ page.attachLogger(logger);
171
+ }
158
172
  const optionsFromHandler = await handler(page);
159
173
  const pdfStream = page.renderPdfStream({ ...optionsFromHandler, ...options });
160
174
  const close = async () => {
@@ -175,8 +189,14 @@ let PdfService = class PdfService2 {
175
189
  PdfService = __decorate([
176
190
  (0, import_container.singleton)(),
177
191
  __param(1, (0, import_container.forwardArg)((argument) => argument?.browserControllerArgument ?? { browserArguments })),
178
- __param(2, (0, import_container.injectArg)()),
179
- __metadata("design:paramtypes", [import_templates.TemplateService, import_browser_controller.BrowserController, Object])
192
+ __param(2, (0, import_container.resolveArg)("PdfService")),
193
+ __param(3, (0, import_container.injectArg)()),
194
+ __metadata("design:paramtypes", [
195
+ import_templates.TemplateService,
196
+ import_browser_controller.BrowserController,
197
+ import_logger.Logger,
198
+ Object
199
+ ])
180
200
  ], PdfService);
181
201
  function pdfTemplate(name, fields, options) {
182
202
  return {
package/utils/repl.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
- import * as repl from 'node:repl';
2
+ import type { ReplOptions } from 'node:repl';
3
3
  import type { Record } from '../types.js';
4
4
  /**
5
5
  * Starts an interactive (repl) session (node only)
6
6
  * @param context context to set the repl context to
7
7
  */
8
- export declare function startRepl(options?: repl.ReplOptions & {
8
+ export declare function repl(options?: ReplOptions & {
9
9
  context?: Record<string>;
10
10
  }): Promise<void>;
package/utils/repl.js CHANGED
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,25 +15,17 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
19
  var repl_exports = {};
30
20
  __export(repl_exports, {
31
- startRepl: () => startRepl
21
+ repl: () => repl
32
22
  });
33
23
  module.exports = __toCommonJS(repl_exports);
34
- var repl = __toESM(require("node:repl"), 1);
24
+ var import_node_repl = require("node:repl");
35
25
  var import_object = require("./object/object.js");
36
26
  var import_type_guards = require("./type-guards.js");
37
- async function startRepl(options) {
38
- const replServer = repl.start(options);
27
+ async function repl(options) {
28
+ const replServer = (0, import_node_repl.start)(options);
39
29
  if ((0, import_type_guards.isDefined)(options?.context)) {
40
30
  for (const [key, value] of (0, import_object.objectEntries)(options.context)) {
41
31
  replServer.context[key] = value;
@@ -1,2 +1,3 @@
1
1
  export type ValueOrProvider<T> = T extends () => any ? never : T | (() => T);
2
+ export type ResolvedValueOrProvider<T extends ValueOrProvider<any>> = T extends ValueOrProvider<infer U> ? U : never;
2
3
  export declare function resolveValueOrProvider<T>(valueOrProvider: ValueOrProvider<T>): T;