@blueprint-ts/core 4.1.0-beta.4 → 4.1.0-beta.6

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.
Files changed (30) hide show
  1. package/dist/persistenceDrivers/MemoryPersistenceDriver.d.ts +11 -0
  2. package/dist/persistenceDrivers/MemoryPersistenceDriver.js +22 -0
  3. package/dist/persistenceDrivers/index.d.ts +2 -1
  4. package/dist/persistenceDrivers/index.js +2 -1
  5. package/dist/requests/BaseRequest.d.ts +2 -0
  6. package/dist/requests/BaseRequest.js +7 -2
  7. package/dist/requests/contracts/BaseRequestContract.d.ts +2 -0
  8. package/dist/requests/drivers/mock/MockRequestAssertionError.d.ts +3 -0
  9. package/dist/requests/drivers/mock/MockRequestAssertionError.js +6 -0
  10. package/dist/requests/drivers/mock/MockRequestDriver.d.ts +160 -0
  11. package/dist/requests/drivers/mock/MockRequestDriver.js +588 -0
  12. package/dist/requests/drivers/mock/MockRequestTestHelpers.d.ts +20 -0
  13. package/dist/requests/drivers/mock/MockRequestTestHelpers.js +70 -0
  14. package/dist/requests/drivers/mock/MockResponseHandler.d.ts +22 -0
  15. package/dist/requests/drivers/mock/MockResponseHandler.js +59 -0
  16. package/dist/requests/index.d.ts +5 -2
  17. package/dist/requests/index.js +4 -1
  18. package/dist/vue/forms/BaseForm.d.ts +4 -0
  19. package/dist/vue/forms/BaseForm.js +40 -43
  20. package/dist/vue/forms/index.d.ts +5 -2
  21. package/dist/vue/forms/index.js +3 -1
  22. package/dist/vue/forms/persistence/StrictPersistenceRestorePolicy.d.ts +4 -0
  23. package/dist/vue/forms/persistence/StrictPersistenceRestorePolicy.js +42 -0
  24. package/dist/vue/forms/persistence/index.d.ts +3 -0
  25. package/dist/vue/forms/persistence/index.js +2 -0
  26. package/dist/vue/forms/persistence/types.d.ts +23 -0
  27. package/dist/vue/forms/persistence/types.js +1 -0
  28. package/dist/vue/forms/persistence/utils.d.ts +2 -0
  29. package/dist/vue/forms/persistence/utils.js +77 -0
  30. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ import { type PersistenceDriver } from './types/PersistenceDriver';
2
+ export declare class MemoryPersistenceDriver implements PersistenceDriver {
3
+ protected suffix?: string | undefined;
4
+ protected static store: Map<string, string>;
5
+ constructor(suffix?: string | undefined);
6
+ static clear(): void;
7
+ protected storageKey(key: string): string;
8
+ get<T>(key: string): T | null;
9
+ set<T>(key: string, state: T): void;
10
+ remove(key: string): void;
11
+ }
@@ -0,0 +1,22 @@
1
+ export class MemoryPersistenceDriver {
2
+ constructor(suffix) {
3
+ this.suffix = suffix;
4
+ }
5
+ static clear() {
6
+ MemoryPersistenceDriver.store.clear();
7
+ }
8
+ storageKey(key) {
9
+ return this.suffix ? `state_${key}_${this.suffix}` : `state_${key}`;
10
+ }
11
+ get(key) {
12
+ const data = MemoryPersistenceDriver.store.get(this.storageKey(key));
13
+ return data ? JSON.parse(data) : null;
14
+ }
15
+ set(key, state) {
16
+ MemoryPersistenceDriver.store.set(this.storageKey(key), JSON.stringify(state));
17
+ }
18
+ remove(key) {
19
+ MemoryPersistenceDriver.store.delete(this.storageKey(key));
20
+ }
21
+ }
22
+ MemoryPersistenceDriver.store = new Map();
@@ -1,6 +1,7 @@
1
1
  import { LocalStorageDriver } from './LocalStorageDriver';
2
+ import { MemoryPersistenceDriver } from './MemoryPersistenceDriver';
2
3
  import { NonPersistentDriver } from './NonPersistentDriver';
3
4
  import { SessionStorageDriver } from './SessionStorageDriver';
4
5
  import { type PersistenceDriver } from './types/PersistenceDriver';
5
- export { LocalStorageDriver, NonPersistentDriver, SessionStorageDriver };
6
+ export { LocalStorageDriver, MemoryPersistenceDriver, NonPersistentDriver, SessionStorageDriver };
6
7
  export type { PersistenceDriver };
@@ -1,4 +1,5 @@
1
1
  import { LocalStorageDriver } from './LocalStorageDriver';
