@firfi/voila-sdk 0.1.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.
Files changed (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/dist/src/domain/cart.d.ts +10 -0
  4. package/dist/src/domain/cart.d.ts.map +1 -0
  5. package/dist/src/domain/cart.js +14 -0
  6. package/dist/src/domain/cart.js.map +1 -0
  7. package/dist/src/domain/checkout-readiness.d.ts +3 -0
  8. package/dist/src/domain/checkout-readiness.d.ts.map +1 -0
  9. package/dist/src/domain/checkout-readiness.js +18 -0
  10. package/dist/src/domain/checkout-readiness.js.map +1 -0
  11. package/dist/src/domain/parse.d.ts +5 -0
  12. package/dist/src/domain/parse.d.ts.map +1 -0
  13. package/dist/src/domain/parse.js +11 -0
  14. package/dist/src/domain/parse.js.map +1 -0
  15. package/dist/src/domain/schemas/auth.d.ts +123 -0
  16. package/dist/src/domain/schemas/auth.d.ts.map +1 -0
  17. package/dist/src/domain/schemas/auth.js +36 -0
  18. package/dist/src/domain/schemas/auth.js.map +1 -0
  19. package/dist/src/domain/schemas/cart.d.ts +1224 -0
  20. package/dist/src/domain/schemas/cart.d.ts.map +1 -0
  21. package/dist/src/domain/schemas/cart.js +123 -0
  22. package/dist/src/domain/schemas/cart.js.map +1 -0
  23. package/dist/src/domain/schemas/category-page.d.ts +187 -0
  24. package/dist/src/domain/schemas/category-page.d.ts.map +1 -0
  25. package/dist/src/domain/schemas/category-page.js +43 -0
  26. package/dist/src/domain/schemas/category-page.js.map +1 -0
  27. package/dist/src/domain/schemas/category.d.ts +25 -0
  28. package/dist/src/domain/schemas/category.d.ts.map +1 -0
  29. package/dist/src/domain/schemas/category.js +30 -0
  30. package/dist/src/domain/schemas/category.js.map +1 -0
  31. package/dist/src/domain/schemas/checkout-summary.d.ts +1035 -0
  32. package/dist/src/domain/schemas/checkout-summary.d.ts.map +1 -0
  33. package/dist/src/domain/schemas/checkout-summary.js +103 -0
  34. package/dist/src/domain/schemas/checkout-summary.js.map +1 -0
  35. package/dist/src/domain/schemas/delivery-destination.d.ts +176 -0
  36. package/dist/src/domain/schemas/delivery-destination.d.ts.map +1 -0
  37. package/dist/src/domain/schemas/delivery-destination.js +52 -0
  38. package/dist/src/domain/schemas/delivery-destination.js.map +1 -0
  39. package/dist/src/domain/schemas/index.d.ts +13 -0
  40. package/dist/src/domain/schemas/index.d.ts.map +1 -0
  41. package/dist/src/domain/schemas/index.js +13 -0
  42. package/dist/src/domain/schemas/index.js.map +1 -0
  43. package/dist/src/domain/schemas/money.d.ts +18 -0
  44. package/dist/src/domain/schemas/money.d.ts.map +1 -0
  45. package/dist/src/domain/schemas/money.js +11 -0
  46. package/dist/src/domain/schemas/money.js.map +1 -0
  47. package/dist/src/domain/schemas/product.d.ts +230 -0
  48. package/dist/src/domain/schemas/product.d.ts.map +1 -0
  49. package/dist/src/domain/schemas/product.js +32 -0
  50. package/dist/src/domain/schemas/product.js.map +1 -0
  51. package/dist/src/domain/schemas/proposition.d.ts +746 -0
  52. package/dist/src/domain/schemas/proposition.d.ts.map +1 -0
  53. package/dist/src/domain/schemas/proposition.js +110 -0
  54. package/dist/src/domain/schemas/proposition.js.map +1 -0
  55. package/dist/src/domain/schemas/search.d.ts +31 -0
  56. package/dist/src/domain/schemas/search.d.ts.map +1 -0
  57. package/dist/src/domain/schemas/search.js +16 -0
  58. package/dist/src/domain/schemas/search.js.map +1 -0
  59. package/dist/src/domain/schemas/session.d.ts +1341 -0
  60. package/dist/src/domain/schemas/session.d.ts.map +1 -0
  61. package/dist/src/domain/schemas/session.js +140 -0
  62. package/dist/src/domain/schemas/session.js.map +1 -0
  63. package/dist/src/domain/schemas/slot.d.ts +844 -0
  64. package/dist/src/domain/schemas/slot.d.ts.map +1 -0
  65. package/dist/src/domain/schemas/slot.js +130 -0
  66. package/dist/src/domain/schemas/slot.js.map +1 -0
  67. package/dist/src/index.d.ts +26 -0
  68. package/dist/src/index.d.ts.map +1 -0
  69. package/dist/src/index.js +26 -0
  70. package/dist/src/index.js.map +1 -0
  71. package/dist/src/voila/browser-login-adapter.d.ts +108 -0
  72. package/dist/src/voila/browser-login-adapter.d.ts.map +1 -0
  73. package/dist/src/voila/browser-login-adapter.js +128 -0
  74. package/dist/src/voila/browser-login-adapter.js.map +1 -0
  75. package/dist/src/voila/browser-login.d.ts +32 -0
  76. package/dist/src/voila/browser-login.d.ts.map +1 -0
  77. package/dist/src/voila/browser-login.js +86 -0
  78. package/dist/src/voila/browser-login.js.map +1 -0
  79. package/dist/src/voila/cart-mutation.d.ts +23 -0
  80. package/dist/src/voila/cart-mutation.d.ts.map +1 -0
  81. package/dist/src/voila/cart-mutation.js +52 -0
  82. package/dist/src/voila/cart-mutation.js.map +1 -0
  83. package/dist/src/voila/cart-view.d.ts +14 -0
  84. package/dist/src/voila/cart-view.d.ts.map +1 -0
  85. package/dist/src/voila/cart-view.js +45 -0
  86. package/dist/src/voila/cart-view.js.map +1 -0
  87. package/dist/src/voila/catalog-search.d.ts +27 -0
  88. package/dist/src/voila/catalog-search.d.ts.map +1 -0
  89. package/dist/src/voila/catalog-search.js +40 -0
  90. package/dist/src/voila/catalog-search.js.map +1 -0
  91. package/dist/src/voila/categories.d.ts +4 -0
  92. package/dist/src/voila/categories.d.ts.map +1 -0
  93. package/dist/src/voila/categories.js +22 -0
  94. package/dist/src/voila/categories.js.map +1 -0
  95. package/dist/src/voila/category-products.d.ts +22 -0
  96. package/dist/src/voila/category-products.d.ts.map +1 -0
  97. package/dist/src/voila/category-products.js +32 -0
  98. package/dist/src/voila/category-products.js.map +1 -0
  99. package/dist/src/voila/checkout-summary.d.ts +15 -0
  100. package/dist/src/voila/checkout-summary.d.ts.map +1 -0
  101. package/dist/src/voila/checkout-summary.js +93 -0
  102. package/dist/src/voila/checkout-summary.js.map +1 -0
  103. package/dist/src/voila/checkout-urls.d.ts +11 -0
  104. package/dist/src/voila/checkout-urls.d.ts.map +1 -0
  105. package/dist/src/voila/checkout-urls.js +23 -0
  106. package/dist/src/voila/checkout-urls.js.map +1 -0
  107. package/dist/src/voila/delivery-destinations.d.ts +22 -0
  108. package/dist/src/voila/delivery-destinations.d.ts.map +1 -0
  109. package/dist/src/voila/delivery-destinations.js +70 -0
  110. package/dist/src/voila/delivery-destinations.js.map +1 -0
  111. package/dist/src/voila/guest-bootstrap.d.ts +40 -0
  112. package/dist/src/voila/guest-bootstrap.d.ts.map +1 -0
  113. package/dist/src/voila/guest-bootstrap.js +108 -0
  114. package/dist/src/voila/guest-bootstrap.js.map +1 -0
  115. package/dist/src/voila/headers.d.ts +5 -0
  116. package/dist/src/voila/headers.d.ts.map +1 -0
  117. package/dist/src/voila/headers.js +20 -0
  118. package/dist/src/voila/headers.js.map +1 -0
  119. package/dist/src/voila/http-client.d.ts +60 -0
  120. package/dist/src/voila/http-client.d.ts.map +1 -0
  121. package/dist/src/voila/http-client.js +124 -0
  122. package/dist/src/voila/http-client.js.map +1 -0
  123. package/dist/src/voila/initial-state.d.ts +19 -0
  124. package/dist/src/voila/initial-state.d.ts.map +1 -0
  125. package/dist/src/voila/initial-state.js +117 -0
  126. package/dist/src/voila/initial-state.js.map +1 -0
  127. package/dist/src/voila/session-health.d.ts +10 -0
  128. package/dist/src/voila/session-health.d.ts.map +1 -0
  129. package/dist/src/voila/session-health.js +176 -0
  130. package/dist/src/voila/session-health.js.map +1 -0
  131. package/dist/src/voila/session-snapshot.d.ts +41 -0
  132. package/dist/src/voila/session-snapshot.d.ts.map +1 -0
  133. package/dist/src/voila/session-snapshot.js +101 -0
  134. package/dist/src/voila/session-snapshot.js.map +1 -0
  135. package/dist/src/voila/session-storage.d.ts +22 -0
  136. package/dist/src/voila/session-storage.d.ts.map +1 -0
  137. package/dist/src/voila/session-storage.js +54 -0
  138. package/dist/src/voila/session-storage.js.map +1 -0
  139. package/dist/src/voila/shopping-context.d.ts +33 -0
  140. package/dist/src/voila/shopping-context.d.ts.map +1 -0
  141. package/dist/src/voila/shopping-context.js +159 -0
  142. package/dist/src/voila/shopping-context.js.map +1 -0
  143. package/dist/src/voila/slot-urls.d.ts +22 -0
  144. package/dist/src/voila/slot-urls.d.ts.map +1 -0
  145. package/dist/src/voila/slot-urls.js +51 -0
  146. package/dist/src/voila/slot-urls.js.map +1 -0
  147. package/dist/src/voila/slots.d.ts +41 -0
  148. package/dist/src/voila/slots.d.ts.map +1 -0
  149. package/dist/src/voila/slots.js +137 -0
  150. package/dist/src/voila/slots.js.map +1 -0
  151. package/dist/src/voila/urls.d.ts +114 -0
  152. package/dist/src/voila/urls.d.ts.map +1 -0
  153. package/dist/src/voila/urls.js +197 -0
  154. package/dist/src/voila/urls.js.map +1 -0
  155. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-destinations.js","sourceRoot":"","sources":["../../../src/voila/delivery-destinations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Either } from "effect";
