@netceterapx/click-to-pay-sdk 2.0.0-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +358 -0
- package/package.json +82 -0
package/README.md
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
## Component usage
|
|
2
|
+
|
|
3
|
+
The Netcetera Click-to-Pay SDK component is of type web component.
|
|
4
|
+
|
|
5
|
+
```html
|
|
6
|
+
<click-to-pay locale='en_US'
|
|
7
|
+
isexpanded='true'
|
|
8
|
+
email='myemail@email.com'
|
|
9
|
+
dcfopeningbehaviour='full'
|
|
10
|
+
sandbox='false'></click-to-pay>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`locale` This prop informs the SRCi component to render in the appropriate language set by the merchant.
|
|
14
|
+
|
|
15
|
+
`isexpanded` This prop is used to show/hide the SRCi component. It can be used when the SRCi button is clicked to open
|
|
16
|
+
the component, or let the merchant control when to show the component.
|
|
17
|
+
|
|
18
|
+
`email` This prop can contain the currently authenticated profile email address. This allows the login section of the
|
|
19
|
+
SRC component to autofill the users email.
|
|
20
|
+
|
|
21
|
+
`dcfopeningbehaviour` This prop controls how the SRC component will render the DCF window. Available options are:
|
|
22
|
+
|
|
23
|
+
- `replace` This will hide the SRC component while the DCF window is active. It will be placed where the SRC component
|
|
24
|
+
is located.
|
|
25
|
+
- `full` This will cover the whole page with a backdrop. The DCF window will be placed in the center of the screen.
|
|
26
|
+
- `popup` This will open the DCF window in a popup window.
|
|
27
|
+
|
|
28
|
+
`sandbox` This prop controls the environment which the SRCi component starts. Possible values:
|
|
29
|
+
- `false` This starts the SRCi in production mode, using the production SDK's by the chosen credit card brands.
|
|
30
|
+
Note: A production environment must be configured first with the chosen credit card brand (Visa, MS, etc...).
|
|
31
|
+
- `true` This starts the SRCi in development mode, using the sandbox version of the chosen credit card brands. As an example,
|
|
32
|
+
this can be useful for local development.
|
|
33
|
+
|
|
34
|
+
`ispaninpaybutton` This prop controls whether a masked PAN is shown on the payment button. Possible values:
|
|
35
|
+
- `true` Masked pan is shown on the payment button.
|
|
36
|
+
- `false` Masked pan is not shown on the payment button.
|
|
37
|
+
|
|
38
|
+
`isbuttonprimary` This prop controls whether the main button in the component is in primary or secondary state. Possible values:
|
|
39
|
+
- `true` Button is in primary state.
|
|
40
|
+
- `false` Button is in secondary state.
|
|
41
|
+
|
|
42
|
+
Note: The application starts by default in production mode.
|
|
43
|
+
|
|
44
|
+
`config` This prop is used for initializing the SRC component.
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
|
|
48
|
+
clickToPay.config = {
|
|
49
|
+
mastercard: {
|
|
50
|
+
srcInitiatorId: 'required-src-initiator-id',
|
|
51
|
+
srciDpaId: 'required-src-dpa-id',
|
|
52
|
+
dpaTransactionOptions: {
|
|
53
|
+
dpaLocale: 'required-dpa-locale',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
visa: {
|
|
57
|
+
srcInitiatorId: 'required-src-initiator-id',
|
|
58
|
+
srciDpaId: 'required-src-dpa-id',
|
|
59
|
+
encryptionKey: 'required-encryption-key',
|
|
60
|
+
publicKey: 'required-public-key',
|
|
61
|
+
},
|
|
62
|
+
amex: {
|
|
63
|
+
srcInitiatorId: 'required-src-initiator-id',
|
|
64
|
+
dpaData: {
|
|
65
|
+
dpaPresentationName: 'required-dpa-presentation-name',
|
|
66
|
+
dpaName: 'required-dpa-name',
|
|
67
|
+
},
|
|
68
|
+
dpaTransactionOptions: {
|
|
69
|
+
threeDsPreference: 'required-three-ds-preference',
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
If for example you do not support Amex, just by not including the `amex` property will be enough to inform the SRC
|
|
76
|
+
component to ignore that vendor.
|
|
77
|
+
|
|
78
|
+
Note: The SRC component has a detailed error reporting solution. Thus, any values that are missing will be reported with
|
|
79
|
+
the full path.
|
|
80
|
+
|
|
81
|
+
`config.iframe` This prop is used when a custom iframe window is used by the merchant.
|
|
82
|
+
This allows the merchant to control the position of the iframe window and also react on
|
|
83
|
+
the iframe state changes.
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<iframe width='600px' height='800px' id='src-iframe'></iframe>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
clickToPay.config = {
|
|
91
|
+
iframe: {
|
|
92
|
+
ref: document.querySelector('#src-iframe'),
|
|
93
|
+
handlers: {
|
|
94
|
+
onDcfShow() {
|
|
95
|
+
// handle when DCF is visible and loaded...
|
|
96
|
+
},
|
|
97
|
+
onDcfHide() {
|
|
98
|
+
// handle when DCF window is removed...
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Note: The `config.iframe.ref` property is required when using a custom window.
|
|
106
|
+
|
|
107
|
+
`profileDetails` This prop contains user data that is passed to the credit card brand DCF. For example, this can be useful
|
|
108
|
+
when the merchant has a logged-in user data which it can pass to the DCF, as to make some form fields already pre-filled.
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
clickToPay.profileDetails = {
|
|
112
|
+
fullName: "John Doe",
|
|
113
|
+
firstName: "John",
|
|
114
|
+
lastName: "Doe",
|
|
115
|
+
email: "john-doe@company.com",
|
|
116
|
+
billingAddress: {
|
|
117
|
+
countryCode: "US",
|
|
118
|
+
name: "John",
|
|
119
|
+
line1: "29501 PACIFIC FEDERAL WAY WA 98003-3869 USA",
|
|
120
|
+
city: "Washington",
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`transactionAmount` This prop contains the amount and currency code associated with the transaction that are shown on the payment button.
|
|
126
|
+
It is a required prop.
|
|
127
|
+
|
|
128
|
+
```js
|
|
129
|
+
clickToPay.transactionamount = {
|
|
130
|
+
amount: 10,
|
|
131
|
+
currencyCode: USD
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Note: Some fields might be ignored / not used, by a particular credit card brand DCF.
|
|
136
|
+
|
|
137
|
+
### Dynamically update the SRCi component
|
|
138
|
+
|
|
139
|
+
The SRCi component able to react to any changes of its props. That means the merchant can programmatically set/update
|
|
140
|
+
its props, and the component will update itself accordingly.
|
|
141
|
+
|
|
142
|
+
```js
|
|
143
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
144
|
+
|
|
145
|
+
let clickToPay = document.querySelector('click-to-pay');
|
|
146
|
+
|
|
147
|
+
clickToPay.setAttribute('isExpanded', 'false');
|
|
148
|
+
|
|
149
|
+
clickToPay.config = {
|
|
150
|
+
// ...
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
clickToPay.addEventListener('consumerStatus', (e) => {
|
|
154
|
+
// handle consumer status events...
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
clickToPay.addEventListener('paymentSuccess', (e) => {
|
|
158
|
+
// handle success...
|
|
159
|
+
});
|
|
160
|
+
clickToPay.addEventListener('paymentError', (e) => {
|
|
161
|
+
// handle error...
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
clickToPay.addEventListener('generalEvents', (e) => {
|
|
165
|
+
// handle events that might be important to listen on...
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
clickToPay.addEventListener('performanceUpdate', (e) => {
|
|
169
|
+
// handle performance entry update
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
clickToPay.addEventListener('userActionUpdate', (e) => {
|
|
173
|
+
// handle user action entry update
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`document.addEventListener('DOMContentLoaded', function() {...});` It's recommended to initialize/update any properties after the component is fully initialized.
|
|
179
|
+
|
|
180
|
+
`let clickToPay = document.querySelector('click-to-pay');` The merchant can get a reference to the SRCi component.
|
|
181
|
+
|
|
182
|
+
`clickToPay.setAttribute('isExpanded', 'false');` Then, the merchant is able to modify any prop for the component, when
|
|
183
|
+
that happens the component reacts.
|
|
184
|
+
|
|
185
|
+
` clickToPay.addEventListener('consumerStatus', (e) => {});` The SRCi component will fire a consumer status event whenever there is an update that affects the consumer status during the interaction with the click-to-pay component.
|
|
186
|
+
The event contains the following parameters that describe the current state of the consumer in the click-to-pay flow:
|
|
187
|
+
|
|
188
|
+
1. isRecognized: Informs whether consumer was recognized by detecting a cookie in the browser set by the SRC System.
|
|
189
|
+
2. hasProfile: Informs whether consumer has a profile in any of the SRC Systems.
|
|
190
|
+
3. hasCards: Informs whether consumer has saved cards in any of the SRC Systems.
|
|
191
|
+
4. hasProfileInSchemes: Gives a list of Schemes that the user has a profile in.
|
|
192
|
+
5. manualCardEntryMandatory: Informs whether the manual card entry form should be open by default.
|
|
193
|
+
|
|
194
|
+
` clickToPay.addEventListener('paymentSuccess', (e) => {});` The SRCi component will fire a success event when the card
|
|
195
|
+
has been selected from the user. The response will contain the data for the user card needed to complete a transaction.
|
|
196
|
+
|
|
197
|
+
`clickToPay.addEventListener('paymentError', (e) => {});` The SRCi component will fire a error event whenever there is a
|
|
198
|
+
problem that is not able to recover from. For example: The vendor SDK servers are down. Or something unexpected
|
|
199
|
+
happened.
|
|
200
|
+
|
|
201
|
+
`clickToPay.addEventListener('generalEvents', (e) => {});` The SRCi component will fire an event when important steps/actions
|
|
202
|
+
happened inside the component, triggered by the user or the component itself. Example: The user chose to cancel the open DCF window.
|
|
203
|
+
|
|
204
|
+
`clickToPay.addEventListener('performanceUpdate', (e) => {});` The SRCi component will fire an event when a new SDK performance entry
|
|
205
|
+
has been measured. Example: Mastercard/Visa/Amex SDK init or get profile method finished, and the time for its
|
|
206
|
+
execution has been measured.
|
|
207
|
+
|
|
208
|
+
`clickToPay.addEventListener('userActionUpdate', (e) => {});` The SRCi component will fire an event when a new user action
|
|
209
|
+
has been performed. Example: User clicked on an input field/button, started typing text or selected a card.
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
enum GeneralEvents {
|
|
213
|
+
ON_DCF_CANCEL
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
<h3 id='headless-doc'> Headless </h3>
|
|
218
|
+
|
|
219
|
+
The SRC component can start in a "headless" mode. That means there will be no UI rendered on the screen,
|
|
220
|
+
which is left on the merchant, rather it exposes the `checkout` method directly.
|
|
221
|
+
Thus, the merchant can control the UI flow and leave the checkout process to
|
|
222
|
+
the SRC component to handle.
|
|
223
|
+
|
|
224
|
+
Note: The SRCi components still needs to be initialized by placing the HTML code.
|
|
225
|
+
You can hide the UI with the `isExpanded` props.
|
|
226
|
+
|
|
227
|
+
```html
|
|
228
|
+
<click-to-pay isExpanded='false'></click-to-pay>
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
```js
|
|
232
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
233
|
+
|
|
234
|
+
let clickToPay = document.querySelector('click-to-pay');
|
|
235
|
+
|
|
236
|
+
clickToPay.config = {
|
|
237
|
+
// ...
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// merchant creates the form. In this example we have a checkout submit button.
|
|
241
|
+
let checkoutButton = document.querySelector('#checkout-button');
|
|
242
|
+
|
|
243
|
+
// .then().catch() are also compatible.
|
|
244
|
+
checkoutButton.onclick = async function() {
|
|
245
|
+
try {
|
|
246
|
+
let response = await clickToPay.checkout({
|
|
247
|
+
card: {
|
|
248
|
+
primaryAccountNumber: '1212121212121212',
|
|
249
|
+
panExpirationMonth: '7', // '07' is also allowed.
|
|
250
|
+
panExpirationYear: '2030', // must be 4 digits.
|
|
251
|
+
cardSecurityCode: '123', // must be 3 or 4 digits.
|
|
252
|
+
},
|
|
253
|
+
});
|
|
254
|
+
// handle the response.
|
|
255
|
+
} catch (e) {
|
|
256
|
+
// handle the error.
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
});
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
The response of the `checkout` method is forwarded from the SRC vendor to the merchant.
|
|
263
|
+
|
|
264
|
+
Example response:
|
|
265
|
+
```json
|
|
266
|
+
{
|
|
267
|
+
"userAction": "COMPLETE",
|
|
268
|
+
"checkoutResponseSignature": "eyJraWQiOiJTRTZOOE...",
|
|
269
|
+
"creditCardBrand": "Visa",
|
|
270
|
+
"performance":{"correlationId":{"visa":"5ee5add0-bbdd-6094-55bd-16c4c7bda302","mc":"34f4a04b.8add86db-c257-4f8c-808a-b51a4a07e444","amex":""},"referenceTimestamp":"2022-12-18T20:15:50.036Z","totalLoadingTime":3731,"consumerStatus":{"isRecognized": false, "hasProfile": true, "hasCards": true, "hasProfileInSchemes": ["Visa", "Mastercard"], "manualCardEntryMandatory": false},"sdkPerformance":{"visa":[{"methodName":"init","duration":1428,"startDelta":0},{"methodName":"isRecognized","duration":1297,"startDelta":3690},{"methodName":"identityLookup","duration":1218,"startDelta":18833},{"methodName":"getSrcProfile","duration":2548,"startDelta":41254},{"methodName":"unbindAppInstance","duration":24,"startDelta":52816}]}},
|
|
271
|
+
"userActions": [{"type":"click","target":"email","startDelta":1215},{"type":"text_type","target":"email","startDelta":1743},{"type":"click","target":"continue","startDelta":9258},{"type":"click","target":"otp","startDelta":18889.000000000004},{"type":"text_type","target":"otp","startDelta":43660},{"type":"click","target":"continue","startDelta":44120},{"type":"click","target":"continue","startDelta":50200}]
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
The `checkout` response includes a performance object that contains information about the duration of the
|
|
276
|
+
performed SDK methods during the user interaction, and the point of time in which they started executing.
|
|
277
|
+
Apart from the performance object, it also contains an array of user actions that the user performed, and
|
|
278
|
+
the point of time in which the user performed the actions.
|
|
279
|
+
|
|
280
|
+
Performance object parameters:\
|
|
281
|
+
`correlationId`: The correlation ID used for the transaction.\
|
|
282
|
+
`referenceTimestamp`: The time when the click to pay component finished loading.\
|
|
283
|
+
`totalLoadingTime`: The total loading time of the click to pay component.\
|
|
284
|
+
`consumerStatus`: The consumer status.\
|
|
285
|
+
`sdkPerformance`: The SDK performance entries.
|
|
286
|
+
|
|
287
|
+
SDK performance object parameters:\
|
|
288
|
+
`methodName`: The name of the SDK method.\
|
|
289
|
+
`duration`: The duration of the method execution.\
|
|
290
|
+
`startDelta`: The number of milliseconds when the method started executing after the start of the init method execution.
|
|
291
|
+
|
|
292
|
+
User Action object parameters:\
|
|
293
|
+
`type`: The type of user action. Example: click, text_type, select.\
|
|
294
|
+
`target`: The target on which the user action is performed. Example: email, otp.\
|
|
295
|
+
`startDelta`: The point of time when the user action got executed after the loading of the click to pay component finished. Measured in milliseconds.
|
|
296
|
+
|
|
297
|
+
#### Error response
|
|
298
|
+
|
|
299
|
+
The SRC component validates the provided input for the checkout method. In case there is
|
|
300
|
+
a validation error, the following response can be returned.
|
|
301
|
+
|
|
302
|
+
```ts
|
|
303
|
+
enum CreditCardValidationErrorType {
|
|
304
|
+
CREDIT_CARD_NUMBER_REQUIRED,
|
|
305
|
+
CREDIT_CARD_CVV_REQUIRED,
|
|
306
|
+
CREDIT_CARD_EXPIRATION_YEAR_REQUIRED,
|
|
307
|
+
CREDIT_CARD_EXPIRATION_MONTH_REQUIRED,
|
|
308
|
+
CREDIT_CARD_NUMBER_INVALID,
|
|
309
|
+
CREDIT_CARD_NUMBER_UNSUPPORTED,
|
|
310
|
+
CREDIT_CARD_CVV_INVALID,
|
|
311
|
+
CREDIT_CARD_EXPIRED,
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
interface CreditCardValidation {
|
|
315
|
+
type: CreditCardValidationErrorType;
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Inside the error part (`catch (e)...`) as an example the response can be:
|
|
320
|
+
|
|
321
|
+
```js
|
|
322
|
+
{
|
|
323
|
+
type: 'CREDIT_CARD_NUMBER_REQUIRED'
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Click to Pay explanation modal
|
|
328
|
+
|
|
329
|
+
We offer the possibility to trigger the displaying of a Click to Pay explanation modal from the outside of our product.
|
|
330
|
+
The merchant or PSP can call our `displayClickToPayExplanationModal()` method, and we will overlay the screen with a Click to Pay explanation modal.
|
|
331
|
+
|
|
332
|
+
The modal can be closed by:
|
|
333
|
+
- clicking on the x button within the modal
|
|
334
|
+
- pressing the escape key
|
|
335
|
+
- clicking anywhere outside the modal
|
|
336
|
+
|
|
337
|
+
```js
|
|
338
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
339
|
+
let clickToPay = document.querySelector('click-to-pay');
|
|
340
|
+
|
|
341
|
+
clickToPay.displayClickToPayExplanationModal();
|
|
342
|
+
});
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
The Click to Pay explanation modal is following the UX guidelines of the schemes.
|
|
346
|
+
|
|
347
|
+
### Styling
|
|
348
|
+
|
|
349
|
+
There are multiple class names, and an id spread throughout the components of the SRCi.
|
|
350
|
+
These can be used as hooks to override / add styling as necessary.
|
|
351
|
+
|
|
352
|
+
`click-to-pay` This id is the top most HTML element which the SRCi mounts on.
|
|
353
|
+
|
|
354
|
+
`click-to-pay--main` This class wraps the main attribute. It's a container that wraps all sub-components and also contains the DCF window if chosen to do so.
|
|
355
|
+
|
|
356
|
+
`click-to-pay--spinner-container` This class wraps the spinner. This can be used to manipulate the spinner as to fit your specific styling requirements.
|
|
357
|
+
|
|
358
|
+
`click-to-pay--component-container` This class wraps every component that is currently active.
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@netceterapx/click-to-pay-sdk",
|
|
3
|
+
"version": "2.0.0-rc1",
|
|
4
|
+
"description": "Click-to-pay web-SDK for supporting SecureRemoteCommerce on web platforms",
|
|
5
|
+
"main": "./public/build/click-to-pay-sdk.js",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"public/build/click-to-pay-sdk.js"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "vite build",
|
|
13
|
+
"dev": "vite build --watch --mode development",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:coverage": "vitest run --coverage",
|
|
16
|
+
"test:watch": "vitest watch",
|
|
17
|
+
"lint": "eslint .",
|
|
18
|
+
"start": "vite --port 5001 ./dist/",
|
|
19
|
+
"validate": "svelte-check --threshold error --tsconfig ./tsconfig.json",
|
|
20
|
+
"validate:watch": "svelte-check --threshold error --tsconfig ./tsconfig.json --watch"
|
|
21
|
+
},
|
|
22
|
+
"private": false,
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"registry": "https://registry.npmjs.org"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@babel/core": "^7.22.1",
|
|
28
|
+
"@rollup/plugin-alias": "^5.0.0",
|
|
29
|
+
"@rollup/plugin-commonjs": "^25.0.0",
|
|
30
|
+
"@rollup/plugin-node-resolve": "^15.1.0",
|
|
31
|
+
"@rollup/plugin-replace": "^5.0.2",
|
|
32
|
+
"@rollup/plugin-typescript": "^11.1.1",
|
|
33
|
+
"@rollup/plugin-url": "^8.0.1",
|
|
34
|
+
"@sveltejs/vite-plugin-svelte": "^2.4.2",
|
|
35
|
+
"@testing-library/jest-dom": "^5.16.5",
|
|
36
|
+
"@testing-library/svelte": "^3.2.2",
|
|
37
|
+
"@tsconfig/svelte": "^4.0.1",
|
|
38
|
+
"@types/uuid": "^9.0.1",
|
|
39
|
+
"@typescript-eslint/eslint-plugin": "^5.59.8",
|
|
40
|
+
"@typescript-eslint/parser": "^5.59.8",
|
|
41
|
+
"@vitest/coverage-v8": "^0.32.2",
|
|
42
|
+
"babel-loader": "^9.1.2",
|
|
43
|
+
"eslint": "^8.41.0",
|
|
44
|
+
"eslint-config-prettier": "^8.8.0",
|
|
45
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
46
|
+
"eslint-plugin-svelte": "^2.30.0",
|
|
47
|
+
"jsdom": "^22.1.0",
|
|
48
|
+
"path-browserify": "^1.0.1",
|
|
49
|
+
"postcss": "^8.4.24",
|
|
50
|
+
"postcss-url": "^10.1.3",
|
|
51
|
+
"prettier": "^2.8.8",
|
|
52
|
+
"prettier-plugin-svelte": "^2.10.1",
|
|
53
|
+
"rollup": "^2.66.1",
|
|
54
|
+
"rollup-plugin-copy": "^3.4.0",
|
|
55
|
+
"rollup-plugin-css-only": "^4.3.0",
|
|
56
|
+
"rollup-plugin-svelte": "^7.1.5",
|
|
57
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
58
|
+
"shadow-dom-testing-library": "^1.11.0",
|
|
59
|
+
"shelljs": "^0.8.5",
|
|
60
|
+
"sirv-cli": "^2.0.2",
|
|
61
|
+
"stream-browserify": "^3.0.0",
|
|
62
|
+
"stylelint": "^15.6.2",
|
|
63
|
+
"stylelint-config-standard": "^33.0.0",
|
|
64
|
+
"svelte": "^3.59.1",
|
|
65
|
+
"svelte-check": "^3.4.3",
|
|
66
|
+
"svelte-htm": "^1.2.0",
|
|
67
|
+
"svelte-loader": "^3.1.8",
|
|
68
|
+
"svelte-preprocess": "^5.0.4",
|
|
69
|
+
"ts-node": "^10.9.1",
|
|
70
|
+
"tslib": "^2.6.0",
|
|
71
|
+
"typescript": "^5.0.2",
|
|
72
|
+
"vite": "^4.3.9",
|
|
73
|
+
"vite-plugin-eslint": "^1.8.1",
|
|
74
|
+
"vitest": "^0.32.2"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"final-form": "^4.20.9",
|
|
78
|
+
"jose": "^4.14.4",
|
|
79
|
+
"svelte-final-form": "^1.2.3",
|
|
80
|
+
"uuid": "^9.0.0"
|
|
81
|
+
}
|
|
82
|
+
}
|