2
+ import { MemoryPersistenceDriver } from './MemoryPersistenceDriver';
2
3
  import { NonPersistentDriver } from './NonPersistentDriver';
3
4
  import { SessionStorageDriver } from './SessionStorageDriver';
4
- export { LocalStorageDriver, NonPersistentDriver, SessionStorageDriver };
5
+ export { LocalStorageDriver, MemoryPersistenceDriver, NonPersistentDriver, SessionStorageDriver };
@@ -20,6 +20,7 @@ export declare abstract class BaseRequest<RequestLoaderLoadingType, ResponseErro
20
20
  protected abortSignal: AbortSignal | undefined;
21
21
  protected concurrencyOptions: RequestConcurrencyOptions | undefined;
22
22
  protected additionalHeaders: HeadersContract;
23
+ protected instanceRequestDriver: RequestDriverContract | undefined;
23
24
  protected events: {
24
25
  [key in RequestEvents]?: EventHandlerCallback[];
25
26
  };
@@ -35,6 +36,7 @@ export declare abstract class BaseRequest<RequestLoaderLoadingType, ResponseErro
35
36
  static setDefaultBaseUrl(url: string): void;
36
37
  setRequestLoader(loader: RequestLoaderContract<RequestLoaderLoadingType>): this;
37
38
  setConcurrency(options?: RequestConcurrencyOptions): this;
39
+ setRequestDriver(driver: RequestDriverContract): this;
38
40
  getRequestId(): string;
39
41
  abstract method(): RequestMethodEnum;
40
42
  abstract url(): URL | string;
