diff --git a/.gitignore b/.gitignore index 0270e4a..03781a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,110 @@ - +### macOS ### +# General .DS_Store -*wcworkspace/xcuserdata/* +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +.build/ +# Add this line if you want to avoid checking in Xcode SPM integration. +# .swiftpm/xcode + +# CocoaPods +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# Pods/ +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +<<<<<<< HEAD +iOSInjectionProject/ +======= +iOSInjectionProject/ +>>>>>>> origin/dev diff --git a/BE/signup/build.gradle b/BE/signup/build.gradle index 3e20374..d711fcb 100644 --- a/BE/signup/build.gradle +++ b/BE/signup/build.gradle @@ -24,6 +24,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.h2database:h2' + compile 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.0' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } diff --git a/BE/signup/gradle/wrapper/gradle-wrapper.properties b/BE/signup/gradle/wrapper/gradle-wrapper.properties index a2bf131..9559f58 100644 --- a/BE/signup/gradle/wrapper/gradle-wrapper.properties +++ b/BE/signup/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-all.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.2-bin.zip -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/BE/signup/src/main/java/com/codesquad/signup/SignupApplication.java b/BE/signup/src/main/java/com/codesquad/signup/SignupApplication.java index 976a111..aa0ce6a 100644 --- a/BE/signup/src/main/java/com/codesquad/signup/SignupApplication.java +++ b/BE/signup/src/main/java/com/codesquad/signup/SignupApplication.java @@ -14,5 +14,4 @@ public static void main(String[] args) { log.debug("### debug SignupApplication Start"); log.trace("### trace SignupApplication Start"); } - } diff --git a/BE/signup/src/main/java/com/codesquad/signup/WebConfig.java b/BE/signup/src/main/java/com/codesquad/signup/WebConfig.java new file mode 100644 index 0000000..7066b6a --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/WebConfig.java @@ -0,0 +1,21 @@ +package com.codesquad.signup; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + registry.addViewController("/main").setViewName("main"); + registry.addViewController("/joinForm").setViewName("signup"); + registry.addViewController("/loginForm").setViewName("login"); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/controller/AuthController.java b/BE/signup/src/main/java/com/codesquad/signup/controller/AuthController.java new file mode 100644 index 0000000..e01864d --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/controller/AuthController.java @@ -0,0 +1,52 @@ +package com.codesquad.signup.controller; + +import com.codesquad.signup.exception.UnauthorizedException; +import com.codesquad.signup.message.ErrorMessages; +import com.codesquad.signup.message.SuccessMessages; +import com.codesquad.signup.repository.ApiResponse; +import com.codesquad.signup.repository.User; +import com.codesquad.signup.repository.UserRepository; +import com.codesquad.signup.util.HttpSessionUtil; +import com.codesquad.signup.util.VerifyFormatUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpSession; +import java.util.Map; + +@RestController +public class AuthController { + static final String USER_ID = "userId"; + static final String PASSWORD = "password"; + + @Autowired + private UserRepository userRepository; + + @PostMapping("/login") + public ResponseEntity login(@RequestBody Map loginInfo, HttpSession session) { + + String userId = loginInfo.get(USER_ID); + String password = loginInfo.get(PASSWORD); + + if (!VerifyFormatUtil.isCorrectUserIdFormat(userId)){ + throw new UnauthorizedException(ErrorMessages.FAIL_LOGIN); + } + + if (!VerifyFormatUtil.isCorrectPasswordFormat(password)) { + throw new UnauthorizedException(ErrorMessages.FAIL_LOGIN); + } + + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new UnauthorizedException(ErrorMessages.FAIL_LOGIN)); + + if (!user.isCorrectPassword(password)) { + throw new UnauthorizedException(ErrorMessages.FAIL_LOGIN); + } + + session.setAttribute(HttpSessionUtil.USER_SESSION_KEY, user); + + return new ResponseEntity<>(new ApiResponse(SuccessMessages.SUCCESS, SuccessMessages.SUCCESS_LOGIN), HttpStatus.OK); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/controller/DuplicateController.java b/BE/signup/src/main/java/com/codesquad/signup/controller/DuplicateController.java new file mode 100644 index 0000000..fd0948a --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/controller/DuplicateController.java @@ -0,0 +1,88 @@ +package com.codesquad.signup.controller; + +import com.codesquad.signup.exception.NotFoundPathException; +import com.codesquad.signup.exception.NotUniqueException; +import com.codesquad.signup.exception.WrongFormatException; +import com.codesquad.signup.message.ErrorMessages; +import com.codesquad.signup.message.SuccessMessages; +import com.codesquad.signup.repository.ApiResponse; +import com.codesquad.signup.repository.User; +import com.codesquad.signup.repository.UserRepository; +import com.codesquad.signup.util.VerifyFormatUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +@RequestMapping("/duplicate") +public class DuplicateController { + + @Autowired + private UserRepository userRepository; + + @GetMapping + public Object isDuplicate(String userId, String email, String phone) { + + if (userId != null) + return isUserIdDuplicate(userId); + + if (email != null) + return isEmailDuplicate(email); + + if (phone != null) + return isPhoneNumberDuplicate(phone); + + return new NotFoundPathException(ErrorMessages.NOTFOUND_PATH); + } + + private ResponseEntity isUserIdDuplicate(String userId) { + + if (!VerifyFormatUtil.isCorrectUserIdFormat(userId)) { + throw new WrongFormatException(ErrorMessages.WRONG_FORMAT); + } + + Optional user = userRepository.findByUserId(userId); + + if (user.isPresent()) + throw new NotUniqueException(ErrorMessages.DUPLICATED_USER_ID); + + return new ResponseEntity<>(new ApiResponse(SuccessMessages.SUCCESS, SuccessMessages.VALID_USER_ID), HttpStatus.OK); + } + + + private ResponseEntity isEmailDuplicate(@RequestParam("email") String email) { + + if (!VerifyFormatUtil.isCorrectEmailFormat(email)) { + throw new WrongFormatException(ErrorMessages.WRONG_FORMAT); + } + + Optional user = userRepository.findByEmail(email); + + if (user.isPresent()) + throw new NotUniqueException(ErrorMessages.DUPLICATED_EMAIL); + + return new ResponseEntity<>(new ApiResponse(SuccessMessages.SUCCESS, SuccessMessages.VALID_EMAIL), HttpStatus.OK); + } + + private ResponseEntity isPhoneNumberDuplicate(@RequestParam(value = "phone") String phone) { + + if (!VerifyFormatUtil.isCorrectPhoneNumberFormat(phone)) { + throw new WrongFormatException(ErrorMessages.WRONG_FORMAT); + } + + Optional user = userRepository.findByPhoneNumber(phone); + + if (user.isPresent()) + throw new NotUniqueException(ErrorMessages.DUPLICATED_PHONE); + + return new ResponseEntity<>(new ApiResponse(SuccessMessages.SUCCESS, SuccessMessages.VALID_PHONE), HttpStatus.OK); + } + + +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/controller/UserController.java b/BE/signup/src/main/java/com/codesquad/signup/controller/UserController.java new file mode 100644 index 0000000..df5f87d --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/controller/UserController.java @@ -0,0 +1,53 @@ +package com.codesquad.signup.controller; + +import com.codesquad.signup.exception.ForbiddenException; +import com.codesquad.signup.exception.UserJoinFailedException; +import com.codesquad.signup.message.ErrorMessages; +import com.codesquad.signup.message.SuccessMessages; +import com.codesquad.signup.repository.ApiResponse; +import com.codesquad.signup.repository.User; +import com.codesquad.signup.repository.UserRepository; +import com.codesquad.signup.util.HttpSessionUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpSession; + +@Slf4j +@RestController +public class UserController { + + @Autowired + private UserRepository userRepository; + + @PostMapping("/join") + @ResponseBody + public ResponseEntity joinUser(@RequestBody User user) { + log.debug("### joinUser : {}", user); + + user.checkValidUser(); + + try { + User joinedUser = userRepository.save(user); + return new ResponseEntity<>(new ApiResponse(SuccessMessages.SUCCESS, joinedUser), HttpStatus.OK); + } catch (Exception e) { + throw new UserJoinFailedException(ErrorMessages.FAIL_JOIN); + } + } + + @GetMapping("/user/{id}") + public ResponseEntity show(@PathVariable Long id, HttpSession session) { + log.debug("### show : {}", HttpSessionUtil.getUserFromSession(session)); + + User sessionedUser = HttpSessionUtil.getUserFromSession(session); + + if (!sessionedUser.getId().equals(id)) { + throw new ForbiddenException(ErrorMessages.FORBIDDEN); + } + + return new ResponseEntity<>(new ApiResponse(SuccessMessages.SUCCESS, sessionedUser), HttpStatus.OK); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/BaseException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/BaseException.java new file mode 100644 index 0000000..24d0769 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/BaseException.java @@ -0,0 +1,16 @@ +package com.codesquad.signup.exception; + +import com.codesquad.signup.message.ErrorMessages; +import com.codesquad.signup.repository.ApiResponse; + +public class BaseException extends RuntimeException { + private String errorMessage; + + public BaseException(String errorMessage) { + this.errorMessage = errorMessage; + } + + public ApiResponse returnErrorMessage() { + return new ApiResponse(ErrorMessages.ERROR, errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/CustomAdvice.java b/BE/signup/src/main/java/com/codesquad/signup/exception/CustomAdvice.java new file mode 100644 index 0000000..9aac119 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/CustomAdvice.java @@ -0,0 +1,56 @@ +package com.codesquad.signup.exception; + +import com.codesquad.signup.repository.ApiResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@Slf4j +@ControllerAdvice +public class CustomAdvice { + + @ExceptionHandler(UnauthorizedException.class) + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ResponseBody + public ApiResponse handleError(UnauthorizedException unAuthorized) { + return unAuthorized.returnErrorMessage(); + } + + @ExceptionHandler(NotUniqueException.class) + @ResponseStatus(HttpStatus.CONFLICT) + @ResponseBody + public ApiResponse handleError(NotUniqueException notUnique) { + return notUnique.returnErrorMessage(); + } + + @ExceptionHandler(WrongFormatException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ResponseBody + public ApiResponse handleError(WrongFormatException wrongFormat) { + return wrongFormat.returnErrorMessage(); + } + + @ExceptionHandler(NotFoundPathException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + @ResponseBody + public ApiResponse handleError(NotFoundPathException notFoundPath) { + return notFoundPath.returnErrorMessage(); + } + + @ExceptionHandler(UserJoinFailedException.class) + @ResponseStatus(HttpStatus.CONFLICT) + @ResponseBody + public ApiResponse handleError(UserJoinFailedException userJoinFailed) { + return userJoinFailed.returnErrorMessage(); + } + + @ExceptionHandler(ForbiddenException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + @ResponseBody + public ApiResponse handleError(ForbiddenException forbidden) { + return forbidden.returnErrorMessage(); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/ForbiddenException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/ForbiddenException.java new file mode 100644 index 0000000..971c92c --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/ForbiddenException.java @@ -0,0 +1,8 @@ +package com.codesquad.signup.exception; + +public class ForbiddenException extends BaseException { + + public ForbiddenException(String errorMessage) { + super(errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/NotFoundPathException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/NotFoundPathException.java new file mode 100644 index 0000000..b68a5f9 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/NotFoundPathException.java @@ -0,0 +1,8 @@ +package com.codesquad.signup.exception; + +public class NotFoundPathException extends BaseException { + + public NotFoundPathException(String errorMessage) { + super(errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/NotUniqueException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/NotUniqueException.java new file mode 100644 index 0000000..dff8998 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/NotUniqueException.java @@ -0,0 +1,8 @@ +package com.codesquad.signup.exception; + +public class NotUniqueException extends BaseException{ + + public NotUniqueException(String errorMessage) { + super(errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/UnauthorizedException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/UnauthorizedException.java new file mode 100644 index 0000000..ee791fe --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/UnauthorizedException.java @@ -0,0 +1,8 @@ +package com.codesquad.signup.exception; + +public class UnauthorizedException extends BaseException { + + public UnauthorizedException(String errorMessage) { + super(errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/UserJoinFailedException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/UserJoinFailedException.java new file mode 100644 index 0000000..acc4530 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/UserJoinFailedException.java @@ -0,0 +1,8 @@ +package com.codesquad.signup.exception; + +public class UserJoinFailedException extends BaseException { + + public UserJoinFailedException(String errorMessage) { + super(errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/exception/WrongFormatException.java b/BE/signup/src/main/java/com/codesquad/signup/exception/WrongFormatException.java new file mode 100644 index 0000000..6c56f7e --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/exception/WrongFormatException.java @@ -0,0 +1,8 @@ +package com.codesquad.signup.exception; + +public class WrongFormatException extends BaseException { + + public WrongFormatException(String errorMessage) { + super(errorMessage); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/message/ErrorMessages.java b/BE/signup/src/main/java/com/codesquad/signup/message/ErrorMessages.java new file mode 100644 index 0000000..53c7611 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/message/ErrorMessages.java @@ -0,0 +1,15 @@ +package com.codesquad.signup.message; + +public class ErrorMessages { + public static final String ERROR = "ERROR"; + public final static String WRONG_FORMAT = "잘못된 형식입니다. "; + public final static String FAIL_JOIN = "회원가입에 실패했습니다"; + public final static String NOTFOUND_PATH = "해당 경로를 찾을 수 없습니다"; + public final static String FAIL_LOGIN = "아이디 혹은 비밀번호가 틀렸습니다"; + public final static String UNAUTHORIZED = "로그인이 필요합니다"; + public final static String FORBIDDEN = "접근 권한이 없습니다"; + + public final static String DUPLICATED_USER_ID = "이미 사용중인 아이디입니다"; + public final static String DUPLICATED_EMAIL = "이미 사용중인 이메일입니다"; + public final static String DUPLICATED_PHONE = "이미 사용중인 번호입니다"; +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/message/SuccessMessages.java b/BE/signup/src/main/java/com/codesquad/signup/message/SuccessMessages.java new file mode 100644 index 0000000..48fb9f1 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/message/SuccessMessages.java @@ -0,0 +1,10 @@ +package com.codesquad.signup.message; + +public class SuccessMessages { + public static final String SUCCESS = "SUCCESS"; + public static final String VALID_USER_ID = "사용할 수 있는 아이디입니다"; + public static final String VALID_EMAIL = "사용할 수 있는 이메일입니다"; + public static final String VALID_PHONE = "사용할 수 있는 번호입니다"; + + public static final String SUCCESS_LOGIN = "로그인 성공"; +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/message/UserFormatMessages.java b/BE/signup/src/main/java/com/codesquad/signup/message/UserFormatMessages.java new file mode 100644 index 0000000..654bc21 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/message/UserFormatMessages.java @@ -0,0 +1,11 @@ +package com.codesquad.signup.message; + +public class UserFormatMessages { + public final static String WRONG_FORMAT = "잘못된 형식입니다. "; + public final static String USER_ID_FORMAT = "아이디 (5~20자의 영 소문자, 숫자, 특수기호(_), (-))"; + public final static String PASSWORD_FORMAT = "비밀번호 (8~16자의 영문 대, 소문자, 숫자, 특수문자의 조합)"; + public final static String EMAIL_FORMAT = "이메일 (xxx@xxx.xxx)"; + public final static String PHONE_NUMBER_FORMAT = "전화번호 (앞 3자리의 숫자는 010 인 10자리 또는 11자리의 숫자)"; + public final static String INTEREST_FORMAT = "관심사 (3개 이상)"; + public final static String EMPTY_EXECPTION = "빈칸은 허용되지 않습니다."; +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/repository/ApiResponse.java b/BE/signup/src/main/java/com/codesquad/signup/repository/ApiResponse.java new file mode 100644 index 0000000..a0f53a0 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/repository/ApiResponse.java @@ -0,0 +1,20 @@ +package com.codesquad.signup.repository; + +import lombok.Getter; + +@Getter +public class ApiResponse { + private String status; + private Object message; + + public ApiResponse(){} + public ApiResponse(String status, String message){ + this.status = status; + this.message = message; + } + + public ApiResponse(String status, User user){ + this.status = status; + this.message = user; + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/repository/User.java b/BE/signup/src/main/java/com/codesquad/signup/repository/User.java new file mode 100644 index 0000000..ab3b13a --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/repository/User.java @@ -0,0 +1,97 @@ +package com.codesquad.signup.repository; + +import com.codesquad.signup.exception.WrongFormatException; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.annotation.Id; +import org.springframework.util.ObjectUtils; + +import java.time.LocalDate; + +import static com.codesquad.signup.message.UserFormatMessages.*; +import static com.codesquad.signup.util.VerifyFormatUtil.*; + + +@Slf4j +@Getter +public class User { + + @Id + private Long id; + + @Setter + private String userId; + @Setter + private String password; + @Setter + private String name; + @Setter + private LocalDate birthday; + @Setter + private String sex; + @Setter + private String email; + @Setter + private String phoneNumber; + @Setter + private String interest; + + public boolean isCorrectPassword(String password) { + return this.password.equals(password); + } + + /** + * Feat : 적절한 User 인지 확인 합니다. + * Desc : userId, passwd, email, phoneNumber, interest 중 한개라도 format 에 맞지 않는다면 false 를 리턴합니다. + * Desc : userId, passwd 가 format 에 맞지 않다면 false 를 리턴합니다. + * Return : boolean + */ + public void checkValidUser() { + log.debug("### isValidUser()"); + + if (!isCorrectUserIdFormat(userId)) { + log.debug("### ERROR : isCorrectUserIdFormat"); + throw new WrongFormatException(WRONG_FORMAT + USER_ID_FORMAT); + } + + if (!isCorrectPasswordFormat(password)) { + log.debug("### ERROR : isCorrectPasswordFormat"); + throw new WrongFormatException(WRONG_FORMAT + PASSWORD_FORMAT); + } + + if (!isCorrectEmailFormat(email)) { + log.debug("### ERROR : isCorrectEmailFormat"); + throw new WrongFormatException(WRONG_FORMAT + EMAIL_FORMAT); + } + + if (!isCorrectPhoneNumberFormat(phoneNumber)) { + log.debug("### ERROR : isCorrectPhoneNumberFormat"); + throw new WrongFormatException(WRONG_FORMAT + PHONE_NUMBER_FORMAT); + } + + if (!isCorrectInterestFormat(interest)) { + log.debug("### ERROR : isCorrectInterestFormat"); + throw new WrongFormatException(WRONG_FORMAT + INTEREST_FORMAT); + } + + if(ObjectUtils.isEmpty(name) ||ObjectUtils.isEmpty(birthday) ||ObjectUtils.isEmpty(sex)){ + throw new WrongFormatException(WRONG_FORMAT + EMPTY_EXECPTION); + } + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", userId='" + userId + '\'' + + ", password='" + password + '\'' + + ", name='" + name + '\'' + + ", birthday=" + birthday + + ", sex='" + sex + '\'' + + ", email='" + email + '\'' + + ", phoneNumber='" + phoneNumber + '\'' + + ", interest='" + interest + '\'' + + '}'; + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/repository/UserRepository.java b/BE/signup/src/main/java/com/codesquad/signup/repository/UserRepository.java new file mode 100644 index 0000000..f426407 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/repository/UserRepository.java @@ -0,0 +1,18 @@ +package com.codesquad.signup.repository; + +import org.springframework.data.jdbc.repository.query.Query; +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; + +public interface UserRepository extends CrudRepository { + + @Query("SELECT * FROM User WHERE user_id = :userId") + Optional findByUserId(String userId); + + @Query("SELECT * FROM User WHERE email = :email") + Optional findByEmail(String email); + + @Query("SELECT * FROM User WHERE phone_number = :phoneNumber") + Optional findByPhoneNumber(String phoneNumber); +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/util/HttpSessionUtil.java b/BE/signup/src/main/java/com/codesquad/signup/util/HttpSessionUtil.java new file mode 100644 index 0000000..b42033a --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/util/HttpSessionUtil.java @@ -0,0 +1,23 @@ +package com.codesquad.signup.util; + +import com.codesquad.signup.exception.UnauthorizedException; +import com.codesquad.signup.message.ErrorMessages; +import com.codesquad.signup.repository.User; + +import javax.servlet.http.HttpSession; + +public class HttpSessionUtil { + public static final String USER_SESSION_KEY = "authorizedUser"; + + public static boolean isAuthorizedUser(HttpSession session) { + Object user = session.getAttribute(USER_SESSION_KEY); + return user != null; + } + + public static User getUserFromSession(HttpSession session) { + if (!isAuthorizedUser(session)) { + throw new UnauthorizedException(ErrorMessages.UNAUTHORIZED); + } + return (User)session.getAttribute(USER_SESSION_KEY); + } +} diff --git a/BE/signup/src/main/java/com/codesquad/signup/util/VerifyFormatUtil.java b/BE/signup/src/main/java/com/codesquad/signup/util/VerifyFormatUtil.java new file mode 100644 index 0000000..4230fe3 --- /dev/null +++ b/BE/signup/src/main/java/com/codesquad/signup/util/VerifyFormatUtil.java @@ -0,0 +1,47 @@ +package com.codesquad.signup.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class VerifyFormatUtil { + + public static boolean isCorrectUserIdFormat(String userId) { + final String userIdFormat = "^[a-z0-9-_]{5,20}"; + return isCorrectFormat(userIdFormat, userId); + } + + public static boolean isCorrectPasswordFormat(String password) { + final String passwordPFormat = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&])[A-Za-z\\d$@$!%*?&]{8,16}"; + return isCorrectFormat(passwordPFormat, password); + } + + public static boolean isCorrectEmailFormat(String email) { + final String emailFormat = "^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,3}"; + return isCorrectFormat(emailFormat, email); + } + + public static boolean isCorrectPhoneNumberFormat(String phone) { + final String phoneNumberFormat = "[0-9]{11}"; + return isCorrectFormat(phoneNumberFormat, phone); + } + + public static boolean isCorrectInterestFormat(String interest) { + if (interest == null) return false; + return (interest.split(",").length >= 3); + } + + private static boolean isCorrectFormat(String pattern, String inputValue) { + if (inputValue == null) return false; + + Pattern passwordPattern = Pattern.compile(pattern); + Matcher matcher = passwordPattern.matcher(inputValue); + if (!matcher.find()) { + return false; + } + + if (!matcher.group().equals(inputValue)) { + return false; + } + return true; + } +} diff --git a/BE/signup/src/main/resources/application.properties b/BE/signup/src/main/resources/application.properties index 07f89d6..4f1eeda 100644 --- a/BE/signup/src/main/resources/application.properties +++ b/BE/signup/src/main/resources/application.properties @@ -1,3 +1,8 @@ +handlebars.suffix=.html +handlebars.cache=false +handlebars.expose-session-attributes=true +spring.mvc.hiddenmethod.filter.enabled=true + # DB Connection 설정 spring.datasource.url=jdbc:h2:mem://localhost/signup_db;DB_CLOSE_ON_EXIT=FALSE spring.datasource.driverClassName=org.h2.Driver @@ -7,6 +12,7 @@ spring.datasource.password= # h2 db console에 접근 설정 spring.h2.console.enabled=true spring.h2.console.path=/h2-console +spring.h2.console.settings.web-allow-others=true # profile 설정 spring.profiles.active=dev diff --git a/BE/signup/src/main/resources/schema.sql b/BE/signup/src/main/resources/schema.sql new file mode 100644 index 0000000..13e990e --- /dev/null +++ b/BE/signup/src/main/resources/schema.sql @@ -0,0 +1,17 @@ +CREATE TABLE IF NOT EXISTS USER +( + ID INT NOT NULL AUTO_INCREMENT, + USER_ID VARCHAR(64), + PASSWORD VARCHAR(64), + NAME VARCHAR(64), + BIRTHDAY DATE, + SEX VARCHAR(20), + EMAIL VARCHAR(64), + PHONE_NUMBER VARCHAR(64), + INTEREST VARCHAR(256), + PRIMARY KEY(ID), + UNIQUE (ID), + UNIQUE (USER_ID), + UNIQUE (EMAIL), + UNIQUE (PHONE_NUMBER) +); diff --git a/BE/signup/src/main/resources/static/css/loginStyle.css b/BE/signup/src/main/resources/static/css/loginStyle.css new file mode 100644 index 0000000..086b899 --- /dev/null +++ b/BE/signup/src/main/resources/static/css/loginStyle.css @@ -0,0 +1,75 @@ +body, html { + width: 100%; + height: 100%; +} + +.wrap { + width: 100%; + height: 100%; + position: relative; +} + +.login-form-wrap { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-250px, -225px); + width: 500px; + height: 450px; + border: 1px solid #ccc; + background-color: #F8F9FA; + box-sizing: border-box; +} + +.login-form-wrap>fieldset { + width: 400px; + margin: 0 auto; + display: flex; + padding: 50px; +} + +.login-form-wrap input { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + outline: none; + border: 1px solid #afafaf; + text-indent: 10px; + border-radius: 0; + background-color: #fff; +} + +.login-form-wrap button { + background-color: #23cf19; + color: #fff; + font-size: 18px; + border: none; + outline: none; + cursor: pointer; +} + +.login-form-wrap input:focus { + border: 1px solid #23cf19; +} + +.login-title { + text-align: center; + margin-bottom: 40px; + color: #23cf19; + font-weight: bold; + font-size: 35px; +} + +.login-form-item { + width: 100%; + height: 50px; + margin-bottom: 15px; +} + +.login-form-item:last-child { + margin-bottom: 0; +} + +.login-password-input { + margin-bottom: 30px; +} \ No newline at end of file diff --git a/BE/signup/src/main/resources/static/css/mainStyle.css b/BE/signup/src/main/resources/static/css/mainStyle.css new file mode 100644 index 0000000..d2e20e6 --- /dev/null +++ b/BE/signup/src/main/resources/static/css/mainStyle.css @@ -0,0 +1,7 @@ +.user-info { + display: none; +} + +.user-info.active { + display: block; +} \ No newline at end of file diff --git a/BE/signup/src/main/resources/static/css/reset.css b/BE/signup/src/main/resources/static/css/reset.css new file mode 100644 index 0000000..6261dc4 --- /dev/null +++ b/BE/signup/src/main/resources/static/css/reset.css @@ -0,0 +1,50 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +b { + font-weight: bold; +} + +input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} \ No newline at end of file diff --git a/BE/signup/src/main/resources/static/css/signupStyle.css b/BE/signup/src/main/resources/static/css/signupStyle.css new file mode 100644 index 0000000..9fd8907 --- /dev/null +++ b/BE/signup/src/main/resources/static/css/signupStyle.css @@ -0,0 +1,234 @@ +/* common */ + +.signup-form-wrap, .clauses-wrap { + width: 500px; + margin: 0 auto; + border: 1px solid #ccc; + background-color: #F8F9FA; + box-sizing: border-box; +} + +/* signup */ + +.signup-content { + position: relative; + width: 470px; + margin: 0 auto; + margin-bottom: 20px; +} + +.signup-title { + text-align: center; + color: #23cf19; + font-weight: bold; + font-size: 35px; + margin-top: 20px; + margin-bottom: 50px; +} + +.signup-content label { + display: block; + font-weight: bold; + margin-bottom: 8px; + font-size: 14px; +} + +.signup-content input, .signup-content select { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + outline: none; + border: 1px solid #afafaf; + display: block; + width: 100%; + height: 40px; + text-indent: 10px; + border-radius: 0; + background-color: #fff; +} + +.signup-content input:focus, .signup-content select:focus { + border: 1px solid #23cf19; +} + +.signup-content .state-text { + margin-top: 3px; + height: 13px; + font-size: 13px; + color: #f00; +} + +.signup-content .state-text>span { + color: #23cf19; +} + +.signup-content .birth-date-input-wrap { + display: flex; +} + +.birth-date-input-wrap>select { + margin: 0 15px; +} + +.tags-input-wrap { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + border: 1px solid #afafaf; + background-color: #fff; +} + +.tag-ui-wrap { + display: flex; + flex-wrap: wrap; +} + +.tag-ui-wrap .tag-ui { + padding: 5px; + border: 1px solid #ccc; + margin: 5px; + margin-right: 0; + display: flex; + align-items: center; + border-radius: 3px; + background-color: #f2f2f2; +} + +.tag-ui .tag-ui-close { + font-size: 13px; + margin-left: 5px; + cursor: pointer; +} + +.tag-ui-wrap input { + flex: 1; + font-size: 16px; + outline: none; + border: none; + text-indent: 10px; +} + +.tag-ui-wrap input:focus { + border: none; +} + +.signup-content .clauses-agree-text { + font-weight: bold; + font-size: 14px; + text-decoration: underline; + cursor: pointer; +} + +.signup-content .clauses-agree-checkbox { + position: absolute; + top: 50%; + transform: translateY(-50%); + display: inline-block; + margin: 0; + margin-left: 10px; + width: 16px; + height: 16px; +} + +.signup-content .signup-btns-wrap { + display: flex; + justify-content: space-between; +} + +.signup-btns-wrap>button { + background-color: #23cf19; + color: #fff; + font-size: 18px; + border: none; + width: 227.5px; + height: 50px; + outline: none; + cursor: pointer; +} + +/* clauses */ + +.clauses-wrap { + display: none; +} + +.clauses-wrap.active { + display: block; + position: fixed; + top: 50%; + left: 50%; + margin: -125px -250px; +} + +.signup-blind.active { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #00000080; +} + +.clauses-content { + width: 450px; + margin: 20px auto; +} + +.clauses-title { + font-size: 15px; + font-weight: bold; + margin-bottom: 15px; +} + +.clauses-text-box { + padding: 10px; + line-height: 18px; + font-size: 13px; + width: 100%; + height: 130px; + overflow: auto; + margin-bottom: 20px; + outline: 1px solid #ccc; + background-color: #fff; + box-sizing: border-box; +} + +.clauses-text-box::-webkit-scrollbar { + width: 9px; +} + +.clauses-text-box::-webkit-scrollbar-thumb { + background-color: #ccc; +} + +.clauses-text-box::-webkit-scrollbar-track { + background-color: #f1f1f1; +} + +.clauses-agree-btn { + width: 180px; + height: 45px; + margin: 0 auto; + display: block; + background-color: #ccc; + border: none; + color: #fff; + font-size: 16px; + outline: none; +} + +.clauses-agree-btn.active { + background-color: #23cf19; + cursor: pointer; +} + +.clauses-close-btn { + position: absolute; + right: 10px; + top: 10px; + cursor: pointer; + border: none; + outline: none; + background-color: transparent; +} \ No newline at end of file diff --git a/BE/signup/src/main/resources/static/js/dist/login.bundle.js b/BE/signup/src/main/resources/static/js/dist/login.bundle.js new file mode 100644 index 0000000..ff9a133 --- /dev/null +++ b/BE/signup/src/main/resources/static/js/dist/login.bundle.js @@ -0,0 +1,149 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/js/login/loginMain.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./src/js/constants/constant.js": +/*!**************************************!*\ + !*** ./src/js/constants/constant.js ***! + \**************************************/ +/*! exports provided: VALID_CHECK_REGEX, STATE_MESSAGE, ALERT_MESSAGE, FORM_RULES, STATUS */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VALID_CHECK_REGEX\", function() { return VALID_CHECK_REGEX; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"STATE_MESSAGE\", function() { return STATE_MESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ALERT_MESSAGE\", function() { return ALERT_MESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FORM_RULES\", function() { return FORM_RULES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"STATUS\", function() { return STATUS; });\nconst VALID_CHECK_REGEX = {\n ID: /^[a-z0-9-_]{5,20}$/,\n PASSWORD: {\n LENGTH: /.{8,16}$/,\n UPPER: /^(?=.*[A-Z])/,\n NUMBER: /^(?=.*[0-9])/,\n SPECIAL: /^((?=.*\\d)|(?=.*\\W))/\n },\n EMAIL: /^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,3}$/i,\n PHONE_NUMBER: /^010\\d{3,4}\\d{4}$/\n};\nconst STATE_MESSAGE = {\n VALID: {\n DEFALUT: ' ',\n ID: '사용 가능한 아이디입니다.',\n PASSWORD: '안전한 비밀번호입니다.',\n PASSWORD_RECHECK: '비밀번호가 일치합니다.'\n },\n INVALID: {\n ID: '5~20자의 영문 소문자, 숫자와 특수기호(_)(-) 만 사용 가능합니다.',\n PASSWORD: {\n LENGTH: '8자 이상 16자 이하로 입력해주세요.',\n UPPER: '영문 대문자를 최소 1자 이상 포함해주세요.',\n NUMBER: '숫자를 최소 1자 이상 포함해주세요.',\n SPECIAL: '특수문자를 최소 1자 이상 포함해주세요.'\n },\n PASSWORD_RECHECK: '비밀번호가 일치하지 않습니다.',\n BIRTH_DATE: {\n BASE: '생년월일을 모두 입력해주세요.',\n YEAR: '태어난 년도 4자리를 정확하게 입력하세요.',\n DAY: '태어난 날짜를 정확하게 입력하세요.',\n AGE: '만 14세 이상 99세 이하만 가입 가능합니다.'\n },\n EMAIL: '이메일 주소를 다시 확인해주세요.',\n PHONE_NUMBER: '형식에 맞지 않는 번호입니다.',\n INTERESTS: '3개 이상의 관심사를 입력하세요.'\n },\n DUPLICATE: {\n ID: '이미 사용 중인 아이디입니다.',\n EMAIL: '이미 사용 중인 이메일입니다.',\n PHONE_NUMBER: '이미 사용 중인 휴대전화입니다.'\n }\n};\nconst ALERT_MESSAGE = {\n RESET: '모든 내용을 새로 작성하시겠습니까?',\n JOIN_INVALID: {\n ID: '아이디를 확인해주세요.',\n PASSWORD: '비밀번호를 확인해주세요.',\n NAME: '이름을 확인해주세요.',\n BIRTH_DATE: '생년월일을 확인해주세요.',\n GENDER: '성별을 확인해주세요.',\n EMAIL: '이메일을 확인해주세요.',\n PHONE_NUMBER: '휴대전화를 확인해주세요.',\n INTERESTS: '관심사를 확인해주세요.',\n CLAUSES: '약관에 동의하지 않으셨습니다.'\n },\n JOIN_FAIL: '회원가입에 살패했습니다! 다시 시도해주세요.',\n LOGIN_FAIL: '아이디 또는 비밀번호를 다시 확인해주세요.'\n};\nconst FORM_RULES = {\n YEAR_MAX_LENGTH: 4,\n DAY_MIN_LENGTH: 1,\n DAY_MAX_LENGTH: 2,\n AGE_MIN: 14,\n AGE_MAX: 99,\n NOT_DIGIT: 10,\n INTERESTS_MIN: 3,\n ACTIVE_KEY: 'active'\n};\nconst STATUS = {\n SUCCESS: 200,\n CONFLICT: 409\n};\n\n//# sourceURL=webpack:///./src/js/constants/constant.js?"); + +/***/ }), + +/***/ "./src/js/constants/url.js": +/*!*********************************!*\ + !*** ./src/js/constants/url.js ***! + \*********************************/ +/*! exports provided: URL */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"URL\", function() { return URL; });\n// export const URL = {\n// DEV: {\n// ID_CHECK_API: 'https://signup-5-dev.herokuapp.com/duplicate?userId=',\n// EMAIL_CHECK_API: 'https://signup-5-dev.herokuapp.com/duplicate?email=',\n// PHONE_NUMBER_CHECK_API: 'https://signup-5-dev.herokuapp.com/duplicate?phone=',\n// JOIN_API: 'https://signup-5-dev.herokuapp.com/join',\n// LOGIN_API: 'https://signup-5-dev.herokuapp.com/login'\n// },\n// PROD: {}\n// }\nconst URL = {\n DEV: {\n ID_CHECK_API: '/duplicate?userId=',\n EMAIL_CHECK_API: '/duplicate?email=',\n PHONE_NUMBER_CHECK_API: '/duplicate?phone=',\n JOIN_API: '/join',\n LOGIN_API: '/login'\n },\n PROD: {}\n};\n\n//# sourceURL=webpack:///./src/js/constants/url.js?"); + +/***/ }), + +/***/ "./src/js/http/request.js": +/*!********************************!*\ + !*** ./src/js/http/request.js ***! + \********************************/ +/*! exports provided: joinRequest, loginRequest, checkIdDuplicateRequest, checkEmailDuplicateRequest, checkPhoneNumberDuplicateRequest */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"joinRequest\", function() { return joinRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loginRequest\", function() { return loginRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkIdDuplicateRequest\", function() { return checkIdDuplicateRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkEmailDuplicateRequest\", function() { return checkEmailDuplicateRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkPhoneNumberDuplicateRequest\", function() { return checkPhoneNumberDuplicateRequest; });\n/* harmony import */ var _constants_url_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/url.js */ \"./src/js/constants/url.js\");\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n\n\n\nconst fetchOption = {\n method: 'POST',\n mode: 'cors',\n headers: {\n 'Content-Type': 'application/json'\n }\n};\nconst HOST = 'https://' + window.location.host;\nfunction joinRequest(userData) {\n const signupBlind = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_2__[\"getElement\"])('#signup-blind');\n Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_2__[\"classAdd\"])(signupBlind, _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"FORM_RULES\"].ACTIVE_KEY);\n fetchOption.body = JSON.stringify(userData);\n fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.JOIN_API, fetchOption).then(res => checkJoin(res, makeLoginData(userData)));\n}\n\nfunction makeLoginData(userData) {\n const loginData = {};\n loginData.userId = userData.userId;\n loginData.password = userData.password;\n return loginData;\n}\n\nfunction checkJoin(res, loginData) {\n if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].SUCCESS) loginRequest(loginData);else alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"ALERT_MESSAGE\"].JOIN_FAIL);\n}\n\nfunction loginRequest(loginData) {\n fetchOption.body = JSON.stringify(loginData);\n fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.LOGIN_API, fetchOption).then(checkLogin);\n}\n\nfunction checkLogin(res) {\n if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].SUCCESS) window.location.href = './main';else alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"ALERT_MESSAGE\"].LOGIN_FAIL);\n}\n\nfunction checkIdDuplicateRequest(id) {\n return fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.ID_CHECK_API + id).then(checkDuplicate);\n}\nfunction checkEmailDuplicateRequest(email) {\n return fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.EMAIL_CHECK_API + email).then(checkDuplicate);\n}\nfunction checkPhoneNumberDuplicateRequest(number) {\n return fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.PHONE_NUMBER_CHECK_API + number).then(checkDuplicate);\n}\n\nfunction checkDuplicate(res) {\n if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].SUCCESS) return true;else if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].CONFLICT) return false;\n}\n\n//# sourceURL=webpack:///./src/js/http/request.js?"); + +/***/ }), + +/***/ "./src/js/login/loginMain.js": +/*!***********************************!*\ + !*** ./src/js/login/loginMain.js ***! + \***********************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _http_request_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../http/request.js */ \"./src/js/http/request.js\");\n\n\nconst loginForm = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('.login-form-wrap');\nconst signupBtn = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('.signup-btn');\nloginForm.addEventListener('submit', loginBtnSubmitHandle);\nsignupBtn.addEventListener('click', signupBtnClickHandle);\n\nfunction loginBtnSubmitHandle(evt) {\n evt.preventDefault();\n Object(_http_request_js__WEBPACK_IMPORTED_MODULE_1__[\"loginRequest\"])(makeLoginData());\n}\n\nfunction makeLoginData() {\n const loginFormData = new FormData(loginForm);\n const loginData = {};\n\n for (let [key, value] of loginFormData) {\n loginData[key] = value;\n }\n\n return loginData;\n}\n\nfunction signupBtnClickHandle() {\n window.location.href = './joinForm';\n}\n\n//# sourceURL=webpack:///./src/js/login/loginMain.js?"); + +/***/ }), + +/***/ "./src/js/util/commonUtil.js": +/*!***********************************!*\ + !*** ./src/js/util/commonUtil.js ***! + \***********************************/ +/*! exports provided: getElement, getElements, classAdd, classRemove */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElement\", function() { return getElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElements\", function() { return getElements; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classAdd\", function() { return classAdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classRemove\", function() { return classRemove; });\nfunction getElement(target) {\n return document.querySelector(target);\n}\nfunction getElements(target) {\n return document.querySelectorAll(target);\n}\nfunction classAdd(target, className) {\n target.classList.add(className);\n}\nfunction classRemove(target, className) {\n target.classList.remove(className);\n}\n\n//# sourceURL=webpack:///./src/js/util/commonUtil.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/BE/signup/src/main/resources/static/js/dist/main.bundle.js b/BE/signup/src/main/resources/static/js/dist/main.bundle.js new file mode 100644 index 0000000..4464ebe --- /dev/null +++ b/BE/signup/src/main/resources/static/js/dist/main.bundle.js @@ -0,0 +1,125 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/js/main/main.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./src/js/constants/constant.js": +/*!**************************************!*\ + !*** ./src/js/constants/constant.js ***! + \**************************************/ +/*! exports provided: VALID_CHECK_REGEX, STATE_MESSAGE, ALERT_MESSAGE, FORM_RULES, STATUS */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VALID_CHECK_REGEX\", function() { return VALID_CHECK_REGEX; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"STATE_MESSAGE\", function() { return STATE_MESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ALERT_MESSAGE\", function() { return ALERT_MESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FORM_RULES\", function() { return FORM_RULES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"STATUS\", function() { return STATUS; });\nconst VALID_CHECK_REGEX = {\n ID: /^[a-z0-9-_]{5,20}$/,\n PASSWORD: {\n LENGTH: /.{8,16}$/,\n UPPER: /^(?=.*[A-Z])/,\n NUMBER: /^(?=.*[0-9])/,\n SPECIAL: /^((?=.*\\d)|(?=.*\\W))/\n },\n EMAIL: /^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,3}$/i,\n PHONE_NUMBER: /^010\\d{3,4}\\d{4}$/\n};\nconst STATE_MESSAGE = {\n VALID: {\n DEFALUT: ' ',\n ID: '사용 가능한 아이디입니다.',\n PASSWORD: '안전한 비밀번호입니다.',\n PASSWORD_RECHECK: '비밀번호가 일치합니다.'\n },\n INVALID: {\n ID: '5~20자의 영문 소문자, 숫자와 특수기호(_)(-) 만 사용 가능합니다.',\n PASSWORD: {\n LENGTH: '8자 이상 16자 이하로 입력해주세요.',\n UPPER: '영문 대문자를 최소 1자 이상 포함해주세요.',\n NUMBER: '숫자를 최소 1자 이상 포함해주세요.',\n SPECIAL: '특수문자를 최소 1자 이상 포함해주세요.'\n },\n PASSWORD_RECHECK: '비밀번호가 일치하지 않습니다.',\n BIRTH_DATE: {\n BASE: '생년월일을 모두 입력해주세요.',\n YEAR: '태어난 년도 4자리를 정확하게 입력하세요.',\n DAY: '태어난 날짜를 정확하게 입력하세요.',\n AGE: '만 14세 이상 99세 이하만 가입 가능합니다.'\n },\n EMAIL: '이메일 주소를 다시 확인해주세요.',\n PHONE_NUMBER: '형식에 맞지 않는 번호입니다.',\n INTERESTS: '3개 이상의 관심사를 입력하세요.'\n },\n DUPLICATE: {\n ID: '이미 사용 중인 아이디입니다.',\n EMAIL: '이미 사용 중인 이메일입니다.',\n PHONE_NUMBER: '이미 사용 중인 휴대전화입니다.'\n }\n};\nconst ALERT_MESSAGE = {\n RESET: '모든 내용을 새로 작성하시겠습니까?',\n JOIN_INVALID: {\n ID: '아이디를 확인해주세요.',\n PASSWORD: '비밀번호를 확인해주세요.',\n NAME: '이름을 확인해주세요.',\n BIRTH_DATE: '생년월일을 확인해주세요.',\n GENDER: '성별을 확인해주세요.',\n EMAIL: '이메일을 확인해주세요.',\n PHONE_NUMBER: '휴대전화를 확인해주세요.',\n INTERESTS: '관심사를 확인해주세요.',\n CLAUSES: '약관에 동의하지 않으셨습니다.'\n },\n JOIN_FAIL: '회원가입에 살패했습니다! 다시 시도해주세요.',\n LOGIN_FAIL: '아이디 또는 비밀번호를 다시 확인해주세요.'\n};\nconst FORM_RULES = {\n YEAR_MAX_LENGTH: 4,\n DAY_MIN_LENGTH: 1,\n DAY_MAX_LENGTH: 2,\n AGE_MIN: 14,\n AGE_MAX: 99,\n NOT_DIGIT: 10,\n INTERESTS_MIN: 3,\n ACTIVE_KEY: 'active'\n};\nconst STATUS = {\n SUCCESS: 200,\n CONFLICT: 409\n};\n\n//# sourceURL=webpack:///./src/js/constants/constant.js?"); + +/***/ }), + +/***/ "./src/js/main/main.js": +/*!*****************************!*\ + !*** ./src/js/main/main.js ***! + \*****************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n\n\nconst userInfoBtn = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('.user-info-btn');\nconst userInfo = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('.user-info');\nuserInfoBtn.addEventListener('click', () => {\n if (!userInfo.classList.contains(_constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"FORM_RULES\"].ACTIVE_KEY)) Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"classAdd\"])(userInfo, _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"FORM_RULES\"].ACTIVE_KEY);else Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"classRemove\"])(userInfo, _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"FORM_RULES\"].ACTIVE_KEY);\n});\n\n//# sourceURL=webpack:///./src/js/main/main.js?"); + +/***/ }), + +/***/ "./src/js/util/commonUtil.js": +/*!***********************************!*\ + !*** ./src/js/util/commonUtil.js ***! + \***********************************/ +/*! exports provided: getElement, getElements, classAdd, classRemove */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElement\", function() { return getElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElements\", function() { return getElements; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classAdd\", function() { return classAdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classRemove\", function() { return classRemove; });\nfunction getElement(target) {\n return document.querySelector(target);\n}\nfunction getElements(target) {\n return document.querySelectorAll(target);\n}\nfunction classAdd(target, className) {\n target.classList.add(className);\n}\nfunction classRemove(target, className) {\n target.classList.remove(className);\n}\n\n//# sourceURL=webpack:///./src/js/util/commonUtil.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/BE/signup/src/main/resources/static/js/dist/signup.bundle.js b/BE/signup/src/main/resources/static/js/dist/signup.bundle.js new file mode 100644 index 0000000..8ca3362 --- /dev/null +++ b/BE/signup/src/main/resources/static/js/dist/signup.bundle.js @@ -0,0 +1,245 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./src/js/signup/signupMain.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./src/js/constants/constant.js": +/*!**************************************!*\ + !*** ./src/js/constants/constant.js ***! + \**************************************/ +/*! exports provided: VALID_CHECK_REGEX, STATE_MESSAGE, ALERT_MESSAGE, FORM_RULES, STATUS */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"VALID_CHECK_REGEX\", function() { return VALID_CHECK_REGEX; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"STATE_MESSAGE\", function() { return STATE_MESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ALERT_MESSAGE\", function() { return ALERT_MESSAGE; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"FORM_RULES\", function() { return FORM_RULES; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"STATUS\", function() { return STATUS; });\nconst VALID_CHECK_REGEX = {\n ID: /^[a-z0-9-_]{5,20}$/,\n PASSWORD: {\n LENGTH: /.{8,16}$/,\n UPPER: /^(?=.*[A-Z])/,\n NUMBER: /^(?=.*[0-9])/,\n SPECIAL: /^((?=.*\\d)|(?=.*\\W))/\n },\n EMAIL: /^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,3}$/i,\n PHONE_NUMBER: /^010\\d{3,4}\\d{4}$/\n};\nconst STATE_MESSAGE = {\n VALID: {\n DEFALUT: ' ',\n ID: '사용 가능한 아이디입니다.',\n PASSWORD: '안전한 비밀번호입니다.',\n PASSWORD_RECHECK: '비밀번호가 일치합니다.'\n },\n INVALID: {\n ID: '5~20자의 영문 소문자, 숫자와 특수기호(_)(-) 만 사용 가능합니다.',\n PASSWORD: {\n LENGTH: '8자 이상 16자 이하로 입력해주세요.',\n UPPER: '영문 대문자를 최소 1자 이상 포함해주세요.',\n NUMBER: '숫자를 최소 1자 이상 포함해주세요.',\n SPECIAL: '특수문자를 최소 1자 이상 포함해주세요.'\n },\n PASSWORD_RECHECK: '비밀번호가 일치하지 않습니다.',\n BIRTH_DATE: {\n BASE: '생년월일을 모두 입력해주세요.',\n YEAR: '태어난 년도 4자리를 정확하게 입력하세요.',\n DAY: '태어난 날짜를 정확하게 입력하세요.',\n AGE: '만 14세 이상 99세 이하만 가입 가능합니다.'\n },\n EMAIL: '이메일 주소를 다시 확인해주세요.',\n PHONE_NUMBER: '형식에 맞지 않는 번호입니다.',\n INTERESTS: '3개 이상의 관심사를 입력하세요.'\n },\n DUPLICATE: {\n ID: '이미 사용 중인 아이디입니다.',\n EMAIL: '이미 사용 중인 이메일입니다.',\n PHONE_NUMBER: '이미 사용 중인 휴대전화입니다.'\n }\n};\nconst ALERT_MESSAGE = {\n RESET: '모든 내용을 새로 작성하시겠습니까?',\n JOIN_INVALID: {\n ID: '아이디를 확인해주세요.',\n PASSWORD: '비밀번호를 확인해주세요.',\n NAME: '이름을 확인해주세요.',\n BIRTH_DATE: '생년월일을 확인해주세요.',\n GENDER: '성별을 확인해주세요.',\n EMAIL: '이메일을 확인해주세요.',\n PHONE_NUMBER: '휴대전화를 확인해주세요.',\n INTERESTS: '관심사를 확인해주세요.',\n CLAUSES: '약관에 동의하지 않으셨습니다.'\n },\n JOIN_FAIL: '회원가입에 살패했습니다! 다시 시도해주세요.',\n LOGIN_FAIL: '아이디 또는 비밀번호를 다시 확인해주세요.'\n};\nconst FORM_RULES = {\n YEAR_MAX_LENGTH: 4,\n DAY_MIN_LENGTH: 1,\n DAY_MAX_LENGTH: 2,\n AGE_MIN: 14,\n AGE_MAX: 99,\n NOT_DIGIT: 10,\n INTERESTS_MIN: 3,\n ACTIVE_KEY: 'active'\n};\nconst STATUS = {\n SUCCESS: 200,\n CONFLICT: 409\n};\n\n//# sourceURL=webpack:///./src/js/constants/constant.js?"); + +/***/ }), + +/***/ "./src/js/constants/url.js": +/*!*********************************!*\ + !*** ./src/js/constants/url.js ***! + \*********************************/ +/*! exports provided: URL */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"URL\", function() { return URL; });\n// export const URL = {\n// DEV: {\n// ID_CHECK_API: 'https://signup-5-dev.herokuapp.com/duplicate?userId=',\n// EMAIL_CHECK_API: 'https://signup-5-dev.herokuapp.com/duplicate?email=',\n// PHONE_NUMBER_CHECK_API: 'https://signup-5-dev.herokuapp.com/duplicate?phone=',\n// JOIN_API: 'https://signup-5-dev.herokuapp.com/join',\n// LOGIN_API: 'https://signup-5-dev.herokuapp.com/login'\n// },\n// PROD: {}\n// }\nconst URL = {\n DEV: {\n ID_CHECK_API: '/duplicate?userId=',\n EMAIL_CHECK_API: '/duplicate?email=',\n PHONE_NUMBER_CHECK_API: '/duplicate?phone=',\n JOIN_API: '/join',\n LOGIN_API: '/login'\n },\n PROD: {}\n};\n\n//# sourceURL=webpack:///./src/js/constants/url.js?"); + +/***/ }), + +/***/ "./src/js/data/signupData.js": +/*!***********************************!*\ + !*** ./src/js/data/signupData.js ***! + \***********************************/ +/*! exports provided: signupData, makeSignupJSON, resetSignupData */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"signupData\", function() { return signupData; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"makeSignupJSON\", function() { return makeSignupJSON; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"resetSignupData\", function() { return resetSignupData; });\nconst signupData = {\n userId: null,\n password: null,\n passwordRecheck: null,\n name: null,\n year: null,\n month: null,\n day: null,\n sex: null,\n email: null,\n phoneNumber: null,\n interest: null,\n clausesAgree: null\n};\nconst signupJSON = {\n userId: null,\n password: null,\n name: null,\n birthday: null,\n sex: null,\n email: null,\n phoneNumber: null,\n interest: null\n};\nfunction makeSignupJSON() {\n signupJSON.userId = signupData.userId;\n signupJSON.password = signupData.password;\n signupJSON.name = signupData.name;\n signupJSON.birthday = `${signupData.year}-${signupData.month}-${signupData.day}`;\n signupJSON.sex = signupData.sex;\n signupJSON.email = signupData.email;\n signupJSON.phoneNumber = signupData.phoneNumber;\n signupJSON.interest = signupData.interest.join(', ');\n return signupJSON;\n}\nfunction resetSignupData() {\n for (let key in signupData) {\n signupData[key] = null;\n }\n}\n\n//# sourceURL=webpack:///./src/js/data/signupData.js?"); + +/***/ }), + +/***/ "./src/js/http/request.js": +/*!********************************!*\ + !*** ./src/js/http/request.js ***! + \********************************/ +/*! exports provided: joinRequest, loginRequest, checkIdDuplicateRequest, checkEmailDuplicateRequest, checkPhoneNumberDuplicateRequest */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"joinRequest\", function() { return joinRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"loginRequest\", function() { return loginRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkIdDuplicateRequest\", function() { return checkIdDuplicateRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkEmailDuplicateRequest\", function() { return checkEmailDuplicateRequest; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkPhoneNumberDuplicateRequest\", function() { return checkPhoneNumberDuplicateRequest; });\n/* harmony import */ var _constants_url_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/url.js */ \"./src/js/constants/url.js\");\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n\n\n\nconst fetchOption = {\n method: 'POST',\n mode: 'cors',\n headers: {\n 'Content-Type': 'application/json'\n }\n};\nconst HOST = 'https://' + window.location.host;\nfunction joinRequest(userData) {\n const signupBlind = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_2__[\"getElement\"])('#signup-blind');\n Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_2__[\"classAdd\"])(signupBlind, _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"FORM_RULES\"].ACTIVE_KEY);\n fetchOption.body = JSON.stringify(userData);\n fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.JOIN_API, fetchOption).then(res => checkJoin(res, makeLoginData(userData)));\n}\n\nfunction makeLoginData(userData) {\n const loginData = {};\n loginData.userId = userData.userId;\n loginData.password = userData.password;\n return loginData;\n}\n\nfunction checkJoin(res, loginData) {\n if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].SUCCESS) loginRequest(loginData);else alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"ALERT_MESSAGE\"].JOIN_FAIL);\n}\n\nfunction loginRequest(loginData) {\n fetchOption.body = JSON.stringify(loginData);\n fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.LOGIN_API, fetchOption).then(checkLogin);\n}\n\nfunction checkLogin(res) {\n if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].SUCCESS) window.location.href = './main';else alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"ALERT_MESSAGE\"].LOGIN_FAIL);\n}\n\nfunction checkIdDuplicateRequest(id) {\n return fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.ID_CHECK_API + id).then(checkDuplicate);\n}\nfunction checkEmailDuplicateRequest(email) {\n return fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.EMAIL_CHECK_API + email).then(checkDuplicate);\n}\nfunction checkPhoneNumberDuplicateRequest(number) {\n return fetch(HOST + _constants_url_js__WEBPACK_IMPORTED_MODULE_0__[\"URL\"].DEV.PHONE_NUMBER_CHECK_API + number).then(checkDuplicate);\n}\n\nfunction checkDuplicate(res) {\n if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].SUCCESS) return true;else if (res.status === _constants_constant_js__WEBPACK_IMPORTED_MODULE_1__[\"STATUS\"].CONFLICT) return false;\n}\n\n//# sourceURL=webpack:///./src/js/http/request.js?"); + +/***/ }), + +/***/ "./src/js/signup/clauses.js": +/*!**********************************!*\ + !*** ./src/js/signup/clauses.js ***! + \**********************************/ +/*! exports provided: openClauses, closeClauses, activeClausesAgreeBtn, clausesAgree, clausesAgreeBtnToggle */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"openClauses\", function() { return openClauses; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"closeClauses\", function() { return closeClauses; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"activeClausesAgreeBtn\", function() { return activeClausesAgreeBtn; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clausesAgree\", function() { return clausesAgree; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"clausesAgreeBtnToggle\", function() { return clausesAgreeBtnToggle; });\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/signupData.js */ \"./src/js/data/signupData.js\");\n\n\n\nfunction openClauses(...elements) {\n elements.forEach(el => Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"classAdd\"])(el, _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].ACTIVE_KEY));\n const clausesTextBox = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('#clauses-text-box');\n clausesTextBox.scrollTop = 0;\n}\nfunction closeClauses(...elements) {\n elements.forEach(el => Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"classRemove\"])(el, _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].ACTIVE_KEY));\n}\nfunction activeClausesAgreeBtn(clausesTextBox) {\n if (!(clausesTextBox.clientHeight + clausesTextBox.scrollTop >= clausesTextBox.scrollHeight)) return;\n clausesAgreeBtnToggle(true);\n}\nfunction clausesAgree(...elements) {\n const clausesAgreeCheckbox = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('.clauses-agree-checkbox');\n clausesAgreeCheckbox.checked = true;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].clausesAgree = true;\n closeClauses(...elements);\n}\nfunction clausesAgreeBtnToggle(isActive) {\n const clausesAgreeBtn = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('.clauses-agree-btn');\n if (isActive) Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"classAdd\"])(clausesAgreeBtn, _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].ACTIVE_KEY);else Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"classRemove\"])(clausesAgreeBtn, _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].ACTIVE_KEY);\n clausesAgreeBtn.disabled = !isActive;\n}\n\n//# sourceURL=webpack:///./src/js/signup/clauses.js?"); + +/***/ }), + +/***/ "./src/js/signup/signupButtons.js": +/*!****************************************!*\ + !*** ./src/js/signup/signupButtons.js ***! + \****************************************/ +/*! exports provided: signupResetBtnHandle, signupJoinBtnHandle */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"signupResetBtnHandle\", function() { return signupResetBtnHandle; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"signupJoinBtnHandle\", function() { return signupJoinBtnHandle; });\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/signupData.js */ \"./src/js/data/signupData.js\");\n/* harmony import */ var _userInterests_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./userInterests.js */ \"./src/js/signup/userInterests.js\");\n/* harmony import */ var _clauses_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./clauses.js */ \"./src/js/signup/clauses.js\");\n/* harmony import */ var _http_request_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../http/request.js */ \"./src/js/http/request.js\");\n\n\n\n\n\n\nfunction signupResetBtnHandle() {\n if (!confirm(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].RESET)) return;\n const signupFormWrap = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('.signup-form-wrap');\n const stateText = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElements\"])('.state-text');\n signupFormWrap.reset();\n stateText.forEach(el => el.innerHTML = '');\n Object(_clauses_js__WEBPACK_IMPORTED_MODULE_4__[\"clausesAgreeBtnToggle\"])(false);\n Object(_data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"resetSignupData\"])();\n Object(_userInterests_js__WEBPACK_IMPORTED_MODULE_3__[\"resetTag\"])();\n}\nfunction signupJoinBtnHandle() {\n for (let [key, value] of Object.entries(_data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"])) {\n if (value) continue;\n notifyJoinError(key);\n return;\n }\n\n Object(_http_request_js__WEBPACK_IMPORTED_MODULE_5__[\"joinRequest\"])(Object(_data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"makeSignupJSON\"])());\n}\n\nfunction notifyJoinError(key) {\n switch (key) {\n case \"userId\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.ID);\n break;\n\n case \"password\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.PASSWORD);\n break;\n\n case \"passwordRecheck\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.PASSWORD);\n break;\n\n case \"name\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.NAME);\n break;\n\n case \"year\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.BIRTH_DATE);\n break;\n\n case \"month\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.BIRTH_DATE);\n break;\n\n case \"day\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.BIRTH_DATE);\n break;\n\n case \"sex\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.GENDER);\n break;\n\n case \"email\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.EMAIL);\n break;\n\n case \"phoneNumber\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.PHONE_NUMBER);\n break;\n\n case \"interest\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.INTERESTS);\n break;\n\n case \"clausesAgree\":\n alert(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"ALERT_MESSAGE\"].JOIN_INVALID.CLAUSES);\n }\n}\n\n//# sourceURL=webpack:///./src/js/signup/signupButtons.js?"); + +/***/ }), + +/***/ "./src/js/signup/signupEventManager.js": +/*!*********************************************!*\ + !*** ./src/js/signup/signupEventManager.js ***! + \*********************************************/ +/*! exports provided: initSignupEvent, initClausesEvent */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"initSignupEvent\", function() { return initSignupEvent; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"initClausesEvent\", function() { return initClausesEvent; });\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/signupUtil.js */ \"./src/js/util/signupUtil.js\");\n/* harmony import */ var _userIdPassword_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./userIdPassword.js */ \"./src/js/signup/userIdPassword.js\");\n/* harmony import */ var _userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./userPersonalData.js */ \"./src/js/signup/userPersonalData.js\");\n/* harmony import */ var _userInterests_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./userInterests.js */ \"./src/js/signup/userInterests.js\");\n/* harmony import */ var _clauses_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./clauses.js */ \"./src/js/signup/clauses.js\");\n/* harmony import */ var _signupButtons_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./signupButtons.js */ \"./src/js/signup/signupButtons.js\");\n\n\n\n\n\n\n\nconst signupFormWrap = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('.signup-form-wrap');\nconst clausesWrap = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('.clauses-wrap');\nconst signupBlind = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('#signup-blind');\nconst signupInterests = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('#signup-interests');\nconst clausesTextBox = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('#clauses-text-box');\nconst tagUiWrap = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('#tag-ui-wrap');\nfunction initSignupEvent() {\n signupFormWrap.addEventListener('input', formInputEventDelegation);\n signupFormWrap.addEventListener('change', formChageEventDelegation);\n signupFormWrap.addEventListener('click', formClickEventDelegation);\n signupInterests.addEventListener('keyup', event => Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateStateInterests\"])(_userInterests_js__WEBPACK_IMPORTED_MODULE_4__[\"addInterests\"], event, tagUiWrap, signupInterests));\n signupInterests.addEventListener('keydown', event => Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateStateInterests\"])(_userInterests_js__WEBPACK_IMPORTED_MODULE_4__[\"removeInterests\"], event, tagUiWrap, signupInterests));\n tagUiWrap.addEventListener('click', event => Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateStateInterests\"])(_userInterests_js__WEBPACK_IMPORTED_MODULE_4__[\"removeInterestsOnClick\"], event, tagUiWrap));\n}\nfunction initClausesEvent() {\n clausesWrap.addEventListener('click', clausesClickEventDelegation);\n clausesTextBox.addEventListener('scroll', ({\n target\n }) => Object(_clauses_js__WEBPACK_IMPORTED_MODULE_5__[\"activeClausesAgreeBtn\"])(target));\n}\n\nfunction formInputEventDelegation({\n target\n}) {\n switch (target.id) {\n case 'signup-password':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userIdPassword_js__WEBPACK_IMPORTED_MODULE_2__[\"checkPassword\"], target);\n break;\n\n case 'signup-password-recheck':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userIdPassword_js__WEBPACK_IMPORTED_MODULE_2__[\"recheckPassword\"], target, Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_0__[\"getElement\"])('#signup-password').value);\n break;\n\n case 'signup-name':\n Object(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkName\"])(target.value);\n break;\n\n case 'signup-gender':\n Object(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkGender\"])(target.value);\n break;\n\n default:\n break;\n }\n}\n\nfunction formChageEventDelegation({\n target\n}) {\n switch (target.id) {\n case 'signup-id':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userIdPassword_js__WEBPACK_IMPORTED_MODULE_2__[\"checkId\"], target);\n break;\n\n case 'birth-date-year':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkYear\"], target);\n break;\n\n case 'birth-date-month':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkMonth\"], target);\n break;\n\n case 'birth-date-day':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkDay\"], target);\n break;\n\n case 'signup-email':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkEmail\"], target);\n break;\n\n case 'signup-phone-number':\n Object(_util_signupUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"updateState\"])(_userPersonalData_js__WEBPACK_IMPORTED_MODULE_3__[\"checkPhoneNumber\"], target);\n break;\n\n default:\n break;\n }\n}\n\nfunction formClickEventDelegation({\n target\n}) {\n switch (target.id) {\n case 'clauses-agree-text':\n Object(_clauses_js__WEBPACK_IMPORTED_MODULE_5__[\"openClauses\"])(signupBlind, clausesWrap);\n break;\n\n case 'signup-reset-btn':\n Object(_signupButtons_js__WEBPACK_IMPORTED_MODULE_6__[\"signupResetBtnHandle\"])();\n break;\n\n case 'signup-join-btn':\n Object(_signupButtons_js__WEBPACK_IMPORTED_MODULE_6__[\"signupJoinBtnHandle\"])();\n break;\n\n default:\n break;\n }\n}\n\nfunction clausesClickEventDelegation({\n target\n}) {\n switch (target.id) {\n case 'clauses-close-btn':\n Object(_clauses_js__WEBPACK_IMPORTED_MODULE_5__[\"closeClauses\"])(signupBlind, clausesWrap);\n break;\n\n case 'clauses-agree-btn':\n Object(_clauses_js__WEBPACK_IMPORTED_MODULE_5__[\"clausesAgree\"])(signupBlind, clausesWrap);\n break;\n\n default:\n break;\n }\n}\n\n//# sourceURL=webpack:///./src/js/signup/signupEventManager.js?"); + +/***/ }), + +/***/ "./src/js/signup/signupMain.js": +/*!*************************************!*\ + !*** ./src/js/signup/signupMain.js ***! + \*************************************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _signupEventManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./signupEventManager.js */ \"./src/js/signup/signupEventManager.js\");\n\nObject(_signupEventManager_js__WEBPACK_IMPORTED_MODULE_0__[\"initSignupEvent\"])();\nObject(_signupEventManager_js__WEBPACK_IMPORTED_MODULE_0__[\"initClausesEvent\"])();\n\n//# sourceURL=webpack:///./src/js/signup/signupMain.js?"); + +/***/ }), + +/***/ "./src/js/signup/userIdPassword.js": +/*!*****************************************!*\ + !*** ./src/js/signup/userIdPassword.js ***! + \*****************************************/ +/*! exports provided: checkId, checkPassword, recheckPassword */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkId\", function() { return checkId; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkPassword\", function() { return checkPassword; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"recheckPassword\", function() { return recheckPassword; });\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../data/signupData.js */ \"./src/js/data/signupData.js\");\n/* harmony import */ var _http_request_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../http/request.js */ \"./src/js/http/request.js\");\n\n\n\nasync function checkId(id) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__[\"signupData\"].userId = null;\n const checkIdCondition = id.search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].ID);\n if (checkIdCondition) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.ID;\n if (!(await Object(_http_request_js__WEBPACK_IMPORTED_MODULE_2__[\"checkIdDuplicateRequest\"])(id).then(res => res))) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].DUPLICATE.ID;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__[\"signupData\"].userId = id;\n return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].VALID.ID;\n}\nfunction checkPassword(password) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__[\"signupData\"].password = null;\n const checkLength = password.search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].PASSWORD.LENGTH);\n if (checkLength) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.PASSWORD.LENGTH;\n const checkUpper = password.search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].PASSWORD.UPPER);\n if (checkUpper) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.PASSWORD.UPPER;\n const checkNumber = password.search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].PASSWORD.NUMBER);\n if (checkNumber) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.PASSWORD.NUMBER;\n const checkSpecial = password.replace(/[0-9]/g, '').search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].PASSWORD.SPECIAL);\n if (checkSpecial) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.PASSWORD.SPECIAL;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__[\"signupData\"].password = password;\n return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].VALID.PASSWORD;\n}\nfunction recheckPassword(password, originPassword) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__[\"signupData\"].passwordRecheck = null;\n if (password !== originPassword) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.PASSWORD_RECHECK;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_1__[\"signupData\"].passwordRecheck = password;\n return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].VALID.PASSWORD_RECHECK;\n}\n\n//# sourceURL=webpack:///./src/js/signup/userIdPassword.js?"); + +/***/ }), + +/***/ "./src/js/signup/userInterests.js": +/*!****************************************!*\ + !*** ./src/js/signup/userInterests.js ***! + \****************************************/ +/*! exports provided: addInterests, removeInterests, removeInterestsOnClick, resetTag */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"addInterests\", function() { return addInterests; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeInterests\", function() { return removeInterests; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"removeInterestsOnClick\", function() { return removeInterestsOnClick; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"resetTag\", function() { return resetTag; });\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/signupData.js */ \"./src/js/data/signupData.js\");\n\n\n\nconst tags = [];\nfunction addInterests({\n key\n}, tagUiWrap, signupInterests) {\n if (key !== ',') return;\n const interest = signupInterests.value.replace(/[,]/g, '');\n signupInterests.value = '';\n if (!interest) return;\n tags.push(interest);\n return updateTag(tagUiWrap);\n}\nfunction removeInterests({\n key\n}, tagUiWrap, signupInterests) {\n if (!checkRemoveCondition(key, signupInterests)) return;\n signupInterests.value = tags.pop() + ' ';\n return updateTag(tagUiWrap);\n}\n\nfunction checkRemoveCondition(key, signupInterests) {\n if (tags.length > 0 && signupInterests.value === '' && (key === 'Backspace' || key === 'Delete')) return true;\n return false;\n}\n\nfunction removeInterestsOnClick({\n target\n}, tagUiWrap) {\n if (!target.classList.contains('tag-ui-close')) return;\n const data = target.getAttribute('data-item');\n const index = tags.indexOf(data);\n tags.splice(index, 1);\n return updateTag(tagUiWrap);\n}\nfunction resetTag() {\n Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElements\"])('.tag-ui').forEach(tag => tag.parentElement.removeChild(tag));\n}\n\nfunction checkInterests() {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].interest = null;\n if (tags.length < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].INTERESTS_MIN) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.INTERESTS;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].interest = tags;\n return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].VALID.DEFALUT;\n}\n\nfunction createTag(interest) {\n const tag = document.createElement('span');\n tag.setAttribute('class', 'tag-ui');\n tag.innerHTML = `${interest}`;\n return tag;\n}\n\nfunction updateTag(tagUiWrap) {\n resetTag();\n tags.slice().reverse().forEach(tag => tagUiWrap.prepend(createTag(tag)));\n return checkInterests();\n}\n\n//# sourceURL=webpack:///./src/js/signup/userInterests.js?"); + +/***/ }), + +/***/ "./src/js/signup/userPersonalData.js": +/*!*******************************************!*\ + !*** ./src/js/signup/userPersonalData.js ***! + \*******************************************/ +/*! exports provided: checkYear, checkMonth, checkDay, checkEmail, checkPhoneNumber, checkName, checkGender */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkYear\", function() { return checkYear; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkMonth\", function() { return checkMonth; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkDay\", function() { return checkDay; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkEmail\", function() { return checkEmail; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkPhoneNumber\", function() { return checkPhoneNumber; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkName\", function() { return checkName; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"checkGender\", function() { return checkGender; });\n/* harmony import */ var _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/constant.js */ \"./src/js/constants/constant.js\");\n/* harmony import */ var _util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/commonUtil.js */ \"./src/js/util/commonUtil.js\");\n/* harmony import */ var _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../data/signupData.js */ \"./src/js/data/signupData.js\");\n/* harmony import */ var _http_request_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../http/request.js */ \"./src/js/http/request.js\");\n\n\n\n\nfunction checkYear(year) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].year = null;\n if (year.length !== _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].YEAR_MAX_LENGTH) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.BIRTH_DATE.YEAR;\n return checkBirthDate();\n}\nfunction checkMonth(month) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].month = month;\n return checkBirthDate();\n}\nfunction checkDay(day) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].day = null;\n if (day.length < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].DAY_MIN_LENGTH || day.length > _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].DAY_MAX_LENGTH) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.BIRTH_DATE.DAY;\n return checkBirthDate();\n}\n\nfunction checkBirthDate() {\n const inputYear = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('#birth-date-year').value;\n const inputMonth = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('#birth-date-month').value;\n const inputDay = Object(_util_commonUtil_js__WEBPACK_IMPORTED_MODULE_1__[\"getElement\"])('#birth-date-day').value;\n const lastDay = new Date(inputYear, inputMonth, 0).getDate();\n if (!inputYear || !inputMonth || !inputDay) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.BIRTH_DATE.BASE;\n if (lastDay < inputDay || 0 >= inputDay) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.BIRTH_DATE.DAY;\n if (!checkAge(inputYear, inputMonth, inputDay)) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.BIRTH_DATE.AGE;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].year = inputYear;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].day = inputDay < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].NOT_DIGIT ? '0' + inputDay : inputDay;\n return;\n}\n\nfunction checkAge(year, month, day) {\n const age = calcAge(year, month, day < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].NOT_DIGIT ? '0' + day : day);\n if (age < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].AGE_MIN || age > _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].AGE_MAX) return false;\n return true;\n}\n\nfunction calcAge(year, month, day) {\n const date = new Date();\n const curYear = date.getFullYear();\n let curMonth = date.getMonth() + 1;\n let curDay = date.getDate();\n if (curMonth < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].NOT_DIGIT) curMonth = '0' + curMonth;\n if (curDay < _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"FORM_RULES\"].NOT_DIGIT) curDay = '0' + curDay;\n const curMonthDay = curMonth + curDay;\n const inputYear = year;\n const inputMonthDay = month + day;\n const age = curMonthDay < inputMonthDay ? curYear - inputYear - 1 : curYear - inputYear;\n return age;\n}\n\nasync function checkEmail(email) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].email = null;\n const checkEmail = email.search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].EMAIL);\n if (checkEmail) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.EMAIL;\n if (!(await Object(_http_request_js__WEBPACK_IMPORTED_MODULE_3__[\"checkEmailDuplicateRequest\"])(email).then(res => res))) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].DUPLICATE.EMAIL;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].email = email;\n return;\n}\nasync function checkPhoneNumber(number) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].phoneNumber = null;\n const checkNumber = number.search(_constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"VALID_CHECK_REGEX\"].PHONE_NUMBER);\n if (checkNumber) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].INVALID.PHONE_NUMBER;\n if (!(await Object(_http_request_js__WEBPACK_IMPORTED_MODULE_3__[\"checkPhoneNumberDuplicateRequest\"])(number).then(res => res))) return _constants_constant_js__WEBPACK_IMPORTED_MODULE_0__[\"STATE_MESSAGE\"].DUPLICATE.PHONE_NUMBER;\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].phoneNumber = number;\n return;\n}\nfunction checkName(name) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].name = null;\n if (name) _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].name = name;\n}\nfunction checkGender(gender) {\n _data_signupData_js__WEBPACK_IMPORTED_MODULE_2__[\"signupData\"].sex = gender;\n}\n\n//# sourceURL=webpack:///./src/js/signup/userPersonalData.js?"); + +/***/ }), + +/***/ "./src/js/util/commonUtil.js": +/*!***********************************!*\ + !*** ./src/js/util/commonUtil.js ***! + \***********************************/ +/*! exports provided: getElement, getElements, classAdd, classRemove */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElement\", function() { return getElement; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getElements\", function() { return getElements; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classAdd\", function() { return classAdd; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"classRemove\", function() { return classRemove; });\nfunction getElement(target) {\n return document.querySelector(target);\n}\nfunction getElements(target) {\n return document.querySelectorAll(target);\n}\nfunction classAdd(target, className) {\n target.classList.add(className);\n}\nfunction classRemove(target, className) {\n target.classList.remove(className);\n}\n\n//# sourceURL=webpack:///./src/js/util/commonUtil.js?"); + +/***/ }), + +/***/ "./src/js/util/signupUtil.js": +/*!***********************************!*\ + !*** ./src/js/util/signupUtil.js ***! + \***********************************/ +/*! exports provided: updateState, updateStateInterests */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"updateState\", function() { return updateState; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"updateStateInterests\", function() { return updateStateInterests; });\nasync function updateState(checkCallBackFunc, target, ...additional) {\n let stateMessage = checkCallBackFunc(target.value, ...additional);\n if (typeof stateMessage === 'object') stateMessage = await stateMessage.then(res => res);\n if (!stateMessage) stateMessage = '';\n target.closest('.signup-content').querySelector('.state-text').innerHTML = stateMessage;\n}\nfunction updateStateInterests(checkCallBackFunc, event, ...additional) {\n let stateMessage = checkCallBackFunc(event, ...additional);\n if (!stateMessage) return;\n event.target.closest('.signup-content').querySelector('.state-text').innerHTML = stateMessage;\n}\n\n//# sourceURL=webpack:///./src/js/util/signupUtil.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/BE/signup/src/main/resources/templates/login.html b/BE/signup/src/main/resources/templates/login.html new file mode 100644 index 0000000..2c9bba0 --- /dev/null +++ b/BE/signup/src/main/resources/templates/login.html @@ -0,0 +1,28 @@ + + + + + + + login - + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/BE/signup/src/main/resources/templates/main.html b/BE/signup/src/main/resources/templates/main.html new file mode 100644 index 0000000..80014f1 --- /dev/null +++ b/BE/signup/src/main/resources/templates/main.html @@ -0,0 +1,32 @@ + + + + + + + main - + + + + +
+

