@tstdl/base 0.84.24 → 0.84.26

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.
@@ -53,7 +53,10 @@ var __param = function(paramIndex, decorator) {
53
53
  };
54
54
  var Application_1;
55
55
  (0, import_process_shutdown.initializeSignals)();
56
- let Application = Application_1 = class Application2 {
56
+ let Application = class Application2 {
57
+ static {
58
+ Application_1 = this;
59
+ }
57
60
  static _instance;
58
61
  static get instance() {
59
62
  if ((0, import_type_guards.isUndefined)(this._instance)) {
@@ -28,5 +28,6 @@ export declare class BrowserContextController implements AsyncDisposable, Inject
28
28
  getState(): Promise<BrowserContextState>;
29
29
  setExtraHttpHeaders(headers: Record<string, string | undefined>): Promise<void>;
30
30
  newPage(options?: NewPageOptions): Promise<PageController>;
31
+ waitForNoPages(): Promise<void>;
31
32
  waitForClose(): Promise<void>;
32
33
  }
@@ -73,6 +73,19 @@ let BrowserContextController = class BrowserContextController2 {
73
73
  }
74
74
  return controller;
75
75
  }
76
+ async waitForNoPages() {
77
+ while (true) {
78
+ const pages = this.context.pages();
79
+ if (pages.length == 0) {
80
+ break;
81
+ }
82
+ for (const page of pages) {
83
+ if (!page.isClosed()) {
84
+ await new Promise((resolve) => page.once("close", () => resolve()));
85
+ }
86
+ }
87
+ }
88
+ }
76
89
  async waitForClose() {
77
90
  return new Promise((resolve) => this.context.once("close", () => resolve()));
78
91
  }
@@ -20,7 +20,27 @@ export declare class ElementController<T extends Locator | ElementHandle = Locat
20
20
  readonly locatorOrHandle: T;
21
21
  readonly options: ElementControllerOptions;
22
22
  constructor(locatorOrHandle: T, options?: ElementControllerOptions);
23
- waitFor(options?: Parameters<Locator['waitFor']>[0]): Promise<void>;
23
+ /**
24
+ * Wait for element state
25
+ * @param state some states may only be usable for either locator or handle
26
+ * @param options options
27
+ */
28
+ waitFor(state?: Parameters<ElementHandle['waitForElementState']>[0] | NonNullable<LocatorOptions<'waitFor', '0'>['state']>, options?: Parameters<ElementHandle['waitForElementState']>[1]): Promise<void>;
29
+ /**
30
+ * Check if element exists
31
+ * @param options.state which state is required in order to be deemed existing
32
+ * @param options.timeout how long to wait for the element before being deemed not existing (default: 250ms)
33
+ */
34
+ exists(options?: {
35
+ state?: 'visible' | 'attached';
36
+ timeout?: number;
37
+ }): Promise<boolean>;
38
+ isVisible(): Promise<boolean>;
39
+ isHidden(): Promise<boolean>;
40
+ isEnabled(): Promise<boolean>;
41
+ isDisabled(): Promise<boolean>;
42
+ isChecked(): Promise<boolean>;
43
+ isEditable(): Promise<boolean>;
24
44
  fill(text: string, options?: Merge<LocatorOptions<'fill', 1>, ActionDelayOptions>): Promise<void>;
25
45
  type(text: string, options?: Merge<TypedOmit<LocatorOptions<'type', 1>, 'delay'>, ActionDelayOptions & TypeDelayOptions>): Promise<void>;
26
46
  selectOption(value: string | string[], options?: Merge<LocatorOptions<'selectOption', 1>, ActionDelayOptions>): Promise<void>;
@@ -24,6 +24,7 @@ module.exports = __toCommonJS(element_controller_exports);
24
24
  var import_timing = require("../utils/timing.js");
25
25
  var import_type_guards = require("../utils/type-guards.js");
26
26
  var import_value_or_provider = require("../utils/value-or-provider.js");
27
+ var import_utils = require("./utils.js");
27
28
  class ElementController {
28
29
  locatorOrHandle;
29
30
  options;
@@ -31,8 +32,47 @@ class ElementController {
31
32
  this.locatorOrHandle = locatorOrHandle;
32
33
  this.options = options;
33
34
  }
34
- async waitFor(options) {
35
- return this.locatorOrHandle.waitFor(options);
35
+ /**
36
+ * Wait for element state
37
+ * @param state some states may only be usable for either locator or handle
38
+ * @param options options
39
+ */
40
+ async waitFor(state = "visible", options) {
41
+ if ((0, import_utils.isLocator)(this.locatorOrHandle)) {
42
+ return this.locatorOrHandle.waitFor({ state, ...options });
43
+ }
44
+ return this.locatorOrHandle.waitForElementState(state, options);
45
+ }
46
+ /**
47
+ * Check if element exists
48
+ * @param options.state which state is required in order to be deemed existing
49
+ * @param options.timeout how long to wait for the element before being deemed not existing (default: 250ms)
50
+ */
51
+ async exists(options) {
52
+ try {
53
+ await this.waitFor(options?.state ?? "visible", { timeout: options?.timeout ?? 250 });
54
+ return true;
55
+ } catch {
56
+ return false;
57
+ }
58
+ }
59
+ async isVisible() {
60
+ return this.locatorOrHandle.isVisible();
61
+ }
62
+ async isHidden() {
63
+ return this.locatorOrHandle.isHidden();
64
+ }
65
+ async isEnabled() {
66
+ return this.locatorOrHandle.isEnabled();
67
+ }
68
+ async isDisabled() {
69
+ return this.locatorOrHandle.isDisabled();
70
+ }
71
+ async isChecked() {
72
+ return this.locatorOrHandle.isChecked();
73
+ }
74
+ async isEditable() {
75
+ return this.locatorOrHandle.isEditable();
36
76
  }
37
77
  async fill(text, options) {
38
78
  await this.prepareAction(options);
@@ -1,5 +1,7 @@
1
- import type { LaunchOptions } from 'playwright';
1
+ import type { ElementHandle, LaunchOptions, Locator } from 'playwright';
2
2
  import type { NewBrowserContextOptions } from './browser-controller.js';
3
3
  import type { NewBrowserOptions } from './browser.service.js';
4
4
  export declare function getLaunchOptions(options: NewBrowserOptions): LaunchOptions;
5
5
  export declare function mergeNewBrowserContextOptions(a: NewBrowserContextOptions | undefined, b?: NewBrowserContextOptions, c?: NewBrowserContextOptions): NewBrowserContextOptions;
6
+ export declare function isLocator(locatorOrHandle: Locator | ElementHandle): locatorOrHandle is Locator;
7
+ export declare function isElementHandle(locatorOrHandle: Locator | ElementHandle): locatorOrHandle is Locator;
package/browser/utils.js CHANGED
@@ -19,6 +19,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var utils_exports = {};
20
20
  __export(utils_exports, {
21
21
  getLaunchOptions: () => getLaunchOptions,
22
+ isElementHandle: () => isElementHandle,
23
+ isLocator: () => isLocator,
22
24
  mergeNewBrowserContextOptions: () => mergeNewBrowserContextOptions
23
25
  });
24
26
  module.exports = __toCommonJS(utils_exports);
@@ -45,3 +47,9 @@ function mergeNewBrowserContextOptions(a, b, c) {
45
47
  extraHttpHeaders: (0, import_object.objectKeys)(mergedExtraHttpHeaders).length > 0 ? mergedExtraHttpHeaders : void 0
46
48
  };
47
49
  }
50
+ function isLocator(locatorOrHandle) {
51
+ return (0, import_object.hasOwnProperty)(locatorOrHandle, "count");
52
+ }
53
+ function isElementHandle(locatorOrHandle) {
54
+ return (0, import_object.hasOwnProperty)(locatorOrHandle, "asElement");
55
+ }
@@ -1,2 +1,5 @@
1
- declare const template: import("../../../mail/index.js").MailTemplate<object>;
1
+ type HelloMailContext = {
2
+ name: string;
3
+ };
4
+ declare const template: import("../../../mail/index.js").MailTemplate<HelloMailContext>;
2
5
  export default template;
@@ -31,6 +31,6 @@ function HelloMail({ name }) {
31
31
  const template = (0, import_mail.mailTemplate)("hello-name", {
32
32
  subject: (0, import_string_template_resolver.stringTemplateField)({ renderer: "handlebars", template: "Hello {{ name }} in subject!" }),
33
33
  html: (0, import_jsx_template_resolver.jsxTemplateField)({ renderer: "mjml-jsx", template: HelloMail }),
34
- text: (0, import_string_template_resolver.stringTemplateField)({ renderer: "handlebars", template: "Hello {{ name }} in text!" })
34
+ text: (0, import_string_template_resolver.stringTemplateField)({ renderer: "string", template: ({ name }) => `Hello ${name} in text!` })
35
35
  });
36
36
  var hello_name_default = template;
@@ -1,2 +1,2 @@
1
- export declare const template: import("../../../templates/template.model.js").Template<import("../../../types.js").Record<string, boolean>, any, import("../../../types.js").Record>;
1
+ export declare const template: import("../../../templates/template.model.js").Template<import("../../../types.js").Record<string, boolean>, any, any>;
2
2
  export default template;
@@ -1,2 +1,2 @@
1
- declare const template: import("../../../templates/template.model.js").Template<import("../../../types.js").Record<string, boolean>, any, import("../../../types.js").Record>;
1
+ declare const template: import("../../../templates/template.model.js").Template<import("../../../types.js").Record<string, boolean>, any, any>;
2
2
  export default template;
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
+ import * as Http from 'node:http';
2
3
  import type { AfterResolve } from '../../../container/index.js';
3
4
  import { afterResolve } from '../../../container/index.js';
4
5
  import type { AsyncDisposable } from '../../../disposable/index.js';
5
6
  import { disposeAsync } from '../../../disposable/index.js';
6
7
  import { Logger } from '../../../logger/index.js';
7
- import * as Http from 'node:http';
8
8
  import type { HttpServerRequestContext } from '../http-server.js';
9
9
  import { HttpServer } from '../http-server.js';
10
10
  export type NodeHttpServerContext = {
@@ -31,6 +31,7 @@ __export(node_http_server_exports, {
31
31
  NodeHttpServer: () => NodeHttpServer
32
32
  });
33
33
  module.exports = __toCommonJS(node_http_server_exports);
34
+ var Http = __toESM(require("node:http"), 1);
34
35
  var import_container = require("../../../container/index.js");
35
36
  var import_core = require("../../../core.js");
36
37
  var import_disposable = require("../../../disposable/index.js");
@@ -44,7 +45,6 @@ var import_readable_stream_adapter = require("../../../utils/stream/readable-str
44
45
  var import_timer = require("../../../utils/timer.js");
45
46
  var import_timing = require("../../../utils/timing.js");
46
47
  var import_type_guards = require("../../../utils/type-guards.js");
47
- var Http = __toESM(require("node:http"), 1);
48
48
  var import_rxjs = require("rxjs");
49
49
  var import_http_server_request = require("../http-server-request.js");
50
50
  var import_http_server = require("../http-server.js");
@@ -1,11 +1,14 @@
1
1
  import type { Template, TemplateField } from '../../templates/template.model.js';
2
- export type MailTemplate<Context extends object = any> = Template<{
2
+ import type { Record } from '../../types.js';
3
+ export type MailTemplate<Context extends Record = any> = Template<{
3
4
  subject: false;
4
5
  html: false;
5
6
  text: false;
6
7
  }, undefined, Context>;
7
- export declare function mailTemplate<Context extends object>(name: string, fields: {
8
- subject?: TemplateField;
9
- html?: TemplateField;
10
- text?: TemplateField;
11
- }): MailTemplate<Context>;
8
+ type MailTemplateFields<Context extends Record> = {
9
+ subject?: TemplateField<string, string, any, Context>;
10
+ html?: TemplateField<string, string, any, Context>;
11
+ text?: TemplateField<string, string, any, Context>;
12
+ };
13
+ export declare function mailTemplate<Context extends Record>(name: string, fields: MailTemplateFields<Context>): MailTemplate<Context>;
14
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.84.24",
3
+ "version": "0.84.26",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -35,14 +35,14 @@
35
35
  "@types/nodemailer": "6.4",
36
36
  "@typescript-eslint/eslint-plugin": "5.59",
37
37
  "@typescript-eslint/parser": "5.59",
38
- "concurrently": "8.1",
39
- "esbuild": "0.17",
40
- "eslint": "8.41",
38
+ "concurrently": "8.2",
39
+ "esbuild": "0.18",
40
+ "eslint": "8.42",
41
41
  "eslint-import-resolver-typescript": "3.5",
42
42
  "eslint-plugin-import": "2.27",
43
43
  "tsc-alias": "1.8",
44
44
  "typedoc": "0.24",
45
- "typescript": "5.0"
45
+ "typescript": "5.1"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "@elastic/elasticsearch": "^8.8",
@@ -58,13 +58,13 @@
58
58
  "koa": "^2.14",
59
59
  "minio": "^7.1",
60
60
  "mjml": "^4.14",
61
- "mongodb": "^5.5",
61
+ "mongodb": "^5.6",
62
62
  "nodemailer": "^6.9",
63
- "playwright": "^1.34",
63
+ "playwright": "^1.35",
64
64
  "preact": "^10.15",
65
- "preact-render-to-string": "^6.0",
65
+ "preact-render-to-string": "^6.1",
66
66
  "undici": "^5.22",
67
- "urlpattern-polyfill": "^8.0"
67
+ "urlpattern-polyfill": "^9.0"
68
68
  },
69
69
  "peerDependenciesMeta": {
70
70
  "@tstdl/angular": {
@@ -1,15 +1,15 @@
1
- import type { TypedOmit } from '../../types.js';
1
+ import type { Record, TypedOmit } from '../../types.js';
2
2
  import type { ComponentClass, FunctionComponent } from 'preact';
3
3
  import { TemplateField } from '../template.model.js';
4
4
  import type { TemplateRenderer, TemplateRendererOptions, TemplateRendererString } from '../template.renderer.js';
5
5
  import { TemplateResolver } from '../template.resolver.js';
6
- export type JsxTemplate = FunctionComponent<any> | ComponentClass<any, any>;
7
- export declare class JsxTemplateField<Renderer extends string = string, Options = any> extends TemplateField<'string', Renderer, Options> {
8
- template: JsxTemplate;
6
+ export type JsxTemplate<Context extends Record = any> = FunctionComponent<Context> | ComponentClass<Context, any>;
7
+ export declare class JsxTemplateField<Renderer extends string = string, Options = any, Context extends Record = any> extends TemplateField<'string', Renderer, Options, Context> {
8
+ template: JsxTemplate<Context>;
9
9
  }
10
10
  export declare class JsxTemplateResolver extends TemplateResolver<JsxTemplateField, JsxTemplate> {
11
11
  constructor();
12
12
  canHandle(resolver: string): boolean;
13
13
  resolve(field: JsxTemplateField): JsxTemplate;
14
14
  }
15
- export declare function jsxTemplateField<Renderer extends TemplateRenderer>(field: TypedOmit<JsxTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions]>, 'resolver'>): JsxTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions]>;
15
+ export declare function jsxTemplateField<Renderer extends TemplateRenderer, Context extends Record = any>(field: TypedOmit<JsxTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions], Context>, 'resolver'>): JsxTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions], Context>;
@@ -2,13 +2,13 @@ import type { Record, TypedOmit } from '../../types.js';
2
2
  import { TemplateField } from '../template.model.js';
3
3
  import type { TemplateRenderer, TemplateRendererOptions, TemplateRendererString } from '../template.renderer.js';
4
4
  import { TemplateResolver } from '../template.resolver.js';
5
- export type StringTemplate = string | ((context: Record) => string | Promise<string>);
6
- export declare class StringTemplateField<Renderer extends string = string, Options = any> extends TemplateField<'string', Renderer, Options> {
7
- template: StringTemplate;
5
+ export type StringTemplate<Context extends Record = any> = string | ((context: Context) => string | Promise<string>);
6
+ export declare class StringTemplateField<Renderer extends string = string, Options = any, Context extends Record = any> extends TemplateField<'string', Renderer, Options, Context> {
7
+ template: StringTemplate<Context>;
8
8
  }
9
9
  export declare class StringTemplateResolver extends TemplateResolver<StringTemplateField> {
10
10
  constructor();
11
11
  canHandle(resolver: string): boolean;
12
- resolve(field: StringTemplateField): StringTemplate;
12
+ resolve(field: StringTemplateField): StringTemplate<Record>;
13
13
  }
14
- export declare function stringTemplateField<Renderer extends TemplateRenderer>(field: TypedOmit<StringTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions]>, 'resolver'>): StringTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions]>;
14
+ export declare function stringTemplateField<Renderer extends TemplateRenderer, Context extends Record = any>(field: TypedOmit<StringTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions], Context>, 'resolver'>): StringTemplateField<Renderer[TemplateRendererString], Renderer[TemplateRendererOptions], Context>;
@@ -1,21 +1,23 @@
1
1
  import type { PickBy, Record, SimplifyObject } from '../types.js';
2
- export type TemplateContext<T extends Template> = T[typeof templateContext];
3
- export declare const templateContext: unique symbol;
4
- export declare class TemplateField<Resolver extends string = string, Renderer extends string = string, Options = any> {
2
+ export type TemplateContext<T extends Template> = Parameters<NonNullable<T[typeof templateContext]>>[0];
3
+ declare const templateContext: unique symbol;
4
+ export declare class TemplateField<Resolver extends string = string, Renderer extends string = string, Options = any, Context extends Record = any> {
5
+ readonly [templateContext]?: (context: Context) => void;
5
6
  resolver: Resolver;
6
7
  renderer: Renderer;
7
8
  options?: Options;
8
9
  }
9
- export type TemplateFields<Fields extends Record<string, boolean>, Resolver extends string = string, Renderer extends string = string, Options = any> = SimplifyObject<{
10
- [P in keyof PickBy<Fields, true>]: TemplateField<Resolver, Renderer, Options>;
10
+ export type TemplateFields<Fields extends Record<string, boolean>, Resolver extends string = string, Renderer extends string = string, Options = any, Context extends Record = any> = SimplifyObject<{
11
+ [P in keyof PickBy<Fields, true>]: TemplateField<Resolver, Renderer, Options, Context>;
11
12
  } & {
12
- [P in keyof PickBy<Fields, false>]?: TemplateField<Resolver, Renderer, Options>;
13
+ [P in keyof PickBy<Fields, false>]?: TemplateField<Resolver, Renderer, Options, Context>;
13
14
  }>;
14
- export declare abstract class Template<Fields extends Record<string, boolean> = Record<string, boolean>, TemplateOptions = any, Context extends Record = Record> {
15
- readonly [templateContext]?: Context;
15
+ export declare abstract class Template<Fields extends Record<string, boolean> = Record<string, boolean>, TemplateOptions = any, Context extends Record = any> {
16
+ readonly [templateContext]?: (context: Context) => void;
16
17
  /** name of template */
17
18
  name: string;
18
- fields: TemplateFields<Fields>;
19
+ fields: TemplateFields<Fields, string, string, any, Context>;
19
20
  options?: TemplateOptions;
20
21
  }
21
22
  export declare function simpleTemplate(name: string, template: TemplateField): Template;
23
+ export {};
@@ -20,8 +20,7 @@ var template_model_exports = {};
20
20
  __export(template_model_exports, {
21
21
  Template: () => Template,
22
22
  TemplateField: () => TemplateField,
23
- simpleTemplate: () => simpleTemplate,
24
- templateContext: () => templateContext
23
+ simpleTemplate: () => simpleTemplate
25
24
  });
26
25
  module.exports = __toCommonJS(template_model_exports);
27
26
  var import_schema = require("../schema/index.js");
@@ -39,7 +38,6 @@ var __metadata = function(k, v) {
39
38
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
40
39
  return Reflect.metadata(k, v);
41
40
  };
42
- const templateContext = Symbol("templateData");
43
41
  let TemplateField = class TemplateField2 {
44
42
  resolver;
45
43
  renderer;
@@ -1,4 +1,4 @@
1
1
  import type { TemplateRenderer } from './template.renderer.js';
2
2
  import type { TemplateResolver } from './template.resolver.js';
3
3
  export declare const TEMPLATE_RENDERERS: import("../container/index.js").InjectionToken<TemplateRenderer<string, any>[], any>;
4
- export declare const TEMPLATE_RESOLVERS: import("../container/index.js").InjectionToken<TemplateResolver<import("./template.model.js").TemplateField<string, string, any>, unknown>[], any>;
4
+ export declare const TEMPLATE_RESOLVERS: import("../container/index.js").InjectionToken<TemplateResolver<import("./template.model.js").TemplateField<string, string, any, any>, unknown>[], any>;
@@ -1,2 +1,2 @@
1
1
  import type { Predicate, TypePredicate } from './types.js';
2
- export declare function assert<T, TPredicate extends T = T>(iterable: Iterable<T>, predicate: Predicate<T> | TypePredicate<T, TPredicate>): IterableIterator<TPredicate>;
2
+ export declare function assert<T, TPredicate extends T = T>(iterable: Iterable<T>, predicate: TypePredicate<T, TPredicate> | Predicate<T>): IterableIterator<TPredicate>;