From ee2cb0eedf472210c21e1a6a869692d3a770216d Mon Sep 17 00:00:00 2001 From: Catalin Pit <25515812+catalinpit@users.noreply.github.com> Date: Fri, 8 Mar 2024 10:20:58 +0200 Subject: [PATCH 01/56] docs: add article about public api --- apps/marketing/content/blog/public-api.mdx | 301 ++++++++++++++++++ .../public/blog/api-implementation.webp | Bin 0 -> 56982 bytes apps/marketing/public/blog/api-package.webp | Bin 0 -> 19380 bytes .../public/blog/blog-author-catalin.webp | Bin 0 -> 18814 bytes apps/marketing/public/blog/docs.webp | Bin 0 -> 135304 bytes 5 files changed, 301 insertions(+) create mode 100644 apps/marketing/content/blog/public-api.mdx create mode 100644 apps/marketing/public/blog/api-implementation.webp create mode 100644 apps/marketing/public/blog/api-package.webp create mode 100644 apps/marketing/public/blog/blog-author-catalin.webp create mode 100644 apps/marketing/public/blog/docs.webp diff --git a/apps/marketing/content/blog/public-api.mdx b/apps/marketing/content/blog/public-api.mdx new file mode 100644 index 000000000..dd9a0b174 --- /dev/null +++ b/apps/marketing/content/blog/public-api.mdx @@ -0,0 +1,301 @@ +--- +title: 'Building the Documenso Public API - The Why and How' +description: 'This article talks about the need for the public API and the process of building it. It also discusses the requirements we had to meet and the constraints we had to work within.' +authorName: 'Catalin' +authorImage: '/blog/blog-author-catalin.webp' +authorRole: 'Developer' +date: 2024-03-08 +tags: + - Development + - API +--- + +This article covers the process of building the public API for Documenso. It starts by explaining why the API was needed for a digital document signing company in the first place. Then, it'll dive into the steps we took to build it. Lastly, it'll present the requirements we had to meet and the constraints we had to work within. + +## Why the public API + +We decided to build the public API to open a new way of interacting with Documenso. While the web app does the job well, there are use cases where it's not enough. In those cases, the users might want to interact with the platform programmatically. Usually, that's for integrating Documenso with other applications. + +The new public API enables them to do that. The users can integrate Documenso's functionalities within other applications to automate tasks, create custom solutions, and build custom workflows, to name just a few. + +The API provides 12 endpoints at the time of writing this article: + +- (GET) `/api/v1/documents` - retrieve all the documents +- (POST) `/api/v1/documents` - upload a new document and getting a presigned URL +- (GET) `/api/v1/documents/{id}` - fetch a specific document +- (DELETE) `/api/v1/documents/{id}` - delete a specific document +- (POST) `/api/v1/templates/{templateId}/create-document` - create a new document from an existing template +- (POST) `/api/v1/documents/{id}/send` - send a document for signing +- (POST) `/api/v1/documents/{id}/recipients` - create a document recipient +- (PATCH) `/api/v1/documents/{id}/recipients/{recipientId}` - update the details of a document recipient +- (DELETE) `/api/v1/documents/{id}/recipients/{recipientId}` - delete a specific recipient from a document +- (POST) `/api/v1/documents/{id}/fields` - create a field for a document +- (PATCH) `/api/v1/documents/{id}/fields` - update the details of a document field +- (DELETE) `/api/v1/documents/{id}/fields` - delete a field from a document + +> Check out the [API documentation](https://app.documenso.com/api/v1/openapi). + +Moreover, it also enables us to enhance the platform by bringing other integrations to Documenso, such as Zapier. + +In conclusion, the new public API extends Documenso's capabilities, provides more flexibility for users, and opens up a broader world of possibilities. + +## Picking the right approach & tech + +Once we decided to build the API, we had to choose the approach and technologies to use. There were 2 options: + +1. Build an additional application +2. Launch the API in the existing codebase + +### 1. Build an additional application + +That would mean creating a new codebase and building the API from scratch. Having a separate app for the API would result in benefits such as: + +- lower latency responses +- supporting larger field uploads +- separation between the apps (Documenso and the API) +- customizability and flexibility +- easier testing and debugging + +This approach has significant benefits. However, one major drawback is that it requires additional resources. + +We'd have to spend a lot of time just on the core stuff, such as building and configuring the basic server. After that, we'd spend time implementing the endpoints and authorization, among other things. + +When the building is done, there will be another application to deploy and manage. + +All of this would stretch our already limited resources. + +So, we asked ourselves if there is another way of doing it without sacrificing the API quality and the developer experience. + +### 2. Launch the API in the existing codebase + +The other option was to launch the API in the existing codebase. Rather than writing everything from scratch, we could use most of our existing code. + +Since we're using tRPC for our internal API (backend), we looked for solutions that work well with tRPC. We narrowed down the choices to: + +- [trpc-openapi](https://github.com/jlalmes/trpc-openapi) +- [ts-rest](https://ts-rest.com/) + +Both technologies allow you to build public APIs. The `trpc-openapi` technology allows you to easily turn tRPC procedures into REST endpoints. It's more like a plugin for tRPC. + +On the other hand, `ts-rest` is more of a standalone solution. `ts-rest` enables you to create a contract for the API, which can be used both on the client and server. You can consume and implement the contract in your application, thus providing end-to-end type safety and RPC-like client. + +> You can see a [comparison between trpc-openapi and ts-rest](https://catalins.tech/public-api-trpc/) here. + +So, the main difference between the 2 is that `trpc-openapi` is like a plugin that extends tRPC's capabilities, whereas `ts-rest` provides the tools for building a standalone API. + +### Our choice + +After analyzing and comparing the 2 options, we decided to go with `ts-rest` because of its benefits. + +Here's a paragraph from the `ts-rest` documentation that hits the nail on the head: + +> tRPC has many plugins to solve this issue by mapping the API implementation to a REST-like API, however, these approaches are often a bit clunky and reduce the safety of the system overall, ts-rest does this heavy lifting in the client and server implementations rather than requiring a second layer of abstraction and API endpoint(s) to be defined. + +## API Requirements + +We defined the following requirements for the API: + +- The API should use path-based versioning (e.g. `/v1`) +- The system should use bearer tokens for API authentication + - The API token should be a random string of 32 to 40 characters +- The system should encrypt the token and store the encrypted value +- The system should only display the API token when it's created +- The API should have self-generated documentation like Swagger +- Users should be able to create an API key + - Users should be able to choose a token name + - Users should be able to choose an expiration date for the token + - User should be able to choose between 7 days, 1 month, 3 months, 6 months, 12 months, never +- System should display all the user's tokens in the settings page + - System should display the token name, creation date, expiration date and a delete button +- Users should be able to delete an API key +- Users should be able to retrieve all the documents from their account +- Users should be able to upload a new document + - Users should receive an S3 pre-signed URL after a successful upload +- Users should be able to retrieve a specific document from their account by its id +- Users should be able to delete a specific document from their account by its id +- Users should be able to create a new document from an existing document template +- Users should be able to send a document for signing to 1 or more recipients +- Users should be able to create a recipient for a document +- Users should be able to update the details of a recipient +- Users should be able to delete a recipient from a document +- Users should be able to create a field (e.g. signature, email, name, date) for a document +- Users should be able to update a field for a document +- Users should be able to delete a field from a document + +## Constraints + +We also faced the following constraints while developing the API: + +1. Resources + +Limited resources were one of the main constraints. We're a new startup with a relatively small team. Building and maintaining an additional application would strain our limited resources. + +2. Technology stack + +Another constraint was the technology stack. Our tech stack includes TypeScript, Prisma, and tRPC, among others. We also use Vercel for hosting. + +As a result, we wanted to use technologies we are comfortable with. This allowed us to leverage our existing knowledge and ensured consistency across our applications. + +Using familiar technologies also meant we could develop the API faster, as we didn't have to spend time learning new technologies. We could also leverage existing code and tools used in our main application. + +It's worth mentioning that this is not a permanent decision. We're open to moving the API to another codebase/tech stack when it makes sense (e.g. API is heavily used and needs better performance). + +3. File uploads + +Due to our current architecture, we support file uploads with a maximum size of 50 MB. To circumvent this, we created an additional step for uploading documents. + +Users make a POST request to the `/api/v1/documents` endpoint and the API responds with an S3 pre-signed URL. The users then make a 2nd request to the pre-signed URL with their document. + +## How we built the API + +![API package diagram](api-package.webp) + +Our codebase is a monorepo, so we created a new API package in the `packages` directory. It contains both the API implementation and its documentation. + +The main 2 blocks of the implementation consist of the API contract and the code for the API endpoints. + +![API implementation diagram](api-implementation.webp) + +In a few words, the API contract defines the API structure, the format of the requests and responses, how to authenticate API calls, the available endpoints and their associated HTTP verbs. You can explore the [API contract](https://github.com/documenso/documenso/blob/main/packages/api/v1/contract.ts) on GitHub. + +Then, there's the implementation part, which is the actual code for each endpoint defined in the API contract. The implementation is where the API contract is brought to life and made functional. + +Let's take the endpoint `/api/v1/documents` as an example. + +```ts +export const ApiContractV1 = c.router( + { + getDocuments: { + method: 'GET', + path: '/api/v1/documents', + query: ZGetDocumentsQuerySchema, + responses: { + 200: ZSuccessfulResponseSchema, + 401: ZUnsuccessfulResponseSchema, + 404: ZUnsuccessfulResponseSchema, + }, + summary: 'Get all documents', + }, + ... + } +); +``` + +The API contract specifies the following things for `getDocuments`: + +- the allowed HTTP request method is GET, so trying to make a POST request, for example, results in an error +- the path is `/api/v1/documents` +- the query parameters the user can pass with the request + - in this case - `page` and `perPage` +- the allowed responses and their schema + - `200` returns an object containing an array of all documents and a field `totalPages`, which is self-explanatory + - `401` returns an object with a message such as "Unauthorized" + - `404` returns an object with a message such as "Not found" + +The implementation of this endpoint needs to match the contract completely; otherwise, `ts-rest` will complain, and your API might not work as intended. + +The `getDocuments` function from the `implementation.ts` file runs when the user hits the endpoint. + +```ts +export const ApiContractV1Implementation = createNextRoute(ApiContractV1, { + getDocuments: authenticatedMiddleware(async (args, user, team) => { + const page = Number(args.query.page) || 1; + const perPage = Number(args.query.perPage) || 10; + + const { data: documents, totalPages } = await findDocuments({ + page, + perPage, + userId: user.id, + teamId: team?.id, + }); + + return { + status: 200, + body: { + documents, + totalPages, + }, + }; + }), + ... +}); +``` + +There is a middleware, too, `authenticatedMiddleware`, that handles the authentication for API requests. It ensures that the API token exists and the token used has the appropriate privileges for the resource it accesses. + +So, that's how the other endpoints work as well. The code differs, but the principles are the same. You can explore the [API implementation](https://github.com/documenso/documenso/blob/main/packages/api/v1/implementation.ts) and the [middleware code](https://github.com/documenso/documenso/blob/main/packages/api/v1/middleware/authenticated.ts) on GitHub. + +### Documentation + +For the documentation, we decided to use Swagger UI, which automatically generates the documentation from the OpenAPI specification. + +The OpenAPI specification describes an API containing the available endpoints and their HTTP request methods, authentication methods, and so on. Its purpose is to help both machines and humans understand the API without having to look at the code. + +The Documenso OpenAPI specification is live [here](https://documenso.com/api/v1/openapi.json). + +Thankfully, `ts-rest` makes it seamless to generate the OpenAPI specification. + +```ts +import { generateOpenApi } from '@ts-rest/open-api'; + +import { ApiContractV1 } from './contract'; + +export const OpenAPIV1 = generateOpenApi( + ApiContractV1, + { + info: { + title: 'Documenso API', + version: '1.0.0', + description: 'The Documenso API for retrieving, creating, updating and deleting documents.', + }, + }, + { + setOperationId: true, + }, +); +``` + +Then, the Swagger UI takes the OpenAPI specification as a prop and generates the documentation. The code below shows the component responsible for generating the documentation. + +```ts +'use client'; + +import SwaggerUI from 'swagger-ui-react'; +import 'swagger-ui-react/swagger-ui.css'; + +import { OpenAPIV1 } from '@documenso/api/v1/openapi'; + +export const OpenApiDocsPage = () => { + return ; +}; + +export default OpenApiDocsPage; +``` + +Lastly, we create an API endpoint to display the Swagger documentation. The code below dynamically imports the `OpenApiDocsPage` component and displays it. + +```ts +'use client'; + +import dynamic from 'next/dynamic'; + +const Docs = dynamic(async () => import('@documenso/api/v1/api-documentation'), { + ssr: false, +}); + +export default function OpenApiDocsPage() { + return ; +} +``` + +You can access and play around with the documentation at [documenso.com/api/v1/openapi](https://documenso.com/api/v1/openapi). You should see a page like the one shown in the screenshot below. + +![The documentation for the Documenso API](docs.webp) + +> This article shows how to [generate Swagger documentation for a Next.js API](https://catalins.tech/generate-swagger-documentation-next-js-api/). + +So, that's how we went about building the first iteration of the public API after taking into consideration all the constraints and the current needs. The [GitHub pull request for the API](https://github.com/documenso/documenso/pull/674) is publicly available on GitHub. You can go through it at your own pace. + +## Conclusion + +The current architecture and approach work well for our current stage and needs. However, as we continue to grow and evolve, our architecture and approach will likely need to adapt. We monitor API usage and performance regularly and collect feedback from users. This enables us to find areas for improvement, understand our users' needs, and make informed decisions about the next steps. diff --git a/apps/marketing/public/blog/api-implementation.webp b/apps/marketing/public/blog/api-implementation.webp new file mode 100644 index 0000000000000000000000000000000000000000..575df5dab95ab53bc3cfae13c26745897c89cac2 GIT binary patch literal 56982 zcmeFZWprE1(k3ifW@cuFnAtHi#LSK%W{8=YnK@?W7-D9oIA(Ut%rP@*a?ZVXUYNOO zz8|yZ&v&$zq}sh(-Mg#1o_eZUd#lJuO2)1O0Gbk_N*YQ$TJQh>;N9=HB^00w1dtIE zQ-UY>eFz|cw>GwMf?xpvY;2t!Ris2owX}6eVdem^03-k+0385rXzXM!uPUkbN9{lA z{_*`^Uv~=t;2$NkjQ{)d|F!miJ3=(Eu{8kzfSA9_txQavjDO4izhw&(8*N6du!!b=%J7wc$VPw4 z=q-Q9#ukn?0092L@A{O+_Kv^X$N!@*vVUB|ZwUZE{bM|&=BBo$j)u;rCZvBB{@?ug zPkli-{Z{_}&9?t@TmP^6`D5+;qu*A@M0GI$g05O09Knq|5umQLM?*YO934km> z5ugUp2IvEf0TuuofFr;S;0*`>gaV=f@qiRS1|Szu1Skho1L^?HfDS+}UGiL7)Wi15gF14g3T&2igK%fZo6$ zU=%PBm;uZOmIG^nt-xO32yhzs6SxID0$u^1AV3g^5SS1|5Y!ON5Ihhf5ONS|5PA^i z5DpNY5Wx_!5NQwv5S0*35WNti5c3e55GN3~AOHvfgbgACF@ktNVjxA34#*7T2=WC* zf>J>RplVPXXc#mL+60|~9wDJ2F(64H86n?8N<*qc8bdlj`a(uSWJE z+QJ6HrovXhcEQfT9>6}sp~6wY@xdv=nZS9##laQ9wZToo?ZG|6qrua_3&5+vTfqmw zr@>dl55lj)Un3wOkR$LSC?i-R_#>ntd_(w-u!Zo5h>l2)D2Awu=zcBNf=27$r&jYsT`>vX&vbS83UOKSq9kz*$+7rxe0j&`3waPg$hLkMIXfzB^9L} zWfJ8S6%LgeRSeY-)fY7rwH0*{^%e~SjTKE1%?2$RtpaTX?GPOXof=&N-2^=ty%4=0 zeFp=CL4hHLVT=)kQG_vwv4;tbNrNeaX@wbuS%o=)d4YwF#et=P<&Kq!)rqx<4Z^0z zmch2hj>E3QUci3BA;J;CF~y0%sm7VXxyL2I6~;Bijl`|NoyUE`BgK=z`;3=>*NnG@ z4~b8YuZ-`8pMyV$e@cK!@Seb!Ad;YtV3`ntke*P5(2KB;aE$Plh?q!<$et*jsGsPR z7@Js_*orurxQqCR1cOA7#F8YLq?_cJ6pK`Z)S5Jnbb$1NjF3#4%!MqUY=Z2WoQ7PT zJdnJGe2oI0f``J4BAKF(;)0TdQl8SA@+;*s6&w{0l?Bxos$r^oY8q-y>M-hN>O&e_ z8W|c-ny)mgv`Dl9Xmj=ppDi=`H9p=_eT=7`PZL8L}Cs-$A|O zeP{cw;N2o4BBKbSE8|zjEhcQH4@`kf%}i&^l*~HJ3CzRHZ!DZF)+|LVE3D|OvaEru zZLC*p^lZj#nQU|HNbHjAe(WvmmmCZnrW`pOOPm;-@|?oYHn&VYx!u6YU68LYPaaX=xFGa z=-hsk_?Yr>PnT0SRChs-M$cVuL?2(@TEEi(#lX;@{u9(E%}*7dUJMlt3k+|KWQ?+m zE{w&DzZjpG2%99E9GME3CYm0Y3793C9hwW6Cz&5v2w9|BoLY)mW>{WYNn7Pw-G5g6 zT>2Sot!Z6j18eiirqveR_OtDP9kHFe-LyS}eW?AW1D`{R!-b=qV~G>cNzbXp8S}T3 z9&@2}331tS6?DyXeQ?uot9M6pw{;)$p!bOIIPjG8EcSx*GWP28Ci4#P-trOg$@c~N z8u|A5QTPS>?fFajmj%EFd=3~7WC=_Ryb00_Y6~U`_7C0(kqY@5iX7?~x)}C8EH@l7 z+%kM3f;}QV;w{o7@<$X)RBF^qv~l#07}l7y7;vmv>_i+_TuwZ6ylwnKf>1(PB3hzn z;!cu$Qd2T%a%A#Nib2XqDo1MW7x*tOUpCV|q_w0|rpKqhWLRX(XNqRlWD#aXWZh?* zWY6RX=Tzqsi6qlFamqeAkmfDtXmZ_8t zlyjGtR}fajeTDey^7W`vw{ogVysD*|u{ys7yC&)z;G4_0p6ZJ2WRVH#)B{KfR#7u(YVVxVdDqbokTy=jF2N z^7D%SD%5J^8tPi=I^lZ32Hi%@Cf8=?miX4#w(9oEj`7aPuG8+zUhqEBe(C|qLHQxu zVaJi=(bVzBwM%F!*mS@HZFun+yES1^(s&e{+Gq zxxn9C;P1S^-+6(*^8$b81^&(p{GAv0J1_A6XU9Eo4ep9~SS5B}YSP|^?s(225GpLQPT?bwTd)@C`gD<+(_~ALa&q*%)`h1sPfS#pSD8Du~ zgnGgGZ=>M$SMa)Go1g#N(QC~c$t?;PO!XG_`uUaQk!022+V2y|cW@%uAB^)x@d|Sv z_tt&(cKTZN!50rw@n=H+T+2Le~a$a-w(Un&nf4MIiow|}MG}uQX8sZL1pUB7E@R3F?O@V*xwLqWR zUz*kT!p*J4Xt0^n{ zD%ITpCPn*#ib8OvB}fRls+agpF*ooCIzQzgmdZh=;u`u*VY>?kJf;%8GY@DYPE!&} znDL+X+uDF&`tZwhXi2HqCAzctmx33hkH>o*wB2pPFS@wKvt^&xSu|vZAiYU!Rv%3r z50P#QYaRY-<#4c?>5)psU*MeF4s6akK3quD_R)}V+vijI{4V}?E6Zqq?0wDAR>CQ` zm=~Kv6-Q{~N2tbek!X(klWQ67HlFLW(qWKuuFPLd748kk_qFxTA0dv)LKB~%D&Q{r zY9R8nbee|hd^psQwbFO!BsPSl?@B)hW`#i@H0(MPQ%hTxg=M3jIfv~?fl!KIum0WY zKY6Cg%-?qVr+uJsdLhvhYwiA(3AOnCFs;7Swx1&Og!$RjlB;Bvyv6555C2)u*f1>{ zDk6pQGOi+Q(M{>_Za>7KG+N+NXWK_aVw6kTlO)LismH+KwgjnFQvkJ zY?(9Z-x|h$GVB)EAew5a2Koj}h`i^yb{*zV9{*?CkMf-Ec9(xY`oq~<-M^t>up;uu z{|D$`Jdu3e;y8b*Ukf9)>nP7BoX>c$nXUOtzzM1OtYjy97H%_J1+o=~&}{n*$wDHH z_Lo{d_V1c#6{Se0D>~~BQN-q@ZrIBb{tptB9AvyQEz!ert?>FQ zlRg{Z3s<6k4k}}qwaxyGmj_N5ooNp*GquR^6yN`oe*Y_Q+Q0*C@b^D>&i4QLqw-SE zpdu*>;9m}>B@MwKPYllZA79kZO6X+v+Fj zm}4+g7XqwiUfwrCeUivb%?k^)P}k5wlx~2L2L?UmU+iS1v+ivhx?Yv)5Bc zPX^!i?SDW(_s_>Ic`B4N?|(YQp+LA1Rhj?lCkqUkhSV{acmOtxICENhiB<)xYg_RlOOjlB8q z{>&bNvI={8&2_4?v>k2Sm^cPcO>FuSmDWr9U-nO^T)M{hFQ@$vt)4Q`HP@;+#{C1e z+fH{6SGMYzM9pX4{foyG8Yb45|2N3tg~o3aTdgNr8x^?~;E94O@PYY&Q+c9G zf5Y~YG?alx=hCTGZT?U5FdRH;QO0`vUtE{9-_1EAWN$_IbNF%KuW|9&UB^~aKeWuV zSp+7dZ^+Baz|#&awsX;LbN9KA4wS5;56i~|z+Yzsg@)}xMm&*K!LYwR`o3tIjwpZT zPE5Mt9I8y$jitwD5DkLw9f?4$%=GVX3mqWWfoyRIx*iq1QyZ%zt!>p+`JX2EKS#D2 zOWWWFeq#Dc^85pY@7XA*b}(%SXE9@NpHTFe6CRNk_J2ZAUDzp~=G!b68xIpd@OS+m z%&Aycj{IyZuwBaK{%Wh9!f}7W6u<9aT_MsAA49lC&72yqmO2j@_ff5Pj`(!C@=_Yx zbQtG!lFdN=TUVp9DVd|62h0V}@4T(;$kVv2WP3xb^b(7;E{Y+0^9nE;53F?jTmRKKKM>ZVfJ-Ux&Hr15+jh8*E7|^* zMw2lWY4Auu>ih>N;(*d3a=mT;@N+J!!3$){w!)lc(CEk?hyFbM-&k^v9mOyG_YD+O zr~Nck;G3mM$A3ZyWsg6<3q$^v1&TuFA2@Tkh=hci(ol^72huL@Ap2jYWi|84ESLpu z1f|C35h3^C6LhW7@5yG?v|8{WM$(y#*yBLkX|5e>7~#RGMgt*X*#FTglP9+i2W%+H ze!ETm@~QiOz}bS)I+qgD!1Q|ci9ntAl9-^c9O?&*J`YyYZz^Z9YEZTojuN3M-HYtZ zhPy>CcRSXV^WU;+!*Hl_euAVF zZ&)_LVPK|}EL>w%ut39FPMsg^nv7HLfi5pb5Oc=>yx`15Qwk(#6xsx=I$mhXdBBEJ@ zr`Q=0kpNZUE=&GcIE(p&ZvS)!#?yU1FYZ4WO}Nh0(0^>b#F_aev0*x^=|Q($NvuVZkhNM{T~n!cKdsZ$yDTf#r_PDt@2e&j|PD<1F+0gVMsOo!ZLK zio3b>`9aR2S*UdPm>O*1L?1yIkUK<@Hlz|g&!hsK1oGqYH9#ESXsC`8R??$|m`h`a zKYijUKpHtm_bce^+ADwS_9K1VrUYB=Aq=a?ikp|i8P6~ouBuWgXnHfWb>$2Dg`8CaH3k(U4l-4uR_dcTjo{<8gv%`v*GHBKf1Zv;2#2 zBeUXlzD)fY8~7ur5NxYZCatD3Nrgh2^>?me%l0bBZv19}dAKtz6yNoGY?FJ1r6y;d zrc!;Orhn8;>7`A>$I zs_#wt&uCY4+k(NDVj&h&rrpV=N^ddtRhjPN^3Rr)ALcB{mRc4~%$S8JZvsObEJOXw z#LH%%HEArT-FI1bo{;I0l@7EU;(nerH#L;NBY$UVAD^ui&<=4o9ud?f2oTL-rceAr z8U-mv*Z1%9Kn_r(zXM3n#|;=+B5iliFNKq$5*ngBSdPUkOP zOxGo?cacn16qQ<$Eu|fHd2ER|0v5JKBPFuv{cUwB96&9)jGENryKn9%_uzxr&u$+4j81T`~e54jvr= zU$#Q;8wF8ir&hBrV4A|0obp-v$&_mQI$(@GFM<#ui6#4RtZ2I3k5;Kh2*cD-s+~3d zWQ0hRj+-~1Vae9L@E`0xX2m&lv3WG1ZSrhDtb;6j*}^M#G$sSmFX`QLN4jMM7T*Xu z$TAMc2fLlDddN94yNqzrs=dQwYg>ACN25O0#sJAku_V~uHbjGUmPo2TEN}H#79Adu zT*v&uX9$6;={SPM|h&i!UyYm&d26dmp=Le*vwGQ(_lKt^{VmFHTEZQ*Y4txCk7|A z7%_ui)A}>=&Ud;EntUC_MC-wHQU=9Bk`%qLRzNu_i*u03t@Pp4M@kR957W*6nX+WmCkzfBo2TRy;gJUY&IA5KwIqol~m|}R-<;iTIv`HK6KQ<&n zid7ABuTk>Q6*1;j`E~l~@sA6<%Es%jqfxJ+#5_$bV__hGy+28~ymO`HMZ0t6?eT&h zPP~VW?{L`O*up*My^mx>f+hVc_VZr?h~L5CU&LzvC0+14m-`03m+=21rTgcr?Xqql z77tZ1V2!({{(}o~?uD!QLcPpOn3mayO-I~D!WwfmS zEZ$B`Hq+e?fh_1n^;%_3_SeGNqG@wqG^l8%m9RDtowwdopoAH+!zp;T8mLJqr)&dH zIcs}TKfS*?baT*_c>*K6e|&~Dd;T_526+z&f}TE=wE}RRim@x$l^8pGDxI|ub3Gd; zgca|AzG(#TF&4(tkFkj+D-^}UqmbG{2@fe!oFi~4jm$&`<5r{_7w>ja9wm_95VOch?qN+J|RU>TvzG42}Ge;l`9=HA&w5@q@PDvq(l?^U`s0(#=ek zIdoir5`b4>x4%8DoYnrj-O$gGr9`IYcuY_XOU;pw!Wz9*E7Y>+!8e4Fn>Y8#3*Yze zAcO$vmYyGB=((-ZiRW&gWa%uU0HsrM#1Ofl@TN0M9AVi3jeC*d!{0YS@c9O}49~_X z0;;v?dt+=ls~PCN8PsHw$I1Z>=qv@&oweL%4Qg+1djL@3UNDP+Hc$?lU%Rcxn_g>E zs!rlg5xTcZ@7k`!iDA48prIFX_v=*)R(}M^uAu6%^PkI8>&@X|?USdel{N@E0=(6* zb!|_wA{R@6>&%PkCGMgj6RDA{PI)Pe-oNi5u`D4t5A+CKYjHxQ6B$#5|C;dZYQqJs zA&k zN?g_@7=Trn;`XEPxjDV#_Sbh4sAoUtqFVoyYIdlXnvqR0jJkB`a_KW@2kNN2+loiK zcZO4Mk4PP%TR+fYtzjRv!h-fg=xwk@b(vn)+xfK|jVvP=`G4GdH;sNUeHFh}7F%e_Aj4^GyVOn((J>FrdJPW5U$?66Nj`2KY1GZ>P`duMhguj zhe>F5tR^d<|K^?W)2}g21-$}mQ zY298ka~ssdtE$oL_2Fb?(1*qFV3fG4dYtZ;CyPoil^6&9!Ccc1$;|Qw=cw46a0Lfx zmPXet#DciL1S|PXBoLoygZ#AdU^-PQl4rquy@DVrcc9M+eJyF6kHv8gHdgD!2AVmVvszKfyTFL{l^f;PwDw@k) zk+KG-f!}}QhF7{-i%`4{&sBE#8TF+TJ!F%ZgCxU$pwF+l+h3XAjZH=wlBtNjJ~rS; zT*1%ZIx^UBCJSiEBV0)U62d{!=CXk%39PT1`yJQ}-vH29z)Dz9L3s|NE%^O+vNbWX znMqgdVQ;cu{PokM8?Oq*O4oL`3O@^}-vq+o`sHx;=C2WkH5|0vRfk_atHHsdR-34C zz6F0Nj%FMEfp)g5_^igoe3onbrQ6cRFg7w>R6*^l3fs_T*2tb-{p_XG;2uw`VlY+5 z)6=&?o!5MSmS%x`v~LL1La6psNm6y=HEjben+#Svu+nt2@tJyEAFhWWr)$UJuYo{`q#;8%_jH=1NA$P3mE zcH9@mX)JWzZ*h&8ot=YbwC!V(7p%$a$GuKCF^w2$u$^!fkj8|G5x$;w!i%|K<;t-8 zgI!NydUo1OoyG@@nklC*!3mgQ9&*t?^*Zz?cJ%oxeK~zYf>7B#QU@SDbnn#0WeL8> zkJ;en`L#O4z$ie}UN{cS><^^a2Vu0P^0{%RHlHL0-t~5bvN(_S`VbADDEWcHS4~Zd zYccUizozccwCzrl4;yla>~PCa^Z+o6zZjn39kFE2F!GLQg!;Aq&n zF87O<7T~je#c_QqUWEBRzJ8%OFg;%tE5zC*YtrE@b?0)cU(z+Wrr9rA{myVS%GFHp zUKV|6lB3wXg|%sUr!^>iiXobu1@q`=w_EwKJ#%BV?`w1y<9bR;nq_$w8AJgmL-_0` zVV`>yIJ?gME1hZYa9H!U`KzHLVQ@@5n=B#bFnTt}uwX+Qz(vUZ1M`YvYLv33J)~Fhcty~555-#2FkYrJgpHk|oHY~F&;=_v?+wFe0%O|wbZyCy2rQ*t?c zfCY`F1`#9jOYt4HrM{K|s;zi-pZH;ie@wpP)kvH*Bd29$Y0L%4fote7%oT2y5!yt^ zlTF^jF}9_?2yOCJB{!M>12^R!ZRb#TgTt!;gO(ZM&;raJ7l8vp^ZCqyd+WmcmY7ew z*f9i(YbiftJhOI)pi8A=Hi0G_?)jP#x~S}43$M%ehgh1=I+tAU%B~`Z9qXe!Ru~Fb z93M;MSZNB!_$zdZ3eJ6+2odN&BVnzYWL^Z0{WXsvrURCr22NY3NQ*%1H-<&;Zp%-o zhVVG~SM56meg{PqFE$gB9X+`P+I~rKtV*Uv^v(|f?DD+69HR|lL0_7iIz|@j8(Of< zTRnXchU;P?Lz7xZRGKuf0@>6^KeMNB9fAad~wFQkNPL5mEH$Chh1|^ z*Wq+K#P_Y9?`3Uvd=0exg|}#SoSAFbbYc=emN(ivEL|mB8Pt@K;OwLl9z`3= z&WPgk9NZDdaT~BwCR5p;Gr`_yObf@LhIk&QXrAW{k9P-}MrANz0{EUVA3Y7?0f$_X zG`|eQAAXH@FI7ZEome0TvQ`i3{aU@nJ&sq0&ah~KRf92ZL8ZwH&InFKHDvYydz3x+R2EzB!z2-76 zd$^_6X{{0t<9rC)8H`9>oQu~OD3NI&6#cA`xL6oh1n81-VO~zMbosR#&w5l4x}Mk@H6bz)H3UGtpAwmIh~eVaJ|Cu=95p9bzy?%A;w4J?f%R*M_=$TjQ-i;z)kMOl5ME4JDS+sVF(l6E_Mc zD2AbZb4-aU+>{&-NGqR#85FvzKz=q(RGHuCfcY0_^pNH|op&^G1h-ypNwq3aS?-ZJ zat9(1#$p}tUrZWfsWzU>ulxvY*tMc=u}=`?hdoJ73oLZ=65%_m=yVQY#+#&EP?S;xna(R1m zD*XY#Uil=_q@esxAyN(hw7m>zB95j!ja!X%1}I&5X4Le6@d0!^Z&U6_GbCk;@4C2b z);}|wCeN8g^1fDdHmTQ~B*Kz?Yms9(U;Z2c-W%v!d1~fqLmsN*C`FCiwiq_1xHE-f z(z#apQSe$uOU_R1h$`}>Q}0E3$JkXrSvxo_)0rk*h1+uB=R-vQ!tJn6J!aE73IIK$ zs1-0q@jY`ONu?L_Zs z3&lqFLyO4n;q<&?@%QGp%1I%#A**Q$9>c^@p>OLk#;}j&!Bul!I&5TOP z%X7(!z!Oz>1uo(>;f^u(i6rO*&F}@#jICSl3})#+ADPH}_nEPY=l9ENlAU7CTANn} zQeEXfYNhc?zKdFNk|^Se%h=0K8(FUVZg6E0Q3`H@b?s`tv~TeR!>~V8cRD^>A?+uL zx7D&a#lw7J{}l%&q^)Lvx%si)F;NRS_o*F54MwTLUhDkS^xc&z``Lj7${z&9Rpqh6MPvljk*mw0Mq`L$Y7E!wk!u z55ESK(}sCfxznp{C*My@&J&l~`Vr3UcO^zR$Somb=iDlgso7nHj(*?&L9rk(ssTq= zyZgrdOkURG9y_4i7jTrBVk^4J0ZnFaEmLTM>2>G*N#V|!uP_0V%VlT|Hvxw089zVC z1gSc}kxx%Y|)aZ&6>rX_uT#C#B;c?NLRXIl?dX6=G;d6CbcL zh<1(FWL|_RRav34UZ5>T@Ug^F9iWAM$Qvu|!%fIT6_){vMyJBO;3*cRJr0s0(<{wq z+DPu_RJ6cbMVT~Z9lK7da+3dCVOsR{X3qX~(r+A{cdaF>e@^W|1E1Zv`yB@cGXUi_ zv7AW#16~b`79AtAR?#5plA8$}h}Ua{Q92;Nc@L@fhC9-Qk=&>D5|4wWkt2} zoECD8J*B%<5UR631j+8KN>K=oqUg&9^$NNHlh(vp!h2Da@yk>*FB;Y$ao*zkxYt}+jo5wGQ#Fr!P?WD>2$NkEPq6ZuHMqIqk zq`)9#(#rLs$kj_P|JTI}k;c9x;oTVZ&|5CuS|jN0k?0(!f#nJ}%pMd;XaPXlY1lk1 z%!|ey`>wEQHsNpp!@?ia|(DPVDc82~5OZJ;*~$k zqfqns!9q`^on-C9q-l&v_)?p|g#N#wH^SgV&PAfD`MsJ&!`L z_(Beee;7y~uZHiKqDWBDVMZ10^%!yS%tr}41D6ao6sT?jQ0OimrGls`LMQ41)jw3Q zse2HR^Pc-PIL0*;LUhV&6TIk>O@GSblY|!Qkfd2wjitM>Fk#7@v)vK++PE5f^g&tk zq7(7J#<6Sm2#Ve09`SpE${Ncr)z|SGwr6<3tIGkyRznm&9&tJOOc6d zyL6vTEAv4g_GY*81y+!Gpf{t^uUxvVJL#cXMB=J>`c85LS)GTIuVRHnBXumwD}FI` zvdE5$WK{^LyRW^&u{c-|5{Ecz#mxh{7h@qVm=+FX!yUp0gTEdWbeNU zyA1f+!I^2j_u^pI6|>IMC;7(KShM6OcDhWH{2o(r?NutdUwB4ze2Zx7=O=OvHxf`N zZL{*aPlZ#c0re$l9&Q7TmhS`2X1s3jtzjuC8bJr!eZ)&}e--U+X3hS{p*=p+nQ@7? z7zz(LdUf?hw2vjl_EfM?T@nO$6jke)c&`yul+`BCxzSy&>fRSFAoG zbV;zu0T>ofQlOnh-|Gw31n~(;NRljYs8qbwQB8uM4_0Wptud3`T4}p}^{Ns^cYaK# zbGa{ffl+g`Z^UM3xrmVT{JLtTdT$MrspoK#o<`w(DG57-67K(FU5k z{zm!Yd)<7Tx>3Bwjx8?R0=k)o-Dzo^>q~o;-d#d|e6=8MGu)>dyFgI;gP%>p7Wa0D$Z_4s2wEuV}8~!~;55 zeP8$t@I`y2`TfqC<3~sXUN>YP{av%>GCw@F( z$V1aCXTeT}>mC)~JTqm${>)Hch7(X?FD7K(`b6Z*-TB$Lo@iX9*0xSTu_4{n_XHe~ z$Ig>icun8)9x3_OjeDt9kUnNf-RkpzXRm7B%l{NYj5s5Yx*1S4K1<~( z?M^q;v+0DnF33Byd{5V6I7t>6z5|Uiaz-L3JszwkG_*fbo&d|<<>)-n1xY5z00#{? z=^rn(=NBM`U$dF?s*}Dp{q?28Zre*bX>+HnG?JioMfBp)4I1q~mHg zDj>$%7h8lBF8U%L$onD#7ZMQ)4K;224l04RUdWuasw^4z`Dh9Rq??7T`2_)jG)Y1H zdd&MGHz%_6K`sZbF`%lwHpFi?HOHL~d=DW1{m>u^p>(MAI4cyPZ^P?cX$tZ0ySBOr z!cw((H0PeA)4w*!l0b)Cj0DteqEOFpfL^R7H)7+itd;NU8VobHqK@x4`DD)+p!D2| zZ{btVr^CA=r<{kXQg8#3OAbmlak|BQREGIq-=r(gAUayv7aEE;}o8a-9E~u2#_5fop z*{rzVB<(d=Yl-|bQ`NsI+)Nt`Bo43ufUNbUcoWf>ln7re2tlkf9Sd#(rH3d5w4(0Q zI7k%@WapxA9&FjgLAwz5BHWc7CA>5~(;IqJmwecQ9$MR`+m~zlb(eP5`)at-e2Lsn zF{|?1qj}M&f$HJK!fC?npYcIm?7jlQ1@r~*TmA1>oNgITF?hFRU;<=w?OIrkAL zBam(wjLv^Uc_a^#=p)z*BNMoHLr;cB9GKqPEn$$D*lo+g=>rl1AO!OyXLlGejwS6U ztJDrO7GM+sk_))_-RB?lxy_A~_QS&uuk-ZaL}v=@1(<-xPrI&- z>>(Rdqjie&`xVTw?y~Q_`~k7Ib!*xXMmJfHC5YH9I_DQ!BnnD{=+b*mr=5D9tin!N zX_T<%b7#iEA4TV#SJL)m9>gSIC``fUaQvC{i7MLx9|YkT){#OMSBBz&pM>HKyiJSo zqF#@^{;J~NZKDiD5`jV*O2wK3E==^r~V!NgQEm>wsZD6t!Uma&6iC8rf*!y z&9>Sg>r}wn^H1;)Epd*aFrALV1buZ3FEM>R(1%12>E zrtez={f2rIHwG)w8t=w(?7o%b;RLt(a<>NN+$Oz8o0~>!n_lz6%&YQgfDli*@EoVX z!G;`zShk-{iN7Lh+XEAC->9hm%%i0v($3YBVl?q4gPHbT4#I3Nye_C7u5U)lF8&^> zByA@Ppf=XyCgiV@&WtBKWc%RBhv<#@n@2u}Ra=y6uKCqKz-c7 z@`*|Lr1%}gkr81JT{cC6%t9g~Wj=#PciaTz7%}?$7NQVw(xrmCvvB~2!2t(knTzHWh4 z3I;Vm-)cx>#Vh>hlC84n&APg>TFDVl$CdBzeL@h(l(>i&J$gQr_L)!<4spHT3Hq%$lz4iGO_NRoMILMZz>z8Mzj7RIQ{9v~TtD zTD>+eGFSf0gwV+x^@25*#{%kIg6+yiWpo<1oN+8$?t3gvqX_45rYrdtD(9WI%%rUz zltZOHjC}GV7Bz#p=l2t{25YLx!e()O5T{81%7_7+<-Q3d)|?J%Q_s5uj)NE z=0I6;TA6n_uiM&HM!nM-;tAX%%YLN;GLMTA)FuYS1UY=>x9~`@Im-V7)*?AL)0lbdWV zuyIEYu(04#eW|th)X)C%lSj|)ct|Cw*Cm(DV%2vOYoMUD>ABm=a6F?QLAZ%1`pIq0OqouuHx=&xBo@g6*<&` zAuvm^XON%8Ek*IMx}!#h?tc7fVo97HbjNKN_2y%1^gPi?)lqJDJ+-S-P^r*Bv z-s;;_asN?CXGydk#5{+j7T2bn~pFCMKrW`$WXmSi~)U0R!J>2k%x~|$G2Qu z)O?7z1e;B3fP$Y`o8lzvb6l4A04GVF^b_5Neqz}U3u^79;34Sow=Re=d%lR`-i|Sz zb_0gxW1yRV7X4QJvf+MR=awopB;1qid%4(8Tr%DMhvN_)#F=vv5m$tj%rcmBUk!K} z>!e^fRpdRBS%@*W{e8K_L)|KA-!W*$;U3HB#JB4`%tyC4+gp9`xVugH{BMFBG({1dN)Xn;s~IDLLT5E*JXl}+m!8G{o@X-L)H*2U7ZcL}glH?o(&D?sftd;et>U6V!G zoNa5m56X!FNFg2OnS=cbva(nGBqKlfYh`E3^BiWz0k^~tw5LBjPKG|vpL!HWyscT# z!L`7M;{ed|ExegiU+=d@fc*HX%8hGWTzjjqKT0dVu5t`lE?a>9)Se)`(P19cxt-0= zYhkQtinBGbWi&LVk27zHNIxbJOe1Lsnt+-sjt?bBqC0O9*x70K`_zJX^ou~#D8@|o zKA_c(u^j#weq%40Nl52iDJ;=U?N{BxXq+bf96}>XwPxu2euR+4cn0VLUp>tGO4D5; ztx)TwwOleRQW9TNE3{2|g)g99W@D>L?D35a`-1$5MpK|pFCRYKBHd@ga#txd*a?5# zCDXxC|EDuc{Aw|We!^%IhM9f%L!(soWu+`vSjc;=0OsLoY0|Myu|%n|^2vPNyvNF6 z;adt}NY9gccJPk7-P;){G}%IFN3Fva3D)bn1kzh&wJN1uq5e%2U^u4HA1@}R&T2WUg26$ls`qC0QV0iH8bE@^U3ev`0^fyL>SWNubgJ8?D#l6uUYn@g8h3flll*+}{O)}DuwS8#GQGG}W!|ED8QlZ&=@cPdw8 zX=#VP=q-faN@r3*SWAy)4Xwoj50GjQ+i;&VOh3~*0yFN9 zf59~zl-1z7Pz zF)(+ZUxsFrPTg{!uZ4VJ8t#c&q~$8*16^g3F$*-Au<7& zrqpCNn}ao)D!UliSR{BQSa>*I12Lv3gGEA=kg*ck*F#QZ6O<%esJv(al!B)4m2M^F z)W(h}xb6Zojrj^Py^+~k?CV1b`+*ylV=x4DyW+x^7Zm;+;2r8WON9;TEK`PibfEOk*=XO#JG?;Hvi|QqdPk5#JPaajE#;xT|@|PD7>!kZ9B_NtqiN zL)N!0w4ceW4af-JV74uTE)4@J`$sO?Ss6^tfMy_8&7|(e9!YWoXM)yKCv+|RFDvAM z5<3-r>{GG5aU2PKnnkv7j#yJ?F7NnhnO>}z7j80OFC=2{WV=i{RiR~(p$Wu;fFblZ?70!g4gN*yq5EjS z;ba+l`bOCh-G`6|oyLsG4SyYPKGEiCb(DWcaB91r;b)ON+nSmC!L6ibAnt?kQ&5XF zemMxusEw{<9s3OkzQlw}^5oCYxe{T4Mq4&8*Rn%hEW88& zLQzk}O-deR9#XAZSgq(1r_v#`HhQhFZSKCxQFZvoN?vxN+s_oUf3E2xUwdtfUr)_# zSA>Qf+pds>zs5*$<9UX)`V`2_+cEeC#b~sPA5Mz;-(C|+1@f%Xs17440Mib!! z&@i_`qvQ{3Mc8`kad`Ut2T8cqz(}}kc70PfX8t94w5e#uz2%78G;|6XJ6~Zi*dY&g z=6=djhx9Th-bqGW(qboDn$O{5cDE6}C{E$vrv2*vw2Ol;?huk7)(@_qj< z>lrq16!SfoBk)-Nhvu*?bO2Z$3%7UgsSHS zyZRar-A}v@XuP~=r3*@84(c_=5ldkc^wm01ub~}p9~TC#eHcu~CwFEr%T~;m3nRcv zDotlWJEw^-t)C1p1hKJJi)YXLJT*UAGXY7Y(Q)+{YoQ!^qk%7VfD?=HU>p)gg_?)d z40!Lor7}U@ZsW=RoPosU$SfR@Oli_Lm0wzURBaB1)*7uu-9lU);7Eb2wp*PZyE97` z{EKe!RgNQW!iq+Rym61b6Bdssh|!4jwT=d|jfa3!_DRL9;|rAEd+qtFB_rt#vvl-VG@J|s2GhCD!#Dr28GJcxU_M%!>>Vv{8NO>M#v+;397TPJ z32G=UJWRk53ipeuL7}jyyH1m$xvHlM#8QwEjtKBos@^c&;mZSGdRf7`FNHy9kqRXG znA$4E0OKWyEvjvyQZ-E{D*VH4DuB)TYA@)OcxX*<@bjy&*)*?u()i1O!uaxgpmOx^ ziMcZB>kD|Q!&@_@xGv=X^W?+ISK(DJuyi=$O}+ViU%Orr&-PC@&RImla5a*kDQM8S zM#wQcmhNo9f7Cuk>y=->M!noWAf;99vsEFUu}DN_=1`|D9%dW!Ssrjd1krKcAVPd1 zdld|FfIqMg*oIuT8K{pb^|m zxug~)#e-SxGET(kMWK=aOtkMbopey7qNYBN20lr=dVkX3CA6d~LiZlI{ZKlPJLJ{S z#=~*A1Sn9lpR#*wRYezXr|di^p}wMwFS=b4+2S`Y{cb$@ldB5yJbxCxAW`)5&69P& zW;ywiO*Q^d12E;UD5LImN!|k(HZfKJh(w|M1?GSuL|A59?yKadOZzI^W<6y~onqjt zB4-3{bN1=p5%w=`VYgrU7}PPY?(_i|tF-eRc`<@c%eb^fm`Ip~N*BwmMsa=Ja+BN4{BiPaHEN{=NyNz&K6d&u4)p%`ZX{7?gg+5* zZF6VOdj#6eBxhTqIi(>Iq4F9%f5jYdcnMH14|hQ&=A!D3zBSais;GRWd$82SRs2u( zTVA2n_=6wOK%R@z=6VY~z}$pbFtE+bIpwTmKhfuCWWox6y!I)$6#X7TqLVxe1ua_A7I_j*K>hBk2_+6pDnjUas87B>~XGndT zdM?W_)%`-Q+%(3n7-QIcxUPhSS`No+GWk#~lmgO)k&N83;uY((;^ z%be3$R7(JSof34~d>z08ma)mZrRqT4<$wD;G~Ychn22un6dIXan9X^SrzK%8*+)5ng4hWSdK6-6dJ` z@NgH&KnXMN$$p`KRF6C7b`zDfGG&c(K_w1*?i5=4V+oq$E*So5VOgT_^UgQNb5j)(ATJsZOF)b4INM8X9C^S=kerKme6mAw0{ZAW%$cl%+ zlPM?dc@r$rb;_GH>t+F$Jspd@9~6qR!RDN2VF-LI)}fx5mPOuo)V*54H|sRpf*(GX zQd^{5>~w?8x-dwvxs*R&+EXd9trnywGi(r$cd~-|T9HY(zjh>wq*k)o%7G3bp+>v= zEz#P_?+ZMTXYzE9NvYn?u0vTWl%YCn#=RP3bGu zZGJ0&cnL#EPJl_uc%LiZLn;wg&z^OiWwf1_mH~DZhV9b*X5W2=vQL<`=|iE66TtGw zR$_-tzeU`{FfK5kw^^F((sV^%DJLCvzgD#!$-AV%S=^oA=FD zaXy%R>iZ*u-Kq$4?7`pbeyacDAvMmad8>GA4AKJZ0NHfl4G)TC(Qf+j&DHZ7+oPA#UANYf~Giio7k+M?eyUlC_cc!K! zSbHN#Ax-i`1})ZS4U3Hq`xfkjE^R?DQ>$Qj(??2Ccm(5_cj;dP zu-zz7ZJzIs>z-$YRIRff>gntLR;n!jSjQpRoeJ*<_AW~Uy9;m4iEjWDcCr{6aRsn@ zFDu#Cd6E-aTEB%PB-Y~~#V0Mk{RKve>*oA20LwdQ;%A@!$rFLwk0pL&UH2*1uc7XZ zf*gLTx{|I6oQXw66}-C7=bX)q2BT2d$Sk1bH_`$}kilt}AN}*XiFUNPP4^Vm{U^6#T}!A# z3AAxcZyFV#Ydt!3KR-B;ei|OmNELG&=4+(t)?ZJ8HN`54wGaEczudsJIg^d^{R&ZD zYkPphb7jmK9438$>{w_7UXO5euB&9{S*S2BEyshuDOPq7O6uXHbCYaNsoi+4Xwz+v znAbr5W!P?%6RR9XRvmkW{loT3v(6DWL6+&m8lt3bYGOg*O3EAoLHcgwT8;Te#;eT7 z{O%028TF15wIU_Ga_C!cIXV#`mEJa1^S`;9Cl9*!2~7&Tak)r-G@pgTNsnFc_}~F! z9$_9vI2Z$*kOhUW;T2^aTsBES(NcB(wydVVu$i~&bw~Lf zcOnha>Vp*qNG*?qCVuADC4NH62CLDvrcZaL!kWA%uA|+b1h{YKr7-hX&7T)qp#UnV zV#9=}%vXxk$v1_LKyz$J!vW1zEt?#fi+h#4dv}#zfZ#5=B>?hp)oRKRvAZNjR$7^+ zIU*?JvznV3Br=QCO(;*C)Ak;~cfPhMA6wg3-fYC-x``ws)wQ3GHjs#%jr5kR0$&E} zAA1XY=dBpT#*8!YNSx(~Qi#{#heWGb@?@G(B`Zh=Cez!ji2qddJtu=3~0c)%C+n+&#oDYIO61E$0BfwP}4Un%`Lf)G7UTMMR zR+`Q*V3DT54yfOMWC?S7`PTT_%^s5BRYvW{c>X`(9UEhCLDVBGBnZB4c{Mq( zsp$cPV3;n^5HCKSA2<6fjtXRIO73@Wsmi*HwaVsvYb$s!H;Fe}Y9EaOEeE6*76j$^hu{qH_5Hs^NIRNfc0!0g8!pO>x;k>PoJffQaIpKY#S)eXnrGD#g zGRRr?^=k(!F_*z%EPNWz)cwE|J+!F~S+5wH&a{4u(n)MYUD~I=cg!>3zVa z^dzlxnrZLH#A)Hk=bfGv{olPi_k3<$v#p2bjT>EA8p-Urke$%xC~$_^=rJejYmIw8LEJfCQwHwtQIdJyPiMG7Z`j3DI%GH>Z3xVGD*GRodtK-^X z!eOuHx}RC5?-R&O4cG^Q73bo?4h|5dPST$=JF8bPP1%!2T?3T> zl`wVqF!|nN4YL@gnH(3I4vu!r7#9NxE`V&Y_JUm7z(VSjT&BFmM`G+8lKfH=CA9YT z7)NP{Q^1d^jn5lTDvZ0@N!ZUS2|ok}d~WQV26H#?@_TzYEo9x9?OOfv{>hw9C_k7XOux-Z;?y)Xe({saYEymH*#Nm+)F za;}=3ho?(y1pH{UH?=`Kd`E7V@jfIZ%skySAz_VEcpL{DM*|TkOjNNK`ee=QeSD_5 zP%I^JtN)HF2Pai;P^v>2&!Y~EMB!DYOzkQ0jg~|LOJ>#xd$`T9P=iIWzJY;yAM1e8 zs$-2Gs<{=eMLkE}@8sj6O8OQ5ub&pcB!($nG+a!APk)s(+!~7&Zhp@iB_dv$CPv*!A>x0#qC4Ijc_7jT=NGj(_yv##6e{Mjt zt?9D)8?;Q=KdD%7&XvkE|KbnKgtHY0;TYs2%H{!JkscAEjc69M_dFSW%$j>i%PgMk zY#*PvF+P9rJHB{`wYWZVH6nOY+2uX|_vgGXZ(vwbb z3J&IuGk@y_J&lN!%?kmeI=L$l6vp)BbR_5J&GoO{eU5Xcq}jWC)}q=JTCTPe)nnHD zd!$d<z)#M71%4phXkXq95@JoZ z7<-I5O3vcnTkr^rnzVG1zQPlS9$ylYF4fW;d2Z{vNI!p>s9kYp1$CAE@jM3%@WmR! zA=gXv;$aC1DbTVI0*8(^yRWSE)sscr%H%5CNi;t3yHbKk0?Vh1p(*RX8dJKgu&)~O zpSOH+r?XvzY#m0?A_WX%A14FVr4m5gb>IA+tfXdCgUV~Kxs@s6EtJznmS&r0F1|1i z)A6Z~aZ(id>gs>G6?ENvuf8wL-enjXEy`*T;IOQUkI%#K;_J}$y2AYwUn=(Of~wH& zMs}}uj~Zf+9v8*Wbw%k(2R>4OmI#|rL zkbChjV^E!QfXIl&QdCA>eu9x_6N~!Jb#>Q8y8qXSN0N`A zQJMnUV|B}#3-2G3<16^}IHTs(%+f`a@#)D(P;&nR(n0Fr*d$MDwGuL>$N1YNm5IV+ zaYI0iaVIZyKBQQuJ#hDg0Pq*!PZdV{FjqZrGPH?REm*TM9N>!E5t+Ebr-T>aTN8WA7x>&B!>nHffDWJ z<`A&P-jtUQ8$%!9e8a|s%RSMK2kL9b!|eF^T~)sAvCWR!SHb#fI+%u59hW2b6?M0) zc9@O%>fUFimw%FpLu7PHGb^MXK*4DO>PZ|1a0y8e9E2?e>06Y74p!M`r&79=i3J9D!$Drm^`~dT9@OACHAPJ(Y{WArj}$%?;+tVfB|>w?4FTao>PtRtll}zfKL4r zY@B1ny5`$zEd<^N)2okf0-9AZ23p10hnFk%z_rQ%0DNY?b$G>x{Ng{mc#hw~!KFDu z?Y7vb$e;&wv<~!>RO05Rb4(ZS5ev{d%^Bea1>%Taw-xL%6@)){fM#DOkIKKDccJth zx7OeZ=?VA<>=cRKaG%boWo!8p1rhD=?i|&)hDH8L7sh^jx6tp02E(VnU{Em6T_jSn zh%Q}leG*A>xr)DEzscb@s^c~vk^;PlCxk9H%=#c`8iFTyh*(1DG|>3Fb9>fS&)ytQMRu8v(#2nJBHyGQf^xx7E@ z@s6fVa^1JXY+^2v`jsuI@rLcx7BP={U+0Aa&53-YuW z8fkZ_-@+zkSr1Me1ZxWelH76tMvUtqogv>H4<~H*CmJXQL0~m=O_VK~Bgn99gBx@l zmb%`FJM>;WKZ4zVa5{PY5)Vct~^2a+#V7_ z)qvIvknTTl>lpil{ea`N*ktZ%^2|fp(myug7Z>|$$MG`7%!}o6M51n)Se_QBar8%Q+b*nZ-3(*4GWejS=_RL|r>O&wAVi8r&EH(Npk*70~ z#vCC!;T`?`6tHuH_2A*=gVP_DF4|d2JPD^8Rx(}m7i_) z>vOihG={V>Y zehAmA8C-c65YzNxdvQPA^^vW?+>S(J?mqrIp7!I6YIVG=Jae$U2q{S*0z`bhhY{lx z`ly2N{fj&c+Es=F4ig@1t5$n-G*Q1$Aq@0gJJ0atr7-{-;{1N~nSCRl{hJG3#65bJ z5f6_!sG_deB-1AIW7sCnZN~$B3x5vG6)W+F*oijqaxgn|1@s#X%JS9Wn=54yJs5Jr zi!Epy^bf|wVrr6x(IsFZ-e@w9;r*NpSTG4y@&&NAp2i?Y$x8#4ZRR|2KLhEOTwKF2RjC53{m0``nRm}EdrH34Inb`)sgGvpNnk$HZ7*Q zau}hkB=^azjd{v7AEYa-?QZWmjG>kZ!Q)+7&cojp%0DNU;|0(lT9PXZuk#aRZK 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 WkO^c0nZW-e@H(-Sp}Q*50d)t(H_|fz literal 0 HcmV?d00001 diff --git a/apps/marketing/public/blog/blog-author-catalin.webp b/apps/marketing/public/blog/blog-author-catalin.webp new file mode 100644 index 0000000000000000000000000000000000000000..19803d87d3421590c0c31afbe6eee3ec95bea7f5 GIT binary patch literal 18814 zcmbrkV{k7)*SGtRy<;ak){br4wr$&Xc5K_WZQFLTV>>7Jb6363hxgR^a(bqxulY@{ z#;Tc`sa~TXE+XP04gjbM3&^R+v8h1=008`-91ZlJU0hI5E*ALb6aXA+WoYdPN(TT~ z+c-HWhzj7VscZbF;{QqdhK_dpa&l7tNBFDKW+VAm;b*77$ajxLjV8> z@~0Y`p`C-%5A*%7jH{E~e>nDsQ4G!WjefZBhp8NX2Kd9X|IrQp%ZLAA)Bp0zf7n4u zLGWj8us@7%`d_B{4;%cK|1%eSLo)~KpE_1QOl)oC{4<9CN&lG%tg(%<;!lb5KiLtW z01yQT{J75m;0!PaSOJ^>)IX)okI(+!?HK;YP6lB6V`KPpv;(*U9DXcJ0cJn8R6nXS zz!6~lQ=0tf#y^|YPmQ1SzrO!ppE{Z_{-?d4DZ@$t0AL5--}iq20Ei3#;4}35`#t~r z`?CN509ge9dK3TG-Zt^aomW44?Eh-SSpWchAOO(Z{lA()5dhHg<713%JADWJ|LF(h z=Ll?K0s!2V00406008ojuc0;n|6c#Ezkk~PPy2v^6#ziV69AB!0szv|0RYmU{@}HK z?o|9<5dgrB7$^(qPYh5D5RW`@v@lUV0ZJO29~&5GeTxNL`gK_yNC**wZ&4Jb@S!q^ zSHkY~>QVFiNZljm+rPPkvYssX^_W$7r|4jvDqpd07WmJv#pYaTiTmri@0{b5I8X8S ztgP#MF0fsqE83Ut{Mv=PZrrcW8q169zMk?fD(64%E{9|F{hcZQh$A9tyQ|WpJ3skD zH-q^VX8+ZG-8sDT!#@?=%R*Zqmic?kT)YLu$4HXkw<`uAGe9q(BsG9U4qxE)fQ#F5 z%lr{&PPobNbNsG--8f2-c#QLRrWQE{oCMFv$pd*uN^Wr^Mh<AUg9e5^;3L_Y;I}DISi~nzItvR;xM1|Q;c7HP=IYv=j2wJ4ynYAm z2;PyUBF)STu zoT7W7v#S2s2hj}Xv9y1mS|Z%~(hLrN_ywCHdeG)d3NH3QJb4MC@UiY*bLk~G@td82J{_B zCSIX)`OrP4rH4Ox@2`|o_nVq$p>pk!(9gBm<*EmJ^pNb`$#pX33%WKPy=}XM;Y0mG zcQql~chOXzukMSl8=sA`G|5Vq#tt;xVb9-hg70;1Iv5TlEseR^ckX!K^#cC2=KoIO zL``LYR%-ml#wqu1#k!rqO`s3ORvm|Qt;zy&3<=!^Q~+>&(d6-xeMdP_Tn7YO3|+w? z+?b*WJ&qTTY_>p5K&{J%G3F+8GYUJo-6Nk{2`SmKgm0jT5Ef`+iXaIBv5E$h5pKBkgb~6R z|LGJ)QMr44K{Z*Swh%ujSQCp$z6vDK^A~`A9t|6fdt6CQQ$jxuFHLmxoKT|jjg`VBt>j{_4^LS}}5;V@eqrSq}cp*q6# zcR>z@gqqd_Q_{gLK4tD&5~cvU&XGWBt)Q`i?Nlz?3Ac|BL~Tnmg}JLO0k1gPNV1wm zoz<=rbvIj6N3l$!%`4AJtk`ZFS+}L*;NR=t4SuiB7H!D`v$$WV!Y<_ABb`R~TS4OT z7sJee(=t)6!HtYGu5>s12$Hdw6w6Xq9x$9J`!~CAU!+E$5rhqw=neA-YdQRjLHN#u z^c@xRp|T5h3jcq+E5_t37LYhpEuXYQ_BW~r#6ZPxATaI30OtW~-#Pa^w!ugaqivE~ zPBDT}Vr3QD^>o61h3pD^c+`Tn?$wqVg^~5x&IRt=gi(^}T}mxQ23Jl?i8Q$`y1$8Z z%^FnU-j9p#{blvKNNZZ#=7En8TZzHj%!`M!{^Qi=f^^bU5}slzPzmw{DG>KsC7B2^ zI>T^5r{3PkSK#2R3|1p-P;zyPigqX}b<%S%gk$OLwG}h!zrf>a{uwBCFDe{J%WT=i z52LpGCjV*Rs#CENhoXdpQ(H-B>yxwM?kgpR_qcS3noBl<@98SD2qd_FNSy=nd`8>4 zop8f3fB9_ZjQr(cz>NDZSiUcM0`82tvX!GFhsYU}G~z`=k$F4taY(>kTvIUY*E%B) zj3n9}>7?P+XasjhS~(d{Vr!xqCZR5@$?o?GVb1$Z&v@tXg6T+UGdH+Xj0=u`F|1p0 z!s6n6+Non+J%J^p(L1odtfQ0)?G$Q=*z$>}g#FXCN+4rSqF{vrsQ#DY@8BpyVHVDL zM-I0Zz5STe@^0>xp_6!5SL!s8-xCIIzuj3StHC&@q+$ZKmk{T*;RC%JK43yWdDM^} z6{Q-u*1h$62K1Cpl%vJE-qE4X3^-4J&ja14-Wp^N^5cm^(tx%4vs@qbs#)G%wcs7CQb1L{<#Z8T9b!4+w&_j z_pM{2({ZAev5j<KApQl&@Ul8B@WE*_`hJhc(4d8k}#Au|Q!A3i&7W(BG%d@z!9LlxAj;WsNCy|g(}4yowb4Z3&!E+Gh>Ur9h54@RmS zh4kih>Chy{KJoUg2ou`O??`Cv)yRn(VYxMxzj(q1f~F+*8_wKh&JrGhrC3`+Q(F{M zLoqPA=}oy-(90cXZ$o?_JQf$z%!3inV5)S^VBcCsnAMjj<=^{8Ha2Yvs@w`NOPpn& zcyaO9qRJ^oW9`pRFHO&GGs?z)jTpzKs@dDXCYAB6W7g}3d15Q9r#3Y{-jL(g>4_$M z&6OO_G-TIjE5|4u3{;{>>yz>UzCQnk4SHr|4T!tc-NOt8uuwD(FDAlZK+SdJr@UuNZ!s^em};YVrypx>&BIG;MA(%&JiK%c?BMb)NAe!3 z|6$LJj1!fsI+mUi2<T2hE8V9Jhk4@^8Y#!8`rc5@=)``C{z!8Mb2yo08l|} zhWHi-=mr^e&pK7Qj@J)2FEOQ0GlJWG0ex+2#WRLM zFycP_t2<3R;B??y0;?5HNA$7c{-|q{*YE^kz@iW}dhl1g-4Z9{gO3Uc()0+`Gaesl z{Q3m<*ZqJWSAKaPu|>?T`(I4^bTFxX##~kM_Wx`{XlFyY~Y(rg#TQqXKK?EwL z$oCa5GjaIBrIfIBG)SS6>4Y3Y&h%gd3{m|h3DLQ zeY&Rar-MaD(0Ilts$j>5T!gA9cusoWd4ylh+^Bh~!bheK-F%nuV`@EcIPbicDnh`t zd(&PM;>mIo$=j*U4-KSY-H?lbZm+qIR!<;#VDP&ZOrZoNbRFj))hEYE2&ZfpES>}v zqxTg`h-*KNQ1`JbF%Uf*Yy!n$BBVCJ^^uvH1r1EuCs1cD&hmRK{apnUQpWb*m_L*l(C(d;lE&5KmgKMT3KJJ0k-=0G!f<|u3m*|;I)^S(re+g9L% zu@QGDHMITOo$8X#|ZB3=xnApg}3C-{*aa+m6zk0lho zpJ$xX7rPxnVn;56wlqu!EcP*fG~0uyJZU0H6d+BooX@D-KfOU9A0LVWW@z)cnF45> zcX!el`9sXS&H*f;O_>UZ7{DR$q0Fl7HVHI)%&>V5hWhMg*pLyxBqSj|3##(8?PzPL z*DZ%{u63pg*fPd+Inyd!ax?>x3P_mU&Yr#VzS#9kTK3;m(S6`$$c6C>c)~|naW;!C z4a{6Qim=)z_LqG&OIDvZ zSsx&NP+TwtXX&`ts!P;FqgisA^rN||DC54mQMS&!T@h&6BCAx&r4wnOP+-Bnx86@k z*LGkSj9?1XPCmLmGT;m2{(%L{433Pq!C?m%%UYZ(?2gG0J|{1?@`?0+bt6UUdk0$o zN(>Y%A!{#oGnqBg;f=3HPm@$W!nmNlA5ZD0Gz3*}8#79aZ^j zGoEm@dWtURBo|DiBBIC&X5ydfAtY_fj)zu2}6ZmcTvJ$37I0678n%wnS&%R zvp&P73*}+pUVgZABN|+`^eY!SVYI?l z>{4&bM4~1<)ny)}_RuAtN;5-*Tr)}W6jN{ zFX!Y;X}i^DiKaXjbyzV=3%5Tjh)h2=&WWj_BNO{>}B3KNW(5~4xuNy8cU$=i0@7%+Nz)BBXUQzZCuBR(s=t|2m|8g#GqAB?e6wBl=0<`dVKg$s%_yBbH5T^)4xUONICfRg zkX$VtDhggO4}h@Dd5?@(8af7de25^Zo`P{)5q3fs0aM=(zh$K4-4JF*7HM0B#u6#H zOOA-HBmA4)amKs=ozadbB&T~1mL_P^s-Rw8YjK95cBtZ7TWzC+(oPdn`Yv6m4 zh@gAnNP80?bk;x6gulUS=N7UJl5`)l;PZmE1SA@S;<~%~@sW?}drn`WMUI*Wy>)W% zl@)fz?>q8vEnBRL;_2fu)%|9PqsTVHJVZir15@&p__9~r7IUj8MiB$NFg@89Ru?&8 zUL_z)HpcxPK8KwARzS2f9ma4LRFGJMe~i>%zNP{KHuI_N%18%xVONwjIN3R z=`qfFvwf(gt_&ylR!v&pvrtZee-w0N&7L2iSh9X>2Ikc zvNiKB<?K(IJ5&a_L^1cEEF*uQtQxbvoscla?oX zf@V%v`l*4*J_7w1QC4o-U|`1-_?SDuItx;`K|%+<7prLWLb&k~X*~zntAXk`eg(96 zta0*0{Sy#!S+Kc8mmay`!fKcYw7P0&gH=y(A>VZ5^umF=3Of@~!0dNsetbaMp-&dU zwnFa(W7BO)v~=TOwJNP@zlT>Tx40< z@q$BR3_LnV+Lt?gH^!i;c<=&U^uW=AJECxzKfa#5zJL*xkJg#jhYfXm?}AzG**BFA zsde78E}`npzm8`PmIdi>OpGwOuD%m&AaavAdTQdq>lsnrq1hCmb+d+a>WlpR!irxz zhDBp_8PdA&mf6Mw)o6)A_)M%^=u*R`&1FqrNR${KNax6l&7gbTS-MPM359CVcrIMZ zFjwxKC}Vr^nI18sSL&YqMwMe^pZTnJkRRvyKu`r%=Y@^TY!P+QgFW`rN09YWp~)@@ z+CDrL*VJbO(@Qug0B+3icvH#|$;#|P3%+l1Ln4^r$e9fTF$w@pTcXTw>5Vu9&AwB$ zcSl0rNp;67hZy8b_RI#3$XJ-v#tGA@vKLZqYtLygqHEG-NmfbNQRmF%q&^X5#t3ql zO&b+zr9~+&d*}d?twU6Tp`}1Pj7)ca^I8_(_EEyJQb~LvNzi;&eAmxnAf&r`CqBXY z%Aa-81;mrUyAxe(ODuOgXzIUH)V=lg7&Q1-s+5jn#WLn^oP?#=<_J7d3`|ThUXVsCea3#(!Y3_EEG=?hsMEY&(AF{$^ar||b2wyk zN?x+958s8S(KAzJ7KfWRROg5K=K?GhB;P>Rx7!539hNKmTWodkjJ-I*eumu2q?JXW z6+z00HGz<%%;UJIXRF0B#Ipa&Mp!|ur&wNV5*2 zHoHs)c4lti%v|$2JkZO-LSH<>4eK@dBcZ?9MYj!1jo*C-Vt4AH**A- z@A9Q|U;(qe`|eqiP?M44rUSIwq#y?t1#1i2uRe-gw-XXoAUNY9o-yWTyN68x?9;*vm9*q3u=1ptg}k|fR8_NI~+oc&uuw59B-nsnO*XUY3IY8_Wp zuZlprTm}c&qLjgAzA1f0#u>70LW{XgXnePKKC%Tt{`^ZW91NZcII zH~dL2b9Px!HEM>ooTZk+R?*|qI22WS>7YHQxn3{>96?73z;JFm(10vDr!chQZ|m5I z+mXn)G5z|4^%vIbXU0gxp!qj?&wQoT@A)T6=BS2R3++CC1JItvq`(EP^Jh2))!EZ~ z9dKtD2x?bm&@5c|>HR-GzZtg~M_gkFAe2WU zz_VjtL}O=e17t+xLq)VNOpowj;H{9?U0*CTfB#m*C5pb#XzS618>V zj{gE1jnIwrApmhHC3)M5-|1{rUGR}F^DZ&uJlqh4u@Z7&UZet03+D?`T=UYbQDxll z{(cm%OPloKM)TDS^2`q~WZbrP;Ye)gf~j0%-!cz44XEKPeQdc=5NNa6;t?fRAam)U za_Dwv9Q@9jw^(n25uM3zwKyYO45LNL-c|=!h}Gh4f<8@z-)2{Q`YA&GjFBYqrCe~^#s0q#%bXR7(CryIt`vO z9h5Lcv{TG0gN zkx<_b4Mb{W1c0wpoEbF7I;?E!bYyLgGMiqsf3E68fbXlbLf7G1dhB-?>Jp_nXk&Rr z;)U4Ib*y>rKRDQ-Q&Pq#&cMc~=wT@@sqKvH1veu(kZkLmwaLe7dP4TIh|Y~C{?7oA z(RNSl=6T{*#JLHl1HXx$lLB6A(B|+*^NOvy>;tP_yX(>rdk{Kw_Mg{E;e{7x zO)E}ZLJD_fcs3461`HyCsChsUanHQ?sY(kdp_s0ccBOo}a8oV3=Wj3rBF4 zX>8D%Y~IwM80QquuyTB96v{7cPauaN*vISZV@X!>CiiI{TWT??1ypUf*agWT3L5@pKSbzU1qsK52wlBxV z?s_a1!Ij9QA}MA|G`lpJ?@T&v*LTk5!@FmK1C=Bn`kBdstW*rBvV@e(nozF;dy^du z2J(MlGMIV6ZV6@PpnFresQ)T0!D~xHllmHd9dCkq=Bvg$e#5qe z-62AKlm;aRyJzGUAl`L88R>_}XuLm5=|irv{`0GbDAO~UVi~P%1LifrA`4w=VE`gN zFbtROpVskg9P2>f7V2?zrkpcfx=Lfnc3s5EjK9vtI`q;Ear`{T2z-47!cPpfp1@S0 zAf?x{pLmlry|84m0xWgmVQ-0BC@}$2pmmFNzLeyPvNoz$-Ae-zU^ zve{_*!H`!LgA$UUk67R*_Pu+8X}V(lFnoJu^P$@mCJ12 z>&^W(u=mTKtGAbYM{^xb?U?u5PUL-?oGl#^KRvmr<;6_gE~Cf^)+Vex+D}Hqp;|m6Us@CIwLBso|aGZ8ZGy1~T=-a&DDhUc0m_!R1K|cZmD>O4VsLYQo+bMTU$=x%s10GU-vGC$Jw`^X; z6WA!V_3$FlureQ4GHXGu)3%HKDL_AZ?gZhfsIqNCs$nzk>_m9~^0r0GgmHkZ%A*4u zNKC*HH`09}bD{vXIi3$Tse4RVk2OnH5)Dbh#m5nPqcczf5rM3wEWkup>_6NWkXnr3 zlSJugqbqaY@LADy4GaZbErRN05g9Sb69$TNsI_{O<*4Y1QlvcDoy5-!Tm>^Pkqz5M z3nEcxIE#`!ZMY9pu23Rb6G&mtL!+uD3q09)_H@&0NoQP0ml{exq)*no8>BhhEcnztH_ReR58a^+w3vfq1%ah%pzcm`Y)BzcPy z67;ZtRd+OAk}ioLRBW_SnW!0(1mOsHjuHuc#bMk+)Y~juOhOha6F)w4{I-s zSU;yd_^W}>iUQ~ke@J$c&IobxK}-r`mLO9#yo{cv6T0z{;_Npsa#zYN7}k(mq@pwG zTc=q-^upya>SLx`7UjEGK-urP+zD<41WVPAkZqXGb6Kjdzjut2)fcB)H&q6K7jY|z zeT^E_{dq4!X8RvZAn`m&S>Jn_b4oIxuxd)*&{$UiOg*piA?AP-bW$x)XD{6FWtQp@ zpUOQF%Y|c-+CC8w(jzujW8#CuC*FJUKcZ!X7o2$f^!dviS#$c5gGhI$dL@;-AYAHs z@*C1fZbZ*ZBk2)7N6rNuJ9vU+Jx%`aZiy?8Xf4R$<0Y&gX*OtjQ4|N@xl%Yqk+i`s z`yT81y&fFnE(;6TOm{QMMnbqu%qwlB(T6ngzWfZMFCKt@VZH$!-5iMvzk%x)m&099 z&b)u@ywEd;E=SnD5Y__w=yqaDvpHWZH)Y7~DORDpd#8#`GJ-UofE0y$^m=fl2A%OI zGL6c#XF6dm-v&Iru@)jY9>d^YpLp8u`P}p<`&DwT*Ej2Ft>}4Wq)XO4{$frr&j6G~ zQqS0n(hm-h$*KJk?~aln@RXoOm{tPD%8g+ubW=nvT#oy`lz7jAKMM#bEctGg5*IoI z!I|NZTcr~zSxkPFq>>nLHG51!7-?R7`jvZ^$ZW^2AxGM zQW1DDZ=^iZ+b60^q20^H+eBKyK9qcOPAIm^EI=^It>kUmA76;ysId~Nwn{qiZ#RB5e9Q(fHrhDyRO=74zPno(PN4u+qHC>%8 zkhq>nN!d&^hCVwj|2FMNN@#$d=as7Zk>-+SFaHRlBn=j7P)Xkulctp0<0$&-j>gKy zdNQj!d6LD}JL+;rytM6tp^ex7brzv`fDu8Ee@kd6!(<4%?Neal6DS3{G3V{$#g(1* ziXT+FDuba;camp%*~RzyxeCZ^Aln4%Q+WT7&D3;cs9Gsu6E8??eI^7gFIk~Q9Bm); z(_7mrhoB*^Fn&cI=j6dDeCmYDWBIyTQjIK(H6}(pD~*}%Qg1y6c(aT8IwQ3N@Z&yk zE^ZZ&4-C3~cj)dClp$Z7_w1Q4eb8t`0-<^&v;oCv)b9@YF_3*}<}kh!_uSv?lsGNM zP0U#}N6{w))xh1d2g(yF?1}cmRTh3Z1ny1`!lEwK@|2jP8?Nms)6(PW3Rm>j>z!0IGqifGz3bBv8!RU&LCLGMvbt4# zgGp>A0`q`n^+$vh1WUwV8i-0|A>&isk5cX#UDVprR2T`om6YaS#}IPk?9^ zR?#*~Po?lQRrQk1O9Kz?3OGM-l+VbA&zchs&f}-$xB2*Y>xDr{CS4xkEDp;Zf8ib% z8odOcmOCPmo%Ll{;B+F&aA#kI;pWKvUs~@1Od#NP!Q4h%CVx4Jf~yt={CW67Z8v@=gUqNjajc9!$cK_V#TKH!koenZYtjJhypgG)Flu9dpImt zoaYx=B=ep1Y@5OI=k6>c2z&bg9+nLVE2d^QlNZF$h=(c`=k=1w-65lwN-NzecBgBQ zkY=!7NXEGMPvn{L0v`S5HODA(oedgue# zPL#h?Y9RI@b#|>kqda3E-c01kDq}8kFpDo1+XKgsWhFiLht~3vaAQ}V6BsBX$$m{D zM7HXO`jsClr~p+SoAM)Doct#G9%t{D?DlxT`E9XANjUZ*623!{{tX6dX=Ee&zRp98 zBI})%d~;=GAOjZBIxz>|uq3c9v)NVIqh6|%$ed9z9a4zh>`{YM_lOGF9(Dzzs#J-~GD;afZUhSI(LCU2YOGvr&~5Y+y$f{$^!R( zP@W-aS^UcD7NHCjYu~b?9dYe_d^n77lVH)6u*rq*=9O?!Prj(5?<23f+*#l8QKD~} zY0U9}w|L6~sIZ@3+qS?q40~T2R3w~ReHM?C>Y{;an<}|Qfcv)nDncW1A{}S96XA!K zOPKw?_5m%y-t-qDsM#mqBrUlRH+ctW%8Wq^km%C@s z3^fD4l6KTIJ_9JKeOEg^beLTZiX-U)#m8fiN8$pdzb(IB*gcY7@(OW@Mt3IHitqEh zUYAFQp`+Xf{}4zIM81O*W2eB@0Yk4nfj6&L;JF-)zC>XJ4BC^tsW@TBmto1heH7f- z;qJ=~olC!&yq-QNz22H6Mh=d#Z!^nSPP_F@e;+e2x|8;B+7a*n{9mF7gMaj^JM@MUY3DB?D{75&^S;iqXa{%7xir#UC-go55R+zX`Y$~o=@tK?EvYY= zCLbP^FSw3=$?AeQ+RL$dJ}$A$6SGNzMoF$f@Ji_9Y%yJN@EKdwVTw#k7UknOQwn$S zvT;k+j~y$HhYhM(4|h-83Dq(pTDy!^o2pB{BX$kYrS&N-qrT?-TbFsVU*n=*fRWN> zUI2C6=#ywMQ8**J_zt`Q^QM`*3p8>1mO-B;FJP)emLUBsj{T|FmN zUO=2)RuR4kAs$$KdJ{2gHBf}w)@NispFU8*mN97uF?q?Q%+F$=8jr__{-3q9 zTQ;RWyc<+0m&&7eCcp4m;50D44M}NM>8u2wH$C(#Hf#uWNM`xF&m83krMWITF!&aN zfNp6Z8oz>BHT50Q(sFOUb5nzbjk~a01$RS!w3ni;UO%swew*KL52#V#tDMwW4~H)2 z)ZxiJ9MHcD)zHA9oRn)XRcuF{;!F@+2}5{#m76!Y(;p z58~+qnnJb;Cb5|9t^EM?v&~q>obY8>N`1WI4gOig9(pu&{82bn$j@k(jf3^er0 zq{zs7HVvtAed$mPw~yL7*EA1m1(25fO~&AoyzxA%p@`=p!|)wh+zZWOLn1R349Rt` zIVO*I{Nmv_k-Qj^gmTC6FK_!vS##{2BS(K_{)GbL74(FWf!xzqZSy2rKXjpPr?CN} zVYw=c&BM zat0X>yXd^f=7!q5kk#O<=7xO!gz9mTV~^yf&bAZmm$6)B4-{jx>BY`@U+G}2&sDyi zXXmG41@&4|;6{h)iR^0zGl__k7X^L`mW;U!bA=MsP9xFbf4-BaUM3J0g{ImZBL4}p zg0<6le7^1fYFaIFw_U|B5yrjnA8#|`3=m}KCPb~|S2SH>9Tm z_67h0r2q+>4jhc$IzdtpO_29Q1MI5Aql#V5p{Q1Y`xlaS>6@tc)1uLVXE0kv!D1}i znJ-Kod1WRc%nrH9V$WlKXYg**wCM~F+)IU;!#!ui?g%-c9Bgt1(P!jeL!|v${9SJ% ziBEdw5|7Oyg7WX1S}8h@tqo46{Ge7w4RsvgqDraL%-y&fR*stHa)xKWQPP66;yY~} zLr!!Db~~@q=e&>wzjK6hph@&-y^`K*-gmQ~XzL{;R(u0Vv@UP(M<=%r2v?m^?R56DALa8*y9fU+b2XR(ov67 z_iLOEqLPIwxhsZ7e_L0J)}oljAJUdAYRMu#C9vr8(&&%X-js({v2csd0b|(E>U6ER z!a0_V+UHwP^94hT8Mf}oVQ-H7Z`_*hiWu0huEEf{FW6xbxYpKCD}rG>Ch+A&K(nM3 z^Ayqr$kyU=@g`oS)h@};BJcLTNdTOQ_&Baew~zRPuDpd%fSZKTjM z+*VgbsGwC0m$$3|H+ z-rw-0-{Nj=Ib!ymDrh6@(~RP-;ic4K6tiUl9+iY;cBQpy<~S5G9S8}7C%LJc`AiBE z&JG}X7YTXst0~1j{igyDvWNeqB0koj;bjf*B`V0+7{lnQ@q&Z$c2hFBsa5H-Di_C) z<3_n}t*MzQUL4m`rkDjXn($mmi2w7Ofb#)&D;OwM zykS4OGpe%YP!uavDn<4mm1OPgd z)Kp}BPeTatC2vf!*DetZ}SK?|T zP*zPvr4xNPahQ&`E0`P*Hw)CBc%#Nw(p~eM+Yu8uRampX;OPK0ziQvERN5lBlnH+) z6oj^sy)$5_q}n(_byFL%r2iQn$Uj_QlnA!G<{!&5?zfMaOU)@Qvm@c>Qfm(RryR-g zre}qjh^H%VwOs7jVH$fxkXgrF9rEk`Ryou>Jo5wBfIsWk5yP7CC-o6xKHS1Mka1y^ zBn8J8>XZ28__-Oj(N}%)19{QVQ9FTn?L-gZ-A|~`i@uOKs}HCb#Iy$Y!Q%{eJrO?z z-V@PHPty+`i%>HFiJM`WQL#xna@OHQ5h#5h>Iw9U{HxR4TSRq;RAnJk?)GCxyymXP z6$}L?;3B@)YEmJL^-?ZCzW{01*VQW$DS?>ml+ch^yd-U+@7Wt39F0U)b3Ql&5Q;ScyMGL*v%g0!&QA;xY9j2_NNp?s+CEhSp|WkE z>@IF?D|898F? zC78)SxSlqx+JYfebn^4A!( zeS(KNieyV!DTz2Ay{Gq4^$?u_YL@Og*q1A-o?JA~p zpg7s}qnJsfGqF#$zhl2#x07m?_3&&!FSLvjcGGoFfP-#Go;;pj_}&Ng0bJrPOb>e5 zJuG`Eh~%6pSYV7*B6Ry6Q%qPfJt9l@PK@s_n58NQVMW8CPsL^1vUY7f_q$#x@=XqlR}qI{z=A*Bo)%wQ*ZQF z!IA|I#s{BccBdzK*i3k_luGFeJyxABB!}@^DPg@2sb~WVdJ&m_T4(r@&Z&$|2Y*zMv; zwtAWy;!9gro+5}r@)fC=HkK%pAwr+wM{PclkR@*s2|I)t&S_IJ{q9l#r5oUvxTDgM zKG`=1oMDWIlE6cj_X31d@rq82 zx*WFAckKv^rZAB5zgpSFk0K8q8&RfGmr3>=GCHn}0~K)7`FIodnJo`?gwKVgBc7Cx zJ&S$pIZ-8zb3EgDLLbkV8^4qyyCfKx_Qc4)_f1cDvRE%&54tpcr|B&GxMSskGf--; zVM8vOm*f?9cf`v7ncRJ>ST@dAaqiB;=?D>t=!FMF`^FVvddCI6dLpLejf%^Z7=Gee zm?CHth3ZqBEcgcGTKw%)r`hFIB)lt5ojGB0qM=f+O%>75hQ02ZL>W;Sa?eByV#!d5 zg>N-NB)PrGV~`QxYQTH7DhHB{83_2NirJI8ntT`ekAEj_yM0?F)GHRe-b=J8gtFIU z^OvQBkn0^rUMh%scaLF*k9R(^UVU%m{U;|i6dGivt=w80#)SC#KRd}w_sBN5;HgsF zPRW6l2)j7Wz&WEk7W-euvt!hGi}Y|~3V(M7{$<K`YV`+379*7bN&Th+6?|Y_ zNK=E-H()4qX3`k!=uj9}uGOJD&mOb@R*AE2RA==6Q&Lw!q`M4hEP$gd?AXF*gpp`H zDXFkbJe#bXdSmTZK2ZCIjAs7MI0=3E<<_= zGn}xMx)kveI5@+4GDd7_L+4P%#EWjt-Idl#d;MlO)mTv@SxsKTxk9Z*Rem|S=)tz9 zISVva9Mu+o^#4|b;{0ypXV8-u_`=DsH5MIfs2JstiPTMwkGXz$R%-n)?j&>tu(rw& zbKLmLu}6to#-Mv!TLjO9#^PEYNLWDS1XLZxhsvu(ipJyF7mFj;9s4%2u$wqX^0oYX zp(*t?yTL||Z{>W)^qxher$}L<7#{k)xOKU_4095cBFl>&e=_B^B*oq?7xV5E91mJ{ z%P@#3K&pK4M{NN(Y(z6~VQhXuf;aY7v|)QGfLrzs%1O*|C79m=U^9UQYrrTCs8wEe zN9wjK3-ZXkteSPXYN*j{}+-%*P+8}q+yB&0lDx z)ezb0PuVR}S~Df;vLXYfR3d)>+vmOSr#CXz0VnL$G?J%=T})w${6~{7-?DU~{|iAd zoXH2X&w-)8G35$HkzYgb07a!jMR9=nRnl$_rj@Jifsr|HH?Nq(@88E91V`7rhtIAb z5z_aQPXS4kg7TmHtrv@CMp>TiH;XsriOdT+59|66b@C2gU;?9ImR5zwBm5f zm#1@v*G9vAe&zAZm^XsQ1kM>(-PSd{7+XlVmdT#?`A9D&3{{b{=hOhtRHr+lFLL~{ z@QsM7;c0TRVxXF|2FKrV5w!c2eFbSQ9K|n-n7>75!sgd$8_}=WVbZgk;wJX@fLItG zKler^wI(60%W~|*!>!jF)xI2xWC+=@vr~Lclo6Q@p4x_?Nz37GG=+GR-m5Qda`PO;=b3mY*%|+~ZB{F|9pp1rDL18<@`P zADC%tPF5AFk_1wi#{BuHQzO?VuCJQ|GB+_gsa{iQWjd;0zzQ;TX&-I!YK{_0KwthO zhZN_2g$b6i>}hGM1uB1{e4`lQpdi*8%%`4+OmBnrY(bx167WWX{Ko479njF?vCvu0T* zmtu24QG-C6+6SP1DLvnl_?mJZMoRH`il;sdzX~sG)i?8SYwqyE!}zVgiFTdfl4`5= zyT&x+tMPEOY@XC^oM01LL^X-GgBY9XvK% z&3i&2IJTqS2F7TH{~A&y3dD#GYrug6<>{$RR=4=wmZncIWfYB>r}aSlvX~~#P;z$v z`EVp^r`J5w)nZ19t}>PWnB5RtqDbMPo7d%qwjuJ@z>%D}S}79&dFVix(zna!VLhLp z(z>8WD~TJSQm5&4=1_T`aBRx#DZ+nwRX8yK$rKP_*5p2beND^<>@!FS_umNl09J|551e!0XVpzZ_$@67JwGtTZEL3yI%cg+izB zE}LSp(lAbgOy9Xdw40E@pM{mt9S-02S0}4M96my!EIwT5^CoaEp2#EGW z8&<%UbAe^fGuVy)F*tyL+d%9#B&`;s6;kotEjEfjZtvY%_oS60_3L{mX zPHGS@ta62=`z0_*xgW3hGwcHy+3(-wshLObE!yw|FO>t$c9asavm3n{J=fL3bdf`K z`k>W!XXuH9R~ENdW%A=q%OMtI=D&kb=l`Do{Raa0B~zKPY;7kk+v5O1Q|z~8rt!$C zFJRW0w8w3+ElP6N=j72;NIW)P9z6p@X4G_!*%Hr@#lX<}1!ij|+&7y}4~xTlMiU*RYY6ZQMwi055Nc5mikE&q17uPRE8SOY+Q6?d{J{e9V{p>Upd=N( z9pbH4$kp9H4|ul*;$$x)^b%BVZp-Y`Q`k|o5T+rRQ$wCA$Y^1fS1>dWBxx?m%!Jgs z6>CP~>yup;Pro2mB4F!9ggkPGZGNPCYi5hv`<5i&JIC^6sm5kvajAP@{E1w}D+K^2 zjv;XO^h*F`9VH+=ykvvSuUny3XEObQ(j;TxCNE|9Og?syI!%?&*oY)fHFHseeP}^P zVP?5z7Rn7(ZWRRhdr8uDedYO-J*^716v);ctNE7Zp=_;YZ0|}$5RzzBn5vVLjwpD@ z>*}}9rG2U=3Ksa=d~>fdTwMZ|?03<7o@kzW)g=VOLCq~}b0}PlK_jWWLQ?3$x@+N9 z-4vih?L-MS@`c#e)pq8*eD{qkk>5$~McUdS&KdL1a9fnBLGBGfKbGM@aRZzK;>jTrP{p^J9HEF? zy_?RhOO;94M{x`#N+)}LGS7ZBP+*1jJ;-OE4~($YMCvLhPZSW`_MA{E#_T0v>KD_9 z9uZ5k^)XblA$t4S$ddc-i@L~ZSqbBw4rkc43F=yfiX%buI*8%p7grIQIzVo@(^MoS zP2xJprPeAJGBQ9Tp=xpEJb5^5q7-~wE*Q_o4^4ZSOkpyvYe@gFpDPl**9xRLtRe)_ zAvlbkRXCh&-2PV1do&Yzt~3L%SK`~e@Bf*A0I_y3hKBqsi}FzRh<)Dt48v4De6pkO z&?&&bRE{q1L#FD@4rK&e=!5CkT;7j4DlP>9b4ra#eUeoj`=PGk=B3Gldlve~gA@!Z znkgC_Aift*4s4fTh&(E9%wsA>(O;#?{{RBryRcDw-rAU;R#R}`Ku_M7QJLU_l@m=4 z>_R801q;DT2)ukHxr07s7$&jH=@t>Z%*uWB4nEvm2U5B<&pCl7;|;f{^(&N~(1DSn;L$ zfy=W?V9>VZaL$8hQ=URW&17!w=)4E8GE?KY;8}j@TkGUvkhOGv& zeY+s?17zDD_p7S>0X(`bG*j_pr%l=1-Qjhi!5>LE)RIy4>TTI@D30yi;Vm`c7d>P`q2Q!GgQJ4;7Dv)O%?|Mtu#l#5565&@5&jX=lx;uBQSa>l z4oL@ya74qj@ArtTZ^}R0?%IAkyAZh;nBiIHeq2)!uK+)7Gv28>&|(_LGe&^*L=V`8 z%xPI<@7NzJ9-GPaZe#nE!V%|n@suDVsn_{KZ8VXJ+AIfxJ}vs73#5m?B@{maK0XFe z6(LUQ$;iR=?2L@M7n9972>=m8?&1weqwOlYJaYeZP*F_^MY|8dvKUAXt$qwid32#^ zxNl@P%Sfen^Mxw~p%}S4tVP@oM5oG>k&u0%f7IKB=PeR>;T?;+&L0Jd(2rqQ(Wo4^!a-|1B4*^3zHeui%C;^Lxc8K zNe*mk4Y(Y-9^+MJ0G1FAeT3Jh%QyGft#R+2(QmRu5E=b7anfCnA2E#da4E{*fEL$s zgP_;jZMlhQUkvYpS%iHwF!B|Roj-*e*7}d(Y_7L{7;T{>{>ZWhkwG|>?39LB;syU* zp{cQkWa`=V2z|h)Mf8<bX<%*CKPw*qjsL>@rjw{2~=|r`P$|2%V75% zCBuynVGq998UMp$-je8Y20bFXQ^XZ)N8~hp@T`jhA)~kZD&z9E;rE-a9%vptO_02a zdI7lViCI*UI`n7X?l!H1&ZNf(pOsw`z^{tLEfPJvMQs1gT$A)*R3jC)4{iBaf-R%! zgy!de{M^}Kp^gqoEWHWDN__RE6aAw+th0r&{BX|`_i4o}6z8elx!;{Y+!bzzjj-3i z{THj_)j;-@(AXa0W9W7{!3DJKxmXZLfre~~-^heoGGjZHPNB*K*Zvz3;y94AcV-AR zI!PCg_GUkM#t4Ozw+=eyD({-Y>&%pc@>Js$J|0vx5RL|zTsi7t`puJs42yCRSgKk( zH>!GaE7=*dQbmpcq{T0|dHFq&b=Nj4neW_|OwU@&2y9r6`PnXWj*K*9sIfNd0-*|X`ik-!0V`e#%OHS_JgUqfy!FXLOS{!vb$prm_%A>J0L%dL Ar2qf` literal 0 HcmV?d00001 diff --git a/apps/marketing/public/blog/docs.webp b/apps/marketing/public/blog/docs.webp new file mode 100644 index 0000000000000000000000000000000000000000..466b560b27fadbe4d349ab2b6d09fb778056723a GIT binary patch literal 135304 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 literal 0 HcmV?d00001 From 8afe6699785b51f8abb5fa937418430b79a6df75 Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Fri, 8 Mar 2024 16:26:47 +0530 Subject: [PATCH 02/56] feat: improve lint staged performance --- lint-staged.config.cjs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lint-staged.config.cjs b/lint-staged.config.cjs index d7e42680e..0fff01832 100644 --- a/lint-staged.config.cjs +++ b/lint-staged.config.cjs @@ -1,7 +1,15 @@ +const path = require('path'); + +const buildEslintCommand = (filenames) => + `eslint --fix ${filenames.map((f) => path.relative(process.cwd(), f)).join(' ')} `; + +const buildPrettierCommand = (filenames) => + `prettier --write ${filenames.map((f) => path.relative(process.cwd(), f)).join(' ')} `; + /** @type {import('lint-staged').Config} */ module.exports = { - '**/*.{ts,tsx,cts,mts}': (files) => files.map((file) => `eslint --fix ${file}`), - '**/*.{js,jsx,cjs,mjs}': (files) => files.map((file) => `prettier --write ${file}`), - '**/*.{yml,mdx}': (files) => files.map((file) => `prettier --write ${file}`), + '**/*.{ts,tsx,cts,mts}': [buildEslintCommand], + '**/*.{js,jsx,cjs,mjs}': [buildPrettierCommand], + '**/*.{yml,mdx}': [buildPrettierCommand], '**/*/package.json': 'npm run precommit', }; From c463d5a0ed82bc82317e10bc7baa5b2e73f79d63 Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Fri, 8 Mar 2024 16:47:38 +0530 Subject: [PATCH 03/56] fix: add double quote --- lint-staged.config.cjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lint-staged.config.cjs b/lint-staged.config.cjs index 0fff01832..a23c3fd78 100644 --- a/lint-staged.config.cjs +++ b/lint-staged.config.cjs @@ -1,10 +1,10 @@ const path = require('path'); const buildEslintCommand = (filenames) => - `eslint --fix ${filenames.map((f) => path.relative(process.cwd(), f)).join(' ')} `; + `eslint --fix ${filenames.map((f) => `"${path.relative(process.cwd(), f)}"`).join(' ')}`; const buildPrettierCommand = (filenames) => - `prettier --write ${filenames.map((f) => path.relative(process.cwd(), f)).join(' ')} `; + `prettier --write ${filenames.map((f) => `"${path.relative(process.cwd(), f)}"`).join(' ')}`; /** @type {import('lint-staged').Config} */ module.exports = { From 9b5346efef1f7cc631f57502a065d3d3951a368d Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Fri, 8 Mar 2024 14:54:18 +0000 Subject: [PATCH 04/56] chore: add test for multiple recipient --- .../e2e/pr-718-add-stepper-component.spec.ts | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts index 6e03979c0..e482c4172 100644 --- a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts +++ b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts @@ -73,3 +73,98 @@ test(`[PR-718]: should be able to create a document`, async ({ page }) => { // Assert document was created await expect(page.getByRole('link', { name: documentTitle })).toBeVisible(); }); + +test('should be able to create a document with multiple recipients', async ({ page }) => { + await page.goto('/signin'); + + const documentTitle = `example-${Date.now()}.pdf`; + + // Sign in + await page.getByLabel('Email').fill(TEST_USER.email); + await page.getByLabel('Password', { exact: true }).fill(TEST_USER.password); + await page.getByRole('button', { name: 'Sign In' }).click(); + + // Upload document + const [fileChooser] = await Promise.all([ + page.waitForEvent('filechooser'), + page.locator('input[type=file]').evaluate((e) => { + if (e instanceof HTMLInputElement) { + e.click(); + } + }), + ]); + + await fileChooser.setFiles(path.join(__dirname, '../../../assets/example.pdf')); + + // Wait to be redirected to the edit page + await page.waitForURL(/\/documents\/\d+/); + + // Set title + await expect(page.getByRole('heading', { name: 'Add Title' })).toBeVisible(); + + await page.getByLabel('Title').fill(documentTitle); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add signers + await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible(); + + await page.getByLabel('Email*').fill('user1@example.com'); + await page.getByLabel('Name').fill('User 1'); + + await page.getByRole('button', { name: 'Add Signer' }).click(); + + await page.getByLabel('Email*').nth(1).fill('user2@example.com'); + await page.getByLabel('Name').nth(1).fill('User 2'); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add fields + await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible(); + + await page.getByRole('button', { name: 'User 1 Signature' }).click(); + await page.locator('canvas').click({ + position: { + x: 100, + y: 100, + }, + }); + + await page.getByRole('button', { name: 'Email Email' }).click(); + await page.locator('canvas').click({ + position: { + x: 100, + y: 200, + }, + }); + + await page.getByText('User 1 (user1@example.com)').click(); + await page.getByText('User 2 (user2@example.com)').click(); + + await page.getByRole('button', { name: 'User 2 Signature' }).click(); + await page.locator('canvas').click({ + position: { + x: 500, + y: 100, + }, + }); + + await page.getByRole('button', { name: 'Email Email' }).click(); + await page.locator('canvas').click({ + position: { + x: 500, + y: 200, + }, + }); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add subject and send + await expect(page.getByRole('heading', { name: 'Add Subject' })).toBeVisible(); + await page.getByRole('button', { name: 'Send' }).click(); + + await page.waitForURL('/documents'); + + // Assert document was created + await expect(page.getByRole('link', { name: documentTitle })).toBeVisible(); +}); From d462ca0b462c6317c3eba0e19d7a96ec3ea0752f Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Sat, 9 Mar 2024 00:16:16 +0530 Subject: [PATCH 05/56] feat: remove prettier plugin --- packages/eslint-config/index.cjs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/eslint-config/index.cjs b/packages/eslint-config/index.cjs index 57cecf40d..bc20fcbdc 100644 --- a/packages/eslint-config/index.cjs +++ b/packages/eslint-config/index.cjs @@ -4,29 +4,20 @@ module.exports = { 'turbo', 'eslint:recommended', 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', 'plugin:package-json/recommended', ], - plugins: ['prettier', 'package-json', 'unused-imports'], + plugins: ['package-json', 'unused-imports'], env: { + es2022: true, node: true, browser: true, - es6: true, }, parser: '@typescript-eslint/parser', - parserOptions: { - tsconfigRootDir: __dirname, - project: ['../../apps/*/tsconfig.json', '../../packages/*/tsconfig.json'], - ecmaVersion: 2022, - ecmaFeatures: { - jsx: true, - }, - sourceType: 'module', - }, + parserOptions: { project: true }, rules: { '@next/next/no-html-link-for-pages': 'off', From 7631c6e90ee3b4ea7b4cc8d1cc585f6ea98480b2 Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Sat, 9 Mar 2024 00:17:04 +0530 Subject: [PATCH 06/56] feat: add prettier to lint --- lint-staged.config.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lint-staged.config.cjs b/lint-staged.config.cjs index a23c3fd78..9f10dcc76 100644 --- a/lint-staged.config.cjs +++ b/lint-staged.config.cjs @@ -8,7 +8,7 @@ const buildPrettierCommand = (filenames) => /** @type {import('lint-staged').Config} */ module.exports = { - '**/*.{ts,tsx,cts,mts}': [buildEslintCommand], + '**/*.{ts,tsx,cts,mts}': [buildEslintCommand, buildPrettierCommand], '**/*.{js,jsx,cjs,mjs}': [buildPrettierCommand], '**/*.{yml,mdx}': [buildPrettierCommand], '**/*/package.json': 'npm run precommit', From 19714fb807a2a1496e26ca82f4c3c3c2cfad5d36 Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Sat, 9 Mar 2024 00:29:42 +0530 Subject: [PATCH 07/56] feat: update packages --- package-lock.json | 1571 ++++++++++++++++++++------- packages/eslint-config/package.json | 18 +- 2 files changed, 1202 insertions(+), 387 deletions(-) diff --git a/package-lock.json b/package-lock.json index 72d06b98a..aa4c258f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3110,14 +3110,6 @@ "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.3.tgz", "integrity": "sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA==" }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.19.tgz", - "integrity": "sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==", - "dependencies": { - "glob": "7.1.7" - } - }, "node_modules/@next/swc-darwin-arm64": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz", @@ -7496,187 +7488,6 @@ "@types/node": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", - "dependencies": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", - "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -7954,6 +7765,24 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz", + "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -8006,10 +7835,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "node_modules/array.prototype.tosorted": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10247,6 +10088,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", @@ -10723,35 +10583,11 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-config-next": { - "version": "13.4.19", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.4.19.tgz", - "integrity": "sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==", - "dependencies": { - "@next/eslint-plugin-next": "13.4.19", - "@rushstack/eslint-patch": "^1.1.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.31.7", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/eslint-config-prettier": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -10759,17 +10595,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-config-turbo": { - "version": "1.10.16", - "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.16.tgz", - "integrity": "sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==", - "dependencies": { - "eslint-plugin-turbo": "1.10.16" - }, - "peerDependencies": { - "eslint": ">6.6.0" - } - }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -10922,55 +10747,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", @@ -10982,80 +10758,6 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-turbo": { - "version": "1.10.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.16.tgz", - "integrity": "sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==", - "dependencies": { - "dotenv": "16.0.3" - }, - "peerDependencies": { - "eslint": ">6.6.0" - } - }, - "node_modules/eslint-plugin-turbo/node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/eslint-plugin-unused-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", - "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0", - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, "node_modules/eslint-rule-composer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", @@ -11342,11 +11044,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" - }, "node_modules/fast-equals": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", @@ -11884,15 +11581,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16362,6 +16063,14 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -16575,17 +16284,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/prettier-plugin-sql": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/prettier-plugin-sql/-/prettier-plugin-sql-0.14.0.tgz", @@ -21588,19 +21286,690 @@ "version": "0.0.0", "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "6.8.0", - "@typescript-eslint/parser": "6.8.0", - "eslint": "^8.40.0", - "eslint-config-next": "13.4.19", - "eslint-config-prettier": "^8.8.0", - "eslint-config-turbo": "^1.9.3", - "eslint-plugin-package-json": "^0.2.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-unused-imports": "^3.0.0", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "eslint": "^8.57.0", + "eslint-config-next": "^14.1.3", + "eslint-config-turbo": "^1.12.5", + "eslint-plugin-package-json": "^0.10.4", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-unused-imports": "^3.1.0", "typescript": "5.2.2" } }, + "packages/eslint-config/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/eslint-config/node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/eslint-config/node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "packages/eslint-config/node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "packages/eslint-config/node_modules/@next/eslint-plugin-next": { + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.3.tgz", + "integrity": "sha512-VCnZI2cy77Yaj3L7Uhs3+44ikMM1VD/fBMwvTBb3hIaTIuqa+DmG4dhUDq+MASu3yx97KhgsVJbsas0XuiKyww==", + "dependencies": { + "glob": "10.3.10" + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", + "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/type-utils": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", + "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/scope-manager": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", + "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", + "dependencies": { + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/type-utils": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", + "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.1.1", + "@typescript-eslint/utils": "7.1.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/types": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", + "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", + "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", + "dependencies": { + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/visitor-keys": "7.1.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/utils": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", + "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.1.1", + "@typescript-eslint/types": "7.1.1", + "@typescript-eslint/typescript-estree": "7.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "packages/eslint-config/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", + "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", + "dependencies": { + "@typescript-eslint/types": "7.1.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/eslint-config/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "packages/eslint-config/node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "packages/eslint-config/node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "packages/eslint-config/node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "packages/eslint-config/node_modules/es-abstract": { + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/eslint-config/node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/eslint-config/node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/eslint-config/node_modules/eslint-config-next": { + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.3.tgz", + "integrity": "sha512-sUCpWlGuHpEhI0pIT0UtdSLJk5Z8E2DYinPTwsBiWaSYQomchdl0i60pjynY48+oXvtyWMQ7oE+G3m49yrfacg==", + "dependencies": { + "@next/eslint-plugin-next": "14.1.3", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/eslint-config/node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/eslint-config/node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "packages/eslint-config/node_modules/eslint-config-next/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/eslint-config/node_modules/eslint-config-turbo": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.12.5.tgz", + "integrity": "sha512-wXytbX+vTzQ6rwgM6sIr447tjYJBlRj5V/eBFNGNXw5Xs1R715ppPYhbmxaFbkrWNQSGJsWRrYGAlyq0sT/OsQ==", + "dependencies": { + "eslint-plugin-turbo": "1.12.5" + }, + "peerDependencies": { + "eslint": ">6.6.0" + } + }, "packages/eslint-config/node_modules/eslint-plugin-package-json": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-package-json/-/eslint-plugin-package-json-0.2.0.tgz", @@ -21618,6 +21987,436 @@ "eslint": ">=4.7.0" } }, + "packages/eslint-config/node_modules/eslint-plugin-react": { + "version": "7.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz", + "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "packages/eslint-config/node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/eslint-config/node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/eslint-config/node_modules/eslint-plugin-turbo": { + "version": "1.12.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.12.5.tgz", + "integrity": "sha512-cXy7mCzAdngBTJIWH4DASXHy0vQpujWDBqRTu0YYqCN/QEGsi3HWM+STZEbPYELdjtm5EsN2HshOSSqWnjdRHg==", + "dependencies": { + "dotenv": "16.0.3" + }, + "peerDependencies": { + "eslint": ">6.6.0" + } + }, + "packages/eslint-config/node_modules/eslint-plugin-unused-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.1.0.tgz", + "integrity": "sha512-9l1YFCzXKkw1qtAru1RWUtG2EVDZY0a0eChKXcL+EZ5jitG7qxdctu4RnvhOJHv4xfmUf7h+JJPINlVpGhZMrw==", + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "6 - 7", + "eslint": "8" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "packages/eslint-config/node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/eslint-config/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "packages/eslint-config/node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/eslint-config/node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/eslint-config/node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/eslint-config/node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "packages/eslint-config/node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/eslint-config/node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "packages/eslint-config/node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/eslint-config/node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "packages/eslint-config/node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -21630,6 +22429,24 @@ "node": ">=14.17" } }, + "packages/eslint-config/node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "packages/lib": { "name": "@documenso/lib", "version": "1.0.0", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index d519a3362..4d25e1bd8 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -7,16 +7,14 @@ "clean": "rimraf node_modules" }, "dependencies": { - "@typescript-eslint/eslint-plugin": "6.8.0", - "@typescript-eslint/parser": "6.8.0", - "eslint": "^8.40.0", - "eslint-config-next": "13.4.19", - "eslint-config-prettier": "^8.8.0", - "eslint-config-turbo": "^1.9.3", - "eslint-plugin-package-json": "^0.2.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-unused-imports": "^3.0.0", + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "eslint": "^8.57.0", + "eslint-config-next": "^14.1.3", + "eslint-config-turbo": "^1.12.5", + "eslint-plugin-package-json": "^0.10.4", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-unused-imports": "^3.1.0", "typescript": "5.2.2" } } From 62b4a13d4d908e97438496c7a50edd9fa4eb3c49 Mon Sep 17 00:00:00 2001 From: nafees nazik Date: Sat, 9 Mar 2024 00:32:08 +0530 Subject: [PATCH 08/56] feat: upgrade packages --- package-lock.json | 400 ++++++++++++++++++++++++++++++++++++---------- package.json | 4 +- 2 files changed, 316 insertions(+), 88 deletions(-) diff --git a/package-lock.json b/package-lock.json index aa4c258f4..b1124e033 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,8 +19,8 @@ "dotenv-cli": "^7.3.0", "eslint": "^8.40.0", "eslint-config-custom": "*", - "husky": "^8.0.0", - "lint-staged": "^14.0.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", "prettier": "^2.5.1", "rimraf": "^5.0.1", "turbo": "^1.9.3" @@ -7603,27 +7603,15 @@ } }, "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "dependencies": { - "type-fest": "^1.0.2" + "type-fest": "^3.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8547,21 +8535,71 @@ } }, "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, "dependencies": { "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "string-width": "^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -8973,9 +9011,9 @@ "integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==" }, "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "engines": { "node": ">=16" @@ -11580,6 +11618,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -12242,15 +12292,15 @@ } }, "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", "dev": true, "bin": { - "husky": "lib/bin.js" + "husky": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" @@ -13355,27 +13405,27 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-14.0.1.tgz", - "integrity": "sha512-Mw0cL6HXnHN1ag0mN/Dg4g6sr8uf8sn98w2Oc1ECtFto9tvRF7nkXGJRbx8gPlHyoR0pLyBr2lQHbWwmUHe1Sw==", + "version": "15.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", + "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", "dev": true, "dependencies": { "chalk": "5.3.0", - "commander": "11.0.0", + "commander": "11.1.0", "debug": "4.3.4", - "execa": "7.2.0", - "lilconfig": "2.1.0", - "listr2": "6.6.1", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.1", "micromatch": "4.0.5", "pidtree": "0.6.0", "string-argv": "0.3.2", - "yaml": "2.3.1" + "yaml": "2.3.4" }, "bin": { "lint-staged": "bin/lint-staged.js" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=18.12.0" }, "funding": { "url": "https://opencollective.com/lint-staged" @@ -13394,35 +13444,47 @@ } }, "node_modules/lint-staged/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", - "signal-exit": "^3.0.7", + "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">=16.17" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" } }, "node_modules/lint-staged/node_modules/is-stream": { @@ -13437,6 +13499,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/lint-staged/node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -13450,9 +13521,9 @@ } }, "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -13491,6 +13562,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", @@ -13503,43 +13586,105 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" }, "node_modules/listr2": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", - "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", + "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", "dev": true, "dependencies": { - "cli-truncate": "^3.1.0", + "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", - "log-update": "^5.0.1", + "log-update": "^6.0.0", "rfdc": "^1.3.0", - "wrap-ansi": "^8.1.0" + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/load-tsconfig": { @@ -13661,19 +13806,19 @@ } }, "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "ansi-escapes": "^5.0.0", + "ansi-escapes": "^6.2.0", "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13691,6 +13836,72 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", + "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -13706,6 +13917,23 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", diff --git a/package.json b/package.json index cbaa2a1eb..9e1797cb8 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,8 @@ "dotenv-cli": "^7.3.0", "eslint": "^8.40.0", "eslint-config-custom": "*", - "husky": "^8.0.0", - "lint-staged": "^14.0.0", + "husky": "^9.0.11", + "lint-staged": "^15.2.2", "prettier": "^2.5.1", "rimraf": "^5.0.1", "turbo": "^1.9.3" From 27a69819f9b925119cac61518a0c5bb761593512 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 09:49:31 +0530 Subject: [PATCH 09/56] feat: added custom styling for swagger ui Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 101 ++++++++++++++++++++++++++ packages/api/v1/api-documentation.tsx | 4 + 2 files changed, 105 insertions(+) create mode 100644 packages/api/v1/api-documentation.css diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css new file mode 100644 index 000000000..6e2884cbb --- /dev/null +++ b/packages/api/v1/api-documentation.css @@ -0,0 +1,101 @@ +#swagger-ui.api-platform .wrapper { + padding: 0 60px; +} + +#swagger-ui.api-platform .information-container.wrapper { + margin: 0 0 30px; + padding: 10px 0 0; + width: 100%; + max-width: 100%; + background-color: white; + border-bottom: 1px solid #ccc; +} + +#swagger-ui.api-platform .info, #formats { + width: 100%; + max-width: 1460px; + padding: 0 50px; + margin: 0 auto; +} + +#swagger-ui.api-platform .opblock .opblock-summary-method, +#swagger-ui.api-platform .btn.execute { + transition: all ease 0.3s; + background-color: #3CAAB5; + border-color: #3CAAB5; +} + +#swagger-ui.api-platform .opblock .opblock-summary-method:hover, +#swagger-ui.api-platform .btn.execute:hover { + background-color: #288690; + border-color: #288690; +} + +#swagger-ui.api-platform .opblock-summary { + padding: 0; +} + +#swagger-ui.api-platform .opblock-tag:hover { + background-color: rgba(0, 0, 0, .1); + transform: scale(1.01); +} + +#swagger-ui.api-platform .opblock.opblock-get, +#swagger-ui.api-platform .opblock-section-header, +#swagger-ui.api-platform .opblock-summary { + background-color: rgba(60, 170, 181, 0.1); + border-color: #3CAAB5; +} + +#swagger-ui.api-platform .opblock-summary-method { + border-radius: 0; + padding: 10px; +} + +#swagger-ui.api-platform .opblock-tag, .swagger-ui .table-container tr th, +.swagger-ui .table-container tr td { + padding: 5px 0; + margin: 0 0 10px; +} + +#swagger-ui.api-platform .btn-group .btn, #swagger-ui.api-platform .execute-wrapper .btn { + padding: 10px 40px; +} + +#swagger-ui.api-platform .btn { + transition: all ease 0.2s; + box-shadow: none; + background-color: #f7f7f7; +} + +#swagger-ui.api-platform .btn:hover, #swagger-ui.api-platform .btn.cancel:hover, +#swagger-ui.api-platform .btn.authorize:hover { + background-color: rgba(65, 68, 78, 0.1); + border-color: transparent; +} + +#swagger-ui.api-platform select, #swagger-ui.api-platform input:focus, +#swagger-ui.api-platform select:focus, #swagger-ui.api-platform textarea:focus, +#swagger-ui.api-platform button:focus { + box-shadow: none; + cursor: pointer; + outline: none; +} + +.swagger-ui .markdown p, .swagger-ui .markdown pre, +.swagger-ui .renderedMarkdown p, .swagger-ui .renderedMarkdown pre { + margin: 0; +} + +::placeholder, :-moz-placeholder, ::-moz-placeholder, :-ms-input-placeholder { + color: #fff; +} + +:disabled::placeholder, :disabled:-moz-placeholder, +:disabled::-moz-placeholder, :disabled:-ms-input-placeholder { + color: #fafafa; +} + +#swagger-ui .topbar { + display: none; +} diff --git a/packages/api/v1/api-documentation.tsx b/packages/api/v1/api-documentation.tsx index fe394e603..0ecdc4b39 100644 --- a/packages/api/v1/api-documentation.tsx +++ b/packages/api/v1/api-documentation.tsx @@ -5,6 +5,10 @@ import 'swagger-ui-react/swagger-ui.css'; import { OpenAPIV1 } from '@documenso/api/v1/openapi'; +// Custom CSS for the Swagger UI +// eslint-disable-next-line prettier/prettier +import './api-documentation.css'; + export const OpenApiDocsPage = () => { return ; }; From 52afae331e6dfaf907894aff446d8f732bb04a2c Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 09:50:37 +0530 Subject: [PATCH 10/56] chore: updated to send email to doc owners Signed-off-by: Adithya Krishna --- .../server-only/document/send-completed-email.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/lib/server-only/document/send-completed-email.ts b/packages/lib/server-only/document/send-completed-email.ts index 812e54ba3..2ef1da851 100644 --- a/packages/lib/server-only/document/send-completed-email.ts +++ b/packages/lib/server-only/document/send-completed-email.ts @@ -10,6 +10,7 @@ import { DOCUMENT_AUDIT_LOG_TYPE } from '../../types/document-audit-logs'; import type { RequestMetadata } from '../../universal/extract-request-metadata'; import { getFile } from '../../universal/upload/get-file'; import { createDocumentAuditLogData } from '../../utils/document-audit-logs'; +import { getUserById } from '../user/get-user-by-id'; export interface SendDocumentOptions { documentId: number; @@ -40,6 +41,7 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo await Promise.all( document.Recipient.map(async (recipient) => { const { email, name, token } = recipient; + const user = await getUserById({ id: document.userId }); const assetBaseUrl = NEXT_PUBLIC_WEBAPP_URL() || 'http://localhost:3000'; @@ -52,10 +54,16 @@ export const sendCompletedEmail = async ({ documentId, requestMetadata }: SendDo await prisma.$transaction( async (tx) => { await mailer.sendMail({ - to: { - address: email, - name, - }, + to: [ + { + address: email, + name, + }, + { + address: user.email, + name: user.name!, + }, + ], from: { name: process.env.NEXT_PRIVATE_SMTP_FROM_NAME || 'Documenso', address: process.env.NEXT_PRIVATE_SMTP_FROM_ADDRESS || 'noreply@documenso.com', From e5497efe7c9f74f93e10557fda22aa3cd67c611f Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 12:38:56 +0530 Subject: [PATCH 11/56] chore: updated dark mode styling Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 110 +++----------------------- packages/api/v1/api-documentation.tsx | 2 +- 2 files changed, 10 insertions(+), 102 deletions(-) diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css index 6e2884cbb..9edb85748 100644 --- a/packages/api/v1/api-documentation.css +++ b/packages/api/v1/api-documentation.css @@ -1,101 +1,9 @@ -#swagger-ui.api-platform .wrapper { - padding: 0 60px; -} - -#swagger-ui.api-platform .information-container.wrapper { - margin: 0 0 30px; - padding: 10px 0 0; - width: 100%; - max-width: 100%; - background-color: white; - border-bottom: 1px solid #ccc; -} - -#swagger-ui.api-platform .info, #formats { - width: 100%; - max-width: 1460px; - padding: 0 50px; - margin: 0 auto; -} - -#swagger-ui.api-platform .opblock .opblock-summary-method, -#swagger-ui.api-platform .btn.execute { - transition: all ease 0.3s; - background-color: #3CAAB5; - border-color: #3CAAB5; -} - -#swagger-ui.api-platform .opblock .opblock-summary-method:hover, -#swagger-ui.api-platform .btn.execute:hover { - background-color: #288690; - border-color: #288690; -} - -#swagger-ui.api-platform .opblock-summary { - padding: 0; -} - -#swagger-ui.api-platform .opblock-tag:hover { - background-color: rgba(0, 0, 0, .1); - transform: scale(1.01); -} - -#swagger-ui.api-platform .opblock.opblock-get, -#swagger-ui.api-platform .opblock-section-header, -#swagger-ui.api-platform .opblock-summary { - background-color: rgba(60, 170, 181, 0.1); - border-color: #3CAAB5; -} - -#swagger-ui.api-platform .opblock-summary-method { - border-radius: 0; - padding: 10px; -} - -#swagger-ui.api-platform .opblock-tag, .swagger-ui .table-container tr th, -.swagger-ui .table-container tr td { - padding: 5px 0; - margin: 0 0 10px; -} - -#swagger-ui.api-platform .btn-group .btn, #swagger-ui.api-platform .execute-wrapper .btn { - padding: 10px 40px; -} - -#swagger-ui.api-platform .btn { - transition: all ease 0.2s; - box-shadow: none; - background-color: #f7f7f7; -} - -#swagger-ui.api-platform .btn:hover, #swagger-ui.api-platform .btn.cancel:hover, -#swagger-ui.api-platform .btn.authorize:hover { - background-color: rgba(65, 68, 78, 0.1); - border-color: transparent; -} - -#swagger-ui.api-platform select, #swagger-ui.api-platform input:focus, -#swagger-ui.api-platform select:focus, #swagger-ui.api-platform textarea:focus, -#swagger-ui.api-platform button:focus { - box-shadow: none; - cursor: pointer; - outline: none; -} - -.swagger-ui .markdown p, .swagger-ui .markdown pre, -.swagger-ui .renderedMarkdown p, .swagger-ui .renderedMarkdown pre { - margin: 0; -} - -::placeholder, :-moz-placeholder, ::-moz-placeholder, :-ms-input-placeholder { - color: #fff; -} - -:disabled::placeholder, :disabled:-moz-placeholder, -:disabled::-moz-placeholder, :disabled:-ms-input-placeholder { - color: #fafafa; -} - -#swagger-ui .topbar { - display: none; -} +/* Custom CSS for dark mode */ +@media (prefers-color-scheme: dark) { + .swagger-ui { + filter: invert(85%) hue-rotate(180deg); + } + .swagger-ui .microlight { + filter: invert(100%) hue-rotate(180deg); + } +} \ No newline at end of file diff --git a/packages/api/v1/api-documentation.tsx b/packages/api/v1/api-documentation.tsx index 0ecdc4b39..b7c36fa8b 100644 --- a/packages/api/v1/api-documentation.tsx +++ b/packages/api/v1/api-documentation.tsx @@ -5,7 +5,7 @@ import 'swagger-ui-react/swagger-ui.css'; import { OpenAPIV1 } from '@documenso/api/v1/openapi'; -// Custom CSS for the Swagger UI +// Custom Dark Mode CSS for the Swagger UI // eslint-disable-next-line prettier/prettier import './api-documentation.css'; From 025af6e9f46f5e1683f607928fa73c341b68ba43 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 12:41:08 +0530 Subject: [PATCH 12/56] chore: added eol Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css index 9edb85748..9deba27ea 100644 --- a/packages/api/v1/api-documentation.css +++ b/packages/api/v1/api-documentation.css @@ -6,4 +6,4 @@ .swagger-ui .microlight { filter: invert(100%) hue-rotate(180deg); } -} \ No newline at end of file +} From cc483016d8d6732b8a47365181dc31cee4323888 Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Wed, 13 Mar 2024 13:24:09 +0530 Subject: [PATCH 13/56] chore: updated styling Signed-off-by: Adithya Krishna --- packages/api/v1/api-documentation.css | 9 --------- packages/api/v1/api-documentation.tsx | 23 +++++++++++++++++++---- packages/ui/styles/theme.css | 9 +++++++++ 3 files changed, 28 insertions(+), 13 deletions(-) delete mode 100644 packages/api/v1/api-documentation.css diff --git a/packages/api/v1/api-documentation.css b/packages/api/v1/api-documentation.css deleted file mode 100644 index 9deba27ea..000000000 --- a/packages/api/v1/api-documentation.css +++ /dev/null @@ -1,9 +0,0 @@ -/* Custom CSS for dark mode */ -@media (prefers-color-scheme: dark) { - .swagger-ui { - filter: invert(85%) hue-rotate(180deg); - } - .swagger-ui .microlight { - filter: invert(100%) hue-rotate(180deg); - } -} diff --git a/packages/api/v1/api-documentation.tsx b/packages/api/v1/api-documentation.tsx index b7c36fa8b..98bdd7095 100644 --- a/packages/api/v1/api-documentation.tsx +++ b/packages/api/v1/api-documentation.tsx @@ -1,15 +1,30 @@ 'use client'; +import { useEffect } from 'react'; + +import { useTheme } from 'next-themes'; import SwaggerUI from 'swagger-ui-react'; import 'swagger-ui-react/swagger-ui.css'; import { OpenAPIV1 } from '@documenso/api/v1/openapi'; -// Custom Dark Mode CSS for the Swagger UI -// eslint-disable-next-line prettier/prettier -import './api-documentation.css'; - export const OpenApiDocsPage = () => { + const { theme } = useTheme(); + + useEffect(() => { + const body = document.body; + + if (theme === 'dark') { + body.classList.add('swagger-dark-theme'); + } else { + body.classList.remove('swagger-dark-theme'); + } + + return () => { + body.classList.remove('swagger-dark-theme'); + }; + }, [theme]); + return ; }; diff --git a/packages/ui/styles/theme.css b/packages/ui/styles/theme.css index 70a06ad15..de1927f73 100644 --- a/packages/ui/styles/theme.css +++ b/packages/ui/styles/theme.css @@ -129,3 +129,12 @@ .custom-scrollbar::-webkit-scrollbar-thumb:hover { background: rgb(100 116 139 / 0.5); } + + /* Custom Swagger Dark Theme */ +.swagger-dark-theme .swagger-ui { + filter: invert(88%) hue-rotate(180deg); +} + +.swagger-dark-theme .swagger-ui .microlight { + filter: invert(100%) hue-rotate(180deg); +} \ No newline at end of file From 0488442652fdac10f68587f36fd9244351501226 Mon Sep 17 00:00:00 2001 From: Gautam-Hegde Date: Wed, 13 Mar 2024 13:45:10 +0530 Subject: [PATCH 14/56] fix: pagination discrepancy --- packages/ui/primitives/data-table-pagination.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ui/primitives/data-table-pagination.tsx b/packages/ui/primitives/data-table-pagination.tsx index feebf6c54..a143960b4 100644 --- a/packages/ui/primitives/data-table-pagination.tsx +++ b/packages/ui/primitives/data-table-pagination.tsx @@ -20,6 +20,9 @@ export function DataTablePagination({ table, additionalInformation = 'VisibleCount', }: DataTablePaginationProps) { + const pageCount = table.getPageCount(); + const isEmptyTable = pageCount === 0; + return (

