@ttoss/react-auth 1.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.
@@ -0,0 +1,54 @@
1
+ import * as React from 'react';
2
+ import { FlexProps } from '@ttoss/ui';
3
+
4
+ type User = {
5
+ id: string;
6
+ email: string;
7
+ emailVerified: string;
8
+ } | null;
9
+ type Tokens = {
10
+ idToken: string;
11
+ accessToken: string;
12
+ refreshToken: string;
13
+ } | null;
14
+ declare const AuthProvider: ({ children }: {
15
+ children: React.ReactNode;
16
+ }) => JSX.Element;
17
+ declare const useAuth: () => {
18
+ signOut: () => Promise<any>;
19
+ isAuthenticated: boolean;
20
+ user: User;
21
+ tokens: Tokens;
22
+ };
23
+
24
+ type LogoContextProps = {
25
+ logo?: React.ReactNode;
26
+ children?: React.ReactNode;
27
+ };
28
+
29
+ declare const Auth: {
30
+ ({ logo, ...componentProps }: Record<string, unknown> & LogoContextProps): JSX.Element;
31
+ displayName: string;
32
+ };
33
+
34
+ type AuthContainerProps = FlexProps & {
35
+ backgroundImageUrl?: string;
36
+ };
37
+ declare const AuthContainer: ({ sx, ...props }: AuthContainerProps) => JSX.Element;
38
+
39
+ type OnSignInInput = {
40
+ email: string;
41
+ password: string;
42
+ };
43
+ type OnSignIn = (input: OnSignInInput) => void;
44
+ type OnSignUpInput = {
45
+ email: string;
46
+ password: string;
47
+ };
48
+ type OnSignUp = (input: OnSignUpInput) => void;
49
+ type OnConfirmSignUp = (input: {
50
+ email: string;
51
+ code: string;
52
+ }) => void;
53
+
54
+ export { Auth, AuthContainer, AuthProvider, OnConfirmSignUp, OnSignIn, OnSignInInput, OnSignUp, OnSignUpInput, useAuth };
package/dist/index.js ADDED
@@ -0,0 +1,564 @@
1
+ /** Powered by @ttoss/config. https://ttoss.dev/docs/modules/packages/config/ */
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
+
27
+ // src/index.ts
28
+ var src_exports = {};
29
+ __export(src_exports, {
30
+ Auth: () => Auth2,
31
+ AuthContainer: () => AuthContainer,
32
+ AuthProvider: () => AuthProvider_default,
33
+ useAuth: () => useAuth
34
+ });
35
+ module.exports = __toCommonJS(src_exports);
36
+
37
+ // src/AuthProvider.tsx
38
+ var React = __toESM(require("react"));
39
+ var import_aws_amplify = require("aws-amplify");
40
+ var import_jsx_runtime = require("react/jsx-runtime");
41
+ var signOut = () => {
42
+ return import_aws_amplify.Auth.signOut();
43
+ };
44
+ var AuthContext = React.createContext({
45
+ signOut,
46
+ isAuthenticated: false,
47
+ user: null,
48
+ tokens: null
49
+ });
50
+ var AuthProvider = ({ children }) => {
51
+ const [user, setUser] = React.useState(null);
52
+ const [tokens, setTokens] = React.useState(null);
53
+ React.useEffect(() => {
54
+ const updateUser = () => {
55
+ import_aws_amplify.Auth.currentAuthenticatedUser().then(({ attributes, signInUserSession }) => {
56
+ setUser({
57
+ id: attributes.sub,
58
+ email: attributes.email,
59
+ emailVerified: attributes["email_verified"]
60
+ });
61
+ setTokens({
62
+ idToken: signInUserSession.idToken.jwtToken,
63
+ accessToken: signInUserSession.accessToken.jwtToken,
64
+ refreshToken: signInUserSession.refreshToken.token
65
+ });
66
+ }).catch(() => {
67
+ setUser(null);
68
+ setTokens(null);
69
+ });
70
+ };
71
+ const updateUserListener = import_aws_amplify.Hub.listen("auth", updateUser);
72
+ updateUser();
73
+ return () => {
74
+ updateUserListener();
75
+ };
76
+ }, []);
77
+ const isAuthenticated = !!user;
78
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AuthContext.Provider, { value: { signOut, isAuthenticated, user, tokens }, children });
79
+ };
80
+ var useAuth = () => {
81
+ return React.useContext(AuthContext);
82
+ };
83
+ var AuthProvider_default = AuthProvider;
84
+
85
+ // src/Auth.tsx
86
+ var React3 = __toESM(require("react"));
87
+ var import_aws_amplify2 = require("aws-amplify");
88
+
89
+ // src/AuthCard.tsx
90
+ var React2 = __toESM(require("react"));
91
+ var import_ui = require("@ttoss/ui");
92
+ var import_react_notifications = require("@ttoss/react-notifications");
93
+ var import_jsx_runtime2 = require("react/jsx-runtime");
94
+ var LogoContext = React2.createContext({});
95
+ var LogoProvider = ({ children, ...values }) => {
96
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(LogoContext.Provider, { value: values, children });
97
+ };
98
+ var AuthCard = ({
99
+ children,
100
+ title,
101
+ buttonLabel,
102
+ links = []
103
+ }) => {
104
+ const { logo } = React2.useContext(LogoContext);
105
+ const { isLoading } = (0, import_react_notifications.useNotifications)();
106
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.Card, { sx: { maxWidth: "564px" }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_ui.Flex, { sx: { flexDirection: "column", gap: 3 }, children: [
107
+ logo && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.Flex, { sx: { width: "100%", justifyContent: "center" }, children: logo }),
108
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
109
+ import_ui.Text,
110
+ {
111
+ variant: "title",
112
+ sx: { alignSelf: "center", marginY: 4, fontSize: 5 },
113
+ children: title
114
+ }
115
+ ),
116
+ children,
117
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.Flex, { sx: { justifyContent: "space-between", marginTop: 3 }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
118
+ import_ui.Button,
119
+ {
120
+ type: "submit",
121
+ "aria-label": "submit-login",
122
+ variant: "cta",
123
+ disabled: isLoading,
124
+ sx: { width: "100%" },
125
+ children: buttonLabel
126
+ }
127
+ ) }),
128
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
129
+ import_ui.Flex,
130
+ {
131
+ sx: {
132
+ justifyContent: "space-between",
133
+ flexDirection: "column",
134
+ gap: 3,
135
+ marginTop: 4,
136
+ color: "text"
137
+ },
138
+ children: links.map((link) => {
139
+ return link && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_ui.Link, { onClick: link.onClick, children: link.label }, link.label);
140
+ })
141
+ }
142
+ )
143
+ ] }) });
144
+ };
145
+
146
+ // src/AuthConfirmSignUp.tsx
147
+ var import_forms = require("@ttoss/forms");
148
+ var import_react_i18n = require("@ttoss/react-i18n");
149
+ var import_jsx_runtime3 = require("react/jsx-runtime");
150
+ var AuthConfirmSignUp = ({
151
+ email,
152
+ onConfirmSignUp
153
+ }) => {
154
+ const { intl } = (0, import_react_i18n.useI18n)();
155
+ const schema = import_forms.yup.object().shape({
156
+ code: import_forms.yup.string().required(
157
+ intl.formatMessage({
158
+ description: "Required field.",
159
+ defaultMessage: "Required field"
160
+ })
161
+ ).max(
162
+ 6,
163
+ intl.formatMessage(
164
+ {
165
+ description: "Minimum {value} characters.",
166
+ defaultMessage: "Minimum {value} characters"
167
+ },
168
+ { value: 6 }
169
+ )
170
+ )
171
+ }).required();
172
+ const formMethods = (0, import_forms.useForm)({
173
+ resolver: (0, import_forms.yupResolver)(schema)
174
+ });
175
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
176
+ import_forms.Form,
177
+ {
178
+ ...formMethods,
179
+ onSubmit: ({ code }) => {
180
+ return onConfirmSignUp({ code, email });
181
+ },
182
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
183
+ AuthCard,
184
+ {
185
+ buttonLabel: intl.formatMessage({
186
+ description: "Confirm",
187
+ defaultMessage: "Confirm"
188
+ }),
189
+ title: intl.formatMessage({
190
+ description: "Confirmation",
191
+ defaultMessage: "Confirmation"
192
+ }),
193
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
194
+ import_forms.FormFieldInput,
195
+ {
196
+ name: "code",
197
+ label: intl.formatMessage({
198
+ description: "Sign up confirmation code",
199
+ defaultMessage: "Code"
200
+ })
201
+ }
202
+ )
203
+ }
204
+ )
205
+ }
206
+ );
207
+ };
208
+
209
+ // src/AuthSignIn.tsx
210
+ var import_forms2 = require("@ttoss/forms");
211
+
212
+ // ../cloud-auth/dist/esm/index.js
213
+ var PASSWORD_MINIMUM_LENGTH = 8;
214
+
215
+ // src/AuthSignIn.tsx
216
+ var import_react_i18n2 = require("@ttoss/react-i18n");
217
+ var import_jsx_runtime4 = require("react/jsx-runtime");
218
+ var AuthSignIn = ({
219
+ onSignIn,
220
+ onSignUp,
221
+ defaultValues
222
+ }) => {
223
+ const { intl } = (0, import_react_i18n2.useI18n)();
224
+ const schema = import_forms2.yup.object().shape({
225
+ email: import_forms2.yup.string().required(
226
+ intl.formatMessage({
227
+ description: "Email is a required field.",
228
+ defaultMessage: "Email field is required"
229
+ })
230
+ ).email(
231
+ intl.formatMessage({
232
+ description: "Invalid email.",
233
+ defaultMessage: "Invalid email"
234
+ })
235
+ ),
236
+ password: import_forms2.yup.string().required(
237
+ intl.formatMessage({
238
+ description: "Password is required.",
239
+ defaultMessage: "Password field is required"
240
+ })
241
+ ).min(
242
+ PASSWORD_MINIMUM_LENGTH,
243
+ intl.formatMessage(
244
+ {
245
+ description: "Password must be at least {value} characters long.",
246
+ defaultMessage: "Password requires {value} characters"
247
+ },
248
+ { value: PASSWORD_MINIMUM_LENGTH }
249
+ )
250
+ ).trim()
251
+ });
252
+ const formMethods = (0, import_forms2.useForm)({
253
+ defaultValues,
254
+ resolver: (0, import_forms2.yupResolver)(schema)
255
+ });
256
+ const onSubmitForm = (data) => {
257
+ return onSignIn(data);
258
+ };
259
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_forms2.Form, { ...formMethods, onSubmit: onSubmitForm, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
260
+ AuthCard,
261
+ {
262
+ title: intl.formatMessage({
263
+ description: "Sign in title.",
264
+ defaultMessage: "Login"
265
+ }),
266
+ buttonLabel: intl.formatMessage({
267
+ description: "Button label.",
268
+ defaultMessage: "Login"
269
+ }),
270
+ links: [
271
+ {
272
+ onClick: onSignUp,
273
+ label: intl.formatMessage({
274
+ description: "Link to retrieve password.",
275
+ defaultMessage: "Do you forgot your password?"
276
+ })
277
+ },
278
+ {
279
+ onClick: onSignUp,
280
+ label: intl.formatMessage({
281
+ description: "Link to sign up.",
282
+ defaultMessage: "Don't have an account? Sign up"
283
+ })
284
+ }
285
+ ],
286
+ children: [
287
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
288
+ import_forms2.FormFieldInput,
289
+ {
290
+ name: "email",
291
+ label: intl.formatMessage({
292
+ description: "Email label.",
293
+ defaultMessage: "Email"
294
+ })
295
+ }
296
+ ),
297
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
298
+ import_forms2.FormFieldInput,
299
+ {
300
+ name: "password",
301
+ label: intl.formatMessage({
302
+ description: "Password label.",
303
+ defaultMessage: "Password"
304
+ })
305
+ }
306
+ )
307
+ ]
308
+ }
309
+ ) });
310
+ };
311
+
312
+ // src/AuthSignUp.tsx
313
+ var import_forms3 = require("@ttoss/forms");
314
+ var import_react_i18n3 = require("@ttoss/react-i18n");
315
+ var import_jsx_runtime5 = require("react/jsx-runtime");
316
+ var AuthSignUp = ({ onSignUp, onReturnToSignIn }) => {
317
+ const { intl } = (0, import_react_i18n3.useI18n)();
318
+ const schema = import_forms3.yup.object().shape({
319
+ email: import_forms3.yup.string().required(
320
+ intl.formatMessage({
321
+ description: "Email is a required field.",
322
+ defaultMessage: "Email field is required"
323
+ })
324
+ ).email(
325
+ intl.formatMessage({
326
+ description: "Invalid email.",
327
+ defaultMessage: "Invalid email"
328
+ })
329
+ ),
330
+ password: import_forms3.yup.string().required(
331
+ intl.formatMessage({
332
+ description: "Password is required.",
333
+ defaultMessage: "Password field is required"
334
+ })
335
+ ).min(
336
+ PASSWORD_MINIMUM_LENGTH,
337
+ intl.formatMessage(
338
+ {
339
+ description: "Password must be at least {value} characters long.",
340
+ defaultMessage: "Password requires {value} characters"
341
+ },
342
+ { value: PASSWORD_MINIMUM_LENGTH }
343
+ )
344
+ ).trim()
345
+ });
346
+ const formMethods = (0, import_forms3.useForm)({
347
+ resolver: (0, import_forms3.yupResolver)(schema)
348
+ });
349
+ const onSubmitForm = (data) => {
350
+ return onSignUp(data);
351
+ };
352
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_forms3.Form, { ...formMethods, onSubmit: onSubmitForm, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
353
+ AuthCard,
354
+ {
355
+ buttonLabel: intl.formatMessage({
356
+ description: "Create account.",
357
+ defaultMessage: "Create account"
358
+ }),
359
+ title: intl.formatMessage({
360
+ description: "Title on sign up.",
361
+ defaultMessage: "Register"
362
+ }),
363
+ links: [
364
+ {
365
+ label: intl.formatMessage({
366
+ description: "Link to sign in on sign up.",
367
+ defaultMessage: "Do you already have an account? Sign in"
368
+ }),
369
+ onClick: onReturnToSignIn
370
+ }
371
+ ],
372
+ children: [
373
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
374
+ import_forms3.FormFieldInput,
375
+ {
376
+ name: "email",
377
+ label: intl.formatMessage({
378
+ description: "Email label.",
379
+ defaultMessage: "Email"
380
+ })
381
+ }
382
+ ),
383
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
384
+ import_forms3.FormFieldInput,
385
+ {
386
+ name: "password",
387
+ label: intl.formatMessage({
388
+ description: "Password label.",
389
+ defaultMessage: "Password"
390
+ })
391
+ }
392
+ )
393
+ ]
394
+ }
395
+ ) });
396
+ };
397
+
398
+ // src/Auth.tsx
399
+ var import_xstate = require("xstate");
400
+ var import_react = require("@xstate/react");
401
+ var import_react_notifications2 = require("@ttoss/react-notifications");
402
+ var import_jsx_runtime6 = require("react/jsx-runtime");
403
+ var authMachine = (0, import_xstate.createMachine)(
404
+ {
405
+ predictableActionArguments: true,
406
+ initial: "signIn",
407
+ states: {
408
+ signIn: {
409
+ on: {
410
+ SIGN_UP: { target: "signUp" },
411
+ SIGN_UP_RESEND_CONFIRMATION: {
412
+ actions: ["assignEmail"],
413
+ target: "signUpConfirm"
414
+ }
415
+ }
416
+ },
417
+ signUp: {
418
+ on: {
419
+ SIGN_UP_CONFIRM: {
420
+ actions: ["assignEmail"],
421
+ target: "signUpConfirm"
422
+ },
423
+ RETURN_TO_SIGN_IN: { target: "signIn" }
424
+ }
425
+ },
426
+ signUpConfirm: {
427
+ on: {
428
+ SIGN_UP_CONFIRMED: {
429
+ actions: ["assignEmail"],
430
+ target: "signIn"
431
+ }
432
+ }
433
+ }
434
+ }
435
+ },
436
+ {
437
+ actions: {
438
+ assignEmail: (0, import_xstate.assign)({
439
+ email: (_, event) => {
440
+ return event.email;
441
+ }
442
+ })
443
+ }
444
+ }
445
+ );
446
+ var AuthWithoutLogo = () => {
447
+ const { isAuthenticated } = useAuth();
448
+ const [state, send] = (0, import_react.useMachine)(authMachine);
449
+ const { setLoading } = (0, import_react_notifications2.useNotifications)();
450
+ const onSignIn = React3.useCallback(
451
+ async ({ email, password }) => {
452
+ try {
453
+ setLoading(true);
454
+ await import_aws_amplify2.Auth.signIn(email, password);
455
+ } catch (error) {
456
+ switch (error.code) {
457
+ case "UserNotConfirmedException":
458
+ await import_aws_amplify2.Auth.resendSignUp(email);
459
+ send({ type: "SIGN_UP_RESEND_CONFIRMATION", email });
460
+ break;
461
+ default:
462
+ }
463
+ } finally {
464
+ setLoading(false);
465
+ }
466
+ },
467
+ [send, setLoading]
468
+ );
469
+ const onSignUp = React3.useCallback(
470
+ async ({ email, password }) => {
471
+ try {
472
+ setLoading(true);
473
+ await import_aws_amplify2.Auth.signUp({
474
+ username: email,
475
+ password,
476
+ attributes: { email }
477
+ });
478
+ send({ type: "SIGN_UP_CONFIRM", email });
479
+ } catch (error) {
480
+ } finally {
481
+ setLoading(false);
482
+ }
483
+ },
484
+ [send, setLoading]
485
+ );
486
+ const onConfirmSignUp = React3.useCallback(
487
+ async ({ email, code }) => {
488
+ try {
489
+ setLoading(true);
490
+ await import_aws_amplify2.Auth.confirmSignUp(email, code);
491
+ send({ type: "SIGN_UP_CONFIRMED", email });
492
+ } catch (error) {
493
+ } finally {
494
+ setLoading(false);
495
+ }
496
+ },
497
+ [send, setLoading]
498
+ );
499
+ const onReturnToSignIn = React3.useCallback(() => {
500
+ send({ type: "RETURN_TO_SIGN_IN" });
501
+ }, [send]);
502
+ if (isAuthenticated) {
503
+ return null;
504
+ }
505
+ if (state.matches("signUp")) {
506
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(AuthSignUp, { onSignUp, onReturnToSignIn });
507
+ }
508
+ if (state.matches("signUpConfirm")) {
509
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
510
+ AuthConfirmSignUp,
511
+ {
512
+ onConfirmSignUp,
513
+ email: state.context.email
514
+ }
515
+ );
516
+ }
517
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
518
+ AuthSignIn,
519
+ {
520
+ onSignIn,
521
+ onSignUp: () => {
522
+ return send("SIGN_UP");
523
+ },
524
+ defaultValues: { email: state.context.email }
525
+ }
526
+ );
527
+ };
528
+ var withLogo = (Component) => {
529
+ const WithLogo = ({ logo, ...componentProps }) => {
530
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LogoProvider, { logo, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(Component, { ...componentProps }) });
531
+ };
532
+ WithLogo.displayName = "WithLogo";
533
+ return WithLogo;
534
+ };
535
+ var Auth2 = withLogo(AuthWithoutLogo);
536
+
537
+ // src/AuthContainer.tsx
538
+ var import_ui2 = require("@ttoss/ui");
539
+ var import_jsx_runtime7 = require("react/jsx-runtime");
540
+ var AuthContainer = ({ sx, ...props }) => {
541
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
542
+ import_ui2.Flex,
543
+ {
544
+ ...props,
545
+ sx: {
546
+ height: "100vh",
547
+ justifyContent: "center",
548
+ alignItems: "center",
549
+ margin: 0,
550
+ backgroundPosition: "center",
551
+ backgroundRepeat: "no-repeat",
552
+ backgroundSize: "cover",
553
+ ...sx
554
+ }
555
+ }
556
+ );
557
+ };
558
+ // Annotate the CommonJS export names for ESM import in node:
559
+ 0 && (module.exports = {
560
+ Auth,
561
+ AuthContainer,
562
+ AuthProvider,
563
+ useAuth
564
+ });
@@ -0,0 +1,74 @@
1
+ {
2
+ "0XOzcH": {
3
+ "defaultMessage": "Required field",
4
+ "description": "Required field."
5
+ },
6
+ "0cVgsc": {
7
+ "defaultMessage": "Login",
8
+ "description": "Button label."
9
+ },
10
+ "5E12mO": {
11
+ "defaultMessage": "Email",
12
+ "description": "Email label."
13
+ },
14
+ "EXZxA0": {
15
+ "defaultMessage": "Register",
16
+ "description": "Title on sign up."
17
+ },
18
+ "KY2T6J": {
19
+ "defaultMessage": "Code",
20
+ "description": "Sign up confirmation code"
21
+ },
22
+ "LU2ddR": {
23
+ "defaultMessage": "Do you already have an account? Sign in",
24
+ "description": "Link to sign in on sign up."
25
+ },
26
+ "OhDL0i": {
27
+ "defaultMessage": "Invalid email",
28
+ "description": "Invalid email."
29
+ },
30
+ "Pdio77": {
31
+ "defaultMessage": "Create account",
32
+ "description": "Create account."
33
+ },
34
+ "PylVqx": {
35
+ "defaultMessage": "Password",
36
+ "description": "Password label."
37
+ },
38
+ "R1rFNQ": {
39
+ "defaultMessage": "Login",
40
+ "description": "Sign in title."
41
+ },
42
+ "S3pjKw": {
43
+ "defaultMessage": "Minimum {value} characters",
44
+ "description": "Minimum {value} characters."
45
+ },
46
+ "TZ4WUk": {
47
+ "defaultMessage": "Password requires {value} characters",
48
+ "description": "Password must be at least {value} characters long."
49
+ },
50
+ "UNttd+": {
51
+ "defaultMessage": "Confirm",
52
+ "description": "Confirm"
53
+ },
54
+ "XC1w2U": {
55
+ "defaultMessage": "Don't have an account? Sign up",
56
+ "description": "Link to sign up."
57
+ },
58
+ "cGR2eI": {
59
+ "defaultMessage": "Confirmation",
60
+ "description": "Confirmation"
61
+ },
62
+ "kdFYba": {
63
+ "defaultMessage": "Password field is required",
64
+ "description": "Password is required."
65
+ },
66
+ "r+QgO+": {
67
+ "defaultMessage": "Email field is required",
68
+ "description": "Email is a required field."
69
+ },
70
+ "z5s0vm": {
71
+ "defaultMessage": "Do you forgot your password?",
72
+ "description": "Link to retrieve password."
73
+ }
74
+ }