@@ -24,6 +24,7 @@ export class BaseRequest {
24
24
  this.abortSignal = undefined;
25
25
  this.concurrencyOptions = undefined;
26
26
  this.additionalHeaders = {};
27
+ this.instanceRequestDriver = undefined;
27
28
  /* @ts-expect-error Ignore generics */
28
29
  this.events = {};
29
30
  if (BaseRequest.requestLoaderFactory !== undefined) {
@@ -47,6 +48,10 @@ export class BaseRequest {
47
48
  this.concurrencyOptions = options;
48
49
  return this;
49
50
  }
51
+ setRequestDriver(driver) {
52
+ this.instanceRequestDriver = driver;
53
+ return this;
54
+ }
50
55
  getRequestId() {
51
56
  return this.requestId;
52
57
  }
@@ -227,8 +232,8 @@ export class BaseRequest {
227
232
  };
228
233
  }
229
234
  resolveRequestDriver() {
230
- var _a;
231
- return (_a = this.getRequestDriver()) !== null && _a !== void 0 ? _a : BaseRequest.requestDriver;
235
+ var _a, _b;
236
+ return (_b = (_a = this.instanceRequestDriver) !== null && _a !== void 0 ? _a : this.getRequestDriver()) !== null && _b !== void 0 ? _b : BaseRequest.requestDriver;
232
237
  }
233
238
  getRequestDriver() {
234
239
  return undefined;
@@ -4,6 +4,7 @@ import { type BodyFactoryContract } from './BodyFactoryContract';
4
4
  import { type HeadersContract } from './HeadersContract';
5
5
  import { type RequestConcurrencyOptions } from '../types/RequestConcurrencyOptions';
6
6
  import { type ResponseHandlerContract } from '../drivers/contracts/ResponseHandlerContract';
7
+ import { type RequestDriverContract } from './RequestDriverContract';
7
8
  export type EventHandlerCallback<T> = (value: T) => void;
8
9
  export interface SendRequestOptions {
9
10
  resolveBody?: boolean;
@@ -30,4 +31,5 @@ export interface BaseRequestContract<RequestLoaderLoadingType, RequestBodyInterf
30
31
  getResponse(): ResponseClass;
31
32
  setAbortSignal(signal: AbortSignal): this;
32
33
  setConcurrency(options?: RequestConcurrencyOptions): this;
34
+ setRequestDriver(driver: RequestDriverContract): this;
33
35
  }
@@ -0,0 +1,3 @@
1
+ export declare class MockRequestAssertionError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,6 @@
1
+ export class MockRequestAssertionError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'MockRequestAssertionError';
5
+ }
6
+ }
@@ -0,0 +1,160 @@
1
+ import { type BodyContent, type BodyContract } from '../../contracts/BodyContract';
2
+ import { type DriverConfigContract } from '../../contracts/DriverConfigContract';
3
+ import { type HeadersContract, type ResolvedHeadersContract } from '../../contracts/HeadersContract';
4
+ import { type RequestDriverContract } from '../../contracts/RequestDriverContract';
5
+ import { RequestMethodEnum } from '../../RequestMethod.enum';
6
+ import { type ResponseHandlerContract } from '../contracts/ResponseHandlerContract';
7
+ import { type MockResponseBody, type MockResponseDefinition } from './MockResponseHandler';
8
+ export type MockRequestBody = BodyContent | Record<string, unknown> | unknown[] | null | undefined;
9
+ export type MockRequestMatchMode = 'ordered' | 'unordered';
10
+ export type MockRequestPredicate<T> = ((value: T) => boolean) & {
11
+ description?: string;
12
+ };
13
+ export interface MockRequestDriverOptions {
14
+ matchMode?: MockRequestMatchMode;
15
+ }
16
+ export interface MockRequestQuery {
17
+ [key: string]: string | string[];
18
+ }
19
+ export interface MockRequestBodyMatchContext {
20
+ method: RequestMethodEnum;
21
+ url: string;
22
+ headers: ResolvedHeadersContract;
23
+ body?: MockNormalizedRequestBody;
24
+ getJson<T>(): T | undefined;
25
+ getText(): string | undefined;
26
+ getQuery(): MockRequestQuery;
27
+ }
28
+ export type MockRequestMethodMatcher = RequestMethodEnum | MockRequestPredicate<RequestMethodEnum>;
29
+ export type MockRequestUrlMatcher = URL | string | MockRequestPredicate<URL>;
30
+ export type MockRequestHeadersMatcher = HeadersContract | ResolvedHeadersContract | MockRequestPredicate<ResolvedHeadersContract>;
31
+ export type MockRequestQueryMatcher = MockRequestQuery | MockRequestPredicate<MockRequestQuery>;
32
+ export type MockRequestBodyMatcher = MockRequestBody | MockRequestPredicate<MockRequestBodyMatchContext>;
33
+ export interface MockRequestExpectation {
34
+ method: MockRequestMethodMatcher;
35
+ url: MockRequestUrlMatcher;
36
+ headers?: MockRequestHeadersMatcher;
37
+ query?: MockRequestQueryMatcher;
38
+ body?: MockRequestBodyMatcher;
39
+ response: MockResponseDefinition;
40
+ }
41
+ export interface MockRequestExpectationCriteria {
42
+ method: MockRequestMethodMatcher;
43
+ url: MockRequestUrlMatcher;
44
+ headers?: MockRequestHeadersMatcher;
45
+ query?: MockRequestQueryMatcher;
46
+ body?: MockRequestBodyMatcher;
47
+ }
48
+ export type MockNormalizedRequestBody = {
49
+ kind: 'text';
50
+ value: string;
51
+ } | {
52
+ kind: 'binary';
53
+ mimeType?: string;
54
+ bytes: number[];
55
+ } | {
56
+ kind: 'form-data';
57
+ entries: MockNormalizedFormDataEntry[];
58
+ } | {
59
+ kind: 'null';
60
+ };
61
+ export interface MockNormalizedFormDataEntry {
62
+ key: string;
63
+ value: {
64
+ kind: 'text';
65
+ value: string;
66
+ } | {
67
+ kind: 'file';
68
+ name?: string;
69
+ mimeType?: string;
70
+ bytes: number[];
71
+ };
72
+ }
73
+ export interface MockRequestHistoryEntry {
74
+ method: RequestMethodEnum;
75
+ url: string;
76
+ headers: ResolvedHeadersContract;
77
+ body?: MockNormalizedRequestBody;
78
+ }
79
+ interface NormalizedMockRequest {
80
+ method: RequestMethodEnum;
81
+ url: string;
82
+ urlWithoutQuery: string;
83
+ parsedUrl: URL;
84
+ headers: ResolvedHeadersContract;
85
+ query: MockRequestQuery;
86
+ body?: MockNormalizedRequestBody;
87
+ }
88
+ interface MockRequestMatchFailure {
89
+ field: 'method' | 'url' | 'headers' | 'query' | 'body';
90
+ message: string;
91
+ expectation: MockRequestExpectation;
92
+ expectedValue?: unknown;
93
+ actualValue?: unknown;
94
+ diffPaths?: string[];
95
+ }
96
+ export declare class MockRequestExpectationBuilder {
97
+ protected readonly driver: MockRequestDriver;
98
+ protected criteria: MockRequestExpectationCriteria;
99
+ constructor(driver: MockRequestDriver, criteria: MockRequestExpectationCriteria);
100
+ withHeaders(headers: MockRequestHeadersMatcher): this;
101
+ withQuery(query: MockRequestQueryMatcher): this;
102
+ withBody(body: MockRequestBodyMatcher): this;
103
+ respond(response: MockResponseDefinition): MockRequestDriver;
104
+ }
105
+ export declare class MockRequestDriver implements RequestDriverContract {
106
+ protected config?: DriverConfigContract | undefined;
107
+ protected expectations: MockRequestExpectation[];
108
+ protected history: MockRequestHistoryEntry[];
109
+ protected matchMode: MockRequestMatchMode;
110
+ constructor(config?: DriverConfigContract | undefined, expectations?: MockRequestExpectation[], options?: MockRequestDriverOptions);
111
+ setMatchMode(mode: MockRequestMatchMode): this;
112
+ ordered(): this;
113
+ unordered(): this;
114
+ expect(expectation: MockRequestExpectation): this;
115
+ expectAny(criteria: MockRequestExpectationCriteria): MockRequestExpectationBuilder;
116
+ reset(): this;
117
+ getHistory(): MockRequestHistoryEntry[];
118
+ assertNoPendingExpectations(): void;
119
+ assertExpectationsMet(): void;
120
+ send(url: URL | string, method: RequestMethodEnum, headers: HeadersContract, body?: BodyContract, requestConfig?: DriverConfigContract): Promise<ResponseHandlerContract>;
121
+ protected selectExpectation(actualRequest: NormalizedMockRequest): Promise<{
122
+ index: number;
123
+ expectation: MockRequestExpectation;
124
+ }>;
125
+ protected matchExpectation(expectation: MockRequestExpectation, actualRequest: NormalizedMockRequest): Promise<MockRequestMatchFailure | undefined>;
126
+ protected matchMethod(method: MockRequestMethodMatcher, actualRequest: NormalizedMockRequest, expectation: MockRequestExpectation): MockRequestMatchFailure | undefined;
127
+ protected matchUrl(expectation: MockRequestExpectation, actualRequest: NormalizedMockRequest): MockRequestMatchFailure | undefined;
128
+ protected matchHeaders(headers: MockRequestHeadersMatcher | undefined, actualRequest: NormalizedMockRequest, expectation: MockRequestExpectation): MockRequestMatchFailure | undefined;
129
+ protected matchQuery(query: MockRequestQueryMatcher | undefined, actualRequest: NormalizedMockRequest, expectation: MockRequestExpectation): MockRequestMatchFailure | undefined;
130
+ protected matchBody(body: MockRequestBodyMatcher | undefined, actualRequest: NormalizedMockRequest, expectation: MockRequestExpectation): Promise<MockRequestMatchFailure | undefined>;
131
+ protected createBodyMatchContext(actualRequest: NormalizedMockRequest): MockRequestBodyMatchContext;
132
+ protected normalizeActualRequest(url: URL | string, method: RequestMethodEnum, headers: HeadersContract, body?: BodyContract): Promise<NormalizedMockRequest>;
133
+ protected toHistoryEntry(request: NormalizedMockRequest): MockRequestHistoryEntry;
134
+ protected buildUnexpectedRequestMessage(actualRequest: NormalizedMockRequest): string;
135
+ protected buildUnorderedMismatchMessage(actualRequest: NormalizedMockRequest, failures: MockRequestMatchFailure[]): string;
136
+ protected buildMismatchMessage(failure: MockRequestMatchFailure, actualRequest: NormalizedMockRequest): string;
137
+ protected formatExpectationSnapshot(expectation: MockRequestExpectation): string;
138
+ protected formatRequestSnapshot(request: NormalizedMockRequest): string;
139
+ protected describeExpectation(expectation: MockRequestExpectation): string;
140
+ protected describeMatcher(matcher: unknown): string;
141
+ protected describeUrlMatcher(expectation: MockRequestExpectation): string;
142
+ protected describeBodyMatcher(body: MockRequestBodyMatcher): string;
143
+ protected describeBodyForMessage(body?: MockNormalizedRequestBody): unknown;
144
+ protected normalizeUrl(url: URL | string): string;
145
+ protected resolveHeaders(headers: HeadersContract | ResolvedHeadersContract): ResolvedHeadersContract;
146
+ protected normalizeBody(body: MockRequestBody): Promise<MockNormalizedRequestBody | undefined>;
147
+ protected normalizeFormData(body: FormData): Promise<MockNormalizedRequestBody>;
148
+ protected getBlobName(value: Blob): string | undefined;
149
+ protected getOptionalBlobDetails(value: Blob): {
150
+ name?: string;
151
+ mimeType?: string;
152
+ };
153
+ protected readBlob(value: Blob): Promise<ArrayBuffer>;
154
+ protected isBufferSource(value: MockRequestBody): value is BufferSource;
155
+ protected toArrayBuffer(value: BufferSource): ArrayBuffer;
156
+ }
157
+ export type { MockResponseBody, MockResponseDefinition };
158
+ export declare function getMockRequestJsonBody<T>(request: Pick<MockRequestHistoryEntry, 'body'>): T | undefined;
159
+ export declare function getMockRequestTextBody(request: Pick<MockRequestHistoryEntry, 'body'>): string | undefined;
160
+ export declare function getMockRequestQuery(request: Pick<MockRequestHistoryEntry, 'url'>): MockRequestQuery;