Welcome !

+

+ user-name 님 반갑습니다. +

+ + +
+ + + + + \ No newline at end of file diff --git a/BE/signup/src/main/resources/templates/signup.html b/BE/signup/src/main/resources/templates/signup.html new file mode 100644 index 0000000..fc94134 --- /dev/null +++ b/BE/signup/src/main/resources/templates/signup.html @@ -0,0 +1,144 @@ + + + + + + + signup - + + + + + +
+ + + + +
+
+

개인정보 수집 및 이용에 대한 안내

+

+ 1. 개인정보처리방침의 의의
+ 네이버는 본 개인정보처리방침을 정보통신망법을 기준으로 작성하되, 네이버 내에서의 이용자 개인정보 처리 현황을 최대한 알기 쉽고 상세하게 설명하기 위해 노력하였습니다. + 이는 쉬운 용어를 사용한 개인정보처리방침 작성 원칙인 ‘Plain Language Privacy Policy(쉬운 용어를 사용한 개인정보처리방침)’를 도입한 것입니다. +


+ 2. 수집하는 개인정보
+ 이용자는 회원가입을 하지 않아도 정보 검색, 뉴스 보기 등 대부분의 네이버 서비스를 회원과 동일하게 이용할 수 있습니다. + 이용자가 메일, 캘린더, 카페, 블로그 등과 같이 개인화 혹은 회원제 서비스를 이용하기 위해 회원가입을 할 경우, 네이버는 서비스 이용을 위해 필요한 최소한의 개인정보를 + 수집합니다. +