2
+ import type { CartTotals, CsrfState, NormalizedCategoryTree, SessionMetadata, SessionSnapshot } from "../domain/schemas/index.js";
3
+ import type { VoilaTransport } from "./http-client.js";
4
+ import { type CookieJarPort } from "./session-snapshot.js";
5
+ export interface GuestCartSummary {
6
+ readonly basketId: string;
7
+ readonly itemCount: number;
8
+ readonly regionId: string;
9
+ readonly totals: CartTotals;
10
+ }
11
+ export interface GuestBootstrapResult {
12
+ readonly categories: NormalizedCategoryTree;
13
+ readonly cart: GuestCartSummary;
14
+ readonly csrf: CsrfState;
15
+ readonly metadata: SessionMetadata;
16
+ readonly regionId: string;
17
+ readonly session: SessionSnapshot;
18
+ }
19
+ export type GuestBootstrapError = {
20
+ readonly _tag: "GuestBootstrapNetworkFailure";
21
+ readonly message: string;
22
+ } | {
23
+ readonly _tag: "GuestBootstrapNon2xxResponse";
24
+ readonly message: string;
25
+ readonly status: number;
26
+ } | {
27
+ readonly _tag: "GuestBootstrapMissingCookies";
28
+ readonly message: string;
29
+ } | {
30
+ readonly _tag: "GuestBootstrapCookiePersistenceFailure";
31
+ readonly message: string;
32
+ } | {
33
+ readonly _tag: "GuestBootstrapMissingCsrf";
34
+ readonly message: string;
35
+ } | {
36
+ readonly _tag: "GuestBootstrapInitialStateMalformed";
37
+ readonly message: string;
38
+ };
39
+ export declare const bootstrapGuestSession: (transport: VoilaTransport, cookieJarPort?: CookieJarPort) => Promise<Either.Either<GuestBootstrapResult, GuestBootstrapError>>;
40
+ //# sourceMappingURL=guest-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest-bootstrap.d.ts","sourceRoot":"","sources":["../../../src/voila/guest-bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EAET,sBAAsB,EACtB,eAAe,EACf,eAAe,EAChB,MAAM,4BAA4B,CAAA;AAGnC,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,kBAAkB,CAAA;AAE9E,OAAO,EAAE,KAAK,aAAa,EAA2C,MAAM,uBAAuB,CAAA;AAGnG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAA;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAClC;AAED,MAAM,MAAM,mBAAmB,GAC3B;IACA,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,wCAAwC,CAAA;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAA;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,qCAAqC,CAAA;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,CAAA;AAyGH,eAAO,MAAM,qBAAqB,GAChC,WAAW,cAAc,EACzB,gBAAe,aAAkC,KAChD,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CA4ClE,CAAA"}
@@ -0,0 +1,108 @@
1
+ import { Either } from "effect";
2
+ import { getInitialStateCategories } from "./categories.js";
3
+ import { getHeaderValues } from "./headers.js";
4
+ import { extractInitialState, extractInitialStatePayload } from "./initial-state.js";
5
+ import { makeSessionSnapshot, toughCookieJarPort } from "./session-snapshot.js";
6
+ import { VOILA_BASE_URL } from "./urls.js";
7
+ const homepageUrl = new URL("/", VOILA_BASE_URL);
8
+ const emptyStringLength = 0;
9
+ const successStatusMin = 200;
10
+ const successStatusMax = 300;
11
+ const setCookieHeader = "set-cookie";
12
+ const networkFailure = () => ({
13
+ _tag: "GuestBootstrapNetworkFailure",
14
+ message: "Voila homepage request failed"
15
+ });
16
+ const non2xxResponse = (status) => ({
17
+ _tag: "GuestBootstrapNon2xxResponse",
18
+ message: "Voila homepage returned a non-success response",
19
+ status
20
+ });
21
+ const missingCookies = () => ({
22
+ _tag: "GuestBootstrapMissingCookies",
23
+ message: "Voila homepage response did not include guest session cookies"
24
+ });
25
+ const cookiePersistenceFailure = () => ({
26
+ _tag: "GuestBootstrapCookiePersistenceFailure",
27
+ message: "Guest session cookies could not be stored"
28
+ });
29
+ const missingCsrf = () => ({
30
+ _tag: "GuestBootstrapMissingCsrf",
31
+ message: "Voila homepage initial state did not include a CSRF token"
32
+ });
33
+ const initialStateMalformed = () => ({
34
+ _tag: "GuestBootstrapInitialStateMalformed",
35
+ message: "Voila homepage initial state could not be decoded"
36
+ });
37
+ const isSuccessStatus = (status) => status >= successStatusMin && status < successStatusMax;
38
+ const isRecord = (value) => typeof value === "object" && value !== null;
39
+ const hasCsrfToken = (payload) => {
40
+ if (!isRecord(payload) || !isRecord(payload.csrf)) {
41
+ return false;
42
+ }
43
+ return typeof payload.csrf.token === "string";
44
+ };
45
+ const makeGuestCartSummary = (basket) => {
46
+ const itemCount = (basket.itemGroups ?? []).reduce((total, group) => total + group.items.reduce((groupTotal, item) => groupTotal + item.quantity, 0), 0);
47
+ return {
48
+ basketId: basket.basketId,
49
+ itemCount,
50
+ regionId: basket.regionId,
51
+ totals: basket.totals
52
+ };
53
+ };
54
+ const storeHomepageCookies = (cookieJarPort, response) => {
55
+ const cookies = getHeaderValues(response.headers, setCookieHeader);
56
+ if (cookies.length === emptyStringLength) {
57
+ return Either.left(missingCookies());
58
+ }
59
+ const jar = cookieJarPort.create();
60
+ for (const cookie of cookies) {
61
+ try {
62
+ jar.setCookieSync(cookie, homepageUrl.href);
63
+ }
64
+ catch {
65
+ return Either.left(cookiePersistenceFailure());
66
+ }
67
+ }
68
+ return Either.mapLeft(cookieJarPort.serialize(jar), cookiePersistenceFailure);
69
+ };
70
+ const decodeInitialState = (html) => Either.flatMap(Either.mapLeft(extractInitialStatePayload(html), initialStateMalformed), (payload) => {
71
+ if (!hasCsrfToken(payload)) {
72
+ return Either.left(missingCsrf());
73
+ }
74
+ return Either.mapLeft(extractInitialState(html), initialStateMalformed);
75
+ });
76
+ export const bootstrapGuestSession = async (transport, cookieJarPort = toughCookieJarPort) => {
77
+ let response;
78
+ try {
79
+ response = await transport.request({
80
+ headers: {},
81
+ method: "GET",
82
+ url: homepageUrl
83
+ });
84
+ }
85
+ catch {
86
+ return Either.left(networkFailure());
87
+ }
88
+ if (Either.isLeft(response)) {
89
+ return Either.left(networkFailure());
90
+ }
91
+ if (!isSuccessStatus(response.right.status)) {
92
+ return Either.left(non2xxResponse(response.right.status));
93
+ }
94
+ return Either.flatMap(storeHomepageCookies(cookieJarPort, response.right), (cookieJar) => Either.flatMap(decodeInitialState(response.right.body), (initialState) => {
95
+ if (initialState.csrf.token.trim().length === emptyStringLength) {
96
+ return Either.left(missingCsrf());
97
+ }
98
+ return Either.mapLeft(makeSessionSnapshot(initialState.session.metadata, initialState.csrf, cookieJar), cookiePersistenceFailure).pipe(Either.map((session) => ({
99
+ categories: getInitialStateCategories(initialState),
100
+ cart: makeGuestCartSummary(initialState.data.basket),
101
+ csrf: initialState.csrf,
102
+ metadata: initialState.session.metadata,
103
+ regionId: initialState.data.basket.regionId,
104
+ session
105
+ })));
106
+ }));
107
+ };
108
+ //# sourceMappingURL=guest-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest-bootstrap.js","sourceRoot":"","sources":["../../../src/voila/guest-bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SessionMetadata } from "../domain/schemas/index.js";
2
+ export type ResponseHeaders = Readonly<Record<string, ReadonlyArray<string> | string | undefined>>;
3
+ export declare const makeVoilaHeaders: (metadata: SessionMetadata, csrfToken: string) => Readonly<Record<string, string>>;
4
+ export declare const getHeaderValues: (headers: ResponseHeaders, headerName: string) => ReadonlyArray<string>;
5
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/voila/headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;AAElG,eAAO,MAAM,gBAAgB,GAC3B,UAAU,eAAe,EACzB,WAAW,MAAM,KAChB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOhC,CAAA;AAEF,eAAO,MAAM,eAAe,GAC1B,SAAS,eAAe,EACxB,YAAY,MAAM,KACjB,aAAa,CAAC,MAAM,CActB,CAAA"}
@@ -0,0 +1,20 @@
1
+ export const makeVoilaHeaders = (metadata, csrfToken) => ({
2
+ "X-CSRF-TOKEN": csrfToken,
3
+ "client-route-id": metadata.clientRouteId,
4
+ "content-type": "application/json",
5
+ "ecom-request-source": "web",
6
+ "ecom-request-source-version": metadata.assetVersion,
7
+ "page-view-id": metadata.pageViewId
8
+ });
9
+ export const getHeaderValues = (headers, headerName) => {
10
+ const found = Object.entries(headers).find(([key]) => key.toLowerCase() === headerName);
11
+ if (found === undefined) {
12
+ return [];
13
+ }
14
+ const value = found[1];
15
+ if (value === undefined) {
16
+ return [];
17
+ }
18
+ return typeof value === "string" ? [value] : value;
19
+ };
20
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../src/voila/headers.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,QAAyB,EACzB,SAAiB,EACiB,EAAE,CAAC,CAAC;IACtC,cAAc,EAAE,SAAS;IACzB,iBAAiB,EAAE,QAAQ,CAAC,aAAa;IACzC,cAAc,EAAE,kBAAkB;IAClC,qBAAqB,EAAE,KAAK;IAC5B,6BAA6B,EAAE,QAAQ,CAAC,YAAY;IACpD,cAAc,EAAE,QAAQ,CAAC,UAAU;CACpC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAwB,EACxB,UAAkB,EACK,EAAE;IACzB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAA;IAEvF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAEtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AACpD,CAAC,CAAA"}
@@ -0,0 +1,60 @@
1
+ import type { Schema } from "effect";
2
+ import { Either } from "effect";
3
+ import { type SessionSnapshot } from "../domain/schemas/index.js";
4
+ import { type ResponseHeaders } from "./headers.js";
5
+ import { type CookieJarPort } from "./session-snapshot.js";
6
+ export type VoilaHttpMethod = "DELETE" | "GET" | "PATCH" | "POST" | "PUT";
7
+ export interface VoilaHttpRequest {
8
+ readonly body?: string;
9
+ readonly headers?: Readonly<Record<string, string>>;
10
+ readonly method: VoilaHttpMethod;
11
+ readonly url: URL;
12
+ }
13
+ export interface VoilaTransportRequest {
14
+ readonly body?: string;
15
+ readonly headers: Readonly<Record<string, string>>;
16
+ readonly method: VoilaHttpMethod;
17
+ readonly url: URL;
18
+ }
19
+ export interface VoilaTransportResponse {
20
+ readonly body: string;
21
+ readonly headers: ResponseHeaders;
22
+ readonly status: number;
23
+ }
24
+ export interface VoilaTransport {
25
+ readonly request: (request: VoilaTransportRequest) => Promise<Either.Either<VoilaTransportResponse, unknown>>;
26
+ }
27
+ export interface VoilaJsonResult<A> {
28
+ readonly session: SessionSnapshot;
29
+ readonly value: A;
30
+ }
31
+ export type VoilaSdkError = {
32
+ readonly _tag: "VoilaMissingCsrfToken";
33
+ readonly message: string;
34
+ } | {
35
+ readonly _tag: "VoilaUnsupportedOrigin";
36
+ readonly message: string;
37
+ readonly origin: string;
38
+ } | {
39
+ readonly _tag: "VoilaSessionPersistenceFailure";
40
+ readonly message: string;
41
+ } | {
42
+ readonly _tag: "VoilaNetworkFailure";
43
+ readonly message: string;
44
+ } | {
45
+ readonly _tag: "VoilaUnauthorizedSession";
46
+ readonly message: string;
47
+ readonly status: 401 | 403;
48
+ } | {
49
+ readonly _tag: "VoilaNon2xxResponse";
50
+ readonly message: string;
51
+ readonly status: number;
52
+ } | {
53
+ readonly _tag: "VoilaMalformedJson";
54
+ readonly message: string;
55
+ } | {
56
+ readonly _tag: "VoilaSchemaDecodeFailure";
57
+ readonly message: string;
58
+ };
59
+ export declare const requestVoilaJson: <A, I>(schema: Schema.Schema<A, I, never>, session: SessionSnapshot, request: VoilaHttpRequest, transport: VoilaTransport, cookieJarPort?: CookieJarPort) => Promise<Either.Either<VoilaJsonResult<A>, VoilaSdkError>>;
60
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/voila/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { Either } from "effect";
2
+ import { parseJson, parseUnknown } from "../domain/parse.js";
3
+ import {} from "../domain/schemas/index.js";
4
+ import { getHeaderValues, makeVoilaHeaders } from "./headers.js";
5
+ import { toughCookieJarPort } from "./session-snapshot.js";
6
+ import { VOILA_BASE_URL } from "./urls.js";
7
+ const emptyStringLength = 0;
8
+ const unauthorizedStatus = 401;
9
+ const forbiddenStatus = 403;
10
+ const successStatusMin = 200;
11
+ const successStatusMax = 300;
12
+ const setCookieHeader = "set-cookie";
13
+ const missingCsrfToken = () => ({
14
+ _tag: "VoilaMissingCsrfToken",
15
+ message: "Session snapshot is missing a CSRF token"
16
+ });
17
+ const unsupportedOrigin = (origin) => ({
18
+ _tag: "VoilaUnsupportedOrigin",
19
+ message: "Only same-origin Voila requests are supported",
20
+ origin
21
+ });
22
+ const sessionPersistenceFailure = (_cause) => ({
23
+ _tag: "VoilaSessionPersistenceFailure",
24
+ message: "Session cookies could not be restored or persisted"
25
+ });
26
+ const setCookiePersistenceFailure = () => ({
27
+ _tag: "VoilaSessionPersistenceFailure",
28
+ message: "Session cookies could not be restored or persisted"
29
+ });
30
+ const networkFailure = (_cause) => ({
31
+ _tag: "VoilaNetworkFailure",
32
+ message: "Voila network request failed"
33
+ });
34
+ const unauthorizedSession = (status) => ({
35
+ _tag: "VoilaUnauthorizedSession",
36
+ message: "Voila session is unauthorized or expired",
37
+ status
38
+ });
39
+ const non2xxResponse = (status) => ({
40
+ _tag: "VoilaNon2xxResponse",
41
+ message: "Voila returned a non-success response",
42
+ status
43
+ });
44
+ const malformedJson = () => ({
45
+ _tag: "VoilaMalformedJson",
46
+ message: "Voila returned malformed JSON"
47
+ });
48
+ const schemaDecodeFailure = () => ({
49
+ _tag: "VoilaSchemaDecodeFailure",
50
+ message: "Voila response JSON does not match the SDK schema"
51
+ });
52
+ const isSuccessStatus = (status) => status >= successStatusMin && status < successStatusMax;
53
+ const isUnauthorizedStatus = (status) => status === unauthorizedStatus || status === forbiddenStatus;
54
+ const makeRequestHeaders = (request, session, cookieHeader) => {
55
+ const cookieHeaders = cookieHeader.length === emptyStringLength ? {} : { cookie: cookieHeader };
56
+ return {
57
+ ...request.headers,
58
+ ...makeVoilaHeaders(session.metadata, session.csrf.token),
59
+ ...cookieHeaders
60
+ };
61
+ };
62
+ const applySetCookieHeaders = (cookieJarPort, session, response, url) => Either.flatMap(Either.mapLeft(cookieJarPort.deserialize(session.cookieJar), sessionPersistenceFailure), (cookieJar) => {
63
+ for (const cookie of getHeaderValues(response.headers, setCookieHeader)) {
64
+ try {
65
+ cookieJar.setCookieSync(cookie, url.href);
66
+ }
67
+ catch {
68
+ return Either.left(setCookiePersistenceFailure());
69
+ }
70
+ }
71
+ return Either.flatMap(Either.mapLeft(cookieJarPort.serialize(cookieJar), sessionPersistenceFailure), (cookieJarSnapshot) => Either.right({
72
+ ...session,
73
+ cookieJar: cookieJarSnapshot
74
+ }));
75
+ });
76
+ export const requestVoilaJson = async (schema, session, request, transport, cookieJarPort = toughCookieJarPort) => {
77
+ if (session.csrf.token.trim().length === emptyStringLength) {
78
+ return Either.left(missingCsrfToken());
79
+ }
80
+ if (request.url.origin !== VOILA_BASE_URL) {
81
+ return Either.left(unsupportedOrigin(request.url.origin));
82
+ }
83
+ const cookieJar = cookieJarPort.deserialize(session.cookieJar);
84
+ if (Either.isLeft(cookieJar)) {
85
+ return Either.left(sessionPersistenceFailure(cookieJar.left));
86
+ }
87
+ const cookieHeader = cookieJar.right.getCookieStringSync(request.url.href);
88
+ const transportRequestBase = {
89
+ headers: makeRequestHeaders(request, session, cookieHeader),
90
+ method: request.method,
91
+ url: request.url
92
+ };
93
+ const transportRequest = request.body === undefined
94
+ ? transportRequestBase
95
+ : {
96
+ ...transportRequestBase,
97
+ body: request.body
98
+ };
99
+ let response;
100
+ try {
101
+ response = await transport.request(transportRequest);
102
+ }
103
+ catch (error) {
104
+ return Either.left(networkFailure(error));
105
+ }
106
+ if (Either.isLeft(response)) {
107
+ return Either.left(networkFailure(response.left));
108
+ }
109
+ if (isUnauthorizedStatus(response.right.status)) {
110
+ return Either.left(unauthorizedSession(response.right.status));
111
+ }
112
+ if (!isSuccessStatus(response.right.status)) {
113
+ return Either.left(non2xxResponse(response.right.status));
114
+ }
115
+ const updatedSession = applySetCookieHeaders(cookieJarPort, session, response.right, request.url);
116
+ if (Either.isLeft(updatedSession)) {
117
+ return Either.left(updatedSession.left);
118
+ }
119
+ return Either.flatMap(Either.mapLeft(parseJson(response.right.body), malformedJson), (payload) => Either.map(Either.mapLeft(parseUnknown(schema, payload), schemaDecodeFailure), (value) => ({
120
+ session: updatedSession.right,
121
+ value
122
+ })));
123
+ };
124
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/voila/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ParseResult } from "effect";
2
+ import { Either } from "effect";
3
+ import { type InitialState } from "../domain/schemas/index.js";
4
+ export type InitialStateExtractionError = {
5
+ readonly _tag: "InitialStateScriptMissing";
6
+ readonly marker: string;
7
+ } | {
8
+ readonly _tag: "InitialStateJsonMissing";
9
+ readonly marker: string;
10
+ } | {
11
+ readonly _tag: "InitialStateJsonMalformed";
12
+ readonly cause: Error;
13
+ } | {
14
+ readonly _tag: "InitialStateSchemaMismatch";
15
+ readonly cause: ParseResult.ParseError;
16
+ };
17
+ export declare const extractInitialStatePayload: (html: string) => Either.Either<unknown, InitialStateExtractionError>;
18
+ export declare const extractInitialState: (html: string) => Either.Either<InitialState, InitialStateExtractionError>;
19
+ //# sourceMappingURL=initial-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initial-state.d.ts","sourceRoot":"","sources":["../../../src/voila/initial-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,4BAA4B,CAAA;AAclF,MAAM,MAAM,2BAA2B,GACnC;IACA,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAA;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAA;IAC1C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CACtB,GACC;IACA,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAA;IAC3C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,CAAA;CACvC,CAAA;AAqIH,eAAO,MAAM,0BAA0B,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAIzG,CAAA;AAEH,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,2BAA2B,CAIvG,CAAA"}
@@ -0,0 +1,117 @@
1
+ import { Either } from "effect";
2
+ import { parseJson, parseUnknown } from "../domain/parse.js";
3
+ import { InitialStateSchema } from "../domain/schemas/index.js";
4
+ const initialStateMarker = "window.__INITIAL_STATE__";
5
+ const assignmentToken = "=";
6
+ const scriptOpenStart = "<script";
7
+ const scriptOpenEnd = ">";
8
+ const scriptClose = "</script>";
9
+ const objectStart = "{";
10
+ const objectEnd = "}";
11
+ const quote = "\"";
12
+ const escape = "\\";
13
+ const missingIndex = -1;
14
+ const whitespaceCharacters = new Set([" ", "\n", "\r", "\t"]);
15
+ const scriptMissing = () => ({
16
+ _tag: "InitialStateScriptMissing",
17
+ marker: initialStateMarker
18
+ });
19
+ const jsonMissing = () => ({
20
+ _tag: "InitialStateJsonMissing",
21
+ marker: initialStateMarker
22
+ });
23
+ const jsonMalformed = (cause) => ({
24
+ _tag: "InitialStateJsonMalformed",
25
+ cause
26
+ });
27
+ const schemaMismatch = (cause) => ({
28
+ _tag: "InitialStateSchemaMismatch",
29
+ cause
30
+ });
31
+ const skipWhitespace = (html, fromIndex) => {
32
+ let index = fromIndex;
33
+ while (index < html.length && whitespaceCharacters.has(html.charAt(index))) {
34
+ index += 1;
35
+ }
36
+ return index;
37
+ };
38
+ const findJsonStart = (html, fromIndex) => {
39
+ const assignmentIndex = skipWhitespace(html, fromIndex);
40
+ if (html[assignmentIndex] !== assignmentToken) {
41
+ return missingIndex;
42
+ }
43
+ const objectIndex = skipWhitespace(html, assignmentIndex + assignmentToken.length);
44
+ if (html[objectIndex] !== objectStart) {
45
+ return missingIndex;
46
+ }
47
+ return objectIndex;
48
+ };
49
+ const findJsonEnd = (html, fromIndex) => {
50
+ let depth = 0;
51
+ let index = fromIndex;
52
+ let inString = false;
53
+ let escaped = false;
54
+ while (index < html.length) {
55
+ const character = html[index];
56
+ if (escaped) {
57
+ escaped = false;
58
+ }
59
+ else if (character === escape) {
60
+ escaped = inString;
61
+ }
62
+ else if (character === quote) {
63
+ inString = !inString;
64
+ }
65
+ else if (!inString && character === objectStart) {
66
+ depth += 1;
67
+ }
68
+ else if (!inString && character === objectEnd) {
69
+ depth -= 1;
70
+ if (depth === 0) {
71
+ return index;
72
+ }
73
+ }
74
+ index += 1;
75
+ }
76
+ return missingIndex;
77
+ };
78
+ const findInitialStateScript = (html) => {
79
+ let searchIndex = 0;
80
+ while (searchIndex < html.length) {
81
+ const openStartIndex = html.indexOf(scriptOpenStart, searchIndex);
82
+ if (openStartIndex < 0) {
83
+ return Either.left(scriptMissing());
84
+ }
85
+ const openEndIndex = html.indexOf(scriptOpenEnd, openStartIndex + scriptOpenStart.length);
86
+ if (openEndIndex < 0) {
87
+ return Either.left(scriptMissing());
88
+ }
89
+ const closeIndex = html.indexOf(scriptClose, openEndIndex + scriptOpenEnd.length);
90
+ if (closeIndex < 0) {
91
+ return Either.left(scriptMissing());
92
+ }
93
+ const scriptBody = html.slice(openEndIndex + scriptOpenEnd.length, closeIndex);
94
+ if (scriptBody.includes(initialStateMarker)) {
95
+ return Either.right(scriptBody);
96
+ }
97
+ searchIndex = closeIndex + scriptClose.length;
98
+ }
99
+ return Either.left(scriptMissing());
100
+ };
101
+ const extractInitialStateJson = (html) => {
102
+ return Either.flatMap(findInitialStateScript(html), (scriptBody) => {
103
+ const markerIndex = scriptBody.indexOf(initialStateMarker);
104
+ const jsonStart = findJsonStart(scriptBody, markerIndex + initialStateMarker.length);
105
+ if (jsonStart < 0) {
106
+ return Either.left(jsonMissing());
107
+ }
108
+ const jsonEnd = findJsonEnd(scriptBody, jsonStart);
109
+ if (jsonEnd < 0) {
110
+ return Either.left(jsonMissing());
111
+ }
112
+ return Either.right(scriptBody.slice(jsonStart, jsonEnd + 1));
113
+ });
114
+ };
115
+ export const extractInitialStatePayload = (html) => Either.flatMap(extractInitialStateJson(html), (json) => Either.mapLeft(parseJson(json), jsonMalformed));
116
+ export const extractInitialState = (html) => Either.flatMap(extractInitialStatePayload(html), (payload) => Either.mapLeft(parseUnknown(InitialStateSchema, payload), schemaMismatch));
117
+ //# sourceMappingURL=initial-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initial-state.js","sourceRoot":"","sources":["../../../src/voila/initial-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Either } from "effect";
2
+ import type { SdkSessionSnapshot, SessionHealth } from "../domain/schemas/index.js";
3
+ import type { VoilaTransport } from "./http-client.js";
4
+ import type { CookieJarPort } from "./session-snapshot.js";
5
+ export type CheckSessionHealthError = {
6
+ readonly _tag: "SessionHealthSnapshotInvalid";
7
+ readonly message: string;
8
+ };
9
+ export declare const checkSessionHealth: (snapshot: SdkSessionSnapshot, transport: VoilaTransport, cookieJarPort?: CookieJarPort) => Promise<Either.Either<SessionHealth, CheckSessionHealthError>>;
10
+ //# sourceMappingURL=session-health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-health.d.ts","sourceRoot":"","sources":["../../../src/voila/session-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAG/B,OAAO,KAAK,EAGV,kBAAkB,EAClB,aAAa,EAEd,MAAM,4BAA4B,CAAA;AAGnC,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,kBAAkB,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAQ1D,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,8BAA8B,CAAA;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB,CAAA;AAmQD,eAAO,MAAM,kBAAkB,GAC7B,UAAU,kBAAkB,EAC5B,WAAW,cAAc,EACzB,gBAAgB,aAAa,KAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC,CA4B/D,CAAA"}