@@ -65,7 +68,9 @@ export function DataTablePagination({
- Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()} + {isEmptyTable + ? 'Page 1 of 1' + : `Page ${table.getState().pagination.pageIndex + 1} of ${pageCount}`}
@@ -99,7 +104,7 @@ export function DataTablePagination({
); } From d6c8a3d32c5939536f8c87e4b6938f03d35744f8 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 09:20:01 +0000 Subject: [PATCH 20/56] fix: what happens if we use a dynamic import? --- .../src/app/(marketing)/blog/[post]/opengraph/route.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx index 906ee18cd..6f16b5092 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx @@ -1,12 +1,8 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; -import { allBlogPosts } from 'contentlayer/generated'; - export const runtime = 'edge'; -const contentType = 'image/png'; - const IMAGE_SIZE = { width: 1200, height: 630, @@ -17,6 +13,8 @@ type BlogPostOpenGraphImageProps = { }; export async function GET(_request: Request, { params }: BlogPostOpenGraphImageProps) { + const { allBlogPosts } = await import('contentlayer/generated'); + const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); if (!blogPost) { From 4926b6de509b7b5942a16238030507faf7098f74 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 09:40:26 +0000 Subject: [PATCH 21/56] fix: boring sign/verify approach --- .../blog/[post]/opengraph/route.tsx | 22 +++++++++++-------- .../src/app/(marketing)/blog/[post]/page.tsx | 18 +++++++++++++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx index 6f16b5092..f17a7931a 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx @@ -1,6 +1,8 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; +import { verify } from '@documenso/lib/server-only/crypto/verify'; + export const runtime = 'edge'; const IMAGE_SIZE = { @@ -8,16 +10,18 @@ const IMAGE_SIZE = { height: 630, }; -type BlogPostOpenGraphImageProps = { - params: { post: string }; -}; +export async function GET(_request: Request) { + const url = new URL(_request.url); -export async function GET(_request: Request, { params }: BlogPostOpenGraphImageProps) { - const { allBlogPosts } = await import('contentlayer/generated'); + const signature = url.searchParams.get('sig'); + const title = url.searchParams.get('title'); + const author = url.searchParams.get('author'); - const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); + if (!title || !author || !signature) { + return NextResponse.json({ error: 'Not found' }, { status: 404 }); + } - if (!blogPost) { + if (!verify({ title, author }, signature)) { return NextResponse.json({ error: 'Not found' }, { status: 404 }); } @@ -48,10 +52,10 @@ export async function GET(_request: Request, { params }: BlogPostOpenGraphImageP logo

- {blogPost.title} + {title}

-

Written by {blogPost.authorName}

+

Written by {author}

), { diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index fc65d9772..d8ef587c4 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,6 +7,8 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; +import { sign } from '@documenso/lib/server-only/crypto/sign'; + import { CallToAction } from '~/components/(marketing)/call-to-action'; export const dynamic = 'force-dynamic'; @@ -20,16 +22,28 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }; } + const signature = sign({ + title: blogPost.title, + author: blogPost.authorName, + }); + + // Use the url constructor to ensure that things are escaped as they should be + const openGraphImageUrl = new URL(`${blogPost.href}/opengraph`); + + openGraphImageUrl.searchParams.set('title', blogPost.title); + openGraphImageUrl.searchParams.set('author', blogPost.authorName); + openGraphImageUrl.searchParams.set('sig', signature); + return { title: { absolute: `${blogPost.title} - Documenso Blog`, }, description: blogPost.description, openGraph: { - images: [`${blogPost.href}/opengraph`], + images: [openGraphImageUrl.toString()], }, twitter: { - images: [`${blogPost.href}/opengraph`], + images: [openGraphImageUrl.toString()], }, }; }; From f5967e28c3fa751b54e1c9ad79bbb04ee52641b9 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 10:02:09 +0000 Subject: [PATCH 22/56] fix: without protection? --- .../blog/[post]/opengraph-image.tsx | 76 ------------------- .../blog/[post]/opengraph/route.tsx | 9 +-- 2 files changed, 1 insertion(+), 84 deletions(-) delete mode 100644 apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx deleted file mode 100644 index 4c01967d2..000000000 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph-image.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { ImageResponse } from 'next/og'; - -import { allBlogPosts } from 'contentlayer/generated'; - -export const runtime = 'edge'; - -export const contentType = 'image/png'; - -export const IMAGE_SIZE = { - width: 1200, - height: 630, -}; - -type BlogPostOpenGraphImageProps = { - params: { post: string }; -}; - -export default async function BlogPostOpenGraphImage({ params }: BlogPostOpenGraphImageProps) { - const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`); - - if (!blogPost) { - return null; - } - - // The long urls are needed for a compiler optimisation on the Next.js side, lifting this up - // to a constant will break og image generation. - const [interBold, interRegular, backgroundImage, logoImage] = await Promise.all([ - fetch(new URL('@documenso/assets/fonts/inter-bold.ttf', import.meta.url)).then(async (res) => - res.arrayBuffer(), - ), - fetch(new URL('@documenso/assets/fonts/inter-regular.ttf', import.meta.url)).then(async (res) => - res.arrayBuffer(), - ), - fetch(new URL('@documenso/assets/images/background-blog-og.png', import.meta.url)).then( - async (res) => res.arrayBuffer(), - ), - fetch(new URL('@documenso/assets/logo.png', import.meta.url)).then(async (res) => - res.arrayBuffer(), - ), - ]); - - return new ImageResponse( - ( -
- {/* @ts-expect-error Lack of typing from ImageResponse */} - og-background - - {/* @ts-expect-error Lack of typing from ImageResponse */} - logo - -

- {blogPost.title} -

- -

Written by {blogPost.authorName}

-
- ), - { - ...IMAGE_SIZE, - fonts: [ - { - name: 'Inter', - data: interRegular, - style: 'normal', - weight: 400, - }, - { - name: 'Inter', - data: interBold, - style: 'normal', - weight: 700, - }, - ], - }, - ); -} diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx index f17a7931a..70233bbdd 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/opengraph/route.tsx @@ -1,8 +1,6 @@ import { ImageResponse } from 'next/og'; import { NextResponse } from 'next/server'; -import { verify } from '@documenso/lib/server-only/crypto/verify'; - export const runtime = 'edge'; const IMAGE_SIZE = { @@ -13,15 +11,10 @@ const IMAGE_SIZE = { export async function GET(_request: Request) { const url = new URL(_request.url); - const signature = url.searchParams.get('sig'); const title = url.searchParams.get('title'); const author = url.searchParams.get('author'); - if (!title || !author || !signature) { - return NextResponse.json({ error: 'Not found' }, { status: 404 }); - } - - if (!verify({ title, author }, signature)) { + if (!title || !author) { return NextResponse.json({ error: 'Not found' }, { status: 404 }); } From 0db2e6643dd8678283eb3b1ab3ab499bfe62a0fc Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 10:39:48 +0000 Subject: [PATCH 23/56] fix: final final v2 --- .../src/app/(marketing)/blog/[post]/page.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index d8ef587c4..b0d59edc1 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -28,11 +28,11 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }); // Use the url constructor to ensure that things are escaped as they should be - const openGraphImageUrl = new URL(`${blogPost.href}/opengraph`); - - openGraphImageUrl.searchParams.set('title', blogPost.title); - openGraphImageUrl.searchParams.set('author', blogPost.authorName); - openGraphImageUrl.searchParams.set('sig', signature); + const searchParams = new URLSearchParams({ + title: blogPost.title, + author: blogPost.authorName, + sig: signature, + }); return { title: { @@ -40,10 +40,10 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }, description: blogPost.description, openGraph: { - images: [openGraphImageUrl.toString()], + images: [`${blogPost.href}/opengraph?${searchParams.toString()}`], }, twitter: { - images: [openGraphImageUrl.toString()], + images: [`${blogPost.href}/opengraph?${searchParams.toString()}`], }, }; }; From 524a7918d55754a7c26e107f268db298cd7a3eb3 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 10:41:59 +0000 Subject: [PATCH 24/56] fix: toss the signature --- apps/marketing/src/app/(marketing)/blog/[post]/page.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index b0d59edc1..3e50f8305 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -7,8 +7,6 @@ import { ChevronLeft } from 'lucide-react'; import type { MDXComponents } from 'mdx/types'; import { useMDXComponent } from 'next-contentlayer/hooks'; -import { sign } from '@documenso/lib/server-only/crypto/sign'; - import { CallToAction } from '~/components/(marketing)/call-to-action'; export const dynamic = 'force-dynamic'; @@ -22,16 +20,10 @@ export const generateMetadata = ({ params }: { params: { post: string } }) => { }; } - const signature = sign({ - title: blogPost.title, - author: blogPost.authorName, - }); - // Use the url constructor to ensure that things are escaped as they should be const searchParams = new URLSearchParams({ title: blogPost.title, author: blogPost.authorName, - sig: signature, }); return { From d5c4885c67a0a71aabf0c370b5a19e77da4de119 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 12:39:09 +0000 Subject: [PATCH 25/56] fix: update signup form to handle password managers better --- apps/web/src/app/(unauthenticated)/layout.tsx | 2 +- .../src/app/(unauthenticated)/signup/page.tsx | 2 +- apps/web/src/components/forms/v2/signup.tsx | 32 ++++++++----------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/apps/web/src/app/(unauthenticated)/layout.tsx b/apps/web/src/app/(unauthenticated)/layout.tsx index 03a73278f..05055d508 100644 --- a/apps/web/src/app/(unauthenticated)/layout.tsx +++ b/apps/web/src/app/(unauthenticated)/layout.tsx @@ -10,7 +10,7 @@ type UnauthenticatedLayoutProps = { export default function UnauthenticatedLayout({ children }: UnauthenticatedLayoutProps) { return ( -
+
diff --git a/apps/web/src/components/forms/v2/signup.tsx b/apps/web/src/components/forms/v2/signup.tsx index a7e33a759..b3b502993 100644 --- a/apps/web/src/components/forms/v2/signup.tsx +++ b/apps/web/src/components/forms/v2/signup.tsx @@ -108,17 +108,6 @@ export const SignUpFormV2 = ({ const name = form.watch('name'); const url = form.watch('url'); - // To continue we need to make sure name, email, password and signature are valid - const canContinue = - form.formState.dirtyFields.name && - form.formState.errors.name === undefined && - form.formState.dirtyFields.email && - form.formState.errors.email === undefined && - form.formState.dirtyFields.password && - form.formState.errors.password === undefined && - form.formState.dirtyFields.signature && - form.formState.errors.signature === undefined; - const { mutateAsync: signup } = trpc.auth.signup.useMutation(); const onFormSubmit = async ({ name, email, password, signature, url }: TSignUpFormV2Schema) => { @@ -169,6 +158,14 @@ export const SignUpFormV2 = ({ } }; + const onNextClick = async () => { + const valid = await form.trigger(['name', 'email', 'password', 'signature']); + + if (valid) { + setStep('CLAIM_USERNAME'); + } + }; + const onSignUpWithGoogleClick = async () => { try { await signIn('google', { callbackUrl: SIGN_UP_REDIRECT_PATH }); @@ -224,7 +221,7 @@ export const SignUpFormV2 = ({
-
+
{step === 'BASIC_DETAILS' && (

Create a new account

@@ -257,8 +254,8 @@ export const SignUpFormV2 = ({ {step === 'BASIC_DETAILS' && (
@@ -360,8 +357,8 @@ export const SignUpFormV2 = ({ {step === 'CLAIM_USERNAME' && (
@@ -431,9 +428,8 @@ export const SignUpFormV2 = ({ type="button" size="lg" className="flex-1 disabled:cursor-not-allowed" - disabled={!canContinue} loading={form.formState.isSubmitting} - onClick={() => setStep('CLAIM_USERNAME')} + onClick={onNextClick} > Next From fd4d5468cfc331f221d4e2d1a74ae60ac6af7fb4 Mon Sep 17 00:00:00 2001 From: Lucas Smith Date: Thu, 14 Mar 2024 23:52:49 +1100 Subject: [PATCH 26/56] fix: use gif for readme --- README.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 93c6d9f95..b83df450a 100644 --- a/README.md +++ b/README.md @@ -30,17 +30,8 @@ Contributor Covenant

-
- - - - - +
+
## About this project From 17c6a4bd55e16f6f7544f85f7166ccc46b7ba1ff Mon Sep 17 00:00:00 2001 From: Adithya Krishna Date: Fri, 15 Mar 2024 09:18:51 +0530 Subject: [PATCH 27/56] chore: updated focus state of menu switcher Signed-off-by: Adithya Krishna --- .../(dashboard)/layout/menu-switcher.tsx | 2 +- packages/ui/styles/theme.css | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx index 6e3a4c015..e7959322a 100644 --- a/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx +++ b/apps/web/src/components/(dashboard)/layout/menu-switcher.tsx @@ -93,7 +93,7 @@ export const MenuSwitcher = ({ user, teams: initialTeamsData }: MenuSwitcherProp
From b95f7176e26abbdb6bdc4b95c6d3deec46106b14 Mon Sep 17 00:00:00 2001 From: Anik Dhabal Babu Date: Mon, 18 Mar 2024 18:25:04 +0000 Subject: [PATCH 37/56] fix: username overflow issue --- apps/web/src/components/forms/public-profile-claim-dialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/forms/public-profile-claim-dialog.tsx b/apps/web/src/components/forms/public-profile-claim-dialog.tsx index dbd52fd27..e3b03a44c 100644 --- a/apps/web/src/components/forms/public-profile-claim-dialog.tsx +++ b/apps/web/src/components/forms/public-profile-claim-dialog.tsx @@ -154,7 +154,7 @@ export const ClaimPublicProfileDialogForm = ({ -
+
{baseUrl.host}/u/{field.value || ''}
From 2facc0e3318b0aafbf5579fd283779adbdb2b3a6 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 20 Mar 2024 10:17:31 +0000 Subject: [PATCH 38/56] feat: add completed documents per month graph --- ...monthly-completed-documents-chart copy.tsx | 57 +++++++++++++++++++ .../src/app/(marketing)/open/page.tsx | 8 +++ .../user/get-monthly-completed-document.ts | 35 ++++++++++++ .../seed/pr-711-deletion-of-documents.ts | 1 + 4 files changed, 101 insertions(+) create mode 100644 apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx create mode 100644 packages/lib/server-only/user/get-monthly-completed-document.ts diff --git a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx new file mode 100644 index 000000000..ce438145b --- /dev/null +++ b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { DateTime } from 'luxon'; +import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; + +import type { GetUserMonthlyGrowthResult } from '@documenso/lib/server-only/user/get-user-monthly-growth'; +import { cn } from '@documenso/ui/lib/utils'; + +export type MonthlyCompletedDocumentsChartProps = { + className?: string; + data: GetUserMonthlyGrowthResult; +}; + +export const MonthlyCompletedDocumentsChart = ({ + className, + data, +}: MonthlyCompletedDocumentsChartProps) => { + const formattedData = [...data].reverse().map(({ month, cume_count: count }) => { + return { + month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), + count: Number(count), + }; + }); + + return ( +
+
+

Completed Documents per Month

+
+ +
+ + + + + + [Number(value).toLocaleString('en-US'), 'Total Users']} + cursor={{ fill: 'hsl(var(--primary) / 10%)' }} + /> + + + + +
+
+ ); +}; diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 10ab71aa7..77e36ca78 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from 'next'; import { z } from 'zod'; +import { getCompletedDocumentsMonthly } from '@documenso/lib/server-only/user/get-monthly-completed-document'; import { getUserMonthlyGrowth } from '@documenso/lib/server-only/user/get-user-monthly-growth'; import { FUNDING_RAISED } from '~/app/(marketing)/open/data'; @@ -12,6 +13,7 @@ import { CallToAction } from '~/components/(marketing)/call-to-action'; import { BarMetric } from './bar-metrics'; import { CapTable } from './cap-table'; import { FundingRaised } from './funding-raised'; +import { MonthlyCompletedDocumentsChart } from './monthly-completed-documents-chart copy'; import { MonthlyNewUsersChart } from './monthly-new-users-chart'; import { MonthlyTotalUsersChart } from './monthly-total-users-chart'; import { TeamMembers } from './team-members'; @@ -140,6 +142,7 @@ export default async function OpenPage() { ]); const MONTHLY_USERS = await getUserMonthlyGrowth(); + const MONTHLY_COMPLETED_DOCUMENTS = await getCompletedDocumentsMonthly(); return (
@@ -240,6 +243,11 @@ export default async function OpenPage() { + +
diff --git a/packages/lib/server-only/user/get-monthly-completed-document.ts b/packages/lib/server-only/user/get-monthly-completed-document.ts new file mode 100644 index 000000000..ef1bcd4b9 --- /dev/null +++ b/packages/lib/server-only/user/get-monthly-completed-document.ts @@ -0,0 +1,35 @@ +import { DateTime } from 'luxon'; + +import { prisma } from '@documenso/prisma'; + +export type GetCompletedDocumentsMonthlyResult = Array<{ + month: string; + count: number; + cume_count: number; +}>; + +type GetCompletedDocumentsMonthlyQueryResult = Array<{ + month: Date; + count: bigint; + cume_count: bigint; +}>; + +export const getCompletedDocumentsMonthly = async () => { + const result = await prisma.$queryRaw` + SELECT + DATE_TRUNC('month', "completedAt") AS "month", + COUNT("id") as "count", + SUM(COUNT("id")) OVER (ORDER BY DATE_TRUNC('month', "completedAt")) as "cume_count" + FROM "Document" + WHERE "status" = 'COMPLETED' + GROUP BY "month" + ORDER BY "month" DESC + LIMIT 12 + `; + + return result.map((row) => ({ + month: DateTime.fromJSDate(row.month).toFormat('yyyy-MM'), + count: Number(row.count), + cume_count: Number(row.cume_count), + })); +}; diff --git a/packages/prisma/seed/pr-711-deletion-of-documents.ts b/packages/prisma/seed/pr-711-deletion-of-documents.ts index 5365ecf47..d2706b734 100644 --- a/packages/prisma/seed/pr-711-deletion-of-documents.ts +++ b/packages/prisma/seed/pr-711-deletion-of-documents.ts @@ -182,6 +182,7 @@ const createCompletedDocument = async (sender: User, recipients: User[]) => { title: `[${PULL_REQUEST_NUMBER}] Document 1 - Completed`, status: DocumentStatus.COMPLETED, documentDataId: documentData.id, + completedAt: new Date(), userId: sender.id, }, }); From 48858cfdd00748767852c72c315c2d0c4c5309e4 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Wed, 20 Mar 2024 10:31:19 +0000 Subject: [PATCH 39/56] chore: restructure open page --- .../src/app/(marketing)/open/page.tsx | 51 +++++++++++-------- .../src/app/(marketing)/open/team-members.tsx | 2 +- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 77e36ca78..41f0aceba 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -164,7 +164,7 @@ export default async function OpenPage() {

-
+
+
+

Finances

+
+
- - data={EARLY_ADOPTERS_DATA} - metricKey="earlyAdopters" - title="Early Adopters" - label="Early Adopters" - className="col-span-12 lg:col-span-6" - extraInfo={} - /> - +

Community

+
data={STARGAZERS_DATA} metricKey="stars" @@ -240,6 +237,20 @@ export default async function OpenPage() { className="col-span-12 lg:col-span-6" /> + +
+ +

Growth

+
+ + data={EARLY_ADOPTERS_DATA} + metricKey="earlyAdopters" + title="Early Adopters" + label="Early Adopters" + className="col-span-12 lg:col-span-6" + extraInfo={} + /> + @@ -247,20 +258,18 @@ export default async function OpenPage() { data={MONTHLY_COMPLETED_DOCUMENTS} className="col-span-12 lg:col-span-6" /> - - - -
-

Where's the rest?

- -

- We're still working on getting all our metrics together. We'll update this page as - soon as we have more to share. -

-
+
+

Where's the rest?

+ +

+ We're still working on getting all our metrics together. We'll update this page as soon as + we have more to share. +

+
+
); diff --git a/apps/marketing/src/app/(marketing)/open/team-members.tsx b/apps/marketing/src/app/(marketing)/open/team-members.tsx index a79fcd182..288d48a0b 100644 --- a/apps/marketing/src/app/(marketing)/open/team-members.tsx +++ b/apps/marketing/src/app/(marketing)/open/team-members.tsx @@ -1,4 +1,4 @@ -import { HTMLAttributes } from 'react'; +import type { HTMLAttributes } from 'react'; import { cn } from '@documenso/ui/lib/utils'; import { From 574cd176c20ac43d5366581f6972bfc44c1442ce Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Wed, 20 Mar 2024 12:34:03 +0100 Subject: [PATCH 40/56] chore: update copy to have more swag --- apps/marketing/src/app/(marketing)/open/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 41f0aceba..4f2b0d857 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -262,10 +262,10 @@ export default async function OpenPage() {
-

Where's the rest?

+

Is there more?

- We're still working on getting all our metrics together. We'll update this page as soon as + This page is evolving as we learn what makes a great signing company. We'll update it when we have more to share.

From 3e15b5d7456b6849f2da3cd101b24a2ade71793b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Sebasti=C3=A1n=20Mendoza?= Date: Wed, 20 Mar 2024 15:05:17 -0500 Subject: [PATCH 41/56] feat: add sticky behavior to pricing options container --- apps/marketing/src/app/(marketing)/layout.tsx | 3 ++- apps/marketing/src/components/(marketing)/pricing-table.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/layout.tsx b/apps/marketing/src/app/(marketing)/layout.tsx index a7c599b36..75c2d177c 100644 --- a/apps/marketing/src/app/(marketing)/layout.tsx +++ b/apps/marketing/src/app/(marketing)/layout.tsx @@ -38,7 +38,8 @@ export default function MarketingLayout({ children }: MarketingLayoutProps) { return (
{ return (
-
+
Date: Thu, 21 Mar 2024 00:48:49 +0000 Subject: [PATCH 42/56] fix: invalid datetime on graph --- ...rt copy.tsx => monthly-completed-documents-chart.tsx} | 2 +- apps/marketing/src/app/(marketing)/open/page.tsx | 9 +++++---- .../server-only/user/get-monthly-completed-document.ts | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) rename apps/marketing/src/app/(marketing)/open/{monthly-completed-documents-chart copy.tsx => monthly-completed-documents-chart.tsx} (97%) diff --git a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx similarity index 97% rename from apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx rename to apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx index ce438145b..4efd31e76 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart copy.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx @@ -47,7 +47,7 @@ export const MonthlyCompletedDocumentsChart = ({ fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="Total Users" + label="Monthly Completed Documents" /> diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 4f2b0d857..02cf9302f 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -13,7 +13,7 @@ import { CallToAction } from '~/components/(marketing)/call-to-action'; import { BarMetric } from './bar-metrics'; import { CapTable } from './cap-table'; import { FundingRaised } from './funding-raised'; -import { MonthlyCompletedDocumentsChart } from './monthly-completed-documents-chart copy'; +import { MonthlyCompletedDocumentsChart } from './monthly-completed-documents-chart'; import { MonthlyNewUsersChart } from './monthly-new-users-chart'; import { MonthlyTotalUsersChart } from './monthly-total-users-chart'; import { TeamMembers } from './team-members'; @@ -133,17 +133,18 @@ export default async function OpenPage() { { total_count: mergedPullRequests }, STARGAZERS_DATA, EARLY_ADOPTERS_DATA, + MONTHLY_USERS, + MONTHLY_COMPLETED_DOCUMENTS, ] = await Promise.all([ fetchGithubStats(), fetchOpenIssues(), fetchMergedPullRequests(), fetchStargazers(), fetchEarlyAdopters(), + getUserMonthlyGrowth(), + getCompletedDocumentsMonthly(), ]); - const MONTHLY_USERS = await getUserMonthlyGrowth(); - const MONTHLY_COMPLETED_DOCUMENTS = await getCompletedDocumentsMonthly(); - return (
diff --git a/packages/lib/server-only/user/get-monthly-completed-document.ts b/packages/lib/server-only/user/get-monthly-completed-document.ts index ef1bcd4b9..644643bb3 100644 --- a/packages/lib/server-only/user/get-monthly-completed-document.ts +++ b/packages/lib/server-only/user/get-monthly-completed-document.ts @@ -17,9 +17,9 @@ type GetCompletedDocumentsMonthlyQueryResult = Array<{ export const getCompletedDocumentsMonthly = async () => { const result = await prisma.$queryRaw` SELECT - DATE_TRUNC('month', "completedAt") AS "month", + DATE_TRUNC('month', "updatedAt") AS "month", COUNT("id") as "count", - SUM(COUNT("id")) OVER (ORDER BY DATE_TRUNC('month', "completedAt")) as "cume_count" + SUM(COUNT("id")) OVER (ORDER BY DATE_TRUNC('month', "updatedAt")) as "cume_count" FROM "Document" WHERE "status" = 'COMPLETED' GROUP BY "month" From 8c1686f113569c98ef61a3266f86e6309aefeeb3 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 21 Mar 2024 01:25:23 +0000 Subject: [PATCH 43/56] feat: add total signed documents --- .../monthly-completed-documents-chart.tsx | 4 +- .../src/app/(marketing)/open/page.tsx | 24 +++++---- .../open/total-signed-documents-chart.tsx | 54 +++++++++++++++++++ 3 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx diff --git a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx index 4efd31e76..77059f80a 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx @@ -38,7 +38,7 @@ export const MonthlyCompletedDocumentsChart = ({ labelStyle={{ color: 'hsl(var(--primary-foreground))', }} - formatter={(value) => [Number(value).toLocaleString('en-US'), 'Total Users']} + formatter={(value) => [Number(value).toLocaleString('en-US'), 'Completed Documents']} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> @@ -47,7 +47,7 @@ export const MonthlyCompletedDocumentsChart = ({ fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="Monthly Completed Documents" + label="Completed Documents" /> diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index 02cf9302f..ea7ffda14 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -6,8 +6,6 @@ import { getCompletedDocumentsMonthly } from '@documenso/lib/server-only/user/ge import { getUserMonthlyGrowth } from '@documenso/lib/server-only/user/get-user-monthly-growth'; import { FUNDING_RAISED } from '~/app/(marketing)/open/data'; -import { MetricCard } from '~/app/(marketing)/open/metric-card'; -import { SalaryBands } from '~/app/(marketing)/open/salary-bands'; import { CallToAction } from '~/components/(marketing)/call-to-action'; import { BarMetric } from './bar-metrics'; @@ -16,8 +14,10 @@ import { FundingRaised } from './funding-raised'; import { MonthlyCompletedDocumentsChart } from './monthly-completed-documents-chart'; import { MonthlyNewUsersChart } from './monthly-new-users-chart'; import { MonthlyTotalUsersChart } from './monthly-total-users-chart'; +import { SalaryBands } from './salary-bands'; import { TeamMembers } from './team-members'; import { OpenPageTooltip } from './tooltip'; +import { TotalSignedDocumentsChart } from './total-signed-documents-chart'; import { Typefully } from './typefully'; export const metadata: Metadata = { @@ -128,17 +128,17 @@ const fetchEarlyAdopters = async () => { export default async function OpenPage() { const [ - { forks_count: forksCount, stargazers_count: stargazersCount }, - { total_count: openIssues }, - { total_count: mergedPullRequests }, + // { forks_count: forksCount, stargazers_count: stargazersCount }, + // { total_count: openIssues }, + // { total_count: mergedPullRequests }, STARGAZERS_DATA, EARLY_ADOPTERS_DATA, MONTHLY_USERS, MONTHLY_COMPLETED_DOCUMENTS, ] = await Promise.all([ - fetchGithubStats(), - fetchOpenIssues(), - fetchMergedPullRequests(), + // fetchGithubStats(), + // fetchOpenIssues(), + // fetchMergedPullRequests(), fetchStargazers(), fetchEarlyAdopters(), getUserMonthlyGrowth(), @@ -166,7 +166,7 @@ export default async function OpenPage() {
-
+ {/*
-
+
*/} @@ -259,6 +259,10 @@ export default async function OpenPage() { data={MONTHLY_COMPLETED_DOCUMENTS} className="col-span-12 lg:col-span-6" /> +
diff --git a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx new file mode 100644 index 000000000..239d15de9 --- /dev/null +++ b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx @@ -0,0 +1,54 @@ +'use client'; + +import { DateTime } from 'luxon'; +import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; + +import type { GetUserMonthlyGrowthResult } from '@documenso/lib/server-only/user/get-user-monthly-growth'; +import { cn } from '@documenso/ui/lib/utils'; + +export type TotalSignedDocumentsChartProps = { + className?: string; + data: GetUserMonthlyGrowthResult; +}; + +export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocumentsChartProps) => { + const formattedData = [...data].reverse().map(({ month, cume_count: count }) => { + return { + month: DateTime.fromFormat(month, 'yyyy-MM').toFormat('LLLL'), + count: Number(count), + }; + }); + + return ( +
+
+

Total Signed Documents

+
+ +
+ + + + + + [Number(value).toLocaleString('en-US'), 'Signed Documents']} + cursor={{ fill: 'hsl(var(--primary) / 10%)' }} + /> + + + + +
+
+ ); +}; From facafe09971ab95cff479aed2a8d0567f11cd693 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 21 Mar 2024 01:39:14 +0000 Subject: [PATCH 44/56] feat: place card titles in the box --- .../src/app/(marketing)/open/bar-metrics.tsx | 15 +++++---- .../src/app/(marketing)/open/cap-table.tsx | 10 +++--- .../app/(marketing)/open/funding-raised.tsx | 11 ++++--- .../monthly-completed-documents-chart.tsx | 11 +++---- .../open/monthly-new-users-chart.tsx | 11 +++---- .../open/monthly-total-users-chart.tsx | 11 +++---- .../src/app/(marketing)/open/page.tsx | 31 ++++++++++--------- .../open/total-signed-documents-chart.tsx | 11 +++---- .../src/app/(marketing)/open/typefully.tsx | 11 ++++--- .../src/components/(marketing)/callout.tsx | 2 +- .../src/components/(marketing)/hero.tsx | 2 +- 11 files changed, 62 insertions(+), 64 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx b/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx index 940adb8fc..fb9c61f11 100644 --- a/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx +++ b/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx @@ -1,11 +1,10 @@ 'use client'; -import { HTMLAttributes } from 'react'; +import type { HTMLAttributes } from 'react'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import { formatMonth } from '@documenso/lib/client-only/format-month'; -import { cn } from '@documenso/ui/lib/utils'; export type BarMetricProps> = HTMLAttributes & { data: T; @@ -34,13 +33,13 @@ export const BarMetric = -
-

{title}

- {extraInfo} -
+
+
+
+

{title}

+ {extraInfo} +
-
diff --git a/apps/marketing/src/app/(marketing)/open/cap-table.tsx b/apps/marketing/src/app/(marketing)/open/cap-table.tsx index ba6a12dc4..05c122aa5 100644 --- a/apps/marketing/src/app/(marketing)/open/cap-table.tsx +++ b/apps/marketing/src/app/(marketing)/open/cap-table.tsx @@ -5,8 +5,6 @@ import { useEffect, useState } from 'react'; import { Cell, Legend, Pie, PieChart, Tooltip } from 'recharts'; -import { cn } from '@documenso/ui/lib/utils'; - import { CAP_TABLE } from './data'; const COLORS = ['#7fd843', '#a2e771', '#c6f2a4']; @@ -49,10 +47,12 @@ export const CapTable = ({ className, ...props }: CapTableProps) => { setIsSSR(false); }, []); return ( -
-

Cap Table

+
+
+
+

Cap Table

+
-
{!isSSR && ( & { data: Record[]; @@ -18,10 +17,12 @@ export const FundingRaised = ({ className, data, ...props }: FundingRaisedProps) })); return ( -
-

Total Funding Raised

+
+
+
+

Total Funding Raised

+
-
diff --git a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx index 77059f80a..9626838ed 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-completed-documents-chart.tsx @@ -4,7 +4,6 @@ import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import type { GetUserMonthlyGrowthResult } from '@documenso/lib/server-only/user/get-user-monthly-growth'; -import { cn } from '@documenso/ui/lib/utils'; export type MonthlyCompletedDocumentsChartProps = { className?: string; @@ -23,12 +22,12 @@ export const MonthlyCompletedDocumentsChart = ({ }); return ( -
-
-

Completed Documents per Month

-
+
+
+
+

Completed Documents per Month

+
-
diff --git a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx index 0df73e30c..fe7941336 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-new-users-chart.tsx @@ -4,7 +4,6 @@ import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import type { GetUserMonthlyGrowthResult } from '@documenso/lib/server-only/user/get-user-monthly-growth'; -import { cn } from '@documenso/ui/lib/utils'; export type MonthlyNewUsersChartProps = { className?: string; @@ -20,12 +19,12 @@ export const MonthlyNewUsersChart = ({ className, data }: MonthlyNewUsersChartPr }); return ( -
-
-

New Users

-
+
+
+
+

New Users

+
-
diff --git a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx index 96ce34556..6ab5572ec 100644 --- a/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/monthly-total-users-chart.tsx @@ -4,7 +4,6 @@ import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import type { GetUserMonthlyGrowthResult } from '@documenso/lib/server-only/user/get-user-monthly-growth'; -import { cn } from '@documenso/ui/lib/utils'; export type MonthlyTotalUsersChartProps = { className?: string; @@ -20,12 +19,12 @@ export const MonthlyTotalUsersChart = ({ className, data }: MonthlyTotalUsersCha }); return ( -
-
-

Total Users

-
+
+
+
+

Total Users

+
-
diff --git a/apps/marketing/src/app/(marketing)/open/page.tsx b/apps/marketing/src/app/(marketing)/open/page.tsx index ea7ffda14..31990519e 100644 --- a/apps/marketing/src/app/(marketing)/open/page.tsx +++ b/apps/marketing/src/app/(marketing)/open/page.tsx @@ -11,6 +11,7 @@ import { CallToAction } from '~/components/(marketing)/call-to-action'; import { BarMetric } from './bar-metrics'; import { CapTable } from './cap-table'; import { FundingRaised } from './funding-raised'; +import { MetricCard } from './metric-card'; import { MonthlyCompletedDocumentsChart } from './monthly-completed-documents-chart'; import { MonthlyNewUsersChart } from './monthly-new-users-chart'; import { MonthlyTotalUsersChart } from './monthly-total-users-chart'; @@ -128,17 +129,17 @@ const fetchEarlyAdopters = async () => { export default async function OpenPage() { const [ - // { forks_count: forksCount, stargazers_count: stargazersCount }, - // { total_count: openIssues }, - // { total_count: mergedPullRequests }, + { forks_count: forksCount, stargazers_count: stargazersCount }, + { total_count: openIssues }, + { total_count: mergedPullRequests }, STARGAZERS_DATA, EARLY_ADOPTERS_DATA, MONTHLY_USERS, MONTHLY_COMPLETED_DOCUMENTS, ] = await Promise.all([ - // fetchGithubStats(), - // fetchOpenIssues(), - // fetchMergedPullRequests(), + fetchGithubStats(), + fetchOpenIssues(), + fetchMergedPullRequests(), fetchStargazers(), fetchEarlyAdopters(), getUserMonthlyGrowth(), @@ -166,7 +167,7 @@ export default async function OpenPage() {
- {/*
+
-
*/} +
@@ -206,7 +207,7 @@ export default async function OpenPage() { data={STARGAZERS_DATA} metricKey="stars" - title="Github: Total Stars" + title="GitHub: Total Stars" label="Stars" className="col-span-12 lg:col-span-6" /> @@ -214,27 +215,27 @@ export default async function OpenPage() { data={STARGAZERS_DATA} metricKey="mergedPRs" - title="Github: Total Merged PRs" + title="GitHub: Total Merged PRs" label="Merged PRs" - chartHeight={300} + chartHeight={400} className="col-span-12 lg:col-span-6" /> data={STARGAZERS_DATA} metricKey="forks" - title="Github: Total Forks" + title="GitHub: Total Forks" label="Forks" - chartHeight={300} + chartHeight={400} className="col-span-12 lg:col-span-6" /> data={STARGAZERS_DATA} metricKey="openIssues" - title="Github: Total Open Issues" + title="GitHub: Total Open Issues" label="Open Issues" - chartHeight={300} + chartHeight={400} className="col-span-12 lg:col-span-6" /> diff --git a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx index 239d15de9..c2b7561de 100644 --- a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx @@ -4,7 +4,6 @@ import { DateTime } from 'luxon'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; import type { GetUserMonthlyGrowthResult } from '@documenso/lib/server-only/user/get-user-monthly-growth'; -import { cn } from '@documenso/ui/lib/utils'; export type TotalSignedDocumentsChartProps = { className?: string; @@ -20,12 +19,12 @@ export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocume }); return ( -
-
-

Total Signed Documents

-
+
+
+
+

Total Signed Documents

+
-
diff --git a/apps/marketing/src/app/(marketing)/open/typefully.tsx b/apps/marketing/src/app/(marketing)/open/typefully.tsx index a233904db..4f298fbb3 100644 --- a/apps/marketing/src/app/(marketing)/open/typefully.tsx +++ b/apps/marketing/src/app/(marketing)/open/typefully.tsx @@ -6,18 +6,19 @@ import Link from 'next/link'; import { FaXTwitter } from 'react-icons/fa6'; -import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; export type TypefullyProps = HTMLAttributes; export const Typefully = ({ className, ...props }: TypefullyProps) => { return ( -
-

Twitter Stats

+
+
+
+

Twitter Stats

+
-
-
+

Documenso on X

diff --git a/apps/marketing/src/components/(marketing)/callout.tsx b/apps/marketing/src/components/(marketing)/callout.tsx index faa486c46..dfd358c71 100644 --- a/apps/marketing/src/components/(marketing)/callout.tsx +++ b/apps/marketing/src/components/(marketing)/callout.tsx @@ -53,7 +53,7 @@ export const Callout = ({ starCount }: CalloutProps) => { > From 94198e7584492bfc2b1db49526d291bc9cebba74 Mon Sep 17 00:00:00 2001 From: Timur Ercan Date: Thu, 21 Mar 2024 13:16:17 +0100 Subject: [PATCH 45/56] chore: text --- .../(marketing)/open/total-signed-documents-chart.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx index c2b7561de..2a8393363 100644 --- a/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx +++ b/apps/marketing/src/app/(marketing)/open/total-signed-documents-chart.tsx @@ -22,7 +22,7 @@ export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocume
-

Total Signed Documents

+

Total Completed Documents

@@ -34,7 +34,10 @@ export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocume labelStyle={{ color: 'hsl(var(--primary-foreground))', }} - formatter={(value) => [Number(value).toLocaleString('en-US'), 'Signed Documents']} + formatter={(value) => [ + Number(value).toLocaleString('en-US'), + 'Total Completed Documents', + ]} cursor={{ fill: 'hsl(var(--primary) / 10%)' }} /> @@ -43,7 +46,7 @@ export const TotalSignedDocumentsChart = ({ className, data }: TotalSignedDocume fill="hsl(var(--primary))" radius={[4, 4, 0, 0]} maxBarSize={60} - label="Signed Documents" + label="Total Completed Documents" /> From 1cd7dd236b517134385444cce4c8cfe260d5b928 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 21 Mar 2024 16:15:29 +0000 Subject: [PATCH 46/56] chore: test signing a document --- .../src/app/(marketing)/open/bar-metrics.tsx | 2 +- .../e2e/pr-718-add-stepper-component.spec.ts | 84 +++++++++++++++++++ packages/app-tests/package.json | 1 + packages/app-tests/playwright.config.ts | 8 +- .../document/get-document-by-token.ts | 27 ++++-- 5 files changed, 115 insertions(+), 7 deletions(-) diff --git a/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx b/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx index 940adb8fc..8a01c5ecc 100644 --- a/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx +++ b/apps/marketing/src/app/(marketing)/open/bar-metrics.tsx @@ -1,6 +1,6 @@ 'use client'; -import { HTMLAttributes } from 'react'; +import type { HTMLAttributes } from 'react'; import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts'; diff --git a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts index e482c4172..3318afe7a 100644 --- a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts +++ b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts @@ -1,6 +1,9 @@ import { expect, test } from '@playwright/test'; import path from 'node:path'; +import { getDocumentByToken } from '@documenso/lib/server-only/document/get-document-by-token'; +import { getRecipientByEmail } from '@documenso/lib/server-only/recipient/get-recipient-by-email'; +import { DocumentStatus } from '@documenso/prisma/client'; import { TEST_USER } from '@documenso/prisma/seed/pr-718-add-stepper-component'; test(`[PR-718]: should be able to create a document`, async ({ page }) => { @@ -168,3 +171,84 @@ test('should be able to create a document with multiple recipients', async ({ pa // Assert document was created await expect(page.getByRole('link', { name: documentTitle })).toBeVisible(); }); + +test('should be able to create, send and sign a document', async ({ page }) => { + await page.goto('/signin'); + + const documentTitle = `example-${Date.now()}.pdf`; + + // Sign in + await page.getByLabel('Email').fill(TEST_USER.email); + await page.getByLabel('Password', { exact: true }).fill(TEST_USER.password); + await page.getByRole('button', { name: 'Sign In' }).click(); + + // Upload document + const [fileChooser] = await Promise.all([ + page.waitForEvent('filechooser'), + page.locator('input[type=file]').evaluate((e) => { + if (e instanceof HTMLInputElement) { + e.click(); + } + }), + ]); + + await fileChooser.setFiles(path.join(__dirname, '../../../assets/example.pdf')); + + // Wait to be redirected to the edit page + await page.waitForURL(/\/documents\/\d+/); + + // Set title + await expect(page.getByRole('heading', { name: 'Add Title' })).toBeVisible(); + + await page.getByLabel('Title').fill(documentTitle); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add signers + await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible(); + + await page.getByLabel('Email*').fill('user1@example.com'); + await page.getByLabel('Name').fill('User 1'); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add fields + await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible(); + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add subject and send + await expect(page.getByRole('heading', { name: 'Add Subject' })).toBeVisible(); + await page.getByRole('button', { name: 'Send' }).click(); + + await page.waitForURL('/documents'); + + // Assert document was created + await expect(page.getByRole('link', { name: documentTitle })).toBeVisible(); + await page.getByRole('link', { name: documentTitle }).click(); + + const url = await page.url().split('/'); + const documentId = url[url.length - 1]; + + const { token } = await getRecipientByEmail({ + email: 'user1@example.com', + documentId: Number(documentId), + }); + + await page.goto(`/sign/${token}`); + await page.waitForURL(`/sign/${token}`); + + // Check if document has been viewed + const { status } = await getDocumentByToken({ token }); + expect(status).toBe(DocumentStatus.PENDING); + + await page.getByRole('button', { name: 'Complete' }).click(); + await expect(page.getByRole('dialog').getByText('Sign Document')).toBeVisible(); + await page.getByRole('button', { name: 'Sign' }).click(); + + await page.waitForURL(`/sign/${token}/complete`); + await expect(page.getByText('You have signed')).toBeVisible(); + + // Check if document has been signed + const { status: completedStatus } = await getDocumentByToken({ token }); + expect(completedStatus).toBe(DocumentStatus.COMPLETED); +}); diff --git a/packages/app-tests/package.json b/packages/app-tests/package.json index 9dcb32f7d..84f14d469 100644 --- a/packages/app-tests/package.json +++ b/packages/app-tests/package.json @@ -6,6 +6,7 @@ "main": "index.js", "scripts": { "test:dev": "playwright test", + "test-ui:dev": "playwright test --ui", "test:e2e": "start-server-and-test \"npm run start -w @documenso/web\" http://localhost:3000 \"playwright test\"" }, "keywords": [], diff --git a/packages/app-tests/playwright.config.ts b/packages/app-tests/playwright.config.ts index 672c2f7ef..65ba20455 100644 --- a/packages/app-tests/playwright.config.ts +++ b/packages/app-tests/playwright.config.ts @@ -29,7 +29,13 @@ export default defineConfig({ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', - video: 'retain-on-failure', + // BEFORE MERGE: video: 'retain-on-failure', + video: 'on', + + // REMOVE BEFORE MERGE + launchOptions: { + slowMo: 500, + }, }, timeout: 30_000, diff --git a/packages/lib/server-only/document/get-document-by-token.ts b/packages/lib/server-only/document/get-document-by-token.ts index d242e72fd..1594efbe4 100644 --- a/packages/lib/server-only/document/get-document-by-token.ts +++ b/packages/lib/server-only/document/get-document-by-token.ts @@ -1,13 +1,30 @@ import { prisma } from '@documenso/prisma'; import type { DocumentWithRecipient } from '@documenso/prisma/types/document-with-recipient'; -export interface GetDocumentAndSenderByTokenOptions { +export type GetDocumentByTokenOptions = { token: string; -} +}; -export interface GetDocumentAndRecipientByTokenOptions { - token: string; -} +export type GetDocumentAndSenderByTokenOptions = GetDocumentByTokenOptions; +export type GetDocumentAndRecipientByTokenOptions = GetDocumentByTokenOptions; + +export const getDocumentByToken = async ({ token }: GetDocumentByTokenOptions) => { + if (!token) { + throw new Error('Missing token'); + } + + const result = await prisma.document.findFirstOrThrow({ + where: { + Recipient: { + some: { + token, + }, + }, + }, + }); + + return result; +}; export const getDocumentAndSenderByToken = async ({ token, From 5377d27c6a2dfda807369e930f75c4f4596d3da5 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Thu, 21 Mar 2024 16:28:42 +0000 Subject: [PATCH 47/56] chore: test for redirect url --- .../e2e/pr-718-add-stepper-component.spec.ts | 85 +++++++++++++++++++ .../primitives/document-flow/add-subject.tsx | 2 +- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts index 3318afe7a..4327935bb 100644 --- a/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts +++ b/packages/app-tests/e2e/pr-718-add-stepper-component.spec.ts @@ -252,3 +252,88 @@ test('should be able to create, send and sign a document', async ({ page }) => { const { status: completedStatus } = await getDocumentByToken({ token }); expect(completedStatus).toBe(DocumentStatus.COMPLETED); }); + +test('should be able to create, send with redirect url, sign a document and redirect to redirect url', async ({ + page, +}) => { + await page.goto('/signin'); + + const documentTitle = `example-${Date.now()}.pdf`; + + // Sign in + await page.getByLabel('Email').fill(TEST_USER.email); + await page.getByLabel('Password', { exact: true }).fill(TEST_USER.password); + await page.getByRole('button', { name: 'Sign In' }).click(); + + // Upload document + const [fileChooser] = await Promise.all([ + page.waitForEvent('filechooser'), + page.locator('input[type=file]').evaluate((e) => { + if (e instanceof HTMLInputElement) { + e.click(); + } + }), + ]); + + await fileChooser.setFiles(path.join(__dirname, '../../../assets/example.pdf')); + + // Wait to be redirected to the edit page + await page.waitForURL(/\/documents\/\d+/); + + // Set title + await expect(page.getByRole('heading', { name: 'Add Title' })).toBeVisible(); + + await page.getByLabel('Title').fill(documentTitle); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add signers + await expect(page.getByRole('heading', { name: 'Add Signers' })).toBeVisible(); + + await page.getByLabel('Email*').fill('user1@example.com'); + await page.getByLabel('Name').fill('User 1'); + + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add fields + await expect(page.getByRole('heading', { name: 'Add Fields' })).toBeVisible(); + await page.getByRole('button', { name: 'Continue' }).click(); + + // Add subject and send + await expect(page.getByRole('heading', { name: 'Add Subject' })).toBeVisible(); + await page.getByRole('button', { name: 'Advanced Options' }).click(); + await page.getByLabel('Redirect URL').fill('https://documenso.com'); + + await page.getByRole('button', { name: 'Send' }).click(); + + await page.waitForURL('/documents'); + + // Assert document was created + await expect(page.getByRole('link', { name: documentTitle })).toBeVisible(); + await page.getByRole('link', { name: documentTitle }).click(); + + const url = await page.url().split('/'); + const documentId = url[url.length - 1]; + + const { token } = await getRecipientByEmail({ + email: 'user1@example.com', + documentId: Number(documentId), + }); + + await page.goto(`/sign/${token}`); + await page.waitForURL(`/sign/${token}`); + + // Check if document has been viewed + const { status } = await getDocumentByToken({ token }); + expect(status).toBe(DocumentStatus.PENDING); + + await page.getByRole('button', { name: 'Complete' }).click(); + await expect(page.getByRole('dialog').getByText('Sign Document')).toBeVisible(); + await page.getByRole('button', { name: 'Sign' }).click(); + + await page.waitForURL('https://documenso.com'); + + // Check if document has been signed + const { status: completedStatus } = await getDocumentByToken({ token }); + expect(completedStatus).toBe(DocumentStatus.COMPLETED); +}); diff --git a/packages/ui/primitives/document-flow/add-subject.tsx b/packages/ui/primitives/document-flow/add-subject.tsx index bfc7f3fc5..aa0bc148f 100644 --- a/packages/ui/primitives/document-flow/add-subject.tsx +++ b/packages/ui/primitives/document-flow/add-subject.tsx @@ -230,7 +230,7 @@ export const AddSubjectFormPartial = ({