+ 3. 네이버가 수집하는 개인정보 항목 및 수집방법
+ 회사는 이용자들이 회원서비스를 이용하기 위해 회원으로 가입하실 때 서비스 제공을 위한 필수적인 정보들을 온라인상에서 입력 받고 있습니다. 회원 가입 시에 받는 필수적인 정보는 + 이름, 주민등록번호, 이메일주소 등입니다. 또한 양질의 서비스 제공을 위하여 이용자들이 선택적으로 입력할 수 있는 사항으로서 전화번호 등을 입력 받고 있습니다. +


+ 4. 네이버가 수집하는 개인정보의 보유 및 이용기간
+ 이용자가 네이버의 회원으로서 회사에 제공하는 서비스를 이용하는 동안 회사는 이용자들의 개인정보를 계속적으로 보유하며 서비스 제공 등을 위해 이용합니다. 다만, 아래의 "6. 이용자 + 자신의 개인정보 관리(열람, 정정, 삭제 등)에 관한 사항" 에서 설명한 절차와 방법에 따라 회원 본인이 직접 삭제하거나 수정한 정보, 가입해지를 요청한 경우에는 재생할 수 없는 + 방법에 의하여 디스크에서 완전히 삭제하며 추후 열람이나 이용이 불가능한 상태로 처리됩니다. +

