├── .gitignore
├── LICENSE
├── README.md
├── commands
└── MakeAuth.js
├── index.js
├── instructions.js
├── instructions.md
├── package-lock.json
├── package.json
├── providers
└── AdonisAuthScaffoldProvider.js
├── templates
├── ApiAuthController.js
├── AuthController.js
├── ViewHelper.js
├── adonis-auth-scaffold.mustache
├── apiAuthRoutes.js
├── auth-styles.css
├── authLayout.edge
├── authRoutes.js
├── bootstrap
│ ├── auth-styles.css
│ ├── authLayout.edge
│ ├── dashboard.edge
│ ├── login.edge
│ ├── password-change-form.edge
│ ├── password-reset-request-form.edge
│ ├── password-reset.edge
│ └── register.edge
├── dashboard.edge
├── events.js
├── login.edge
├── migration_add_account_status_to_users_schema.js
├── password-change-form.edge
├── password-mail.edge
├── password-reset-request-form.edge
├── password-reset.edge
├── register.edge
└── welcome-mail.edge
└── yalc.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # yalc package cache
24 | .yalc
25 |
26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
27 | .grunt
28 |
29 | # Bower dependency directory (https://bower.io/)
30 | bower_components
31 |
32 | # node-waf configuration
33 | .lock-wscript
34 |
35 | # Compiled binary addons (https://nodejs.org/api/addons.html)
36 | build/Release
37 |
38 | # Dependency directories
39 | node_modules/
40 | jspm_packages/
41 |
42 | # TypeScript v1 declaration files
43 | typings/
44 |
45 | # Optional npm cache directory
46 | .npm
47 |
48 | # Optional eslint cache
49 | .eslintcache
50 |
51 | # Optional REPL history
52 | .node_repl_history
53 |
54 | # Output of 'npm pack'
55 | *.tgz
56 |
57 | # Yarn Integrity file
58 | .yarn-integrity
59 |
60 | # dotenv environment variables file
61 | .env
62 |
63 | # next.js build output
64 | .next
65 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # Adonis Auth Scaffold.
4 |
5 | Adonis auth scaffold offers you painless authentication built on top [Persona.js](https://github.com/adonisjs/persona) available within seconds.
6 |
7 | Spend those minutes you'd use in setting up authentication doing awesome stuff within your app.
8 |
9 | ## Index
10 |
11 | - [Introduction](#introduction)
12 | - [Installation](#installation)
13 | - [Getting Started](#getting-started)
14 |
15 | ## Introduction
16 |
17 | ### Directory Structure
18 |
19 | ```
20 | app
21 | └── Controllers
22 | └── HTTP
23 | ├── AuthController.js
24 | ├── ApiAuthController.js
25 | config
26 | ├── adonis-auth-scaffold.js
27 | public
28 | └── auth
29 | ├── auth-styles.css
30 | resources
31 | └── views
32 | └── auth
33 | └── emails
34 | ├── password.edge
35 | ├── welcome-mail.edge
36 | └── partials
37 | ├── password-change-form.edge
38 | ├── password-reset-request-form.edge
39 | └── layouts
40 | ├── auth.edge
41 | ├── dashboard.edge
42 | ├── login.edge
43 | ├── password-reset.edge
44 | ├── register.edge
45 | start
46 | ├── authEvents.js
47 | ├── authRoutes.js
48 | ├── apiAuthRoutes.js
49 | ```
50 |
51 | ## About Adonis Auth Scaffold.
52 |
53 | Adonis Auth Scaffold is a CLI utility that gives you a functional authentication system in Adonis.js
54 | within seconds.
55 |
56 | ## Getting Started
57 |
58 | ### Installation
59 |
60 | Install `adonis-auth-scaffold` by running the below command.
61 |
62 | __NPM__
63 |
64 | ```bash
65 | npm install adonis-auth-scaffold --save-dev
66 | npm install @adonisjs/mail @adonisjs/persona @adonisjs/validator
67 | ```
68 |
69 | __Yarn__
70 |
71 | ```bash
72 | yarn add adonis-auth-scaffold --save-dev
73 | yarn add @adonisjs/mail @adonisjs/persona @adonisjs/validator
74 | ```
75 |
76 | ### Register providers.
77 |
78 | The `adonis-auth-scaffold` provider must be registered as an `aceProvider`.
79 | We are running CLI commands after all!
80 |
81 | ```js
82 | const aceProviders = [
83 | 'adonis-auth-scaffold/providers/AdonisAuthScaffoldProvider'
84 | ];
85 | ```
86 |
87 | Also add providers for the newly installed dependencies.
88 |
89 | ```js
90 | const providers = [
91 | "@adonisjs/validator/providers/ValidatorProvider",
92 | "@adonisjs/mail/providers/MailProvider",
93 | "@adonisjs/persona/providers/PersonaProvider"
94 | ]
95 | ```
96 |
97 | ### Register Middleware
98 |
99 | Register the below middleware in `start/kernel.js`
100 |
101 | ```js
102 | const globalMiddleware = [
103 | "App/Middleware/ViewHelper"
104 | ]
105 | ```
106 |
107 | ### Generating auth scaffold.
108 |
109 | 
110 |
111 | Please run the below command to scaffold authentication.
112 |
113 | ```js
114 | adonis make:auth
115 | ```
116 |
117 | A prompt to choose between generating code for a RESTful Api or a HTTP client allows you customize the generated files for your specific use case.
118 | Alternative versions of this command involves passing either the `--api-only` or `--http-only` flags.
119 |
120 | To generate auth files for a REST Api, you may run:
121 |
122 | ```js
123 | adonis make:auth --api-only
124 | ```
125 |
126 | ### Events
127 |
128 | Please add the following line at the beginning of `start/events.js`.
129 |
130 | ```js
131 | require('./authEvents');
132 | ```
133 |
134 | ### Migrations
135 |
136 | Run the following command to run startup migrations.
137 | Please remember to add the `status` column to your User migration.
138 |
139 | ```js
140 | adonis migration:run
141 | ```
142 |
143 | ## Contributing
144 |
145 | Contributions are welcome! Check out the [issues](https://github.com/creatrixity/adonis-auth-scaffold/issues) or the [PRs](https://github.com/creatrixity/adonis-auth-scaffold/pull-requests), and make your own if you want something that you don't see there.
146 |
147 | ## License
148 |
149 | [GPLv3.0](https://github.com/creatrixity/adonis-auth-scaffold)
150 |
--------------------------------------------------------------------------------
/commands/MakeAuth.js:
--------------------------------------------------------------------------------
1 | /**
2 | * adonis-auth-scaffold
3 | *
4 | * (c) Caleb Mathew
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | const _ = require("lodash");
11 | const path = require("path");
12 | const packageNamespace = 'adonis-auth-scaffold';
13 |
14 | const Helpers = use('Helpers')
15 |
16 | const { Command } = require("@adonisjs/ace");
17 |
18 | class MakeAuth extends Command {
19 | /* istanbul ignore next */
20 | /**
21 | * The command signature.
22 | *
23 | * @method signature
24 | *
25 | * @return {String}
26 | */
27 | /* istanbul ignore next */
28 | static get signature() {
29 | return `
30 | make:auth
31 | { --api-only : Generates files for RESTful Apis. }
32 | { --http-only : Generates files for HTTP client request. }
33 | { --bootstrap : Generates views based on Bootstrap (only works with HTTP client request). }
34 | `;
35 | }
36 |
37 | /* istanbul ignore next */
38 | /**
39 | * The command description.
40 | *
41 | * @method description
42 | *
43 | * @return {String}
44 | */
45 | static get description() {
46 | return "Generates the auth scaffold.";
47 | }
48 |
49 | /**
50 | * Ensures the command is executed within the project root.
51 | *
52 | * @method ensureInProjectRoot
53 | *
54 | * @return {void}
55 | *
56 | * @private
57 | */
58 | async _ensureInProjectRoot() {
59 | const acePath = path.join(process.cwd(), "ace");
60 | const exists = await this.pathExists(acePath);
61 |
62 | if (!exists) {
63 | throw new Error(
64 | "Oops! Make sure you are inside an Adonisjs app to run the make:auth command."
65 | );
66 | }
67 | }
68 |
69 | /**
70 | * Creates the AuthController.js file for the HTTP client.
71 | *
72 | * @returns {Void}
73 | */
74 | copyHTTPAuthController () {
75 | try {
76 | this.copy(
77 | path.join(__dirname, '../templates', 'AuthController.js'),
78 | path.join(Helpers.appRoot(), 'app/Controllers/Http/AuthController.js')
79 | )
80 |
81 | this.success('Created Controllers/Http/AuthController.js')
82 | } catch (error) {
83 | // Output error message to console.
84 | this.error(error);
85 | }
86 | }
87 |
88 | /**
89 | * Creates the ApiAuthController.js file for the HTTP client.
90 | *
91 | * @returns {Void}
92 | */
93 | copyApiAuthController () {
94 | try {
95 | this.copy(
96 | path.join(__dirname, '../templates', 'ApiAuthController.js'),
97 | path.join(Helpers.appRoot(), 'app/Controllers/Http/ApiAuthController.js')
98 | )
99 | this.success('Created Controllers/Http/ApiAuthController.js')
100 | } catch (error) {
101 | // Output error to console.
102 | this.error(error);
103 | }
104 | }
105 |
106 | /**
107 | * Creates the adonis-auth-scaffold.js config file.
108 | *
109 | * @returns {Void}
110 | */
111 | async copyConfig () {
112 | try {
113 | await this.copy(
114 | path.join(__dirname, '../templates', `${packageNamespace}.mustache`),
115 | path.join(Helpers.configPath(), `${packageNamespace}.js`)
116 | )
117 | this.success(`Created config/${packageNamespace}.js`)
118 | } catch (error) {
119 | // Output error to console.
120 | this.error(error);
121 | }
122 | }
123 |
124 | /**
125 | * Creates the auth-styles.css file.
126 | *
127 | * @param {String} stylePath - Specifies a template subfolder to use for the views.
128 | * @returns {Void}
129 | */
130 | async copyAuthStyles (stylePath) {
131 | try {
132 | await this.copy(
133 | path.join(__dirname, '../templates', stylePath, 'auth-styles.css'),
134 | path.join(Helpers.publicPath(), 'auth/auth-styles.css')
135 | )
136 | this.success('Successfully created public/auth/auth-styles.css')
137 | } catch (error) {
138 | // Output error to console.
139 | this.error(error);
140 | }
141 | }
142 |
143 | /**
144 | * Creates the email view templates files.
145 | *
146 | * @returns {Void}
147 | */
148 | async copyEmailViewTemplates () {
149 | try {
150 | await this.copy(
151 | path.join(__dirname, '../templates', 'password-mail.edge'),
152 | path.join(Helpers.viewsPath(), 'auth/emails/password.edge')
153 | )
154 | await this.copy(
155 | path.join(__dirname, '../templates', 'welcome-mail.edge'),
156 | path.join(Helpers.viewsPath(), 'auth/emails/welcome-mail.edge')
157 | )
158 |
159 | this.success('Created resources/views/auth/emails/password.edge')
160 | this.success('Created resources/views/auth/emails/welcome-mail.edge')
161 | } catch (error) {
162 | // Output error to console.
163 | this.error(error)
164 | }
165 | }
166 |
167 | /**
168 | * Creates the partials view templates.
169 | *
170 | * @param {String} stylePath - Specifies a template subfolder to use for the views.
171 | * @returns {Void}
172 | */
173 | async copyPartialsViewTemplates (stylePath) {
174 | try {
175 | await this.copy(
176 | path.join(__dirname, '../templates', stylePath, 'password-reset-request-form.edge'),
177 | path.join(Helpers.viewsPath(), 'auth/partials/password-reset-request-form.edge')
178 | )
179 | await this.copy(
180 | path.join(__dirname, '../templates', stylePath, 'password-change-form.edge'),
181 | path.join(Helpers.viewsPath(), 'auth/partials/password-change-form.edge')
182 | )
183 |
184 | this.success('Created resources/views/auth/partials/password-reset-request-form.edge')
185 | this.success('Created resources/views/auth/partials/password-change-form.edge')
186 | } catch (error) {
187 | // Output error to console.
188 | this.error(error);
189 | }
190 | }
191 |
192 | /**
193 | * Creates the auth view templates.
194 | *
195 | * @param {String} stylePath - Specifies a template subfolder to use for the views.
196 | * @returns {Void}
197 | */
198 | async copyAuthViewTemplates (stylePath) {
199 | try {
200 | await this.copy(
201 | path.join(__dirname, '../templates', stylePath, 'dashboard.edge'),
202 | path.join(Helpers.viewsPath(), 'auth/dashboard.edge')
203 | )
204 | await this.copy(
205 | path.join(__dirname, '../templates', stylePath, 'login.edge'),
206 | path.join(Helpers.viewsPath(), 'auth/login.edge')
207 | )
208 | await this.copy(
209 | path.join(__dirname, '../templates', stylePath, 'register.edge'),
210 | path.join(Helpers.viewsPath(), 'auth/register.edge')
211 | )
212 | await this.copy(
213 | path.join(__dirname, '../templates', stylePath, 'password-reset.edge'),
214 | path.join(Helpers.viewsPath(), 'auth/password-reset.edge')
215 | )
216 |
217 | this.success('Create resources/views/auth/dashboard.edge')
218 | this.success('Create resources/views/auth/login.edge')
219 | this.success('Create resources/views/auth/register.edge')
220 | this.success('Create resources/views/auth/password-reset.edge')
221 | } catch (error) {
222 | this.error(error);
223 | }
224 | }
225 |
226 | /**
227 | * Creates the layout view templates.
228 | *
229 | * @param {String} stylePath - Specifies a template subfolder to use for the views.
230 | * @returns {Void}
231 | */
232 | async copyLayoutViewTemplates (stylePath) {
233 | try {
234 | await this.copy(
235 | path.join(__dirname, '../templates', stylePath, 'authLayout.edge'),
236 | path.join(Helpers.viewsPath(), 'layouts/auth.edge')
237 | )
238 | this.success('Created resources/views/layouts/auth.edge')
239 | } catch (error) {
240 | // Output error to console.
241 | this.error(error);
242 | }
243 | }
244 |
245 | /**
246 | * Creates the app starter files available at app/start.
247 | *
248 | * @param {String} client
249 | * @returns {Void}
250 | */
251 | async copyAppStarterFiles (client) {
252 | try {
253 | if (client === 'http') {
254 | await this.copy(
255 | path.join(__dirname, '../templates', 'authRoutes.js'),
256 | path.join(Helpers.appRoot(), 'start/authRoutes.js')
257 | )
258 | } else {
259 | await this.copy(
260 | path.join(__dirname, '../templates', 'apiAuthRoutes.js'),
261 | path.join(Helpers.appRoot(), 'start/apiAuthRoutes.js')
262 | )
263 | }
264 |
265 | await this.copy(
266 | path.join(__dirname, '../templates', 'events.js'),
267 | path.join(Helpers.appRoot(), 'start/authEvents.js')
268 | )
269 |
270 | const authRoutesSuccessMessage = client ==='http' ? 'Created start/authRoutes.js': 'Created start/apiAuthRoutes.js';
271 |
272 | this.success(authRoutesSuccessMessage)
273 | this.success('Created start/authEvents.js')
274 | } catch (error) {
275 | // Output error to console.
276 | this.error(error);
277 | }
278 | }
279 |
280 | /**
281 | * Creates the app starter files available at app/start.
282 | *
283 | * @returns {Void}
284 | */
285 | async copyMiddlewareFiles () {
286 | try {
287 | await this.copy(
288 | path.join(__dirname, '../templates', 'ViewHelper.js'),
289 | path.join(Helpers.appRoot(), 'app/Middleware/ViewHelper.js')
290 | )
291 | this.success('Created app/Middleware/ViewHelper.js')
292 | } catch (error) {
293 | this.error(error);
294 | }
295 | }
296 |
297 | /**
298 | * Creates a migration for users table.
299 | *
300 | * @returns {Void}
301 | */
302 | async copyMigrationFiles () {
303 | try {
304 | const timestamp = new Date().getTime();
305 | const newFileName = `database/migrations/${timestamp}_add_account_status_to_users_schema.js`;
306 | await this.copy(
307 | path.join(__dirname, '../templates', 'migration_add_account_status_to_users_schema.js'),
308 | path.join(Helpers.appRoot(), newFileName)
309 | )
310 | this.success(`Created ${newFileName}`)
311 | } catch (error) {
312 | this.error(error);
313 | }
314 | }
315 |
316 | /**
317 | * Creates all scaffold templates.
318 | *
319 | * @param {String} client - Specifies if we are generating for an API or HTTP client.
320 | * @param {String} style - Specifies if we are using regular or Bootstrap views.
321 | * @returns {Void}
322 | */
323 | async _copyFiles (client, style) {
324 | if (client === 'http') {
325 | await this.copyHTTPAuthController();
326 | } else {
327 | await this.copyApiAuthController();
328 | }
329 |
330 | const stylePath = style == 'regular' ? '' : style;
331 |
332 | await this.copyConfig()
333 | await this.copyAuthStyles(stylePath)
334 | await this.copyEmailViewTemplates()
335 | await this.copyPartialsViewTemplates(stylePath)
336 | await this.copyAuthViewTemplates(stylePath)
337 | await this.copyLayoutViewTemplates(stylePath)
338 | await this.copyAppStarterFiles(client)
339 | await this.copyMiddlewareFiles()
340 | await this.copyMigrationFiles()
341 | }
342 |
343 | /**
344 | * Prepends a line of text to a provided file.
345 | *
346 | * @param {String} Object.filename - Fully qualified path of the file to be operated on.
347 | * @param {Number} Object.lineNumber - Line to operate on.
348 | * @param {String} Object.lineContent - Content to be prepended.
349 | * @param {String} Object.afterContent - Finds a line with the content specified and adds the new line after it.
350 | *
351 | * @return {Void}
352 | */
353 | async _prependLineToFile ({
354 | filename,
355 | lineNumber,
356 | lineContent,
357 | afterContent
358 | }) {
359 | let fileContents = await this.readFile(filename, 'utf-8');
360 | fileContents = fileContents.split("\n");
361 |
362 | if (afterContent) {
363 | const i = fileContents.findIndex(l => l.includes(afterContent))
364 | if (i > 0) lineNumber = i + 1;
365 | }
366 |
367 | if (fileContents[lineNumber] === lineContent) return;
368 |
369 | fileContents.splice(lineNumber, 0, `\n${lineContent}\n`)
370 |
371 | await this.writeFile(filename, fileContents.join('\n'));
372 | }
373 |
374 | /**
375 | * Method executed by ace when command is called. It
376 | * will create a new sample test for the user.
377 | *
378 | * @method handle
379 | *
380 | * @return {void}
381 | */
382 | async handle({}, {
383 | apiOnly,
384 | httpOnly,
385 | bootstrap
386 | }) {
387 | let client;
388 | let style;
389 |
390 | if (!apiOnly && !httpOnly) {
391 | client = await this
392 | .choice('Will this be used for a REST Api or for a HTTP Client?', [
393 | {
394 | name: 'For REST Api',
395 | value: 'api'
396 | }, {
397 | name: 'For HTTP',
398 | value: 'http'
399 | }
400 | ])
401 | } else {
402 | client = apiOnly ? 'api': 'http';
403 | }
404 |
405 | if (client === 'http') {
406 | if (!bootstrap) {
407 | style = await this
408 | .choice('Which style do you want to use for your views?', [
409 | {
410 | name: 'Regular Adonis Auth Scaffold views (looks like default welcome page)',
411 | value: 'regular'
412 | }, {
413 | name: 'Bootstrap views',
414 | value: 'bootstrap'
415 | }
416 | ])
417 | } else {
418 | style = 'bootstrap';
419 | }
420 | }
421 |
422 | try {
423 | // Write a module require statement to the routes.js file.
424 | let routesFilePath = path.join(Helpers.appRoot(), 'start/routes.js');
425 | let generatedRoutesFilename = apiOnly ? 'apiAuthRoutes.js': 'authRoutes.js';
426 |
427 | await this._prependLineToFile({
428 | filename: routesFilePath,
429 | lineNumber: 2,
430 | lineContent: `require('./${generatedRoutesFilename}');`
431 | })
432 |
433 | let tokenModelFilePath = path.join(Helpers.appRoot(), 'app/Models/Token.js');
434 | let tokenModelContent = ` user () {
435 | return this.belongsTo('App/Models/User')
436 | }`;
437 |
438 | await this._prependLineToFile({
439 | filename: tokenModelFilePath,
440 | afterContent: 'class Token',
441 | lineContent: tokenModelContent
442 | })
443 |
444 | await this._ensureInProjectRoot();
445 | await this._copyFiles(client, style);
446 | } catch (error) {
447 | /**
448 | * Throw error if command executed programatically
449 | */
450 | if (!this.viaAce) {
451 | throw error;
452 | }
453 | this.error(error.message);
454 | }
455 | }
456 | }
457 |
458 | module.exports = MakeAuth;
459 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const ace = require("@adonisjs/ace");
2 | ace.command(
3 | "make:auth",
4 | "Generates Views, Controllers and Models for user authentication",
5 | function({ name }) {
6 | console.log(`Scaffolding basic authentication`);
7 | }
8 | );
9 |
10 | // Boot ace to execute commands
11 | ace.wireUpWithCommander();
12 | ace.invoke();
13 |
--------------------------------------------------------------------------------
/instructions.js:
--------------------------------------------------------------------------------
1 | /**
2 | * adonis-auth-scaffold
3 | *
4 | * (c) Caleb Mathew
5 | *
6 | * For the full copyright and license information, please view the LICENSE
7 | * file that was distributed with this source code.
8 | */
9 |
10 | module.exports = async cli => {};
11 |
--------------------------------------------------------------------------------
/instructions.md:
--------------------------------------------------------------------------------
1 | ## Getting Started with Adonis Auth Scaffold.
2 |
3 | Thanks for using Adonis auth scaffold.
4 |
5 | ### Register providers.
6 |
7 | The `adonis-auth-scaffold` provider must be registered as an `aceProvider`.
8 | We are running CLI commands after all!
9 |
10 | ```js
11 | const aceProviders = [
12 | 'adonis-auth-scaffold/providers/AdonisAuthScaffoldProvider'
13 | ];
14 | ```
15 |
16 | Also add providers for the newly installed dependencies.
17 |
18 | ```js
19 | const providers = [
20 | "@adonisjs/validator/providers/ValidatorProvider",
21 | "@adonisjs/mail/providers/MailProvider",
22 | "@adonisjs/persona/providers/PersonaProvider"
23 | ]
24 | ```
25 |
26 | ### Register Middleware
27 |
28 | Register the below middleware in `start/kernel.js`
29 |
30 | ```js
31 | const globalMiddleware = [
32 | "App/Middleware/ViewHelper"
33 | ]
34 | ```
35 |
36 | ### Generating auth scaffold.
37 |
38 | Please run the below command to scaffold authentication.
39 |
40 | ```js
41 | adonis make:auth
42 | ```
43 |
44 | ### Routes
45 |
46 | Please add the following line at the beginning of `start/routes.js`.
47 |
48 | ```js
49 | require('./authRoutes');
50 | ```
51 |
52 | ### Events
53 |
54 | Please add the following line at the beginning of `start/events.js`.
55 |
56 | ```js
57 | require('./authEvents');
58 | ```
59 |
60 | ### Migrations
61 |
62 | Run the following command to run startup migrations.
63 | Please remember to add the `status` column to your User migration.
64 |
65 | ```js
66 | adonis migration:run
67 | ```
68 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "adonis-auth-scaffold",
3 | "version": "1.2.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@adonisjs/ace": {
8 | "version": "6.3.1",
9 | "resolved": "https://registry.npmjs.org/@adonisjs/ace/-/ace-6.3.1.tgz",
10 | "integrity": "sha512-ccI9eda/lxPlO48qcKxmnBAr8KUwf/VDytWZysJ9ofDxY5fECta2k8Y8TF7TBs2PIphwl6Pe8cH+fKqihJ0D/g==",
11 | "dev": true,
12 | "requires": {
13 | "@poppinss/colors": "^1.0.1",
14 | "@poppinss/dev-utils": "^1.0.1",
15 | "@poppinss/fancy-logs": "^1.2.1",
16 | "@poppinss/prompts": "^1.0.3",
17 | "@poppinss/utils": "^2.0.0",
18 | "camel-case": "^3.0.0",
19 | "fast-levenshtein": "^2.0.6",
20 | "fs-extra": "^8.1.0",
21 | "getopts": "^2.2.4",
22 | "pad-right": "^0.2.2",
23 | "param-case": "^2.1.1",
24 | "pascal-case": "^2.0.1",
25 | "pluralize": "^8.0.0",
26 | "smpltmpl": "^1.0.2",
27 | "snake-case": "^2.1.0"
28 | }
29 | },
30 | "@adonisjs/fold": {
31 | "version": "6.2.2",
32 | "resolved": "https://registry.npmjs.org/@adonisjs/fold/-/fold-6.2.2.tgz",
33 | "integrity": "sha512-2y2AegrhhI1k/BO33YnKNU4SNZ1GFq2O9Otj99pPaH/0aBY+N3d5Cyk4hWnRJAPFOwBDqHqSiBnVXxkawWbTaQ==",
34 | "dev": true,
35 | "requires": {
36 | "@poppinss/utils": "^2.0.0"
37 | }
38 | },
39 | "@adonisjs/generic-exceptions": {
40 | "version": "2.0.1",
41 | "resolved": "https://registry.npmjs.org/@adonisjs/generic-exceptions/-/generic-exceptions-2.0.1.tgz",
42 | "integrity": "sha512-ZIPnj7vlRZKaAyZ4c2SUFCpJ6Yk+xzR+STjsze9unmZQncpQmVq1K8r20pXX3Z9rnxKVlfwO58HTxMMWaX9t9A==",
43 | "requires": {
44 | "node-exceptions": "^3.0.0",
45 | "upcast": "^2.1.1"
46 | }
47 | },
48 | "@adonisjs/persona": {
49 | "version": "1.0.5",
50 | "resolved": "https://registry.npmjs.org/@adonisjs/persona/-/persona-1.0.5.tgz",
51 | "integrity": "sha512-VFdZ2CAx8WhDih/AkIf9ZG+62QESiInC4oAz+p4HNsY7fG0DDlbDX4TBPwSK1YOdiZCE6t2T0AcpChtXiBp5xg==",
52 | "requires": {
53 | "@adonisjs/generic-exceptions": "^2.0.0",
54 | "moment": "^2.22.1",
55 | "rand-token": "^0.4.0"
56 | }
57 | },
58 | "@poppinss/colors": {
59 | "version": "1.0.1",
60 | "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-1.0.1.tgz",
61 | "integrity": "sha512-k34EgiccCBoTpk9LTkosGxu41/XhxevrC/oE+H5d58Jcga0neSkDxUcmSFmbggfs4S6QA9yaryiqVEl/BVujsA==",
62 | "dev": true,
63 | "requires": {
64 | "kleur": "^3.0.3"
65 | }
66 | },
67 | "@poppinss/dev-utils": {
68 | "version": "1.0.1",
69 | "resolved": "https://registry.npmjs.org/@poppinss/dev-utils/-/dev-utils-1.0.1.tgz",
70 | "integrity": "sha512-njqicZ6RFXs11873L3DKEAqNdF5NnpygurlbU5Cj09+Bj3hEJYdTJXeGUAcZ8NDiRGta74QBWeycy2ZtLj6yrg==",
71 | "dev": true,
72 | "requires": {
73 | "@types/fs-extra": "^8.0.0",
74 | "clear-module": "^4.0.0",
75 | "fs-extra": "^8.1.0"
76 | }
77 | },
78 | "@poppinss/fancy-logs": {
79 | "version": "1.2.1",
80 | "resolved": "https://registry.npmjs.org/@poppinss/fancy-logs/-/fancy-logs-1.2.1.tgz",
81 | "integrity": "sha512-dcIYtquPD8ulJ5x8Lz9dMXI3vls8OfWgIR/PfxXWEugTfxsQY4227hcm/7vTm3m436hFQqHY+J3yaIHtpiWHHg==",
82 | "dev": true,
83 | "requires": {
84 | "@poppinss/colors": "^1.0.1",
85 | "figures": "^3.0.0",
86 | "signale": "^1.4.0",
87 | "string-width": "^4.1.0"
88 | }
89 | },
90 | "@poppinss/prompts": {
91 | "version": "1.0.3",
92 | "resolved": "https://registry.npmjs.org/@poppinss/prompts/-/prompts-1.0.3.tgz",
93 | "integrity": "sha512-12wgPg8/pgbd1u+7OUEeN5LaNAPTuqCgxO7baonJDq7KfvkykKqk10XeJFX/Q/ecutb99oEzpNUnOMrZQ6JjTQ==",
94 | "dev": true,
95 | "requires": {
96 | "enquirer": "^2.3.1"
97 | }
98 | },
99 | "@poppinss/utils": {
100 | "version": "2.0.0",
101 | "resolved": "https://registry.npmjs.org/@poppinss/utils/-/utils-2.0.0.tgz",
102 | "integrity": "sha512-YEMiRYvrkj6lE40k/G4hW5XBMqxYBwxRnRKs/xgFngxXICWaS+pXpGEJwpWtsavImUirtarqKuU7/6LN4nBVRQ==",
103 | "dev": true,
104 | "requires": {
105 | "require-all": "^3.0.0"
106 | }
107 | },
108 | "@types/fs-extra": {
109 | "version": "8.0.1",
110 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.0.1.tgz",
111 | "integrity": "sha512-J00cVDALmi/hJOYsunyT52Hva5TnJeKP5yd1r+mH/ZU0mbYZflR0Z5kw5kITtKTRYMhm1JMClOFYdHnQszEvqw==",
112 | "dev": true,
113 | "requires": {
114 | "@types/node": "*"
115 | }
116 | },
117 | "@types/node": {
118 | "version": "12.11.1",
119 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.1.tgz",
120 | "integrity": "sha512-TJtwsqZ39pqcljJpajeoofYRfeZ7/I/OMUQ5pR4q5wOKf2ocrUvBAZUMhWsOvKx3dVc/aaV5GluBivt0sWqA5A==",
121 | "dev": true
122 | },
123 | "acorn": {
124 | "version": "6.0.2",
125 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz",
126 | "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg=="
127 | },
128 | "acorn-dynamic-import": {
129 | "version": "4.0.0",
130 | "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz",
131 | "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw=="
132 | },
133 | "acorn-node": {
134 | "version": "1.6.1",
135 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.1.tgz",
136 | "integrity": "sha512-B+fHENiJB8X0lNQQ/auxOqBC1xWig8RpxUAomCrlLJmNx1Z141WyRjwcEK4Ux7YRq3133H5Q6GYXch0rOa47NQ==",
137 | "requires": {
138 | "acorn": "^6.0.1",
139 | "acorn-dynamic-import": "^4.0.0",
140 | "acorn-walk": "^6.0.1",
141 | "xtend": "^4.0.1"
142 | }
143 | },
144 | "acorn-walk": {
145 | "version": "6.1.0",
146 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz",
147 | "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg=="
148 | },
149 | "adonis-fold": {
150 | "version": "3.0.3",
151 | "resolved": "https://registry.npmjs.org/adonis-fold/-/adonis-fold-3.0.3.tgz",
152 | "integrity": "sha1-scZNFReVCS/LSdcdT+IJM7l2l0I=",
153 | "requires": {
154 | "cat-log": "^1.0.0",
155 | "co": "^4.6.0",
156 | "co-parallel": "^1.0.0",
157 | "coveralls": "^2.11.12",
158 | "dwell": "^1.0.0",
159 | "eventemitter2": "^2.1.0",
160 | "lodash": "^3.10.1",
161 | "node-exceptions": "^1.0.3",
162 | "require-stack": "^1.0.1"
163 | },
164 | "dependencies": {
165 | "lodash": {
166 | "version": "3.10.1",
167 | "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
168 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
169 | },
170 | "node-exceptions": {
171 | "version": "1.0.3",
172 | "resolved": "http://registry.npmjs.org/node-exceptions/-/node-exceptions-1.0.3.tgz",
173 | "integrity": "sha1-Ylp5e5LL6N1b0K5U6TVxt97ZCxU="
174 | }
175 | }
176 | },
177 | "ansi": {
178 | "version": "0.3.1",
179 | "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz",
180 | "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE="
181 | },
182 | "ansi-colors": {
183 | "version": "3.2.4",
184 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
185 | "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
186 | "dev": true
187 | },
188 | "ansi-regex": {
189 | "version": "4.1.0",
190 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
191 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
192 | "dev": true
193 | },
194 | "ansi-styles": {
195 | "version": "2.2.1",
196 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
197 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
198 | },
199 | "are-we-there-yet": {
200 | "version": "1.1.5",
201 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
202 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
203 | "requires": {
204 | "delegates": "^1.0.0",
205 | "readable-stream": "^2.0.6"
206 | }
207 | },
208 | "argparse": {
209 | "version": "1.0.10",
210 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
211 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
212 | "requires": {
213 | "sprintf-js": "~1.0.2"
214 | }
215 | },
216 | "asn1": {
217 | "version": "0.2.4",
218 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
219 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
220 | "requires": {
221 | "safer-buffer": "~2.1.0"
222 | }
223 | },
224 | "assert-plus": {
225 | "version": "0.2.0",
226 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
227 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ="
228 | },
229 | "asynckit": {
230 | "version": "0.4.0",
231 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
232 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
233 | },
234 | "aws-sign2": {
235 | "version": "0.6.0",
236 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
237 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8="
238 | },
239 | "aws4": {
240 | "version": "1.8.0",
241 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
242 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
243 | },
244 | "babel-code-frame": {
245 | "version": "6.26.0",
246 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
247 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
248 | "dev": true,
249 | "requires": {
250 | "chalk": "^1.1.3",
251 | "esutils": "^2.0.2",
252 | "js-tokens": "^3.0.2"
253 | }
254 | },
255 | "bcrypt-pbkdf": {
256 | "version": "1.0.2",
257 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
258 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
259 | "requires": {
260 | "tweetnacl": "^0.14.3"
261 | }
262 | },
263 | "boom": {
264 | "version": "2.10.1",
265 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
266 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
267 | "requires": {
268 | "hoek": "2.x.x"
269 | }
270 | },
271 | "callsites": {
272 | "version": "3.1.0",
273 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
274 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
275 | "dev": true
276 | },
277 | "camel-case": {
278 | "version": "3.0.0",
279 | "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
280 | "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
281 | "dev": true,
282 | "requires": {
283 | "no-case": "^2.2.0",
284 | "upper-case": "^1.1.1"
285 | }
286 | },
287 | "caseless": {
288 | "version": "0.11.0",
289 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
290 | "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c="
291 | },
292 | "cat-log": {
293 | "version": "1.0.2",
294 | "resolved": "https://registry.npmjs.org/cat-log/-/cat-log-1.0.2.tgz",
295 | "integrity": "sha1-G23XgLP2DVGK8Su8YsdxuLLq70A=",
296 | "requires": {
297 | "ms": "^0.7.1",
298 | "npmlog": "^2.0.0"
299 | },
300 | "dependencies": {
301 | "ms": {
302 | "version": "0.7.3",
303 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
304 | "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8="
305 | }
306 | }
307 | },
308 | "chalk": {
309 | "version": "1.1.3",
310 | "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
311 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
312 | "requires": {
313 | "ansi-styles": "^2.2.1",
314 | "escape-string-regexp": "^1.0.2",
315 | "has-ansi": "^2.0.0",
316 | "strip-ansi": "^3.0.0",
317 | "supports-color": "^2.0.0"
318 | },
319 | "dependencies": {
320 | "ansi-regex": {
321 | "version": "2.1.1",
322 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
323 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
324 | },
325 | "strip-ansi": {
326 | "version": "3.0.1",
327 | "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
328 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
329 | "requires": {
330 | "ansi-regex": "^2.0.0"
331 | }
332 | }
333 | }
334 | },
335 | "clear-module": {
336 | "version": "4.0.0",
337 | "resolved": "https://registry.npmjs.org/clear-module/-/clear-module-4.0.0.tgz",
338 | "integrity": "sha512-JiLAmWcshGbujtuyOdDE9GRmdSV5Ud2x+4kJ79hAZSllWs2Kwaf8NY0wq9DOswypcvSL09FGkVq2JoVgaXKbsw==",
339 | "dev": true,
340 | "requires": {
341 | "parent-module": "^2.0.0",
342 | "resolve-from": "^5.0.0"
343 | }
344 | },
345 | "co": {
346 | "version": "4.6.0",
347 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
348 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
349 | },
350 | "co-parallel": {
351 | "version": "1.0.0",
352 | "resolved": "https://registry.npmjs.org/co-parallel/-/co-parallel-1.0.0.tgz",
353 | "integrity": "sha1-WFl6BlgAWkK4xqI8yE2ioQ2Ubyo=",
354 | "requires": {
355 | "co-thread": "0.0.1"
356 | }
357 | },
358 | "co-thread": {
359 | "version": "0.0.1",
360 | "resolved": "https://registry.npmjs.org/co-thread/-/co-thread-0.0.1.tgz",
361 | "integrity": "sha1-V3E/DvS4flWV1PI3Ef/ks7beXnQ="
362 | },
363 | "color-convert": {
364 | "version": "1.9.3",
365 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
366 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
367 | "dev": true,
368 | "requires": {
369 | "color-name": "1.1.3"
370 | }
371 | },
372 | "color-name": {
373 | "version": "1.1.3",
374 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
375 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
376 | "dev": true
377 | },
378 | "combined-stream": {
379 | "version": "1.0.7",
380 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
381 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
382 | "requires": {
383 | "delayed-stream": "~1.0.0"
384 | }
385 | },
386 | "commander": {
387 | "version": "2.19.0",
388 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
389 | "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
390 | },
391 | "core-util-is": {
392 | "version": "1.0.2",
393 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
394 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
395 | },
396 | "coveralls": {
397 | "version": "2.13.3",
398 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz",
399 | "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==",
400 | "requires": {
401 | "js-yaml": "3.6.1",
402 | "lcov-parse": "0.0.10",
403 | "log-driver": "1.2.5",
404 | "minimist": "1.2.0",
405 | "request": "2.79.0"
406 | }
407 | },
408 | "cross-env": {
409 | "version": "5.2.0",
410 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
411 | "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==",
412 | "requires": {
413 | "cross-spawn": "^6.0.5",
414 | "is-windows": "^1.0.0"
415 | }
416 | },
417 | "cross-spawn": {
418 | "version": "6.0.5",
419 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
420 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
421 | "requires": {
422 | "nice-try": "^1.0.4",
423 | "path-key": "^2.0.1",
424 | "semver": "^5.5.0",
425 | "shebang-command": "^1.2.0",
426 | "which": "^1.2.9"
427 | }
428 | },
429 | "cryptiles": {
430 | "version": "2.0.5",
431 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
432 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
433 | "requires": {
434 | "boom": "2.x.x"
435 | }
436 | },
437 | "dashdash": {
438 | "version": "1.14.1",
439 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
440 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
441 | "requires": {
442 | "assert-plus": "^1.0.0"
443 | },
444 | "dependencies": {
445 | "assert-plus": {
446 | "version": "1.0.0",
447 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
448 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
449 | }
450 | }
451 | },
452 | "delayed-stream": {
453 | "version": "1.0.0",
454 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
455 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
456 | },
457 | "delegates": {
458 | "version": "1.0.0",
459 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
460 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
461 | },
462 | "dwell": {
463 | "version": "1.0.0",
464 | "resolved": "https://registry.npmjs.org/dwell/-/dwell-1.0.0.tgz",
465 | "integrity": "sha1-SXR9Lx0WEMlNgQvosKTGzMMp/wY="
466 | },
467 | "ecc-jsbn": {
468 | "version": "0.1.2",
469 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
470 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
471 | "requires": {
472 | "jsbn": "~0.1.0",
473 | "safer-buffer": "^2.1.0"
474 | }
475 | },
476 | "emoji-regex": {
477 | "version": "8.0.0",
478 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
479 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
480 | "dev": true
481 | },
482 | "enquirer": {
483 | "version": "2.3.2",
484 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.2.tgz",
485 | "integrity": "sha512-PLhTMPUXlnaIv9D3Cq3/Zr1xb7soeDDgunobyCmYLUG19n24dvC8i+ZZgm2DekGpDnx7JvFSHV7lxfM58PMtbA==",
486 | "dev": true,
487 | "requires": {
488 | "ansi-colors": "^3.2.1"
489 | }
490 | },
491 | "error-ex": {
492 | "version": "1.3.2",
493 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
494 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
495 | "dev": true,
496 | "requires": {
497 | "is-arrayish": "^0.2.1"
498 | }
499 | },
500 | "escape-string-regexp": {
501 | "version": "1.0.5",
502 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
503 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
504 | },
505 | "esprima": {
506 | "version": "2.7.3",
507 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
508 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE="
509 | },
510 | "esutils": {
511 | "version": "2.0.3",
512 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
513 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
514 | "dev": true
515 | },
516 | "eventemitter2": {
517 | "version": "2.2.2",
518 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-2.2.2.tgz",
519 | "integrity": "sha1-QH6nHCAgzVdTggOrfnpr3Pt2ktU="
520 | },
521 | "extend": {
522 | "version": "3.0.2",
523 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
524 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
525 | },
526 | "extsprintf": {
527 | "version": "1.3.0",
528 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
529 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
530 | },
531 | "fast-levenshtein": {
532 | "version": "2.0.6",
533 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
534 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
535 | "dev": true
536 | },
537 | "figures": {
538 | "version": "3.0.0",
539 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz",
540 | "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==",
541 | "dev": true,
542 | "requires": {
543 | "escape-string-regexp": "^1.0.5"
544 | }
545 | },
546 | "find-up": {
547 | "version": "2.1.0",
548 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
549 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
550 | "dev": true,
551 | "requires": {
552 | "locate-path": "^2.0.0"
553 | }
554 | },
555 | "forever-agent": {
556 | "version": "0.6.1",
557 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
558 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
559 | },
560 | "form-data": {
561 | "version": "2.1.4",
562 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
563 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
564 | "requires": {
565 | "asynckit": "^0.4.0",
566 | "combined-stream": "^1.0.5",
567 | "mime-types": "^2.1.12"
568 | }
569 | },
570 | "fs-extra": {
571 | "version": "8.1.0",
572 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
573 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
574 | "dev": true,
575 | "requires": {
576 | "graceful-fs": "^4.2.0",
577 | "jsonfile": "^4.0.0",
578 | "universalify": "^0.1.0"
579 | }
580 | },
581 | "gauge": {
582 | "version": "1.2.7",
583 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz",
584 | "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=",
585 | "requires": {
586 | "ansi": "^0.3.0",
587 | "has-unicode": "^2.0.0",
588 | "lodash.pad": "^4.1.0",
589 | "lodash.padend": "^4.1.0",
590 | "lodash.padstart": "^4.1.0"
591 | }
592 | },
593 | "generate-function": {
594 | "version": "2.3.1",
595 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
596 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
597 | "requires": {
598 | "is-property": "^1.0.2"
599 | }
600 | },
601 | "generate-object-property": {
602 | "version": "1.2.0",
603 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
604 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
605 | "requires": {
606 | "is-property": "^1.0.0"
607 | }
608 | },
609 | "getopts": {
610 | "version": "2.2.5",
611 | "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.2.5.tgz",
612 | "integrity": "sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==",
613 | "dev": true
614 | },
615 | "getpass": {
616 | "version": "0.1.7",
617 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
618 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
619 | "requires": {
620 | "assert-plus": "^1.0.0"
621 | },
622 | "dependencies": {
623 | "assert-plus": {
624 | "version": "1.0.0",
625 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
626 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
627 | }
628 | }
629 | },
630 | "graceful-fs": {
631 | "version": "4.2.2",
632 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
633 | "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==",
634 | "dev": true
635 | },
636 | "har-validator": {
637 | "version": "2.0.6",
638 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
639 | "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
640 | "requires": {
641 | "chalk": "^1.1.1",
642 | "commander": "^2.9.0",
643 | "is-my-json-valid": "^2.12.4",
644 | "pinkie-promise": "^2.0.0"
645 | }
646 | },
647 | "has-ansi": {
648 | "version": "2.0.0",
649 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
650 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
651 | "requires": {
652 | "ansi-regex": "^2.0.0"
653 | },
654 | "dependencies": {
655 | "ansi-regex": {
656 | "version": "2.1.1",
657 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
658 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
659 | }
660 | }
661 | },
662 | "has-flag": {
663 | "version": "3.0.0",
664 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
665 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
666 | "dev": true
667 | },
668 | "has-unicode": {
669 | "version": "2.0.1",
670 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
671 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
672 | },
673 | "hawk": {
674 | "version": "3.1.3",
675 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
676 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
677 | "requires": {
678 | "boom": "2.x.x",
679 | "cryptiles": "2.x.x",
680 | "hoek": "2.x.x",
681 | "sntp": "1.x.x"
682 | }
683 | },
684 | "hoek": {
685 | "version": "2.16.3",
686 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
687 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
688 | },
689 | "http-signature": {
690 | "version": "1.1.1",
691 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
692 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
693 | "requires": {
694 | "assert-plus": "^0.2.0",
695 | "jsprim": "^1.2.2",
696 | "sshpk": "^1.7.0"
697 | }
698 | },
699 | "inherits": {
700 | "version": "2.0.3",
701 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
702 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
703 | },
704 | "is-arrayish": {
705 | "version": "0.2.1",
706 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
707 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
708 | "dev": true
709 | },
710 | "is-fullwidth-code-point": {
711 | "version": "3.0.0",
712 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
713 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
714 | "dev": true
715 | },
716 | "is-my-ip-valid": {
717 | "version": "1.0.0",
718 | "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
719 | "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ=="
720 | },
721 | "is-my-json-valid": {
722 | "version": "2.19.0",
723 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz",
724 | "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==",
725 | "requires": {
726 | "generate-function": "^2.0.0",
727 | "generate-object-property": "^1.1.0",
728 | "is-my-ip-valid": "^1.0.0",
729 | "jsonpointer": "^4.0.0",
730 | "xtend": "^4.0.0"
731 | }
732 | },
733 | "is-property": {
734 | "version": "1.0.2",
735 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
736 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
737 | },
738 | "is-typedarray": {
739 | "version": "1.0.0",
740 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
741 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
742 | },
743 | "is-windows": {
744 | "version": "1.0.2",
745 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
746 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
747 | },
748 | "isarray": {
749 | "version": "1.0.0",
750 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
751 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
752 | },
753 | "isexe": {
754 | "version": "2.0.0",
755 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
756 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
757 | },
758 | "isstream": {
759 | "version": "0.1.2",
760 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
761 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
762 | },
763 | "js-tokens": {
764 | "version": "3.0.2",
765 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
766 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
767 | "dev": true
768 | },
769 | "js-yaml": {
770 | "version": "3.6.1",
771 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz",
772 | "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=",
773 | "requires": {
774 | "argparse": "^1.0.7",
775 | "esprima": "^2.6.0"
776 | }
777 | },
778 | "jsbn": {
779 | "version": "0.1.1",
780 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
781 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
782 | },
783 | "json-parse-better-errors": {
784 | "version": "1.0.2",
785 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
786 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
787 | "dev": true
788 | },
789 | "json-schema": {
790 | "version": "0.2.3",
791 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
792 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
793 | },
794 | "json-stringify-safe": {
795 | "version": "5.0.1",
796 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
797 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
798 | },
799 | "jsonfile": {
800 | "version": "4.0.0",
801 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
802 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
803 | "dev": true,
804 | "requires": {
805 | "graceful-fs": "^4.1.6"
806 | }
807 | },
808 | "jsonpointer": {
809 | "version": "4.0.1",
810 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
811 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk="
812 | },
813 | "jsprim": {
814 | "version": "1.4.1",
815 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
816 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
817 | "requires": {
818 | "assert-plus": "1.0.0",
819 | "extsprintf": "1.3.0",
820 | "json-schema": "0.2.3",
821 | "verror": "1.10.0"
822 | },
823 | "dependencies": {
824 | "assert-plus": {
825 | "version": "1.0.0",
826 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
827 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
828 | }
829 | }
830 | },
831 | "kleur": {
832 | "version": "3.0.3",
833 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
834 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
835 | "dev": true
836 | },
837 | "lcov-parse": {
838 | "version": "0.0.10",
839 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
840 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM="
841 | },
842 | "load-json-file": {
843 | "version": "4.0.0",
844 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
845 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
846 | "dev": true,
847 | "requires": {
848 | "graceful-fs": "^4.1.2",
849 | "parse-json": "^4.0.0",
850 | "pify": "^3.0.0",
851 | "strip-bom": "^3.0.0"
852 | }
853 | },
854 | "locate-path": {
855 | "version": "2.0.0",
856 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
857 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
858 | "dev": true,
859 | "requires": {
860 | "p-locate": "^2.0.0",
861 | "path-exists": "^3.0.0"
862 | }
863 | },
864 | "lodash.pad": {
865 | "version": "4.5.1",
866 | "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz",
867 | "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA="
868 | },
869 | "lodash.padend": {
870 | "version": "4.6.1",
871 | "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
872 | "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4="
873 | },
874 | "lodash.padstart": {
875 | "version": "4.6.1",
876 | "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz",
877 | "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs="
878 | },
879 | "log-driver": {
880 | "version": "1.2.5",
881 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz",
882 | "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY="
883 | },
884 | "lower-case": {
885 | "version": "1.1.4",
886 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
887 | "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
888 | "dev": true
889 | },
890 | "mime-db": {
891 | "version": "1.37.0",
892 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
893 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
894 | },
895 | "mime-types": {
896 | "version": "2.1.21",
897 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
898 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
899 | "requires": {
900 | "mime-db": "~1.37.0"
901 | }
902 | },
903 | "minimist": {
904 | "version": "1.2.0",
905 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
906 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
907 | },
908 | "moment": {
909 | "version": "2.22.2",
910 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
911 | "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y="
912 | },
913 | "nice-try": {
914 | "version": "1.0.5",
915 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
916 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
917 | },
918 | "no-case": {
919 | "version": "2.3.2",
920 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
921 | "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
922 | "dev": true,
923 | "requires": {
924 | "lower-case": "^1.1.1"
925 | }
926 | },
927 | "node-exceptions": {
928 | "version": "3.0.0",
929 | "resolved": "https://registry.npmjs.org/node-exceptions/-/node-exceptions-3.0.0.tgz",
930 | "integrity": "sha512-pFhMAqdN1avrFwtZs66HxYiVnbnH9wjXB4m8IKs5Z9+r7U5voqxT+EDbVkRfge+V7JnkOgKhN4HfKBn1o5g9Wg=="
931 | },
932 | "npmlog": {
933 | "version": "2.0.4",
934 | "resolved": "http://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz",
935 | "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=",
936 | "requires": {
937 | "ansi": "~0.3.1",
938 | "are-we-there-yet": "~1.1.2",
939 | "gauge": "~1.2.5"
940 | }
941 | },
942 | "oauth-sign": {
943 | "version": "0.8.2",
944 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
945 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
946 | },
947 | "p-limit": {
948 | "version": "1.3.0",
949 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
950 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
951 | "dev": true,
952 | "requires": {
953 | "p-try": "^1.0.0"
954 | }
955 | },
956 | "p-locate": {
957 | "version": "2.0.0",
958 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
959 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
960 | "dev": true,
961 | "requires": {
962 | "p-limit": "^1.1.0"
963 | }
964 | },
965 | "p-try": {
966 | "version": "1.0.0",
967 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
968 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
969 | "dev": true
970 | },
971 | "pad-right": {
972 | "version": "0.2.2",
973 | "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz",
974 | "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=",
975 | "dev": true,
976 | "requires": {
977 | "repeat-string": "^1.5.2"
978 | }
979 | },
980 | "param-case": {
981 | "version": "2.1.1",
982 | "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
983 | "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
984 | "dev": true,
985 | "requires": {
986 | "no-case": "^2.2.0"
987 | }
988 | },
989 | "parent-module": {
990 | "version": "2.0.0",
991 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz",
992 | "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==",
993 | "dev": true,
994 | "requires": {
995 | "callsites": "^3.1.0"
996 | }
997 | },
998 | "parse-json": {
999 | "version": "4.0.0",
1000 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
1001 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
1002 | "dev": true,
1003 | "requires": {
1004 | "error-ex": "^1.3.1",
1005 | "json-parse-better-errors": "^1.0.1"
1006 | }
1007 | },
1008 | "pascal-case": {
1009 | "version": "2.0.1",
1010 | "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz",
1011 | "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=",
1012 | "dev": true,
1013 | "requires": {
1014 | "camel-case": "^3.0.0",
1015 | "upper-case-first": "^1.1.0"
1016 | }
1017 | },
1018 | "path-exists": {
1019 | "version": "3.0.0",
1020 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1021 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1022 | "dev": true
1023 | },
1024 | "path-key": {
1025 | "version": "2.0.1",
1026 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1027 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
1028 | },
1029 | "pify": {
1030 | "version": "3.0.0",
1031 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1032 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1033 | "dev": true
1034 | },
1035 | "pinkie": {
1036 | "version": "2.0.4",
1037 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
1038 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
1039 | },
1040 | "pinkie-promise": {
1041 | "version": "2.0.1",
1042 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
1043 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
1044 | "requires": {
1045 | "pinkie": "^2.0.0"
1046 | }
1047 | },
1048 | "pkg-conf": {
1049 | "version": "2.1.0",
1050 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz",
1051 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=",
1052 | "dev": true,
1053 | "requires": {
1054 | "find-up": "^2.0.0",
1055 | "load-json-file": "^4.0.0"
1056 | }
1057 | },
1058 | "pluralize": {
1059 | "version": "8.0.0",
1060 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
1061 | "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
1062 | "dev": true
1063 | },
1064 | "process-nextick-args": {
1065 | "version": "2.0.0",
1066 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1067 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
1068 | },
1069 | "punycode": {
1070 | "version": "1.4.1",
1071 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1072 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
1073 | },
1074 | "qs": {
1075 | "version": "6.3.2",
1076 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
1077 | "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw="
1078 | },
1079 | "rand-token": {
1080 | "version": "0.4.0",
1081 | "resolved": "https://registry.npmjs.org/rand-token/-/rand-token-0.4.0.tgz",
1082 | "integrity": "sha512-FLNNsir2R+XY8LKsZ+8u/w0qZ4sGit7cpNdznsI77cAVob6UlVPueDKRyjJ3W1Q6FJLgAVH98JvlqqpSaL7NEQ=="
1083 | },
1084 | "readable-stream": {
1085 | "version": "2.3.6",
1086 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1087 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1088 | "requires": {
1089 | "core-util-is": "~1.0.0",
1090 | "inherits": "~2.0.3",
1091 | "isarray": "~1.0.0",
1092 | "process-nextick-args": "~2.0.0",
1093 | "safe-buffer": "~5.1.1",
1094 | "string_decoder": "~1.1.1",
1095 | "util-deprecate": "~1.0.1"
1096 | }
1097 | },
1098 | "repeat-string": {
1099 | "version": "1.6.1",
1100 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1101 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
1102 | "dev": true
1103 | },
1104 | "request": {
1105 | "version": "2.79.0",
1106 | "resolved": "http://registry.npmjs.org/request/-/request-2.79.0.tgz",
1107 | "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
1108 | "requires": {
1109 | "aws-sign2": "~0.6.0",
1110 | "aws4": "^1.2.1",
1111 | "caseless": "~0.11.0",
1112 | "combined-stream": "~1.0.5",
1113 | "extend": "~3.0.0",
1114 | "forever-agent": "~0.6.1",
1115 | "form-data": "~2.1.1",
1116 | "har-validator": "~2.0.6",
1117 | "hawk": "~3.1.3",
1118 | "http-signature": "~1.1.0",
1119 | "is-typedarray": "~1.0.0",
1120 | "isstream": "~0.1.2",
1121 | "json-stringify-safe": "~5.0.1",
1122 | "mime-types": "~2.1.7",
1123 | "oauth-sign": "~0.8.1",
1124 | "qs": "~6.3.0",
1125 | "stringstream": "~0.0.4",
1126 | "tough-cookie": "~2.3.0",
1127 | "tunnel-agent": "~0.4.1",
1128 | "uuid": "^3.0.0"
1129 | }
1130 | },
1131 | "require-all": {
1132 | "version": "3.0.0",
1133 | "resolved": "https://registry.npmjs.org/require-all/-/require-all-3.0.0.tgz",
1134 | "integrity": "sha1-Rz1JcEvjEBFc4ST3c4Ox69hnExI=",
1135 | "dev": true
1136 | },
1137 | "require-stack": {
1138 | "version": "1.0.2",
1139 | "resolved": "https://registry.npmjs.org/require-stack/-/require-stack-1.0.2.tgz",
1140 | "integrity": "sha1-4A7jSL+Wy1w+LUwntJ5BR24Ill0=",
1141 | "requires": {
1142 | "syntax-error": "^1.1.4"
1143 | }
1144 | },
1145 | "resolve-from": {
1146 | "version": "5.0.0",
1147 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
1148 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
1149 | "dev": true
1150 | },
1151 | "safe-buffer": {
1152 | "version": "5.1.2",
1153 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1154 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1155 | },
1156 | "safer-buffer": {
1157 | "version": "2.1.2",
1158 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1159 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1160 | },
1161 | "semver": {
1162 | "version": "5.6.0",
1163 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
1164 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
1165 | },
1166 | "shebang-command": {
1167 | "version": "1.2.0",
1168 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1169 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1170 | "requires": {
1171 | "shebang-regex": "^1.0.0"
1172 | }
1173 | },
1174 | "shebang-regex": {
1175 | "version": "1.0.0",
1176 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1177 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
1178 | },
1179 | "signale": {
1180 | "version": "1.4.0",
1181 | "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
1182 | "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
1183 | "dev": true,
1184 | "requires": {
1185 | "chalk": "^2.3.2",
1186 | "figures": "^2.0.0",
1187 | "pkg-conf": "^2.1.0"
1188 | },
1189 | "dependencies": {
1190 | "ansi-styles": {
1191 | "version": "3.2.1",
1192 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1193 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1194 | "dev": true,
1195 | "requires": {
1196 | "color-convert": "^1.9.0"
1197 | }
1198 | },
1199 | "chalk": {
1200 | "version": "2.4.2",
1201 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
1202 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
1203 | "dev": true,
1204 | "requires": {
1205 | "ansi-styles": "^3.2.1",
1206 | "escape-string-regexp": "^1.0.5",
1207 | "supports-color": "^5.3.0"
1208 | }
1209 | },
1210 | "figures": {
1211 | "version": "2.0.0",
1212 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
1213 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
1214 | "dev": true,
1215 | "requires": {
1216 | "escape-string-regexp": "^1.0.5"
1217 | }
1218 | },
1219 | "supports-color": {
1220 | "version": "5.5.0",
1221 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1222 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1223 | "dev": true,
1224 | "requires": {
1225 | "has-flag": "^3.0.0"
1226 | }
1227 | }
1228 | }
1229 | },
1230 | "smpltmpl": {
1231 | "version": "1.0.2",
1232 | "resolved": "https://registry.npmjs.org/smpltmpl/-/smpltmpl-1.0.2.tgz",
1233 | "integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ==",
1234 | "dev": true,
1235 | "requires": {
1236 | "babel-code-frame": "^6.26.0"
1237 | }
1238 | },
1239 | "snake-case": {
1240 | "version": "2.1.0",
1241 | "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz",
1242 | "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=",
1243 | "dev": true,
1244 | "requires": {
1245 | "no-case": "^2.2.0"
1246 | }
1247 | },
1248 | "sntp": {
1249 | "version": "1.0.9",
1250 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
1251 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
1252 | "requires": {
1253 | "hoek": "2.x.x"
1254 | }
1255 | },
1256 | "sprintf-js": {
1257 | "version": "1.0.3",
1258 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1259 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
1260 | },
1261 | "sshpk": {
1262 | "version": "1.15.1",
1263 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
1264 | "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==",
1265 | "requires": {
1266 | "asn1": "~0.2.3",
1267 | "assert-plus": "^1.0.0",
1268 | "bcrypt-pbkdf": "^1.0.0",
1269 | "dashdash": "^1.12.0",
1270 | "ecc-jsbn": "~0.1.1",
1271 | "getpass": "^0.1.1",
1272 | "jsbn": "~0.1.0",
1273 | "safer-buffer": "^2.0.2",
1274 | "tweetnacl": "~0.14.0"
1275 | },
1276 | "dependencies": {
1277 | "assert-plus": {
1278 | "version": "1.0.0",
1279 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1280 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
1281 | }
1282 | }
1283 | },
1284 | "string-width": {
1285 | "version": "4.1.0",
1286 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz",
1287 | "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==",
1288 | "dev": true,
1289 | "requires": {
1290 | "emoji-regex": "^8.0.0",
1291 | "is-fullwidth-code-point": "^3.0.0",
1292 | "strip-ansi": "^5.2.0"
1293 | }
1294 | },
1295 | "string_decoder": {
1296 | "version": "1.1.1",
1297 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1298 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1299 | "requires": {
1300 | "safe-buffer": "~5.1.0"
1301 | }
1302 | },
1303 | "stringstream": {
1304 | "version": "0.0.6",
1305 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
1306 | "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA=="
1307 | },
1308 | "strip-ansi": {
1309 | "version": "5.2.0",
1310 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1311 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1312 | "dev": true,
1313 | "requires": {
1314 | "ansi-regex": "^4.1.0"
1315 | }
1316 | },
1317 | "strip-bom": {
1318 | "version": "3.0.0",
1319 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
1320 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
1321 | "dev": true
1322 | },
1323 | "supports-color": {
1324 | "version": "2.0.0",
1325 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1326 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
1327 | },
1328 | "syntax-error": {
1329 | "version": "1.4.0",
1330 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
1331 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
1332 | "requires": {
1333 | "acorn-node": "^1.2.0"
1334 | }
1335 | },
1336 | "tough-cookie": {
1337 | "version": "2.3.4",
1338 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
1339 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
1340 | "requires": {
1341 | "punycode": "^1.4.1"
1342 | }
1343 | },
1344 | "tunnel-agent": {
1345 | "version": "0.4.3",
1346 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
1347 | "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us="
1348 | },
1349 | "tweetnacl": {
1350 | "version": "0.14.5",
1351 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1352 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1353 | },
1354 | "universalify": {
1355 | "version": "0.1.2",
1356 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1357 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1358 | "dev": true
1359 | },
1360 | "upcast": {
1361 | "version": "2.1.2",
1362 | "resolved": "https://registry.npmjs.org/upcast/-/upcast-2.1.2.tgz",
1363 | "integrity": "sha512-c+ueM175OVWv9vr1SYA3rI1ao0bxq6Y7l6u5Sac25Hi0yWz9Lz341zt9/sVOa5+7lYcvHMb0xxaacFy/2lVF2w==",
1364 | "requires": {
1365 | "cross-env": "^5.1.0"
1366 | }
1367 | },
1368 | "upper-case": {
1369 | "version": "1.1.3",
1370 | "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
1371 | "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
1372 | "dev": true
1373 | },
1374 | "upper-case-first": {
1375 | "version": "1.1.2",
1376 | "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
1377 | "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=",
1378 | "dev": true,
1379 | "requires": {
1380 | "upper-case": "^1.1.1"
1381 | }
1382 | },
1383 | "util-deprecate": {
1384 | "version": "1.0.2",
1385 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1386 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1387 | },
1388 | "uuid": {
1389 | "version": "3.3.2",
1390 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1391 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
1392 | },
1393 | "verror": {
1394 | "version": "1.10.0",
1395 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1396 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1397 | "requires": {
1398 | "assert-plus": "^1.0.0",
1399 | "core-util-is": "1.0.2",
1400 | "extsprintf": "^1.2.0"
1401 | },
1402 | "dependencies": {
1403 | "assert-plus": {
1404 | "version": "1.0.0",
1405 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1406 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
1407 | }
1408 | }
1409 | },
1410 | "which": {
1411 | "version": "1.3.1",
1412 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1413 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1414 | "requires": {
1415 | "isexe": "^2.0.0"
1416 | }
1417 | },
1418 | "xtend": {
1419 | "version": "4.0.1",
1420 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
1421 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
1422 | }
1423 | }
1424 | }
1425 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "adonis-auth-scaffold",
3 | "version": "1.2.0",
4 | "description": "Painless authentication scaffolding for your Adonis.js app available to you in one sexy command.",
5 | "main": "index.js",
6 | "dependencies": {
7 | "@adonisjs/persona": "^1.0.5",
8 | "adonis-fold": "^3.0.3"
9 | },
10 | "devDependencies": {
11 | "@adonisjs/ace": "^6.0.0",
12 | "@adonisjs/fold": "^6.0.3"
13 | },
14 | "scripts": {
15 | "test": "echo Tests running..."
16 | },
17 | "keywords": [
18 | "authentication",
19 | "adonis",
20 | "full-stack"
21 | ],
22 | "author": "Caleb Mathew ",
23 | "license": "GPL-3.0",
24 | "repository": "https://github.com/creatrixity/adonis-auth-scaffold",
25 | "private": false
26 | }
27 |
--------------------------------------------------------------------------------
/providers/AdonisAuthScaffoldProvider.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | /**
4 | * adonis-auth-scaffold
5 | *
6 | * (c) Caleb Mathew
7 | *
8 | * For the full copyright and license information, please view the LICENSE
9 | * file that was distributed with this source code.
10 | */
11 |
12 | const { ServiceProvider } = require("@adonisjs/fold");
13 |
14 | class AdonisAuthScaffoldProvider extends ServiceProvider {
15 | /**
16 | * Setup scaffold command for authentications.
17 | *
18 | * @method _setupScaffoldCommand
19 | *
20 | * @return {void}
21 | *
22 | * @private
23 | */
24 | _setupScaffoldCommand() {
25 | this.app.bind("Adonis/Commands/Make:Auth", app =>
26 | require("../commands/MakeAuth")
27 | );
28 | }
29 |
30 | /**
31 | * Registers IOC bindings for this package.
32 | *
33 | * @method register
34 | *
35 | * @return {void}
36 | */
37 | register() {
38 | this._setupScaffoldCommand();
39 | }
40 |
41 | /**
42 | * When provider is booted, fold will call this method.
43 | *
44 | * @method boot
45 | *
46 | * @return {void}
47 | */
48 | boot() {
49 | const ace = require("@adonisjs/ace");
50 | ace.addCommand("Adonis/Commands/Make:Auth");
51 | }
52 | }
53 |
54 | module.exports = AdonisAuthScaffoldProvider;
55 |
--------------------------------------------------------------------------------
/templates/ApiAuthController.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const MAIL_PATTERN = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
3 |
4 | const Persona = use("Persona");
5 | const Config = use("Config");
6 | const ReqPromise = use('request-promise');
7 | const fetch = use('node-fetch');
8 |
9 | const { validate } = use("Validator");
10 |
11 | class ApiAuthController {
12 | async attemptLogin(auth, uid, password) {
13 | // Determine which JWT authenticator will be used: Email or Username.
14 | // If the uid value matches the test pattern, Email authentication is used.
15 | let authBy = MAIL_PATTERN.test(uid) ? 'Email': 'Username';
16 | const authScheme = `jwt${authBy}`;
17 |
18 | return auth
19 | .authenticator(authScheme)
20 | .withRefreshToken()
21 | .attempt(uid, password)
22 | }
23 |
24 | async login({ request, auth, response }) {
25 | const { uid, password } = request.only(["uid", "password"]);
26 |
27 | return this.attemptLogin(auth, uid, password);
28 | }
29 |
30 | async register({ request, auth, response }) {
31 | const payload = request.only([
32 | "email",
33 | "username",
34 | "password",
35 | "password_confirmation"
36 | ]);
37 |
38 | const validation = await validate(
39 | payload,
40 | Config.get("adonis-auth-scaffold.validationRules.registration"),
41 | Config.get("adonis-auth-scaffold.validationMessages")()
42 | );
43 |
44 | if (validation.fails()) {
45 | return {
46 | errors: validation.messages()
47 | }
48 | }
49 |
50 | try {
51 | const user = await Persona.register(payload);
52 |
53 | return this.attemptLogin(auth, payload.email, payload.password);
54 | } catch (error) {
55 | return {
56 | error
57 | }
58 | }
59 | }
60 |
61 | async forgotPassword({ request, response, auth }) {
62 | const payload = request.only(['password', 'password_confirmation', 'token', 'uid']);
63 | const { token, uid, password } = payload
64 |
65 | if (!token) {
66 | const passwordRequest = await Persona.forgotPassword(uid);
67 | return {
68 | message: 'Successfully sent reset message'
69 | }
70 | }
71 |
72 | try {
73 | const user = await Persona.updatePasswordByToken(token, payload);
74 |
75 | return await this.attemptLogin(auth, uid, password);
76 | } catch (error) {
77 | if (error.name === 'InvalidTokenException') {
78 | return {
79 | errorMessage: 'The token supplied is not valid.'
80 | }
81 | }
82 | }
83 | }
84 | }
85 |
86 | module.exports = ApiAuthController;
87 |
--------------------------------------------------------------------------------
/templates/AuthController.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const Persona = use("Persona");
3 | const Config = use("Config");
4 |
5 | const { validate } = use("Validator");
6 |
7 | class AuthController {
8 | async login({ request, auth, response, session }) {
9 | const payload = request.only(["uid", "password"]);
10 |
11 | const user = await Persona.verify(payload);
12 |
13 | await auth.login(user);
14 | response.redirect(Config.get("adonis-auth-scaffold.registrationSuccessRedirectTo"));
15 | }
16 |
17 | async register({ request, auth, response, session }) {
18 | const payload = request.only([
19 | "email",
20 | "username",
21 | "password",
22 | "password_confirmation"
23 | ]);
24 |
25 | const validation = await validate(
26 | payload,
27 | Config.get("adonis-auth-scaffold.validationRules.registration"),
28 | Config.get("adonis-auth-scaffold.validationMessages")()
29 | );
30 |
31 | if (validation.fails()) {
32 | session.withErrors(validation.messages()).flashAll();
33 | return response.redirect("back");
34 | }
35 |
36 | const user = await Persona.register(payload);
37 |
38 | // optional
39 | await auth.login(user);
40 | response.redirect(Config.get("adonis-auth-scaffold.registrationSuccessRedirectTo"));
41 | }
42 |
43 | async forgotPassword({ request, response, session, auth }) {
44 | const token = request.input('token');
45 | const uid = request.input('uid');
46 | const payload = request.only(['password', 'password_confirmation']);
47 |
48 | if (!token) {
49 | await Persona.forgotPassword(uid);
50 | session.flash({ hasMadeResetRequest: 'true' })
51 | return response.redirect('back')
52 | }
53 |
54 | try {
55 | const user = await Persona.updatePasswordByToken(token, payload);
56 |
57 | await auth.login(user);
58 | return response.redirect(Config.get("adonis-auth-scaffold.registrationSuccessRedirectTo"));
59 | } catch (error) {
60 | if (error.name === 'InvalidTokenException') {
61 | session.flash({ errorMessage: 'The token supplied is not valid.' })
62 | } else {
63 | session.flash({ errorMessage: error.message })
64 | }
65 | }
66 |
67 | return response.redirect('back')
68 | }
69 |
70 | getLogin({ request, response, view }) {
71 | return view.render("auth.login");
72 | }
73 |
74 | getRegister({ request, response, view }) {
75 | return view.render("auth.register");
76 | }
77 |
78 | getResetPassword({ request, response, view, params }) {
79 | const token = request.input('token');
80 | return view.render("auth.password-reset", { token });
81 | }
82 |
83 | getAuthDashboard({ request, response, view }) {
84 | return view.render("auth.dashboard");
85 | }
86 |
87 | getLogout({ response, session }) {
88 | const loginRoute = Config.get("adonis-auth-scaffold.loginRoute");
89 | session.clear();
90 |
91 | return response.redirect(loginRoute)
92 | }
93 | }
94 |
95 | module.exports = AuthController;
96 |
--------------------------------------------------------------------------------
/templates/ViewHelper.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | const Config = use("Config");
3 |
4 | class ViewHelper {
5 | async handle({ view }, next) {
6 | view.share({
7 | Config: Config
8 | });
9 | // call next to advance the request
10 | await next();
11 | }
12 | }
13 |
14 | module.exports = ViewHelper;
15 |
--------------------------------------------------------------------------------
/templates/adonis-auth-scaffold.mustache:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const Env = use('Env');
4 |
5 | /*
6 | |--------------------------------------------------------------------------
7 | | Adonis Auth Scaffold
8 | |--------------------------------------------------------------------------
9 | |
10 | | Adonis Auth Scaffold is a CLI utility that gives you a functional authentication
11 | | system in Adonis.js within seconds.
12 | |
13 | */
14 |
15 | module.exports = {
16 | /*
17 | |--------------------------------------------------------------------------
18 | | Registration Route
19 | |--------------------------------------------------------------------------
20 | |
21 | | Specifies the route to handle registration GET and POST requests.
22 | |
23 | */
24 | registrationRoute: "/register",
25 |
26 | /*
27 | |--------------------------------------------------------------------------
28 | | Registration Success Redirect Route
29 | |--------------------------------------------------------------------------
30 | |
31 | | Specifies the route to redirect the user to upon successful registration.
32 | | Leave empty if you do not want any redirects.
33 | |
34 | */
35 | registrationSuccessRedirectTo: "/auth/dashboard",
36 |
37 | /*
38 | |--------------------------------------------------------------------------
39 | | Login Route
40 | |--------------------------------------------------------------------------
41 | |
42 | | Specifies the route to handle login GET and POST requests.
43 | |
44 | */
45 | loginRoute: "/login",
46 |
47 | /*
48 | |--------------------------------------------------------------------------
49 | | Password Reset Route
50 | |--------------------------------------------------------------------------
51 | |
52 | | Specifies the route to handle password reset GET and POST requests.
53 | |
54 | */
55 | passwordResetRoute: "/password/reset",
56 |
57 | /*
58 | |--------------------------------------------------------------------------
59 | | Logout Route
60 | |--------------------------------------------------------------------------
61 | |
62 | | Specifies the route to handle logout GET and POST requests.
63 | |
64 | */
65 | logoutRoute: "/logout",
66 |
67 | /*
68 | |--------------------------------------------------------------------------
69 | | App URL
70 | |--------------------------------------------------------------------------
71 | |
72 | | Specifies the URL for the app.
73 | |
74 | */
75 | appURL: "http://localhost:3333",
76 |
77 | /*
78 | |--------------------------------------------------------------------------
79 | | Registration Rules
80 | |--------------------------------------------------------------------------
81 | |
82 | | An object of validation rules to be used when running validation.
83 | |
84 | */
85 | validationRules: {
86 | registration: {
87 | email: "required|email",
88 | username: "required",
89 | password: "required",
90 | password_confirmation: "required|same:password"
91 | }
92 | },
93 |
94 | /*
95 | |--------------------------------------------------------------------------
96 | | Validation messages
97 | |--------------------------------------------------------------------------
98 | |
99 | | An object of validation messages to be used when validation fails.
100 | |
101 | */
102 | validationMessages: action => {
103 | return {
104 | "uid.required": "Username or E-mail must be filled.",
105 | "username.required": "Username must be filled.",
106 | "email.required": "E-mail must be filled.",
107 | "email.email": "Please use a valid e-mail address.",
108 | "password.required": "Password must be filled.",
109 | "password.mis_match": "Invalid password.",
110 | "password_confirmation.same": `Password confirmation must be same as password.`
111 | };
112 | }
113 | };
114 |
--------------------------------------------------------------------------------
/templates/apiAuthRoutes.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const Config = use("Config");
4 | /*
5 | |--------------------------------------------------------------------------
6 | | API Auth Routes
7 | |--------------------------------------------------------------------------
8 | |
9 | | Http routes are entry points to your web application. You can create
10 | | routes for different URL's and bind Controller actions to them.
11 | |
12 | | A complete guide on routing is available here.
13 | | http://adonisjs.com/docs/4.1/routing
14 | |
15 | */
16 |
17 | /** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */
18 | const Route = use("Route");
19 | const loginRoute = Config.get("adonis-auth-scaffold.loginRoute");
20 | const registerRoute = Config.get("adonis-auth-scaffold.registrationRoute");
21 | const passwordResetRoute = Config.get(
22 | "adonis-auth-scaffold.passwordResetRoute"
23 | );
24 | const logoutRoute = Config.get("adonis-auth-scaffold.logoutRoute");
25 |
26 | Route.post(`api/v1${loginRoute}`, "ApiAuthController.login");
27 | Route.post(`api/v1${registerRoute}`, "ApiAuthController.register");
28 | Route.post(`api/v1${passwordResetRoute}`, "ApiAuthController.forgotPassword");
29 | Route.get(`api/v1${logoutRoute}`, "ApiAuthController.getLogout");
30 |
--------------------------------------------------------------------------------
/templates/auth-styles.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css?family=Montserrat:300");
2 |
3 | html,
4 | body {
5 | height: 100%;
6 | width: 100%;
7 | }
8 |
9 | body {
10 | font-family: "Montserrat", sans-serif;
11 | font-weight: 300;
12 | background-image: url("/splash.png");
13 | background-color: #220052;
14 | }
15 |
16 | * {
17 | margin: 0;
18 | padding: 0;
19 | box-sizing: border-box;
20 | }
21 |
22 | .text-center {
23 | text-align: center;
24 | }
25 |
26 | .auth-form-wrapper {
27 | width: 450px;
28 | margin: auto;
29 | position: absolute;
30 | transform: translate(-50%, -50%);
31 | left: 50%;
32 | top: 50%;
33 | }
34 |
35 | .auth-form-container {
36 | border-radius: 15px;
37 | width: 450px;
38 | padding: 15px 0;
39 | background: #fff;
40 | letter-spacing: 0.5;
41 | opacity: 0;
42 | animation: slideFormDown 1s cubic-bezier(0.19, 1, 0.3, 1) 0.5s forwards;
43 | }
44 |
45 | .auth-form {
46 | margin: 0 auto;
47 | display: block;
48 | width: 90%;
49 | }
50 |
51 | .auth-form-notice {
52 | text-align: center;
53 | padding: 5px 0;
54 | border-radius: 5px;
55 | background: #ff8c44;
56 | color: #fff;
57 | font-weight: bold;
58 | }
59 |
60 | .auth-form-title {
61 | text-align: center;
62 | opacity: 0;
63 | padding: 30px 0;
64 | font-size: 1.5em;
65 | animation: slideDown 2s cubic-bezier(0.19, 1, 0.3, 1) 0.2s forwards;
66 | }
67 |
68 | .auth-form-label-text {
69 | display: block;
70 | font-weight: 600;
71 | font-size: 13px;
72 | margin-bottom: 10px;
73 | }
74 |
75 | .auth-form-group {
76 | margin-bottom: 15px;
77 | width: 100%;
78 | animation: slideDown 2s cubic-bezier(0.19, 1, 0.3, 1) 0.2s forwards;
79 | }
80 |
81 | .auth-form-label {
82 | display: block;
83 | }
84 |
85 | .auth-form-control {
86 | width: 100%;
87 | appearance: none;
88 | font-size: 18px;
89 | background: #fafafa;
90 | outline: none;
91 | border: 1px solid #ccc;
92 | height: 45px;
93 | border-radius: 4px;
94 | padding: 10px;
95 | }
96 |
97 | .auth-form-group-button {
98 | -webkit-appearance: none;
99 | -moz-appearance: none;
100 | display: inline-block;
101 | cursor: pointer;
102 | padding: 15px 25px;
103 | border-radius: 4px;
104 | font-size: 16px;
105 | font-weight: 600;
106 | background: #efefef;
107 | outline: none;
108 | border: 1px solid #efefef;
109 | color: #fff;
110 | background: rgb(251, 47, 81);
111 | }
112 |
113 | .auth-form-group-button.auth-form-group-button--block {
114 | width: 100%;
115 | }
116 |
117 | .auth-form-link,
118 | .auth-form-group-button {
119 | text-decoration: none;
120 | }
121 |
122 | .auth-form-link {
123 | padding: 5px 10px;
124 | color: rgb(34, 0, 82);
125 | }
126 |
127 | .auth-form-link,
128 | .auth-form-error-text {
129 | font-size: 14px;
130 | font-weight: 600;
131 | display: inline-block;
132 | }
133 |
134 | .auth-form-error-text {
135 | color: rgb(251, 47, 81);
136 | }
137 |
138 | .text-center {
139 | text-align: center;
140 | }
141 |
142 | @keyframes slideFormDown {
143 | 0% {
144 | transform: translateY(400px);
145 | opacity: 0;
146 | }
147 | 50% {
148 | opacity: 0.2%;
149 | }
150 | 100% {
151 | opacity: 1;
152 | transform: translateY(0);
153 | }
154 | }
155 |
156 | @keyframes slideDown {
157 | 0% {
158 | transform: translateY(400px);
159 | opacity: 0;
160 | }
161 | 50% {
162 | opacity: 0.2%;
163 | }
164 | 100% {
165 | opacity: 1;
166 | }
167 | }
168 |
--------------------------------------------------------------------------------
/templates/authLayout.edge:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | @section('view-title')
7 | Login/Register
8 | @endsection
9 |
10 | {{ style('auth/auth-styles') }}
11 | @!section('view-styles')
12 |
13 |
14 | @!section('content')
15 |
16 |
17 |
--------------------------------------------------------------------------------
/templates/authRoutes.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | const Config = use("Config");
4 | /*
5 | |--------------------------------------------------------------------------
6 | | Routes
7 | |--------------------------------------------------------------------------
8 | |
9 | | Http routes are entry points to your web application. You can create
10 | | routes for different URL's and bind Controller actions to them.
11 | |
12 | | A complete guide on routing is available here.
13 | | http://adonisjs.com/docs/4.1/routing
14 | |
15 | */
16 |
17 | /** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */
18 | const Route = use("Route");
19 | const loginRoute = Config.get("adonis-auth-scaffold.loginRoute");
20 | const registerRoute = Config.get("adonis-auth-scaffold.registrationRoute");
21 | const registrationSuccessRoute = Config.get("adonis-auth-scaffold.registrationSuccessRedirectTo");
22 | const passwordResetRoute = Config.get(
23 | "adonis-auth-scaffold.passwordResetRoute"
24 | );
25 | const logoutRoute = Config.get("adonis-auth-scaffold.logoutRoute");
26 |
27 | Route.post(loginRoute, "AuthController.login").middleware('guest');
28 | Route.post(registerRoute, "AuthController.register");
29 | Route.post(passwordResetRoute, "AuthController.forgotPassword");
30 |
31 | Route.get(registerRoute, "AuthController.getRegister");
32 | Route.get(loginRoute, "AuthController.getLogin");
33 | Route.get(passwordResetRoute, "AuthController.getResetPassword");
34 | Route.get(logoutRoute, "AuthController.getLogout");
35 | Route.get(registrationSuccessRoute, "AuthController.getAuthDashboard");
36 |
--------------------------------------------------------------------------------
/templates/bootstrap/auth-styles.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin-top: 80px;
3 | }
4 |
5 | .blog-footer {
6 | padding: 2.5rem 0;
7 | color: #999;
8 | text-align: center;
9 | background-color: #f9f9f9;
10 | border-top: 0.05rem solid #e5e5e5;
11 | margin-top: 50px;
12 | }
13 |
--------------------------------------------------------------------------------
/templates/bootstrap/authLayout.edge:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | {{ style('auth/auth-styles') }}
11 | @!section('view-styles')
12 |
13 |
14 | @section('view-title')
15 | Login/Register
16 | @endsection
17 |
18 |
19 |
20 |
57 |
58 |