+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/BE/signup/src/test/java/com/codesquad/signup/repository/UserTest.java b/BE/signup/src/test/java/com/codesquad/signup/repository/UserTest.java new file mode 100644 index 0000000..82c63bb --- /dev/null +++ b/BE/signup/src/test/java/com/codesquad/signup/repository/UserTest.java @@ -0,0 +1,92 @@ +package com.codesquad.signup.repository; + +import com.codesquad.signup.exception.WrongFormatException; +import org.junit.jupiter.api.*; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +@SpringBootTest +@DisplayName("UserTest") +class UserTest { + + User user; + + @BeforeEach + void setUser() { + user = new User(); + user.setUserId("diane"); + user.setPassword("1234Qwer**"); + user.setName("다이앤"); + user.setBirthday(LocalDate.of(2000, 7, 13)); + user.setSex("female"); + user.setEmail("abcd@gmail.com"); + user.setPhoneNumber("01022225555"); + user.setInterest("야구, 농구, 축구"); + } + + @AfterEach + void afterEach() { + assertThrows(WrongFormatException.class, () -> { + user.checkValidUser(); + }); + } + + @Nested + @DisplayName("checkValidUser() 는 user 의 parameter 중 ") + class Describe_checkValidUser { + + final String USER_ID_WRONG = "dianeA"; + final String PASSWORD_WRONG = "123Qwer"; + final String EMAIL_WRONG = "abcdgmail.com"; + final String PHONE_NUMBER_WRONG = "01022223333555"; + final String INTEREST_WRONG = "야구, 농구"; + + final String STRING_NULL = null; + final String STRING_BLANK = ""; + + @Test + @DisplayName(" userId 가 맞지 않으면 (dianeA) WrongFormatException 을 throw 합니다.") + void userIdIsWrong() { + user.setUserId(USER_ID_WRONG); + } + + @Test + @DisplayName(" password 가 맞지 않으면 (123Qwer) WrongFormatException 을 throw 합니다.") + void passwordIsWrong() { + user.setPassword(PASSWORD_WRONG); + } + + @Test + @DisplayName(" email 이 맞지 않으면 (abcdgmail.com) WrongFormatException 을 throw 합니다.") + void emailIsWrong() { + user.setEmail(EMAIL_WRONG); + } + + @Test + @DisplayName(" phoneNumber 가 맞지 않으면 (01022223333555) WrongFormatException 을 throw 합니다.") + void phoneNumberIsWrong() { + user.setPhoneNumber(PHONE_NUMBER_WRONG); + } + + @Test + @DisplayName(" interest 가 맞지 않으면 (야구, 농구) WrongFormatException 을 throw 합니다.") + void interestIsWrong() { + user.setInterest(INTEREST_WRONG); + } + + @Test + @DisplayName(" name 이 null 이면 WrongFormatException 을 throw 합니다.") + void nameIsNULL() { + user.setName(STRING_NULL); + } + + @Test + @DisplayName(" name 이 빈칸이면 WrongFormatException 을 throw 합니다.") + void nameIsBlank() { + user.setName(STRING_BLANK); + } + } +} diff --git a/BE/signup/src/test/java/com/codesquad/signup/util/VerifyFormatUtilTest.java b/BE/signup/src/test/java/com/codesquad/signup/util/VerifyFormatUtilTest.java new file mode 100644 index 0000000..244f180 --- /dev/null +++ b/BE/signup/src/test/java/com/codesquad/signup/util/VerifyFormatUtilTest.java @@ -0,0 +1,178 @@ +package com.codesquad.signup.util; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +@DisplayName("VerifyFormatUtilTest") +class VerifyFormatUtilTest { + + final String STRING_NULL = null; + final String STRING_BLANK = ""; + + @Nested + @DisplayName("isCorrectUserIdFormat() 는 ") + class Describe_isCorrectUserIdFormat { + + final String USER_ID_NORMAL = "diane"; + final String USER_ID_WRONG = "dianeA"; + + @Test + @DisplayName("patameter 가 정상 (diane) 이면 ture 를 리턴합니다.") + void parameterIsNormal() { + assertTrue(VerifyFormatUtil.isCorrectUserIdFormat(USER_ID_NORMAL)); + } + + @Test + @DisplayName("patameter 가 대문자를 가지면 false 를 리턴합니다.") + void parameterIsWrong() { + assertFalse(VerifyFormatUtil.isCorrectUserIdFormat(USER_ID_WRONG)); + } + + @Test + @DisplayName("patameter 가 공백이면 false 를 리턴합니다.") + void parameterIsBlank() { + assertFalse(VerifyFormatUtil.isCorrectUserIdFormat(STRING_BLANK)); + } + + @Test + @DisplayName("patameter 가 Null 이면 false 를 리턴합니다.") + void parameterIsNull() { + assertFalse(VerifyFormatUtil.isCorrectUserIdFormat(STRING_NULL)); + } + } + + @Nested + @DisplayName("isCorrectPasswordFormat() 는 ") + class Describe_isCorrectPasswordFormat { + + final String PASSWORD_NORMAL = "123Qwer**"; + final String PASSWORD_WRONG = "123Qwer"; + + @Test + @DisplayName("patameter 가 정상 (1234Qwer**) 이면 ture 를 리턴합니다.") + void parameterIsNormal() { + assertTrue(VerifyFormatUtil.isCorrectPasswordFormat(PASSWORD_NORMAL)); + } + + @Test + @DisplayName("patameter 에 특수문자가 없으면 (1234Qwer) false 를 리턴합니다.") + void parameterIsWrong() { + assertFalse(VerifyFormatUtil.isCorrectPasswordFormat(PASSWORD_WRONG)); + } + + @Test + @DisplayName("patameter 가 공백이면 false 를 리턴합니다.") + void parameterIsBlank() { + assertFalse(VerifyFormatUtil.isCorrectPasswordFormat(STRING_BLANK)); + } + + @Test + @DisplayName("patameter 가 Null 이면 false 를 리턴합니다.") + void parameterIsNull() { + assertFalse(VerifyFormatUtil.isCorrectPasswordFormat(STRING_NULL)); + } + } + + @Nested + @DisplayName("isCorrectEmailFormat() 는 ") + class Describe_isCorrectEmailFormat { + + final String EMAIL_NORMAL = "abcd@gmail.com"; + final String EMAIL_WRONG = "abcdgmail.com"; + + @Test + @DisplayName("patameter 가 정상 (abcd@gmail.com) 이면 ture 를 리턴합니다.") + void parameterIsNormal() { + assertTrue(VerifyFormatUtil.isCorrectEmailFormat(EMAIL_NORMAL)); + } + + @Test + @DisplayName("patameter 에 @ 가 없으면 (abcdgmail.com) false 를 리턴합니다.") + void parameterIsWrong() { + assertFalse(VerifyFormatUtil.isCorrectEmailFormat(EMAIL_WRONG)); + } + + @Test + @DisplayName("patameter 가 공백이면 false 를 리턴합니다.") + void parameterIsBlank() { + assertFalse(VerifyFormatUtil.isCorrectEmailFormat(STRING_BLANK)); + } + + @Test + @DisplayName("patameter 가 Null 이면 false 를 리턴합니다.") + void parameterIsNull() { + assertFalse(VerifyFormatUtil.isCorrectEmailFormat(STRING_NULL)); + } + } + + @Nested + @DisplayName("isCorrectPhoneNumberFormat() 는 ") + class Describe_isCorrectPhoneNumberFormat { + + final String PHONE_NUMBER_NORMAL = "01022223333"; + final String PHONE_NUMBER_WRONG = "01022223333555"; + + @Test + @DisplayName("patameter 가 정상 (01022223333) 이면 ture 를 리턴합니다.") + void parameterIsNormal() { + assertTrue(VerifyFormatUtil.isCorrectPhoneNumberFormat(PHONE_NUMBER_NORMAL)); + } + + @Test + @DisplayName("patameter 가 11자리를 넘으면 (01022223333555) false 를 리턴합니다.") + void parameterIsWrong() { + assertFalse(VerifyFormatUtil.isCorrectPhoneNumberFormat(PHONE_NUMBER_WRONG)); + } + + @Test + @DisplayName("patameter 가 공백이면 false 를 리턴합니다.") + void parameterIsBlank() { + assertFalse(VerifyFormatUtil.isCorrectPhoneNumberFormat(STRING_BLANK)); + } + + @Test + @DisplayName("patameter 가 Null 이면 false 를 리턴합니다.") + void parameterIsNull() { + assertFalse(VerifyFormatUtil.isCorrectPhoneNumberFormat(STRING_NULL)); + } + } + + @Nested + @DisplayName("isCorrectInterestFormat() 는 ") + class Describe_isCorrectInterestFormat { + + final String INTEREST_NORMAL = "축구, 농구, 배구, 야구"; + final String INTEREST_WRONG = "야구, 농구"; + + @Test + @DisplayName("patameter 가 정상 (축구, 농구, 야구, 배구) 이면 ture 를 리턴합니다.") + void parameterIsNormal() { + + assertTrue(VerifyFormatUtil.isCorrectInterestFormat(INTEREST_NORMAL)); + } + + @Test + @DisplayName("patameter 가 ',' 로 3개 미만으로 구분되면 (야구, 농구) false 를 리턴합니다.") + void parameterIsWrong() { + assertFalse(VerifyFormatUtil.isCorrectInterestFormat(INTEREST_WRONG)); + } + + @Test + @DisplayName("patameter 가 공백이면 false 를 리턴합니다.") + void parameterIsBlank() { + assertFalse(VerifyFormatUtil.isCorrectInterestFormat(STRING_BLANK)); + } + + @Test + @DisplayName("patameter 가 Null 이면 false 를 리턴합니다.") + void parameterIsNull() { + assertFalse(VerifyFormatUtil.isCorrectInterestFormat(STRING_NULL)); + } + } +} diff --git a/FE/package-lock.json b/FE/package-lock.json new file mode 100644 index 0000000..a3397f4 --- /dev/null +++ b/FE/package-lock.json @@ -0,0 +1,4963 @@ +{ + "name": "FE", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/cli": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.8.4.tgz", + "integrity": "sha512-XXLgAm6LBbaNxaGhMAznXXaxtCWfuv6PIDJ9Alsy9JYTOh+j2jJz+L/162kkfU1j/pTSxK1xGmlwI4pdIMkoag==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.0.0", + "lodash": "^4.17.13", + "make-dir": "^2.1.0", + "slash": "^2.0.0", + "source-map": "^0.5.0" + } + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "dev": true, + "requires": { + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", + "dev": true, + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", + "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", + "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.0.tgz", + "integrity": "sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.380", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caniuse-lite": { + "version": "1.0.30001038", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz", + "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.386", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.386.tgz", + "integrity": "sha512-M7JHfp32Bq6Am59AWgglh2d3nqe6y8Y94Vcb/AXUsO3DGvKUHYI5ML9+U5oNShfdOEfurrrjKSoSgFt2mz7mpw==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + }, + "dependencies": { + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.42.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", + "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "requires": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "dependencies": { + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/FE/package.json b/FE/package.json new file mode 100644 index 0000000..e807180 --- /dev/null +++ b/FE/package.json @@ -0,0 +1,23 @@ +{ + "name": "FE", + "version": "1.0.0", + "description": "- Frontend : [Taek](https://github.com/seungdeng17)\r - Backend : [Diane](https://github.com/moonelysian), [Dan](https://github.com/Hyune-c)\r - iOS : [Delma](https://github.com/delmaSong?tab=repositories)", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "webpack" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/cli": "^7.8.4", + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "babel-loader": "^8.1.0" + }, + "dependencies": { + "webpack": "^4.42.1", + "webpack-cli": "^3.3.11" + } +} \ No newline at end of file diff --git a/FE/pages/login.html b/FE/pages/login.html new file mode 100644 index 0000000..648dfc3 --- /dev/null +++ b/FE/pages/login.html @@ -0,0 +1,28 @@ + + + + + + + login - + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/FE/pages/main.html b/FE/pages/main.html new file mode 100644 index 0000000..5ee72a4 --- /dev/null +++ b/FE/pages/main.html @@ -0,0 +1,32 @@ + + + + + + + main - + + + + +
+

Welcome !

+

+ user-name 님 반갑습니다. +

+ + +
+ + + + + \ No newline at end of file diff --git a/FE/pages/signup.html b/FE/pages/signup.html new file mode 100644 index 0000000..0f09925 --- /dev/null +++ b/FE/pages/signup.html @@ -0,0 +1,144 @@ + + + + + + + signup - + + + + + +
+ + + + +
+
+

개인정보 수집 및 이용에 대한 안내

+

+ 1. 개인정보처리방침의 의의
+ 네이버는 본 개인정보처리방침을 정보통신망법을 기준으로 작성하되, 네이버 내에서의 이용자 개인정보 처리 현황을 최대한 알기 쉽고 상세하게 설명하기 위해 노력하였습니다. + 이는 쉬운 용어를 사용한 개인정보처리방침 작성 원칙인 ‘Plain Language Privacy Policy(쉬운 용어를 사용한 개인정보처리방침)’를 도입한 것입니다. +


+ 2. 수집하는 개인정보
+ 이용자는 회원가입을 하지 않아도 정보 검색, 뉴스 보기 등 대부분의 네이버 서비스를 회원과 동일하게 이용할 수 있습니다. + 이용자가 메일, 캘린더, 카페, 블로그 등과 같이 개인화 혹은 회원제 서비스를 이용하기 위해 회원가입을 할 경우, 네이버는 서비스 이용을 위해 필요한 최소한의 개인정보를 + 수집합니다. +


+ 3. 네이버가 수집하는 개인정보 항목 및 수집방법
+ 회사는 이용자들이 회원서비스를 이용하기 위해 회원으로 가입하실 때 서비스 제공을 위한 필수적인 정보들을 온라인상에서 입력 받고 있습니다. 회원 가입 시에 받는 필수적인 정보는 + 이름, 주민등록번호, 이메일주소 등입니다. 또한 양질의 서비스 제공을 위하여 이용자들이 선택적으로 입력할 수 있는 사항으로서 전화번호 등을 입력 받고 있습니다. +


+ 4. 네이버가 수집하는 개인정보의 보유 및 이용기간
+ 이용자가 네이버의 회원으로서 회사에 제공하는 서비스를 이용하는 동안 회사는 이용자들의 개인정보를 계속적으로 보유하며 서비스 제공 등을 위해 이용합니다. 다만, 아래의 "6. 이용자 + 자신의 개인정보 관리(열람, 정정, 삭제 등)에 관한 사항" 에서 설명한 절차와 방법에 따라 회원 본인이 직접 삭제하거나 수정한 정보, 가입해지를 요청한 경우에는 재생할 수 없는 + 방법에 의하여 디스크에서 완전히 삭제하며 추후 열람이나 이용이 불가능한 상태로 처리됩니다. +

+ + +
+
+
+ + + + + \ No newline at end of file diff --git a/FE/src/css/loginStyle.css b/FE/src/css/loginStyle.css new file mode 100644 index 0000000..b26d229 --- /dev/null +++ b/FE/src/css/loginStyle.css @@ -0,0 +1,75 @@ +body, html { + width: 100%; + height: 100%; +} + +.wrap { + width: 100%; + height: 100%; + position: relative; +} + +.login-form-wrap { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-250px, -225px); + width: 500px; + height: 450px; + border: 1px solid #ccc; + background-color: #F8F9FA; + box-sizing: border-box; +} + +.login-form-wrap>fieldset { + width: 400px; + margin: 0 auto; + display: flex; + padding: 50px; +} + +.login-form-wrap input { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + outline: none; + border: 1px solid #afafaf; + text-indent: 10px; + border-radius: 0; + background-color: #fff; +} + +.login-form-wrap button { + background-color: #23cf19; + color: #fff; + font-size: 18px; + border: none; + outline: none; + cursor: pointer; +} + +.login-form-wrap input:focus { + border: 1px solid #23cf19; +} + +.login-title { + text-align: center; + margin-bottom: 40px; + color: #23cf19; + font-weight: bold; + font-size: 35px; +} + +.login-form-item { + width: 100%; + height: 50px; + margin-bottom: 15px; +} + +.login-form-item:last-child { + margin-bottom: 0; +} + +.login-password-input { + margin-bottom: 30px; +} \ No newline at end of file diff --git a/FE/src/css/mainStyle.css b/FE/src/css/mainStyle.css new file mode 100644 index 0000000..1059f95 --- /dev/null +++ b/FE/src/css/mainStyle.css @@ -0,0 +1,7 @@ +.user-info { + display: none; +} + +.user-info.active { + display: block; +} \ No newline at end of file diff --git a/FE/src/css/reset.css b/FE/src/css/reset.css new file mode 100644 index 0000000..69e9e1c --- /dev/null +++ b/FE/src/css/reset.css @@ -0,0 +1,50 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +/* HTML5 display-role reset for older browsers */ + +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +b { + font-weight: bold; +} + +input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} \ No newline at end of file diff --git a/FE/src/css/signupStyle.css b/FE/src/css/signupStyle.css new file mode 100644 index 0000000..faaf5de --- /dev/null +++ b/FE/src/css/signupStyle.css @@ -0,0 +1,234 @@ +/* common */ + +.signup-form-wrap, .clauses-wrap { + width: 500px; + margin: 0 auto; + border: 1px solid #ccc; + background-color: #F8F9FA; + box-sizing: border-box; +} + +/* signup */ + +.signup-content { + position: relative; + width: 470px; + margin: 0 auto; + margin-bottom: 20px; +} + +.signup-title { + text-align: center; + color: #23cf19; + font-weight: bold; + font-size: 35px; + margin-top: 20px; + margin-bottom: 50px; +} + +.signup-content label { + display: block; + font-weight: bold; + margin-bottom: 8px; + font-size: 14px; +} + +.signup-content input, .signup-content select { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + outline: none; + border: 1px solid #afafaf; + display: block; + width: 100%; + height: 40px; + text-indent: 10px; + border-radius: 0; + background-color: #fff; +} + +.signup-content input:focus, .signup-content select:focus { + border: 1px solid #23cf19; +} + +.signup-content .state-text { + margin-top: 3px; + height: 13px; + font-size: 13px; + color: #f00; +} + +.signup-content .state-text>span { + color: #23cf19; +} + +.signup-content .birth-date-input-wrap { + display: flex; +} + +.birth-date-input-wrap>select { + margin: 0 15px; +} + +.tags-input-wrap { + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + width: 100%; + border: 1px solid #afafaf; + background-color: #fff; +} + +.tag-ui-wrap { + display: flex; + flex-wrap: wrap; +} + +.tag-ui-wrap .tag-ui { + padding: 5px; + border: 1px solid #ccc; + margin: 5px; + margin-right: 0; + display: flex; + align-items: center; + border-radius: 3px; + background-color: #f2f2f2; +} + +.tag-ui .tag-ui-close { + font-size: 13px; + margin-left: 5px; + cursor: pointer; +} + +.tag-ui-wrap input { + flex: 1; + font-size: 16px; + outline: none; + border: none; + text-indent: 10px; +} + +.tag-ui-wrap input:focus { + border: none; +} + +.signup-content .clauses-agree-text { + font-weight: bold; + font-size: 14px; + text-decoration: underline; + cursor: pointer; +} + +.signup-content .clauses-agree-checkbox { + position: absolute; + top: 50%; + transform: translateY(-50%); + display: inline-block; + margin: 0; + margin-left: 10px; + width: 16px; + height: 16px; +} + +.signup-content .signup-btns-wrap { + display: flex; + justify-content: space-between; +} + +.signup-btns-wrap>button { + background-color: #23cf19; + color: #fff; + font-size: 18px; + border: none; + width: 227.5px; + height: 50px; + outline: none; + cursor: pointer; +} + +/* clauses */ + +.clauses-wrap { + display: none; +} + +.clauses-wrap.active { + display: block; + position: fixed; + top: 50%; + left: 50%; + margin: -125px -250px; +} + +.signup-blind.active { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #00000080; +} + +.clauses-content { + width: 450px; + margin: 20px auto; +} + +.clauses-title { + font-size: 15px; + font-weight: bold; + margin-bottom: 15px; +} + +.clauses-text-box { + padding: 10px; + line-height: 18px; + font-size: 13px; + width: 100%; + height: 130px; + overflow: auto; + margin-bottom: 20px; + outline: 1px solid #ccc; + background-color: #fff; + box-sizing: border-box; +} + +.clauses-text-box::-webkit-scrollbar { + width: 9px; +} + +.clauses-text-box::-webkit-scrollbar-thumb { + background-color: #ccc; +} + +.clauses-text-box::-webkit-scrollbar-track { + background-color: #f1f1f1; +} + +.clauses-agree-btn { + width: 180px; + height: 45px; + margin: 0 auto; + display: block; + background-color: #ccc; + border: none; + color: #fff; + font-size: 16px; + outline: none; +} + +.clauses-agree-btn.active { + background-color: #23cf19; + cursor: pointer; +} + +.clauses-close-btn { + position: absolute; + right: 10px; + top: 10px; + cursor: pointer; + border: none; + outline: none; + background-color: transparent; +} \ No newline at end of file diff --git a/FE/src/js/constants/constant.js b/FE/src/js/constants/constant.js new file mode 100644 index 0000000..bf5714e --- /dev/null +++ b/FE/src/js/constants/constant.js @@ -0,0 +1,77 @@ +export const VALID_CHECK_REGEX = { + ID: /^[a-z0-9-_]{5,20}$/, + PASSWORD: { + LENGTH: /.{8,16}$/, + UPPER: /^(?=.*[A-Z])/, + NUMBER: /^(?=.*[0-9])/, + SPECIAL: /^((?=.*\d)|(?=.*\W))/ + }, + EMAIL: /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i, + PHONE_NUMBER: /^010\d{3,4}\d{4}$/ +} + +export const STATE_MESSAGE = { + VALID: { + DEFALUT: ' ', + ID: '사용 가능한 아이디입니다.', + PASSWORD: '안전한 비밀번호입니다.', + PASSWORD_RECHECK: '비밀번호가 일치합니다.', + }, + INVALID: { + ID: '5~20자의 영문 소문자, 숫자와 특수기호(_)(-) 만 사용 가능합니다.', + PASSWORD: { + LENGTH: '8자 이상 16자 이하로 입력해주세요.', + UPPER: '영문 대문자를 최소 1자 이상 포함해주세요.', + NUMBER: '숫자를 최소 1자 이상 포함해주세요.', + SPECIAL: '특수문자를 최소 1자 이상 포함해주세요.', + }, + PASSWORD_RECHECK: '비밀번호가 일치하지 않습니다.', + BIRTH_DATE: { + BASE: '생년월일을 모두 입력해주세요.', + YEAR: '태어난 년도 4자리를 정확하게 입력하세요.', + DAY: '태어난 날짜를 정확하게 입력하세요.', + AGE: '만 14세 이상 99세 이하만 가입 가능합니다.' + }, + EMAIL: '이메일 주소를 다시 확인해주세요.', + PHONE_NUMBER: '형식에 맞지 않는 번호입니다.', + INTERESTS: '3개 이상의 관심사를 입력하세요.' + }, + DUPLICATE: { + ID: '이미 사용 중인 아이디입니다.', + EMAIL: '이미 사용 중인 이메일입니다.', + PHONE_NUMBER: '이미 사용 중인 휴대전화입니다.' + } +} + +export const ALERT_MESSAGE = { + RESET: '모든 내용을 새로 작성하시겠습니까?', + JOIN_INVALID: { + ID: '아이디를 확인해주세요.', + PASSWORD: '비밀번호를 확인해주세요.', + NAME: '이름을 확인해주세요.', + BIRTH_DATE: '생년월일을 확인해주세요.', + GENDER: '성별을 확인해주세요.', + EMAIL: '이메일을 확인해주세요.', + PHONE_NUMBER: '휴대전화를 확인해주세요.', + INTERESTS: '관심사를 확인해주세요.', + CLAUSES: '약관에 동의하지 않으셨습니다.' + }, + JOIN_FAIL: '회원가입에 살패했습니다! 다시 시도해주세요.', + LOGIN_FAIL: '아이디 또는 비밀번호를 다시 확인해주세요.' +} + +export const FORM_RULES = { + YEAR_MAX_LENGTH: 4, + DAY_MIN_LENGTH: 1, + DAY_MAX_LENGTH: 2, + AGE_MIN: 14, + AGE_MAX: 99, + NOT_DIGIT: 10, + INTERESTS_MIN: 3, + ACTIVE_KEY: 'active' +} + +export const STATUS = { + SUCCESS: 200, + CONFLICT: 409 +} \ No newline at end of file diff --git a/FE/src/js/constants/url.js b/FE/src/js/constants/url.js new file mode 100644 index 0000000..0ce0252 --- /dev/null +++ b/FE/src/js/constants/url.js @@ -0,0 +1,10 @@ +export const URL = { + DEV: { + ID_CHECK_API: '/duplicate?userId=', + EMAIL_CHECK_API: '/duplicate?email=', + PHONE_NUMBER_CHECK_API: '/duplicate?phone=', + JOIN_API: '/join', + LOGIN_API: '/login' + }, + PROD: {} +} \ No newline at end of file diff --git a/FE/src/js/data/signupData.js b/FE/src/js/data/signupData.js new file mode 100644 index 0000000..f2ae67e --- /dev/null +++ b/FE/src/js/data/signupData.js @@ -0,0 +1,43 @@ +export const signupData = { + userId: null, + password: null, + passwordRecheck: null, + name: null, + year: null, + month: null, + day: null, + sex: null, + email: null, + phoneNumber: null, + interest: null, + clausesAgree: null +} + +const signupJSON = { + userId: null, + password: null, + name: null, + birthday: null, + sex: null, + email: null, + phoneNumber: null, + interest: null +} + +export function makeSignupJSON() { + signupJSON.userId = signupData.userId; + signupJSON.password = signupData.password; + signupJSON.name = signupData.name; + signupJSON.birthday = `${signupData.year}-${signupData.month}-${signupData.day}`; + signupJSON.sex = signupData.sex; + signupJSON.email = signupData.email; + signupJSON.phoneNumber = signupData.phoneNumber; + signupJSON.interest = signupData.interest.join(', '); + return signupJSON; +} + +export function resetSignupData() { + for (let key in signupData) { + signupData[key] = null; + } +} \ No newline at end of file diff --git a/FE/src/js/http/request.js b/FE/src/js/http/request.js new file mode 100644 index 0000000..f26b29d --- /dev/null +++ b/FE/src/js/http/request.js @@ -0,0 +1,61 @@ +import { URL } from '../constants/url.js'; +import { FORM_RULES, ALERT_MESSAGE, STATUS } from '../constants/constant.js'; +import { getElement, classAdd } from '../util/commonUtil.js'; + +const fetchOption = { + method: 'POST', + mode: 'cors', + headers: { 'Content-Type': 'application/json' }, +}; +const HOST = 'https://' + window.location.host; + +export function joinRequest(userData) { + const signupBlind = getElement('#signup-blind'); + classAdd(signupBlind, FORM_RULES.ACTIVE_KEY); + fetchOption.body = JSON.stringify(userData); + fetch(HOST + URL.DEV.JOIN_API, fetchOption) + .then(res => checkJoin(res, makeLoginData(userData))); +} + +function makeLoginData(userData) { + const loginData = {}; + loginData.userId = userData.userId; + loginData.password = userData.password; + return loginData; +} + +function checkJoin(res, loginData) { + if (res.status === STATUS.SUCCESS) loginRequest(loginData); + else alert(ALERT_MESSAGE.JOIN_FAIL); +} + +export function loginRequest(loginData) { + fetchOption.body = JSON.stringify(loginData); + fetch(HOST + URL.DEV.LOGIN_API, fetchOption) + .then(checkLogin); +} + +function checkLogin(res) { + if (res.status === STATUS.SUCCESS) window.location.href = './main'; + else alert(ALERT_MESSAGE.LOGIN_FAIL); +} + +export function checkIdDuplicateRequest(id) { + return fetch(HOST + URL.DEV.ID_CHECK_API + id) + .then(checkDuplicate); +} + +export function checkEmailDuplicateRequest(email) { + return fetch(HOST + URL.DEV.EMAIL_CHECK_API + email) + .then(checkDuplicate); +} + +export function checkPhoneNumberDuplicateRequest(number) { + return fetch(HOST + URL.DEV.PHONE_NUMBER_CHECK_API + number) + .then(checkDuplicate); +} + +function checkDuplicate(res) { + if (res.status === STATUS.SUCCESS) return true; + else if (res.status === STATUS.CONFLICT) return false; +} \ No newline at end of file diff --git a/FE/src/js/login/loginMain.js b/FE/src/js/login/loginMain.js new file mode 100644 index 0000000..f234193 --- /dev/null +++ b/FE/src/js/login/loginMain.js @@ -0,0 +1,26 @@ +import { getElement } from '../util/commonUtil.js'; +import { loginRequest } from '../http/request.js'; + +const loginForm = getElement('.login-form-wrap'); +const signupBtn = getElement('.signup-btn'); + +loginForm.addEventListener('submit', loginBtnSubmitHandle); +signupBtn.addEventListener('click', signupBtnClickHandle); + +function loginBtnSubmitHandle(evt) { + evt.preventDefault(); + loginRequest(makeLoginData()); +} + +function makeLoginData() { + const loginFormData = new FormData(loginForm); + const loginData = {}; + for (let [key, value] of loginFormData) { + loginData[key] = value; + } + return loginData; +} + +function signupBtnClickHandle() { + window.location.href = './joinForm'; +} \ No newline at end of file diff --git a/FE/src/js/main/main.js b/FE/src/js/main/main.js new file mode 100644 index 0000000..39f8864 --- /dev/null +++ b/FE/src/js/main/main.js @@ -0,0 +1,10 @@ +import { getElement, classAdd, classRemove } from '../util/commonUtil.js'; +import { FORM_RULES } from '../constants/constant.js'; + +const userInfoBtn = getElement('.user-info-btn'); +const userInfo = getElement('.user-info'); + +userInfoBtn.addEventListener('click', () => { + if (!userInfo.classList.contains(FORM_RULES.ACTIVE_KEY)) classAdd(userInfo, FORM_RULES.ACTIVE_KEY); + else classRemove(userInfo, FORM_RULES.ACTIVE_KEY); +}); \ No newline at end of file diff --git a/FE/src/js/signup/clauses.js b/FE/src/js/signup/clauses.js new file mode 100644 index 0000000..4b547f4 --- /dev/null +++ b/FE/src/js/signup/clauses.js @@ -0,0 +1,32 @@ +import { FORM_RULES } from '../constants/constant.js'; +import { getElement, classAdd, classRemove } from '../util/commonUtil.js'; +import { signupData } from '../data/signupData.js'; + +export function openClauses(...elements) { + elements.forEach(el => classAdd(el, FORM_RULES.ACTIVE_KEY)); + const clausesTextBox = getElement('#clauses-text-box'); + clausesTextBox.scrollTop = 0; +} + +export function closeClauses(...elements) { + elements.forEach(el => classRemove(el, FORM_RULES.ACTIVE_KEY)); +} + +export function activeClausesAgreeBtn(clausesTextBox) { + if (!(clausesTextBox.clientHeight + clausesTextBox.scrollTop >= clausesTextBox.scrollHeight)) return; + clausesAgreeBtnToggle(true); +} + +export function clausesAgree(...elements) { + const clausesAgreeCheckbox = getElement('.clauses-agree-checkbox'); + clausesAgreeCheckbox.checked = true; + signupData.clausesAgree = true; + closeClauses(...elements); +} + +export function clausesAgreeBtnToggle(isActive) { + const clausesAgreeBtn = getElement('.clauses-agree-btn'); + if (isActive) classAdd(clausesAgreeBtn, FORM_RULES.ACTIVE_KEY); + else classRemove(clausesAgreeBtn, FORM_RULES.ACTIVE_KEY); + clausesAgreeBtn.disabled = !isActive; +} \ No newline at end of file diff --git a/FE/src/js/signup/signupButtons.js b/FE/src/js/signup/signupButtons.js new file mode 100644 index 0000000..6ef97c9 --- /dev/null +++ b/FE/src/js/signup/signupButtons.js @@ -0,0 +1,54 @@ +import { ALERT_MESSAGE } from '../constants/constant.js'; +import { getElement, getElements } from '../util/commonUtil.js'; +import { resetSignupData, signupData, makeSignupJSON } from '../data/signupData.js'; +import { resetTag } from './userInterests.js'; +import { clausesAgreeBtnToggle } from './clauses.js'; +import { joinRequest } from '../http/request.js'; + +export function signupResetBtnHandle() { + if (!confirm(ALERT_MESSAGE.RESET)) return; + const signupFormWrap = getElement('.signup-form-wrap'); + const stateText = getElements('.state-text'); + signupFormWrap.reset(); + stateText.forEach(el => el.innerHTML = ''); + clausesAgreeBtnToggle(false); + resetSignupData(); + resetTag(); +} + +export function signupJoinBtnHandle() { + for (let [key, value] of Object.entries(signupData)) { + if (value) continue; + notifyJoinError(key); + return; + } + joinRequest(makeSignupJSON()); +} + +function notifyJoinError(key) { + switch (key) { + case "userId": alert(ALERT_MESSAGE.JOIN_INVALID.ID); + break; + case "password": alert(ALERT_MESSAGE.JOIN_INVALID.PASSWORD); + break; + case "passwordRecheck": alert(ALERT_MESSAGE.JOIN_INVALID.PASSWORD); + break; + case "name": alert(ALERT_MESSAGE.JOIN_INVALID.NAME); + break; + case "year": alert(ALERT_MESSAGE.JOIN_INVALID.BIRTH_DATE); + break; + case "month": alert(ALERT_MESSAGE.JOIN_INVALID.BIRTH_DATE); + break; + case "day": alert(ALERT_MESSAGE.JOIN_INVALID.BIRTH_DATE); + break; + case "sex": alert(ALERT_MESSAGE.JOIN_INVALID.GENDER); + break; + case "email": alert(ALERT_MESSAGE.JOIN_INVALID.EMAIL); + break; + case "phoneNumber": alert(ALERT_MESSAGE.JOIN_INVALID.PHONE_NUMBER); + break; + case "interest": alert(ALERT_MESSAGE.JOIN_INVALID.INTERESTS); + break; + case "clausesAgree": alert(ALERT_MESSAGE.JOIN_INVALID.CLAUSES); + } +} \ No newline at end of file diff --git a/FE/src/js/signup/signupEventManager.js b/FE/src/js/signup/signupEventManager.js new file mode 100644 index 0000000..2639e1a --- /dev/null +++ b/FE/src/js/signup/signupEventManager.js @@ -0,0 +1,83 @@ +import { getElement } from '../util/commonUtil.js'; +import { updateState, updateStateInterests } from '../util/signupUtil.js'; +import { checkId, checkPassword, recheckPassword } from './userIdPassword.js'; +import { checkYear, checkMonth, checkDay, checkEmail, checkPhoneNumber, checkName, checkGender } from './userPersonalData.js'; +import { addInterests, removeInterests, removeInterestsOnClick } from './userInterests.js'; +import { openClauses, closeClauses, activeClausesAgreeBtn, clausesAgree } from './clauses.js'; +import { signupResetBtnHandle, signupJoinBtnHandle } from './signupButtons.js'; + +const signupFormWrap = getElement('.signup-form-wrap'); +const clausesWrap = getElement('.clauses-wrap'); +const signupBlind = getElement('#signup-blind'); +const signupInterests = getElement('#signup-interests'); +const clausesTextBox = getElement('#clauses-text-box'); +const tagUiWrap = getElement('#tag-ui-wrap'); + +export function initSignupEvent() { + signupFormWrap.addEventListener('input', formInputEventDelegation); + signupFormWrap.addEventListener('change', formChageEventDelegation); + signupFormWrap.addEventListener('click', formClickEventDelegation); + + signupInterests.addEventListener('keyup', (event) => updateStateInterests(addInterests, event, tagUiWrap, signupInterests)); + signupInterests.addEventListener('keydown', (event) => updateStateInterests(removeInterests, event, tagUiWrap, signupInterests)); + tagUiWrap.addEventListener('click', (event) => updateStateInterests(removeInterestsOnClick, event, tagUiWrap)); +} + +export function initClausesEvent() { + clausesWrap.addEventListener('click', clausesClickEventDelegation); + clausesTextBox.addEventListener('scroll', ({ target }) => activeClausesAgreeBtn(target)); +} + +function formInputEventDelegation({ target }) { + switch (target.id) { + case 'signup-password': updateState(checkPassword, target); + break; + case 'signup-password-recheck': updateState(recheckPassword, target, getElement('#signup-password').value); + break; + case 'signup-name': checkName(target.value); + break; + case 'signup-gender': checkGender(target.value); + break; + default: break; + } +} + +function formChageEventDelegation({ target }) { + switch (target.id) { + case 'signup-id': updateState(checkId, target); + break; + case 'birth-date-year': updateState(checkYear, target); + break; + case 'birth-date-month': updateState(checkMonth, target); + break; + case 'birth-date-day': updateState(checkDay, target); + break; + case 'signup-email': updateState(checkEmail, target); + break; + case 'signup-phone-number': updateState(checkPhoneNumber, target); + break; + default: break; + } +} + +function formClickEventDelegation({ target }) { + switch (target.id) { + case 'clauses-agree-text': openClauses(signupBlind, clausesWrap); + break; + case 'signup-reset-btn': signupResetBtnHandle(); + break; + case 'signup-join-btn': signupJoinBtnHandle(); + break; + default: break; + } +} + +function clausesClickEventDelegation({ target }) { + switch (target.id) { + case 'clauses-close-btn': closeClauses(signupBlind, clausesWrap); + break; + case 'clauses-agree-btn': clausesAgree(signupBlind, clausesWrap); + break; + default: break; + } +} \ No newline at end of file diff --git a/FE/src/js/signup/signupMain.js b/FE/src/js/signup/signupMain.js new file mode 100644 index 0000000..6e65c1d --- /dev/null +++ b/FE/src/js/signup/signupMain.js @@ -0,0 +1,4 @@ +import { initSignupEvent, initClausesEvent } from './signupEventManager.js'; + +initSignupEvent(); +initClausesEvent(); \ No newline at end of file diff --git a/FE/src/js/signup/userIdPassword.js b/FE/src/js/signup/userIdPassword.js new file mode 100644 index 0000000..11923d6 --- /dev/null +++ b/FE/src/js/signup/userIdPassword.js @@ -0,0 +1,36 @@ +import { VALID_CHECK_REGEX, STATE_MESSAGE } from '../constants/constant.js'; +import { signupData } from '../data/signupData.js'; +import { checkIdDuplicateRequest } from '../http/request.js'; + +export async function checkId(id) { + signupData.userId = null; + const checkIdCondition = id.search(VALID_CHECK_REGEX.ID); + if (checkIdCondition) return STATE_MESSAGE.INVALID.ID; + if (!await checkIdDuplicateRequest(id).then(res => res)) return STATE_MESSAGE.DUPLICATE.ID; + signupData.userId = id; + return STATE_MESSAGE.VALID.ID; +} + +export function checkPassword(password) { + signupData.password = null; + const checkLength = password.search(VALID_CHECK_REGEX.PASSWORD.LENGTH); + if (checkLength) return STATE_MESSAGE.INVALID.PASSWORD.LENGTH; + + const checkUpper = password.search(VALID_CHECK_REGEX.PASSWORD.UPPER); + if (checkUpper) return STATE_MESSAGE.INVALID.PASSWORD.UPPER; + + const checkNumber = password.search(VALID_CHECK_REGEX.PASSWORD.NUMBER); + if (checkNumber) return STATE_MESSAGE.INVALID.PASSWORD.NUMBER; + + const checkSpecial = password.replace(/[0-9]/g, '').search(VALID_CHECK_REGEX.PASSWORD.SPECIAL); + if (checkSpecial) return STATE_MESSAGE.INVALID.PASSWORD.SPECIAL; + signupData.password = password; + return STATE_MESSAGE.VALID.PASSWORD; +} + +export function recheckPassword(password, originPassword) { + signupData.passwordRecheck = null; + if (password !== originPassword) return STATE_MESSAGE.INVALID.PASSWORD_RECHECK; + signupData.passwordRecheck = password; + return STATE_MESSAGE.VALID.PASSWORD_RECHECK; +} \ No newline at end of file diff --git a/FE/src/js/signup/userInterests.js b/FE/src/js/signup/userInterests.js new file mode 100644 index 0000000..c9e5155 --- /dev/null +++ b/FE/src/js/signup/userInterests.js @@ -0,0 +1,57 @@ +import { STATE_MESSAGE, FORM_RULES } from '../constants/constant.js'; +import { getElements } from '../util/commonUtil.js'; +import { signupData } from '../data/signupData.js'; + +const tags = []; + +export function addInterests({ key }, tagUiWrap, signupInterests) { + if (key !== ',') return; + const interest = signupInterests.value.replace(/[,]/g, ''); + signupInterests.value = ''; + if (!interest) return; + tags.push(interest); + return updateTag(tagUiWrap); +} + +export function removeInterests({ key }, tagUiWrap, signupInterests) { + if (!checkRemoveCondition(key, signupInterests)) return; + signupInterests.value = tags.pop() + ' '; + return updateTag(tagUiWrap); +} + +function checkRemoveCondition(key, signupInterests) { + if (tags.length > 0 && signupInterests.value === '' && (key === 'Backspace' || key === 'Delete')) return true; + return false; +} + +export function removeInterestsOnClick({ target }, tagUiWrap) { + if (!target.classList.contains('tag-ui-close')) return; + const data = target.getAttribute('data-item'); + const index = tags.indexOf(data); + tags.splice(index, 1); + return updateTag(tagUiWrap); +} + +export function resetTag() { + getElements('.tag-ui').forEach(tag => tag.parentElement.removeChild(tag)); +} + +function checkInterests() { + signupData.interest = null; + if (tags.length < FORM_RULES.INTERESTS_MIN) return STATE_MESSAGE.INVALID.INTERESTS; + signupData.interest = tags; + return STATE_MESSAGE.VALID.DEFALUT; +} + +function createTag(interest) { + const tag = document.createElement('span'); + tag.setAttribute('class', 'tag-ui'); + tag.innerHTML = `${interest}`; + return tag; +} + +function updateTag(tagUiWrap) { + resetTag(); + tags.slice().reverse().forEach(tag => tagUiWrap.prepend(createTag(tag))); + return checkInterests(); +} \ No newline at end of file diff --git a/FE/src/js/signup/userPersonalData.js b/FE/src/js/signup/userPersonalData.js new file mode 100644 index 0000000..0c67980 --- /dev/null +++ b/FE/src/js/signup/userPersonalData.js @@ -0,0 +1,82 @@ +import { VALID_CHECK_REGEX, STATE_MESSAGE, FORM_RULES } from '../constants/constant.js'; +import { getElement } from '../util/commonUtil.js'; +import { signupData } from '../data/signupData.js'; +import { checkEmailDuplicateRequest, checkPhoneNumberDuplicateRequest } from '../http/request.js'; + +export function checkYear(year) { + signupData.year = null; + if (year.length !== FORM_RULES.YEAR_MAX_LENGTH) return STATE_MESSAGE.INVALID.BIRTH_DATE.YEAR; + return checkBirthDate(); +} + +export function checkMonth(month) { + signupData.month = month; + return checkBirthDate(); +} + +export function checkDay(day) { + signupData.day = null; + if (day.length < FORM_RULES.DAY_MIN_LENGTH || day.length > FORM_RULES.DAY_MAX_LENGTH) return STATE_MESSAGE.INVALID.BIRTH_DATE.DAY; + return checkBirthDate(); +} + +function checkBirthDate() { + const inputYear = getElement('#birth-date-year').value; + const inputMonth = getElement('#birth-date-month').value; + const inputDay = getElement('#birth-date-day').value; + const lastDay = new Date(inputYear, inputMonth, 0).getDate(); + + if (!inputYear || !inputMonth || !inputDay) return STATE_MESSAGE.INVALID.BIRTH_DATE.BASE; + if (lastDay < inputDay || 0 >= inputDay) return STATE_MESSAGE.INVALID.BIRTH_DATE.DAY; + if (!checkAge(inputYear, inputMonth, inputDay)) return STATE_MESSAGE.INVALID.BIRTH_DATE.AGE; + signupData.year = inputYear; + signupData.day = inputDay < FORM_RULES.NOT_DIGIT ? '0' + inputDay : inputDay; + return; +} + +function checkAge(year, month, day) { + const age = calcAge(year, month, day < FORM_RULES.NOT_DIGIT ? '0' + day : day); + if (age < FORM_RULES.AGE_MIN || age > FORM_RULES.AGE_MAX) return false; + return true; +} + +function calcAge(year, month, day) { + const date = new Date(); + const curYear = date.getFullYear(); + let curMonth = (date.getMonth() + 1); + let curDay = date.getDate(); + if (curMonth < FORM_RULES.NOT_DIGIT) curMonth = '0' + curMonth; + if (curDay < FORM_RULES.NOT_DIGIT) curDay = '0' + curDay; + const curMonthDay = curMonth + curDay; + const inputYear = year; + const inputMonthDay = month + day; + const age = curMonthDay < inputMonthDay ? curYear - inputYear - 1 : curYear - inputYear; + return age; +} + +export async function checkEmail(email) { + signupData.email = null; + const checkEmail = email.search(VALID_CHECK_REGEX.EMAIL); + if (checkEmail) return STATE_MESSAGE.INVALID.EMAIL; + if (!await checkEmailDuplicateRequest(email).then(res => res)) return STATE_MESSAGE.DUPLICATE.EMAIL; + signupData.email = email; + return; +} + +export async function checkPhoneNumber(number) { + signupData.phoneNumber = null; + const checkNumber = number.search(VALID_CHECK_REGEX.PHONE_NUMBER); + if (checkNumber) return STATE_MESSAGE.INVALID.PHONE_NUMBER; + if (!await checkPhoneNumberDuplicateRequest(number).then(res => res)) return STATE_MESSAGE.DUPLICATE.PHONE_NUMBER; + signupData.phoneNumber = number; + return; +} + +export function checkName(name) { + signupData.name = null; + if (name) signupData.name = name; +} + +export function checkGender(gender) { + signupData.sex = gender; +} \ No newline at end of file diff --git a/FE/src/js/util/commonUtil.js b/FE/src/js/util/commonUtil.js new file mode 100644 index 0000000..7a42ca5 --- /dev/null +++ b/FE/src/js/util/commonUtil.js @@ -0,0 +1,15 @@ +export function getElement(target) { + return document.querySelector(target); +} + +export function getElements(target) { + return document.querySelectorAll(target); +} + +export function classAdd(target, className) { + target.classList.add(className); +} + +export function classRemove(target, className) { + target.classList.remove(className); +} \ No newline at end of file diff --git a/FE/src/js/util/signupUtil.js b/FE/src/js/util/signupUtil.js new file mode 100644 index 0000000..aac9620 --- /dev/null +++ b/FE/src/js/util/signupUtil.js @@ -0,0 +1,12 @@ +export async function updateState(checkCallBackFunc, target, ...additional) { + let stateMessage = checkCallBackFunc(target.value, ...additional); + if (typeof stateMessage === 'object') stateMessage = await stateMessage.then(res => res); + if (!stateMessage) stateMessage = ''; + target.closest('.signup-content').querySelector('.state-text').innerHTML = stateMessage; +} + +export function updateStateInterests(checkCallBackFunc, event, ...additional) { + let stateMessage = checkCallBackFunc(event, ...additional); + if (!stateMessage) return; + event.target.closest('.signup-content').querySelector('.state-text').innerHTML = stateMessage; +} \ No newline at end of file diff --git a/FE/webpack.config.js b/FE/webpack.config.js new file mode 100644 index 0000000..95a7dcb --- /dev/null +++ b/FE/webpack.config.js @@ -0,0 +1,19 @@ +const path = require('path'); + +module.exports = { + mode: "development", + entry: "./src/js/signup/signupMain.js", + output: { + path: path.resolve("./src/js", "dist"), + filename: "signup.bundle.js", + }, + module: { + rules: [ + { + test: /\.js$/, + use: 'babel-loader', + exclude: /node_modules/ + } + ] + } +} \ No newline at end of file diff --git a/README.md b/README.md index 5e66a4b..9ae5456 100644 --- a/README.md +++ b/README.md @@ -69,4 +69,6 @@ [포스트 맨](https://documenter.getpostman.com/view/3004320/SzS8sk7n?version=latest)
-## 배포 URL \ No newline at end of file +## 배포 URL +[헤로쿠](https://signup-5-test-deploy.herokuapp.com/loginForm) +
diff --git a/iOS/Demo/demo.gif b/iOS/Demo/demo.gif new file mode 100644 index 0000000..8293542 Binary files /dev/null and b/iOS/Demo/demo.gif differ diff --git a/iOS/README.md b/iOS/README.md deleted file mode 100644 index 78357fb..0000000 --- a/iOS/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# SignUp - -### Members - -- Frontend : [Taek](https://github.com/seungdeng17) -- Backend : [Diane](https://github.com/moonelysian), [Dan](https://github.com/Hyune-c) -- iOS : [Delma](https://github.com/delmaSong?tab=repositories) - - - -
- - - -## Ground Rules - -
- -### Branch - -- Master : 릴리즈될 최종 버전 코드 -- Dev : 각 기능 구현 후 머지 되는 브랜치 -- 클래스/Feature/ : 각 역할별 기능 구현 브랜치. 추후 Dev에 머지 - -
- -### Scrum - -- 시간 : 매일 오전 11시 -- 진행상황 및 이슈, 오늘 할 일 공유 - -
- -### Issue Tracker - -- Github Project Boards : 각 파트별로 진행사항 정리해 한눈에 확인 가능하도록 함 -- Github Issue : 프론트-서버간 통신이 필요한 기능을 이슈로 생성해 공유 - -
- -### Commit Message Guide - - -- Feat : 새로운 기능 추가시 사용 -- Refactor : 전면 수정이 있을 때 사용 -- Fix : 올바르지 않은 동작을 고친 경우에 사용 -- Remove : 코드의 삭제가 있을 때 사용 -- Add : 코드나 테스트, 예제, 문서 등의 추가가 있을 때 사용 -- Update : 원래도 정상적으로 동작하고 있었지만, 수정, 추가, 보완시 사용 - -[참고](https://blog.ull.im/engineering/2019/03/10/logs-on-git.html) - -
- - - - - -## 요구사항 분석 - -[문서](https://docs.google.com/spreadsheets/d/1TymIOeVNU-PpaC1UUimeTzmj-AlIpl9B2_dCUD0S2-8/edit?usp=sharing) - - -## API 문서 - -
- -## 배포 URL \ No newline at end of file diff --git a/iOS/SignUp/SignUp.xcodeproj/project.pbxproj b/iOS/SignUp/SignUp.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c07e522 --- /dev/null +++ b/iOS/SignUp/SignUp.xcodeproj/project.pbxproj @@ -0,0 +1,570 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 3000A0A52429D5C3005DD7B4 /* IdTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3000A0A42429D5C3005DD7B4 /* IdTextField.swift */; }; + 3036A8C3242A44C500436DFF /* PasswordTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3036A8C2242A44C500436DFF /* PasswordTextField.swift */; }; + 3036A8C5242A4B5200436DFF /* PasswordConfirmTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3036A8C4242A4B5200436DFF /* PasswordConfirmTextField.swift */; }; + 3036A8C7242A4BBA00436DFF /* NameTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3036A8C6242A4BBA00436DFF /* NameTextField.swift */; }; + 305C2F9A242D9F7D00366378 /* InterestCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305C2F99242D9F7D00366378 /* InterestCollectionView.swift */; }; + 305C2F9D242DA9B200366378 /* InterestCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 305C2F9C242DA9B200366378 /* InterestCollectionViewCell.swift */; }; + 30769F03242664D100D03360 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30769F02242664D100D03360 /* AppDelegate.swift */; }; + 30769F05242664D100D03360 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30769F04242664D100D03360 /* SceneDelegate.swift */; }; + 30769F07242664D100D03360 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30769F06242664D100D03360 /* ViewController.swift */; }; + 30769F0A242664D100D03360 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 30769F08242664D100D03360 /* Main.storyboard */; }; + 30769F0C242664D600D03360 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 30769F0B242664D600D03360 /* Assets.xcassets */; }; + 30769F0F242664D600D03360 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 30769F0D242664D600D03360 /* LaunchScreen.storyboard */; }; + 30EBC414242F1BA900078AF0 /* RequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EBC413242F1BA900078AF0 /* RequestManager.swift */; }; + 30EBC417242F1F4900078AF0 /* UserInfomation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EBC416242F1F4900078AF0 /* UserInfomation.swift */; }; + 30EBC419242F71D200078AF0 /* EncodeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30EBC418242F71D200078AF0 /* EncodeManager.swift */; }; + 30FCD3322427279D00FE4D44 /* PersonalInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FCD3312427279D00FE4D44 /* PersonalInfoViewController.swift */; }; + 30FCD334242727C900FE4D44 /* TermsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FCD333242727C900FE4D44 /* TermsViewController.swift */; }; + 30FCD336242727E600FE4D44 /* InterestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FCD335242727E600FE4D44 /* InterestViewController.swift */; }; + 30FCD338242727F700FE4D44 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FCD337242727F700FE4D44 /* LoginViewController.swift */; }; + 30FCD36024277CC800FE4D44 /* SignUpTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30FCD35F24277CC800FE4D44 /* SignUpTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 30FCD36224277CC800FE4D44 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 30769EF7242664D100D03360 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 30769EFE242664D100D03360; + remoteInfo = SignUp; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 3000A0A42429D5C3005DD7B4 /* IdTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdTextField.swift; sourceTree = ""; }; + 3036A8C2242A44C500436DFF /* PasswordTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordTextField.swift; sourceTree = ""; }; + 3036A8C4242A4B5200436DFF /* PasswordConfirmTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordConfirmTextField.swift; sourceTree = ""; }; + 3036A8C6242A4BBA00436DFF /* NameTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NameTextField.swift; sourceTree = ""; }; + 305C2F99242D9F7D00366378 /* InterestCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterestCollectionView.swift; sourceTree = ""; }; + 305C2F9C242DA9B200366378 /* InterestCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterestCollectionViewCell.swift; sourceTree = ""; }; + 30769EFF242664D100D03360 /* SignUp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SignUp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 30769F02242664D100D03360 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 30769F04242664D100D03360 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 30769F06242664D100D03360 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 30769F09242664D100D03360 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 30769F0B242664D600D03360 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 30769F0E242664D600D03360 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 30769F10242664D600D03360 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 30EBC413242F1BA900078AF0 /* RequestManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestManager.swift; sourceTree = ""; }; + 30EBC416242F1F4900078AF0 /* UserInfomation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInfomation.swift; sourceTree = ""; }; + 30EBC418242F71D200078AF0 /* EncodeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncodeManager.swift; sourceTree = ""; }; + 30FCD3312427279D00FE4D44 /* PersonalInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonalInfoViewController.swift; sourceTree = ""; }; + 30FCD333242727C900FE4D44 /* TermsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsViewController.swift; sourceTree = ""; }; + 30FCD335242727E600FE4D44 /* InterestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterestViewController.swift; sourceTree = ""; }; + 30FCD337242727F700FE4D44 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; + 30FCD35D24277CC800FE4D44 /* SignUpTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SignUpTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 30FCD35F24277CC800FE4D44 /* SignUpTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpTests.swift; sourceTree = ""; }; + 30FCD36124277CC800FE4D44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 30769EFC242664D100D03360 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 30FCD35A24277CC800FE4D44 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3000A09E2429903B005DD7B4 /* View */ = { + isa = PBXGroup; + children = ( + 305C2F9B242DA98900366378 /* Cell */, + 3000A0A62429DB0E005DD7B4 /* TextField */, + 305C2F99242D9F7D00366378 /* InterestCollectionView.swift */, + ); + path = View; + sourceTree = ""; + }; + 3000A0A62429DB0E005DD7B4 /* TextField */ = { + isa = PBXGroup; + children = ( + 3000A0A42429D5C3005DD7B4 /* IdTextField.swift */, + 3036A8C2242A44C500436DFF /* PasswordTextField.swift */, + 3036A8C4242A4B5200436DFF /* PasswordConfirmTextField.swift */, + 3036A8C6242A4BBA00436DFF /* NameTextField.swift */, + ); + path = TextField; + sourceTree = ""; + }; + 305C2F9B242DA98900366378 /* Cell */ = { + isa = PBXGroup; + children = ( + 305C2F9C242DA9B200366378 /* InterestCollectionViewCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; + 30769EF6242664D100D03360 = { + isa = PBXGroup; + children = ( + 30769F01242664D100D03360 /* SignUp */, + 30FCD35E24277CC800FE4D44 /* SignUpTests */, + 30769F00242664D100D03360 /* Products */, + ); + sourceTree = ""; + }; + 30769F00242664D100D03360 /* Products */ = { + isa = PBXGroup; + children = ( + 30769EFF242664D100D03360 /* SignUp.app */, + 30FCD35D24277CC800FE4D44 /* SignUpTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 30769F01242664D100D03360 /* SignUp */ = { + isa = PBXGroup; + children = ( + 30EBC415242F1F3B00078AF0 /* Model */, + 30EBC412242F1B8F00078AF0 /* Network */, + 3000A09E2429903B005DD7B4 /* View */, + 30FCD3302427278000FE4D44 /* Controller */, + 30769F02242664D100D03360 /* AppDelegate.swift */, + 30769F04242664D100D03360 /* SceneDelegate.swift */, + 30769F08242664D100D03360 /* Main.storyboard */, + 30769F0B242664D600D03360 /* Assets.xcassets */, + 30769F0D242664D600D03360 /* LaunchScreen.storyboard */, + 30769F10242664D600D03360 /* Info.plist */, + ); + path = SignUp; + sourceTree = ""; + }; + 30EBC412242F1B8F00078AF0 /* Network */ = { + isa = PBXGroup; + children = ( + 30EBC413242F1BA900078AF0 /* RequestManager.swift */, + 30EBC418242F71D200078AF0 /* EncodeManager.swift */, + ); + path = Network; + sourceTree = ""; + }; + 30EBC415242F1F3B00078AF0 /* Model */ = { + isa = PBXGroup; + children = ( + 30EBC416242F1F4900078AF0 /* UserInfomation.swift */, + ); + path = Model; + sourceTree = ""; + }; + 30FCD3302427278000FE4D44 /* Controller */ = { + isa = PBXGroup; + children = ( + 30769F06242664D100D03360 /* ViewController.swift */, + 30FCD3312427279D00FE4D44 /* PersonalInfoViewController.swift */, + 30FCD333242727C900FE4D44 /* TermsViewController.swift */, + 30FCD335242727E600FE4D44 /* InterestViewController.swift */, + 30FCD337242727F700FE4D44 /* LoginViewController.swift */, + ); + path = Controller; + sourceTree = ""; + }; + 30FCD35E24277CC800FE4D44 /* SignUpTests */ = { + isa = PBXGroup; + children = ( + 30FCD35F24277CC800FE4D44 /* SignUpTests.swift */, + 30FCD36124277CC800FE4D44 /* Info.plist */, + ); + path = SignUpTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 30769EFE242664D100D03360 /* SignUp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 30769F13242664D600D03360 /* Build configuration list for PBXNativeTarget "SignUp" */; + buildPhases = ( + 30769EFB242664D100D03360 /* Sources */, + 30769EFC242664D100D03360 /* Frameworks */, + 30769EFD242664D100D03360 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SignUp; + productName = SignUp; + productReference = 30769EFF242664D100D03360 /* SignUp.app */; + productType = "com.apple.product-type.application"; + }; + 30FCD35C24277CC800FE4D44 /* SignUpTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 30FCD36424277CC800FE4D44 /* Build configuration list for PBXNativeTarget "SignUpTests" */; + buildPhases = ( + 30FCD35924277CC800FE4D44 /* Sources */, + 30FCD35A24277CC800FE4D44 /* Frameworks */, + 30FCD35B24277CC800FE4D44 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 30FCD36324277CC800FE4D44 /* PBXTargetDependency */, + ); + name = SignUpTests; + productName = SignUpTests; + productReference = 30FCD35D24277CC800FE4D44 /* SignUpTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 30769EF7242664D100D03360 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = delma; + TargetAttributes = { + 30769EFE242664D100D03360 = { + CreatedOnToolsVersion = 11.3; + }; + 30FCD35C24277CC800FE4D44 = { + CreatedOnToolsVersion = 11.3; + TestTargetID = 30769EFE242664D100D03360; + }; + }; + }; + buildConfigurationList = 30769EFA242664D100D03360 /* Build configuration list for PBXProject "SignUp" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 30769EF6242664D100D03360; + productRefGroup = 30769F00242664D100D03360 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 30769EFE242664D100D03360 /* SignUp */, + 30FCD35C24277CC800FE4D44 /* SignUpTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 30769EFD242664D100D03360 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30769F0F242664D600D03360 /* LaunchScreen.storyboard in Resources */, + 30769F0C242664D600D03360 /* Assets.xcassets in Resources */, + 30769F0A242664D100D03360 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 30FCD35B24277CC800FE4D44 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 30769EFB242664D100D03360 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30FCD338242727F700FE4D44 /* LoginViewController.swift in Sources */, + 30FCD336242727E600FE4D44 /* InterestViewController.swift in Sources */, + 3036A8C3242A44C500436DFF /* PasswordTextField.swift in Sources */, + 3036A8C5242A4B5200436DFF /* PasswordConfirmTextField.swift in Sources */, + 30EBC417242F1F4900078AF0 /* UserInfomation.swift in Sources */, + 305C2F9A242D9F7D00366378 /* InterestCollectionView.swift in Sources */, + 30FCD3322427279D00FE4D44 /* PersonalInfoViewController.swift in Sources */, + 30EBC419242F71D200078AF0 /* EncodeManager.swift in Sources */, + 30769F07242664D100D03360 /* ViewController.swift in Sources */, + 3036A8C7242A4BBA00436DFF /* NameTextField.swift in Sources */, + 30769F03242664D100D03360 /* AppDelegate.swift in Sources */, + 3000A0A52429D5C3005DD7B4 /* IdTextField.swift in Sources */, + 30769F05242664D100D03360 /* SceneDelegate.swift in Sources */, + 30EBC414242F1BA900078AF0 /* RequestManager.swift in Sources */, + 30FCD334242727C900FE4D44 /* TermsViewController.swift in Sources */, + 305C2F9D242DA9B200366378 /* InterestCollectionViewCell.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 30FCD35924277CC800FE4D44 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30FCD36024277CC800FE4D44 /* SignUpTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 30FCD36324277CC800FE4D44 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 30769EFE242664D100D03360 /* SignUp */; + targetProxy = 30FCD36224277CC800FE4D44 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 30769F08242664D100D03360 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 30769F09242664D100D03360 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 30769F0D242664D600D03360 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 30769F0E242664D600D03360 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 30769F11242664D600D03360 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 30769F12242664D600D03360 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 30769F14242664D600D03360 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = NC28R53QWB; + INFOPLIST_FILE = SignUp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.delma.SignUp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 30769F15242664D600D03360 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = NC28R53QWB; + INFOPLIST_FILE = SignUp/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.delma.SignUp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 30FCD36524277CC800FE4D44 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = NC28R53QWB; + INFOPLIST_FILE = SignUpTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.delma.SignUpTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SignUp.app/SignUp"; + }; + name = Debug; + }; + 30FCD36624277CC800FE4D44 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = NC28R53QWB; + INFOPLIST_FILE = SignUpTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.delma.SignUpTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SignUp.app/SignUp"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 30769EFA242664D100D03360 /* Build configuration list for PBXProject "SignUp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 30769F11242664D600D03360 /* Debug */, + 30769F12242664D600D03360 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 30769F13242664D600D03360 /* Build configuration list for PBXNativeTarget "SignUp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 30769F14242664D600D03360 /* Debug */, + 30769F15242664D600D03360 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 30FCD36424277CC800FE4D44 /* Build configuration list for PBXNativeTarget "SignUpTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 30FCD36524277CC800FE4D44 /* Debug */, + 30FCD36624277CC800FE4D44 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 30769EF7242664D100D03360 /* Project object */; +} diff --git a/iOS/SignUp/SignUp.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOS/SignUp/SignUp.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..46471f4 --- /dev/null +++ b/iOS/SignUp/SignUp.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iOS/SignUp/SignUp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/SignUp/SignUp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/iOS/SignUp/SignUp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/iOS/SignUp/SignUp/AppDelegate.swift b/iOS/SignUp/SignUp/AppDelegate.swift new file mode 100644 index 0000000..3165ad0 --- /dev/null +++ b/iOS/SignUp/SignUp/AppDelegate.swift @@ -0,0 +1,27 @@ +// +// AppDelegate.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + +} + diff --git a/iOS/SignUp/SignUp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iOS/SignUp/SignUp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/iOS/SignUp/SignUp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iOS/SignUp/SignUp/Assets.xcassets/Contents.json b/iOS/SignUp/SignUp/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/iOS/SignUp/SignUp/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/iOS/SignUp/SignUp/Base.lproj/LaunchScreen.storyboard b/iOS/SignUp/SignUp/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/iOS/SignUp/SignUp/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/SignUp/SignUp/Base.lproj/Main.storyboard b/iOS/SignUp/SignUp/Base.lproj/Main.storyboard new file mode 100644 index 0000000..0c75bba --- /dev/null +++ b/iOS/SignUp/SignUp/Base.lproj/Main.storyboard @@ -0,0 +1,688 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iOS/SignUp/SignUp/Controller/InterestViewController.swift b/iOS/SignUp/SignUp/Controller/InterestViewController.swift new file mode 100644 index 0000000..6727862 --- /dev/null +++ b/iOS/SignUp/SignUp/Controller/InterestViewController.swift @@ -0,0 +1,110 @@ +// +// InterestViewController.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class InterestViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet var interestTextField: UITextField! + @IBOutlet var collectionView: InterestCollectionView! + @IBOutlet var interestAssistLabel: UILabel! + @IBOutlet var joinButton: UIButton! + + var id: String? + var password: String? + var name: String? + var birthDate: String? + var gender: String? + var phoneNumber: String? + var email: String? + + let requestManager = RequestManager() + let encodeManager = EncodeManager() + + private var interest: [String] = [] { + didSet { + guard let lastInterest = interest.last else { return } + NotificationCenter.default.post(name: .addInterest , object: nil, userInfo: ["interest": lastInterest ]) + } + } + + override func viewDidLoad() { + super.viewDidLoad() + interestTextField.delegate = self + + setUI() + joinButton.isEnabled = false + } + + func setUI() { + interestAssistLabel.text = "관심사를 3개 이상 입력해주세요" + interestAssistLabel.textColor = .green + } + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + let text = textField.text! + interest.append(text) + textField.text! = "" + + if interest.count >= 3 { + interestAssistLabel.text = "" + joinButton.isEnabled = true + } + + return true + } + + @IBAction func movePreviousScene(_ sender: Any) { + self.dismiss(animated: true, completion: nil) + } + + @IBAction func moveNextScene(_ sender: UIButton) { + let interestString = interest.reduce("") { "\($0),"+"\($1)" } + guard let id = id, let password = password, let name = name, let birthday = birthDate, let sex = gender, let email = email, let phoneNumber = phoneNumber else { return } + + let encodedData = encodeManager.joinRequestEncoding(id: id, password: password, name: name, birthday: birthday, sex: sex, email: email, phoneNumber: phoneNumber, interest: interestString) + let requestResult = requestManager.request(url: encodedData.url, methodType: .post, body: encodedData.data) + + if requestResult { + joinSuccessAlert() + }else { + joinFailAlert() + } + + } + + func joinSuccessAlert() { + let alert = UIAlertController(title: "가입 성공", message: "회원가입이 완료되었습니다", preferredStyle: .alert) + let ok = UIAlertAction(title: "확인", style: .default) { (ok) in + if let nextScene = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as? LoginViewController { + + nextScene.modalPresentationStyle = .fullScreen + self.present(nextScene, animated: true) + } + } + + alert.addAction(ok) + self.present(alert, animated: true) + } + + func joinFailAlert() { + let alert = UIAlertController(title: "오류 안내", message: "회원가입에 실패했습니다", preferredStyle: .alert) + let ok = UIAlertAction(title: "확인", style: .default) { (ok) in + if let nextScene = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as? ViewController { + + nextScene.modalPresentationStyle = .fullScreen + self.present(nextScene, animated: true) + } + } + + alert.addAction(ok) + self.present(alert, animated: true) + } + + +} diff --git a/iOS/SignUp/SignUp/Controller/LoginViewController.swift b/iOS/SignUp/SignUp/Controller/LoginViewController.swift new file mode 100644 index 0000000..413a7eb --- /dev/null +++ b/iOS/SignUp/SignUp/Controller/LoginViewController.swift @@ -0,0 +1,25 @@ +// +// LoginViewController.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class LoginViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + } + + @IBAction func moveJoinScene(_ sender: UIButton) { + if let nextScene = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as? ViewController { + + nextScene.modalPresentationStyle = .fullScreen + self.present(nextScene, animated: true) + } + } +} diff --git a/iOS/SignUp/SignUp/Controller/PersonalInfoViewController.swift b/iOS/SignUp/SignUp/Controller/PersonalInfoViewController.swift new file mode 100644 index 0000000..efa4d99 --- /dev/null +++ b/iOS/SignUp/SignUp/Controller/PersonalInfoViewController.swift @@ -0,0 +1,141 @@ +// +// PersonalInfoViewController.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class PersonalInfoViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet var birthDateTextField: UITextField! + @IBOutlet var phoneNumberTextField: UITextField! + @IBOutlet var emailTextField: UITextField! + @IBOutlet var emailAssistLabel: UILabel! + @IBOutlet var phoneNumberAssistLabel: UILabel! + + let datePicker: UIDatePicker = UIDatePicker() + + var selectedGender: String = "female" + + private var isBirthDateInput = false + private var isValidEmail = false + private var isValidPhoneNumber = false + + var id: String? + var password: String? + var name: String? + + override func viewDidLoad() { + super.viewDidLoad() + birthDateTextField.delegate = self + emailTextField.delegate = self + phoneNumberTextField.delegate = self + + datePicker.addTarget(self, action: #selector(selectDate(_:)), for: .valueChanged) + } + + + @IBAction func selectGender(_ sender: UISegmentedControl) { + switch sender.selectedSegmentIndex { + case 0: + selectedGender = "female" + case 1: + selectedGender = "male" + default: + break + } + } + + func setUpDatePicker() { + datePicker.isHidden = false + datePicker.frame = CGRect(x: 0, y: self.view.frame.height * (3/4), width: self.view.frame.width, height: self.view.frame.height * (1/4)) + datePicker.locale = NSLocale.init(localeIdentifier: "ko_KO") as Locale + datePicker.datePickerMode = .date + + datePicker.minimumDate = Date(timeIntervalSinceNow: -24 * 60 * 60 * 365 * 99) + datePicker.maximumDate = Date(timeIntervalSinceNow: -24 * 60 * 60 * 365 * 15) + self.view.addSubview(datePicker) + } + + @objc func selectDate(_ sender: UIDatePicker) { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd" + birthDateTextField.text = formatter.string(from: sender.date) + isBirthDateInput = true + } + + func textFieldDidBeginEditing(_ textField: UITextField) { + if textField == birthDateTextField { setUpDatePicker() } + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + textField.layer.borderWidth = 1.0 + + if textField == emailTextField { + if !judgeValidEmail(textField.text!) { + emailAssistLabel.text = "이메일 주소를 다시 확인해주세요" + emailAssistLabel.textColor = .red + textField.layer.borderColor = UIColor.red.cgColor + }else { + emailAssistLabel.text = "" + textField.layer.borderColor = UIColor.black.cgColor + isValidEmail = true + } + } + + if textField == phoneNumberTextField { + if !judgeValidPhoneNumber(textField.text!) { + phoneNumberAssistLabel.text = "형식에 맞지 않는 번호입니다" + phoneNumberAssistLabel.textColor = .red + textField.layer.borderColor = UIColor.red.cgColor + }else { + phoneNumberAssistLabel.text = "" + textField.layer.borderColor = UIColor.black.cgColor + isValidPhoneNumber = true + } + } + return true + } + + func judgeValidEmail(_ email: String) -> Bool { + let emailRegEx = "^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$" + let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegEx) + return emailTest.evaluate(with: email) + } + + func judgeValidPhoneNumber(_ number: String) -> Bool { + let numberRegEx = "^010[0-9]{3,4}[0-9]{4}$" + let numberTest = NSPredicate(format: "SELF MATCHES %@", numberRegEx) + return numberTest.evaluate(with: number) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + datePicker.isHidden = true + self.view.endEditing(true) + } + + @IBAction func moveNextScene(_ sender: UIButton) { + if isValidEmail, isBirthDateInput, isValidPhoneNumber { + if let nextScene = self.storyboard?.instantiateViewController(withIdentifier: "TermsViewController") as? TermsViewController{ + + nextScene.id = id + nextScene.password = password + nextScene.name = name + nextScene.birthDate = birthDateTextField.text! + nextScene.gender = selectedGender + nextScene.phoneNumber = phoneNumberTextField.text! + nextScene.email = emailTextField.text! + + nextScene.modalPresentationStyle = .automatic + self.present(nextScene, animated: true) + } + } + } + + @IBAction func movePreviousScene(_ sender: Any) { + self.dismiss(animated: true, completion: nil) + } +} diff --git a/iOS/SignUp/SignUp/Controller/TermsViewController.swift b/iOS/SignUp/SignUp/Controller/TermsViewController.swift new file mode 100644 index 0000000..c7d5881 --- /dev/null +++ b/iOS/SignUp/SignUp/Controller/TermsViewController.swift @@ -0,0 +1,67 @@ +// +// TermsViewController.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class TermsViewController: UIViewController { + + @IBOutlet var termsDescriptionTextView: UITextView! + + var id: String? + var password: String? + var name: String? + var birthDate: String? + var gender: String? + var phoneNumber: String? + var email: String? + + override func viewDidLoad() { + super.viewDidLoad() + setTermsDescription() + } + + override func viewDidAppear(_ animated: Bool) { + setActionSheet() + } + + func setTermsDescription() { + termsDescriptionTextView.text = "정보통신망법 규정에 따라 코드스쿼드에 회원가입 신청하시는 분께 수집하는 개인정보의 항목, 개인정보의 수집 및 이용목적, 개인정보의 보유 및 이용기간을 안내 드리오니 자세히 읽은 후 동의하여 주시기 바랍니다.\n\n 1. 수집하는 개인정보 이용자는 회원가입을 하지 않아도 대부분의 코드스쿼드 서비스를 회원과 동일하게 이용할 수 있습니다. 이용자가 개인화 혹은 회원제 서비스를 이용하기 위해 회원가입을 할 경우, 코드스쿼드는 서비스 이용을 위해 필요한 최소한의 개인정보를 수집합니다. 회원가입 시점에 코드스쿼드가 이용자로부터 수집하는 개인정보는 아래와 같습니다. - 회원 가입 시에 ‘아이디, 비밀번호, 이름, 생년월일, 성별, 휴대전화번호’를 필수항목으로 수집합니다. \n\n서비스 이용 과정에서 이용자로부터 수집하는 개인정보는 아래와 같습니다. 코드스쿼드 내의 개별 서비스 이용, 이벤트 응모 및 경품 신청 과정에서 해당 서비스의 이용자에 한해 추가 개인정보 수집이 발생할 수 있습니다. 추가로 개인정보를 수집할 경우에는 해당 개인정보 수집 시점에서 이용자에게 ‘수집하는 개인정보 항목, 개인정보의 수집 및 이용목적, 개인정보의 보관기간’에 대해 안내 드리고 동의를 받습니다." + termsDescriptionTextView.isEditable = false + termsDescriptionTextView.font = UIFont.systemFont(ofSize: 15.0) + } + + func setActionSheet() { + let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) + let agree = UIAlertAction(title: "동의", style: .default) { (agree) in + if let nextScene = self.storyboard?.instantiateViewController(withIdentifier: "InterestViewController") as? InterestViewController { + + nextScene.id = self.id + nextScene.password = self.password + nextScene.name = self.name + nextScene.birthDate = self.birthDate + nextScene.gender = self.gender + nextScene.phoneNumber = self.phoneNumber + nextScene.email = self.email + + nextScene.modalPresentationStyle = .fullScreen + self.present(nextScene, animated: false) + } + } + let cancel = UIAlertAction(title: "취소", style: .cancel) { (cancel) in + self.dismiss(animated: true) + } + + actionSheet.addAction(agree) + actionSheet.addAction(cancel) + + present(actionSheet, animated: false) + } + + + +} diff --git a/iOS/SignUp/SignUp/Controller/ViewController.swift b/iOS/SignUp/SignUp/Controller/ViewController.swift new file mode 100644 index 0000000..4532caf --- /dev/null +++ b/iOS/SignUp/SignUp/Controller/ViewController.swift @@ -0,0 +1,92 @@ +// +// ViewController.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet var idTextField: IdTextField! + @IBOutlet var passwordTextField: PasswordTextField! + @IBOutlet var passwordConfirmTextField: PasswordConfirmTextField! + @IBOutlet var nameTextField: NameTextField! + + @IBOutlet var idAssistLabel: UILabel! + @IBOutlet var passwordAssistLabel: UILabel! + @IBOutlet var passwordConfirmAssistLabel: UILabel! + @IBOutlet var nameAssistLabel: UILabel! + + + override func viewDidLoad() { + super.viewDidLoad() + setNotification() + } + + func setNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(inputIdAssistComment(_:)), name: .idAssistance, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(inputPasswordAssistComment(_:)), name: .passwordAssistance, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(inputPasswordConfirmAssistComment(_:)), name: .passwordConfirmAssistance, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(inputNameAssistComment(_:)), name: .nameAssistance, object: nil) + + } + + + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + self.view.endEditing(true) + } + + @IBAction func moveNextScene(_ sender: Any) { + + if idTextField.judgeValidValue(), passwordTextField.judgeValidValue(), passwordConfirmTextField.judgeValidValue(), nameTextField.judgeValidValue() { + if let nextScene = self.storyboard?.instantiateViewController(withIdentifier: "PersonalInfoView") as? PersonalInfoViewController{ + + nextScene.id = idTextField.text! + nextScene.password = passwordTextField.text! + nextScene.name = nameTextField.text! + + nextScene.modalPresentationStyle = .fullScreen + self.present(nextScene, animated: true) + } + } + } + + @IBAction func moveBeforeScene(_ sender: Any) { + self.dismiss(animated: true) + } + + @objc func inputIdAssistComment(_ notification: Notification) { + guard let format = notification.userInfo?["format"] as? (message: String, color: UIColor) else { return } + idAssistLabel.text = format.message + idAssistLabel.textColor = format.color + } + + @objc func inputPasswordAssistComment(_ notification: Notification) { + guard let format = notification.userInfo?["format"] as? (message: String, color: UIColor) else { return } + passwordAssistLabel.text = format.message + passwordAssistLabel.textColor = format.color + } + + @objc func inputPasswordConfirmAssistComment(_ notification: Notification) { + guard let format = notification.userInfo?["format"] as? (message: String, color: UIColor) else { return } + passwordConfirmAssistLabel.text = format.message + passwordConfirmAssistLabel.textColor = format.color + } + + @objc func inputNameAssistComment(_ notification: Notification) { + guard let format = notification.userInfo?["format"] as? (message: String, color: UIColor) else { return } + nameAssistLabel.text = format.message + nameAssistLabel.textColor = format.color + } +} + +extension Notification.Name { + static let idAssistance = Notification.Name("idAssistance") + static let passwordAssistance = Notification.Name("passwordAssistance") + static let passwordConfirmAssistance = Notification.Name("passwordConfirmAssistance") + static let nameAssistance = Notification.Name("nameAssistance") +} diff --git a/iOS/SignUp/SignUp/Info.plist b/iOS/SignUp/SignUp/Info.plist new file mode 100644 index 0000000..2a3483c --- /dev/null +++ b/iOS/SignUp/SignUp/Info.plist @@ -0,0 +1,64 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/iOS/SignUp/SignUp/Model/UserInfomation.swift b/iOS/SignUp/SignUp/Model/UserInfomation.swift new file mode 100644 index 0000000..bf5999f --- /dev/null +++ b/iOS/SignUp/SignUp/Model/UserInfomation.swift @@ -0,0 +1,20 @@ +// +// UserInfomation.swift +// SignUp +// +// Created by delma on 2020/03/28. +// Copyright © 2020 delma. All rights reserved. +// + +import Foundation + +struct UserInfo: Codable { + var userId: String + var password: String + var name: String + var birthday: String + var sex: String + var email: String + var phoneNumber: String + var interest: String +} diff --git a/iOS/SignUp/SignUp/Network/EncodeManager.swift b/iOS/SignUp/SignUp/Network/EncodeManager.swift new file mode 100644 index 0000000..844aa6b --- /dev/null +++ b/iOS/SignUp/SignUp/Network/EncodeManager.swift @@ -0,0 +1,20 @@ +// +// EncodeManager.swift +// SignUp +// +// Created by delma on 2020/03/28. +// Copyright © 2020 delma. All rights reserved. +// + +import Foundation +class EncodeManager { + let encoder = JSONEncoder() + + func joinRequestEncoding(id: String, password: String, name: String, birthday: String, sex: String, email: String, phoneNumber: String, interest: String) -> (url: String, data: Data?) { + let url = "https://signup-5-test-deploy.herokuapp.com/join" + let userInfo = UserInfo(userId: id, password: password, name: name, birthday: birthday, sex: sex, email: email, phoneNumber: phoneNumber, interest: interest) + let data = try? encoder.encode(userInfo) + + return (url, data) + } +} diff --git a/iOS/SignUp/SignUp/Network/RequestManager.swift b/iOS/SignUp/SignUp/Network/RequestManager.swift new file mode 100644 index 0000000..0b4098e --- /dev/null +++ b/iOS/SignUp/SignUp/Network/RequestManager.swift @@ -0,0 +1,45 @@ +// +// RequestManager.swift +// SignUp +// +// Created by delma on 2020/03/28. +// Copyright © 2020 delma. All rights reserved. +// + +import Foundation + +class RequestManager { + enum HTTPMethod: String { + case get = "GET" + case post = "POST" + case put = "PUT" + case delete = "DELETE" + } + + func request(url: String, methodType: HTTPMethod, body: Data? = nil) -> Bool { + guard let url = URL(string: url) else { return false } + + var request = URLRequest(url: url) + request.httpMethod = methodType.rawValue + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.httpBody = body + + let session = URLSession.shared + let task = session.dataTask(with: request) { (data, response, error) in + guard error == nil else { return } + + do { + let anyData = try JSONSerialization.jsonObject(with: data!, options: []) + guard let nsDictionary = anyData as? NSDictionary else { return } + guard let statusValue = nsDictionary["status"] as? String else { return } + let status = statusValue.utf8 + guard String(status) == "ERROR" else { return } + } catch { + + } + } + + task.resume() + return true + } +} diff --git a/iOS/SignUp/SignUp/SceneDelegate.swift b/iOS/SignUp/SignUp/SceneDelegate.swift new file mode 100644 index 0000000..55a6cef --- /dev/null +++ b/iOS/SignUp/SignUp/SceneDelegate.swift @@ -0,0 +1,22 @@ +// +// SceneDelegate.swift +// SignUp +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let _ = (scene as? UIWindowScene) else { return } + } + + +} + diff --git a/iOS/SignUp/SignUp/View/Cell/InterestCollectionViewCell.swift b/iOS/SignUp/SignUp/View/Cell/InterestCollectionViewCell.swift new file mode 100644 index 0000000..eb53fc5 --- /dev/null +++ b/iOS/SignUp/SignUp/View/Cell/InterestCollectionViewCell.swift @@ -0,0 +1,23 @@ +// +// InterestCollectionViewCell.swift +// SignUp +// +// Created by delma on 2020/03/27. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class InterestCollectionViewCell: UICollectionViewCell { + + @IBOutlet var cancelButton: UIButton! + @IBOutlet var interestLabel: UILabel! + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } +} diff --git a/iOS/SignUp/SignUp/View/InterestCollectionView.swift b/iOS/SignUp/SignUp/View/InterestCollectionView.swift new file mode 100644 index 0000000..d6f7dc7 --- /dev/null +++ b/iOS/SignUp/SignUp/View/InterestCollectionView.swift @@ -0,0 +1,83 @@ +// +// InterestCollectionView.swift +// SignUp +// +// Created by delma on 2020/03/27. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class InterestCollectionView: UICollectionView, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource, UICollectionViewDelegate { + + private var interest: [String] = [] + + override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) { + super.init(frame: frame, collectionViewLayout: layout) + self.delegate = self + self.dataSource = self + setNotification() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + self.delegate = self + self.dataSource = self + setNotification() + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return interest.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let row = self.interest[indexPath.row] + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "InterestCollectionViewCell", for: indexPath) as! InterestCollectionViewCell + + cell.layer.cornerRadius = 20.0 + cell.interestLabel.text = row + cell.cancelButton.tag = indexPath.row + cell.cancelButton.addTarget(self, action: #selector(removeInterest(_:)), for: .touchDown) + + return cell + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + let cell = InterestCollectionViewCell() + + let interestLabel = UILabel() + interestLabel.frame = CGRect(x: 0, y: 0, width: 100, height: 40) + interestLabel.text = interest[indexPath.row] + cell.addSubview(interestLabel) + interestLabel.translatesAutoresizingMaskIntoConstraints = false + interestLabel.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true + interestLabel.bottomAnchor.constraint(equalTo: cell.bottomAnchor).isActive = true + interestLabel.leadingAnchor.constraint(equalTo: cell.leadingAnchor).isActive = true + interestLabel.trailingAnchor.constraint(equalTo: cell.trailingAnchor).isActive = true + cell.interestLabel = interestLabel + cell.setNeedsLayout() + let estimatedSize = cell.systemLayoutSizeFitting(CGSize(width: cell.interestLabel.bounds.width, height: 40)) + + return .init(width: estimatedSize.width + 44, height: 40) + } + + func setNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(addInterest(_:)), name: .addInterest, object: nil) + } + + @objc func addInterest(_ notification: Notification) { + guard let interestItem = notification.userInfo?["interest"] as? String else { return } + interest.append(interestItem) + self.reloadData() + } + + @objc func removeInterest(_ sender: UIButton) { + interest.remove(at: sender.tag) + self.reloadData() + } + +} + +extension Notification.Name { + static let addInterest = Notification.Name("addInterest") +} diff --git a/iOS/SignUp/SignUp/View/TextField/IdTextField.swift b/iOS/SignUp/SignUp/View/TextField/IdTextField.swift new file mode 100644 index 0000000..3b2110a --- /dev/null +++ b/iOS/SignUp/SignUp/View/TextField/IdTextField.swift @@ -0,0 +1,65 @@ +// +// IdTextField.swift +// SignUp +// +// Created by delma on 2020/03/24. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class IdTextField: UITextField, UITextFieldDelegate { + + private var isValidId = false + + override init(frame: CGRect) { + super.init(frame: frame) + configure() + self.delegate = self + + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + configure() + self.delegate = self + } + + func configure() { + self.layer.borderWidth = 1.0 + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + judgeValidID(textField) + let newLength = textField.text!.count + string.count - range.length + return !(newLength > 20) + } + + func judgeValidID(_ textField: UITextField) { + //서버에서 아이디 가져와 중복되는지 확인해야 함 + var assistMessage = "" + var assistColor = UIColor.black + let text = textField.text! + if !judgeCorrespondIdRegEx(id: text) { + textField.layer.borderColor = UIColor.red.cgColor + assistMessage = "5~20자의 영문 소문자, 숫자와 특수기호(_)(-) 만 사용 가능합니다." + assistColor = UIColor.red + }else if judgeCorrespondIdRegEx(id: text) { + textField.layer.borderColor = UIColor.black.cgColor + assistMessage = "사용 가능한 아이디입니다." + assistColor = UIColor.green + isValidId = true + } + NotificationCenter.default.post(name: .idAssistance, object: nil, userInfo: ["format":( message: assistMessage, color: assistColor)]) + } + + func judgeCorrespondIdRegEx(id: String) -> Bool { + let idRegEx = "^(?=.*[a-z])(?=.*[0-9])[a-z0-9-_]{5,20}" + let idTest = NSPredicate(format: "SELF MATCHES %@", idRegEx) + return idTest.evaluate(with: id) + } + + func judgeValidValue() -> Bool { + return isValidId + } +} diff --git a/iOS/SignUp/SignUp/View/TextField/NameTextField.swift b/iOS/SignUp/SignUp/View/TextField/NameTextField.swift new file mode 100644 index 0000000..cb90abd --- /dev/null +++ b/iOS/SignUp/SignUp/View/TextField/NameTextField.swift @@ -0,0 +1,59 @@ +// +// NameTextField.swift +// SignUp +// +// Created by delma on 2020/03/24. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class NameTextField: UITextField, UITextFieldDelegate { + + private var isValidName = false + + override init(frame: CGRect) { + super.init(frame: frame) + configure() + self.delegate = self + + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + configure() + self.delegate = self + } + + func configure() { + self.layer.borderWidth = 1.0 + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + judgeValidName(textField) + + return true + } + + func judgeValidName(_ textField: UITextField) { + let text = textField.text! + var assistMessage = "" + var assistColor = UIColor.red + + if text.isEmpty { + textField.layer.borderColor = UIColor.red.cgColor + assistMessage = "이름은 필수입력항목입니다." + assistColor = .red + }else { + textField.layer.borderColor = UIColor.black.cgColor + assistMessage = "" + isValidName = true + } + NotificationCenter.default.post(name: .nameAssistance, object: nil, userInfo: ["format":( message: assistMessage, color: assistColor)]) + + } + + func judgeValidValue() -> Bool { + return isValidName + } +} diff --git a/iOS/SignUp/SignUp/View/TextField/PasswordConfirmTextField.swift b/iOS/SignUp/SignUp/View/TextField/PasswordConfirmTextField.swift new file mode 100644 index 0000000..ab80fee --- /dev/null +++ b/iOS/SignUp/SignUp/View/TextField/PasswordConfirmTextField.swift @@ -0,0 +1,76 @@ +// +// PasswordConfirmTextField.swift +// SignUp +// +// Created by delma on 2020/03/24. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class PasswordConfirmTextField: UITextField, UITextFieldDelegate { + + private var isValidPasswordConfirm = false + private var firstPassword = "" + + override init(frame: CGRect) { + super.init(frame: frame) + configure() + self.delegate = self + addObserver() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + configure() + self.delegate = self + addObserver() + } + + func configure() { + self.layer.borderWidth = 1.0 + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + judgeCorrespondPassword(textField) + return true + } + + + func judgeCorrespondPassword(_ textField: UITextField) { + let text = textField.text! + var assistMessage = "" + var assistColor = UIColor.red + + if text != firstPassword { + textField.layer.borderColor = UIColor.red.cgColor + assistMessage = "비밀번호가 일치하지 않습니다." + assistColor = .red + }else { + textField.layer.borderColor = UIColor.black.cgColor + assistMessage = "비밀번호가 일치합니다." + assistColor = .green + isValidPasswordConfirm = true + } + NotificationCenter.default.post(name: .passwordConfirmAssistance, object: nil, userInfo: ["format":( message: assistMessage, color: assistColor)]) + } + + + func judgeValidValue() -> Bool { + return isValidPasswordConfirm + } + + func addObserver() { + NotificationCenter.default.addObserver(self, selector: #selector(passPassword(_:)), name: .changedPassword, object: nil) + } + + @objc func passPassword(_ notification: Notification) { + guard let password = notification.userInfo?["password"] as? String else { return } + firstPassword = password + } + +} + +extension Notification.Name { + static let changedPassword = Notification.Name("changedPassword") +} diff --git a/iOS/SignUp/SignUp/View/TextField/PasswordTextField.swift b/iOS/SignUp/SignUp/View/TextField/PasswordTextField.swift new file mode 100644 index 0000000..7c34dca --- /dev/null +++ b/iOS/SignUp/SignUp/View/TextField/PasswordTextField.swift @@ -0,0 +1,74 @@ +// +// PasswordTextField.swift +// SignUp +// +// Created by delma on 2020/03/24. +// Copyright © 2020 delma. All rights reserved. +// + +import UIKit + +class PasswordTextField: UITextField, UITextFieldDelegate { + + private var isValidPassword = false + + override init(frame: CGRect) { + super.init(frame: frame) + configure() + self.delegate = self + + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + configure() + self.delegate = self + } + + func configure() { + self.layer.borderWidth = 1.0 + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + judgeValidPassword(textField) + let newLength = textField.text!.count + string.count - range.length + return !(newLength > 16) + } + + func judgeValidPassword(_ textField: UITextField) { + let text = textField.text! + var assistMessage = "" + var assistColor = UIColor.red + textField.layer.borderColor = UIColor.red.cgColor + let specialCharacters = ["!","@","#","$","%"] + + let isContainUpperCase = text.contains(where: { $0.isUppercase}) + let isContainNumeric = text.contains(where: { $0.isNumber }) + let isContainSpecialCharacter = text.contains(where: { specialCharacters.contains(String($0)) }) + + if text.count > 16 || text.count < 8 { + assistMessage = "8자 이상 16자 이하로 입력해주세요." + }else if !isContainUpperCase { + assistMessage = "영문 대문자를 최소 1자 이상 포함해주세요." + }else if !isContainNumeric { + assistMessage = "숫자를 최소 1자 이상 포함해주세요." + }else if !isContainSpecialCharacter { + assistMessage = "특수문자를 최소 1자 이상 포함해주세요." + }else { + assistMessage = "안전한 비밀번호입니다." + assistColor = .green + textField.layer.borderColor = UIColor.black.cgColor + isValidPassword = true + NotificationCenter.default.post(name: .changedPassword, object: nil, userInfo: ["password":text]) + } + + NotificationCenter.default.post(name: .passwordAssistance, object: nil, userInfo: ["format":( message: assistMessage, color: assistColor)]) + + } + + func judgeValidValue() -> Bool { + return isValidPassword + } + + +} diff --git a/iOS/SignUp/SignUpTests/Info.plist b/iOS/SignUp/SignUpTests/Info.plist new file mode 100644 index 0000000..64d65ca --- /dev/null +++ b/iOS/SignUp/SignUpTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/iOS/SignUp/SignUpTests/SignUpTests.swift b/iOS/SignUp/SignUpTests/SignUpTests.swift new file mode 100644 index 0000000..501a4e9 --- /dev/null +++ b/iOS/SignUp/SignUpTests/SignUpTests.swift @@ -0,0 +1,33 @@ +// +// SignUpTests.swift +// SignUpTests +// +// Created by delma on 2020/03/22. +// Copyright © 2020 delma. All rights reserved. +// + +import XCTest + +class SignUpTests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + measure { + // Put the code you want to measure the time of here. + } + } + +}