i forget what did i do

This commit is contained in:
mbaharip
2023-08-10 22:21:55 +07:00
parent 4b7b7d994e
commit d6f42b0c83
18 changed files with 322 additions and 147 deletions
+2
View File
@@ -40,3 +40,5 @@ next-env.d.ts
/.next
/.vscode
/src/pages/api/legacy/
.vercel
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="TypeScriptCompiler">
<option name="recompileOnChanges" value="true" />
</component>
</project>
+2
View File
@@ -1,3 +1,5 @@
- Redo how to handle error
# /
- ~~Override opengraph using banner image~~
- ~~Render readme file~~
+1 -1
View File
@@ -23,7 +23,7 @@
"googleapis": "^118.0.0",
"jsonwebtoken": "^9.0.0",
"mime-types": "^2.1.35",
"next": "^13.4.3",
"next": "^13.4.4",
"next-seo": "^6.0.0",
"nextjs-progressbar": "^0.0.16",
"postcss": "8.4.22",
@@ -0,0 +1,82 @@
import { NextRequest, NextResponse } from "next/server";
import createErrorPayload from "utils/apiHelper/createErrorPayload";
import gdrive from "utils/apiHelper/gdrive";
import shortEncryption from "utils/encryptionHelper/shortEncryption";
import ExtendedError from "utils/generalHelper/extendedError";
import { Constant } from "types/general/constant";
import apiConfig from "config/api.config";
export async function GET(
request: NextRequest,
{ params }: { params: { encryptedFileId: string } },
) {
const _start = Date.now();
const { encryptedFileId } = params;
try {
const getMetadata = gdrive.files.get({
fileId: shortEncryption.decrypt(encryptedFileId),
fields: "id, name, mimeType, webContentLink",
});
const getStream = gdrive.files.get(
{
fileId: shortEncryption.decrypt(encryptedFileId),
alt: "media",
},
{ responseType: "arraybuffer" },
);
const [metadata, stream] = await Promise.all([
getMetadata,
getStream,
]);
if (!metadata || metadata.data.trashed) {
throw new ExtendedError(
Constant.apiFileNotFound,
404,
"notFound",
Constant.reasonNotFound,
);
}
if (
Number(metadata.data.size) >
apiConfig.files.download.maxFileSize &&
apiConfig.files.download.maxFileSize > 0
) {
return NextResponse.redirect(
metadata.data.webContentLink as string,
{
status: 302,
},
);
}
const imgBuffer = (await stream.data) as ArrayBuffer;
return new NextResponse(imgBuffer, {
status: 200,
headers: {
"Content-Type":
metadata.data.mimeType ||
"application/octet-stream",
"Cache-Control": apiConfig.cacheControl,
"Content-Disposition": `inline; filename="${metadata.data.name}"`,
},
});
} catch (error: any) {
const payload = createErrorPayload(
error,
"GET /api/banner/:id",
_start,
);
return NextResponse.json(payload, {
status: payload.code,
});
}
}
+12 -63
View File
@@ -45,78 +45,28 @@ export async function GET(
});
if (!file || file.data.trashed) {
const msg = file.data.trashed
? "File has been deleted"
: "File not found";
throw new ExtendedError(
Constant.apiFileNotFound,
404,
"notFound",
msg,
Constant.reasonNotFound,
);
}
/**
* If fetched file isn't a folder, return File
*/
if (
file.data.mimeType !==
"application/vnd.google-apps.folder"
) {
if (thumbnail === "1") {
if (!file.data.thumbnailLink) {
const imgStream = await fetch(
`${apiConfig.basePath}/og.png`,
).then((res) => res.arrayBuffer());
return new NextResponse(imgStream, {
status: 200,
});
}
if (file.data.mimeType?.startsWith("image/")) {
const imgStream = await gdrive.files.get(
{
fileId: id,
alt: "media",
},
{ responseType: "stream" },
);
if (
Number(file.data.size) <
apiConfig.files.download.maxFileSize &&
apiConfig.files.download.maxFileSize > 0
) {
const arrayBuffer =
await new Promise<ArrayBuffer>(
(resolve, reject) => {
const chunks: Buffer[] = [];
imgStream.data.on("data", (chunk) =>
chunks.push(chunk),
);
imgStream.data.on("end", () => {
const buffer = Buffer.concat(chunks);
resolve(
buffer.buffer.slice(
buffer.byteOffset,
buffer.byteOffset +
buffer.byteLength,
),
);
});
imgStream.data.on("error", reject);
},
);
return new NextResponse(arrayBuffer, {
status: 200,
headers: {
"Content-Type":
file.data.mimeType ||
"application/octet-stream",
"Cache-Control": apiConfig.cacheControl,
"Content-Disposition": `inline; filename="${file.data.name}"`,
},
});
}
}
return NextResponse.redirect(
file.data.thumbnailLink as string,
`${
apiConfig.basePath
}/api/thumbnail/${shortEncryption.encrypt(
id as string,
)}`,
{
status: 302,
},
@@ -148,9 +98,8 @@ export async function GET(
}
const query = [
...apiConfig.files.query,
`'${id}' in parents`,
"trashed = false",
"'me' in owners",
];
const fetchFolderContents = await gdrive.files.list({
q: `${query.join(" and ")}`,
@@ -195,7 +144,7 @@ export async function GET(
return NextResponse.redirect(
`${
apiConfig.basePath
}/api/banner?id=${shortEncryption.encrypt(
}/api/banner/${shortEncryption.encrypt(
bannerFile.id as string,
)}`,
{
@@ -263,7 +212,7 @@ export async function GET(
} catch (error: any) {
const payload = createErrorPayload(
error,
"GET /api/files",
"GET /api/files/:id",
_start,
);
+3 -4
View File
@@ -23,9 +23,8 @@ export async function GET(request: NextRequest) {
);
const query: string[] = [
"trashed = false",
"'me' in owners",
`parents = '${apiConfig.files.rootFolder}'`,
...apiConfig.files.query,
`'${apiConfig.files.rootFolder}' in parents`,
];
const fetchFolderContents = await gdrive.files.list({
q: `${query.join(" and ")}`,
@@ -70,7 +69,7 @@ export async function GET(request: NextRequest) {
return NextResponse.redirect(
`${
apiConfig.basePath
}/api/banner?id=${shortEncryption.encrypt(
}/api/banner/${shortEncryption.encrypt(
bannerFile.id as string,
)}`,
{
@@ -0,0 +1,103 @@
import { NextRequest, NextResponse } from "next/server";
import createErrorPayload from "utils/apiHelper/createErrorPayload";
import gdrive from "utils/apiHelper/gdrive";
import shortEncryption from "utils/encryptionHelper/shortEncryption";
import ExtendedError from "utils/generalHelper/extendedError";
import { Constant } from "types/general/constant";
import apiConfig from "config/api.config";
export async function GET(
request: NextRequest,
{ params }: { params: { encryptedFileId: string } },
) {
const _start = Date.now();
const { encryptedFileId } = params;
try {
const getMetadata = gdrive.files.get({
fileId: shortEncryption.decrypt(encryptedFileId),
fields:
"id, name, mimeType, webContentLink, thumbnailLink, size",
});
const getStream = gdrive.files.get(
{
fileId: shortEncryption.decrypt(encryptedFileId),
alt: "media",
},
{ responseType: "arraybuffer" },
);
const [metadata, stream] = await Promise.all([
getMetadata,
getStream,
]);
if (!metadata || metadata.data.trashed) {
throw new ExtendedError(
Constant.apiFileNotFound,
404,
"notFound",
Constant.reasonNotFound,
);
}
if (!metadata.data.thumbnailLink) {
const imgStream = await fetch(
`${apiConfig.basePath}/og.png`,
).then((res) => res.arrayBuffer());
return new NextResponse(imgStream, {
status: 200,
headers: {
"Content-Type":
metadata.data.mimeType ||
"application/octet-stream",
"Cache-Control": apiConfig.cacheControl,
"Content-Disposition": `inline; filename="${metadata.data.name}"`,
},
});
}
const isWithinMaxFileSize =
Number(metadata.data.size) <
apiConfig.files.download.maxFileSize &&
apiConfig.files.download.maxFileSize > 0;
if (
metadata.data.mimeType?.startsWith("image") &&
isWithinMaxFileSize
) {
const imgBuffer = (await stream.data) as ArrayBuffer;
return new NextResponse(imgBuffer, {
status: 200,
headers: {
"Cache-Control": apiConfig.cacheControl,
},
});
}
return NextResponse.redirect(
metadata.data.thumbnailLink as string,
{
status: 302,
headers: {
"Cache-Control": apiConfig.cacheControl,
},
},
);
} catch (error: any) {
const payload = createErrorPayload(
error,
"GET /api/thumbnail/:id",
_start,
);
return NextResponse.json(payload, {
status: payload.code,
});
}
}
-1
View File
@@ -120,7 +120,6 @@ async function FilePage({ params }: Props) {
if (!pathValidation.success) {
const errorData = pathValidation as API_Error;
console.error(errorData);
const payload = handleError(errorData);
throw new Error(payload);
}
+15 -16
View File
@@ -24,24 +24,23 @@ export default function Error({
const [path, setPath] = useState<string>("root");
useEffect(() => {
console.log("CHECKPOINT ERROR PAGE", error);
if (error.message.includes("{")) {
console.log("CHECKPOINT ERROR MESSAGE IS JSON");
const errorObj = JSON.parse(
error.message,
) as ExtendedError;
const extendError = new ExtendedError(
errorObj.extendedMessage ||
errorObj.extendedMessage ??
Constant.apiInternalError,
errorObj.code || 500,
errorObj.category || "internalServerError",
errorObj.reason || "Internal Server Error",
errorObj.code ?? 500,
errorObj.category ?? "internalServerError",
errorObj.reason ?? "Internal Server Error",
);
console.log("CHECKPOINT EXTENDED ERROR", extendError);
setExtendedError(extendError);
console.log(extendError.code);
const path =
extendError.reason?.split('"')[1].split('"')[0] ||
extendError.reason?.split('"')[1]?.split('"')[0] ??
"root";
setPath(path);
} else {
@@ -55,14 +54,14 @@ export default function Error({
}
}, [error]);
useEffect(() => {
if (extendedError?.code === 401) {
router.push(
`/password?redirect=${pathname}&path=${path}`,
);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [extendedError, path, pathname]);
// useEffect(() => {
// if (extendedError?.code === 401) {
// router.push(
// `/password?redirect=${pathname}&path=${path}`,
// );
// }
// // eslint-disable-next-line react-hooks/exhaustive-deps
// }, [extendedError, path, pathname]);
return (
<div
+7 -2
View File
@@ -23,9 +23,14 @@ function RootLoading() {
</div>
<div
className={
"skeleton h-full min-h-[50dvh] w-full rounded-lg px-4 py-2"
"skeleton h-full min-h-[30dvh] w-full rounded-lg px-4 py-2"
}
></div>
/>
<div
className={
"skeleton h-full min-h-[30dvh] w-full rounded-lg px-4 py-2"
}
/>
</div>
);
}
-1
View File
@@ -1,7 +1,6 @@
import Link from "next/link";
function NotFound() {
console.log("Not Found");
return (
<div
className={
+1 -1
View File
@@ -40,7 +40,7 @@ export const metadata: Metadata = {
async function RootPage() {
const passwordCookies =
cookies().get(Constant.cookiePassword)?.value || "";
cookies().get(Constant.cookiePassword)?.value ?? "";
const getPathValidation = fetch(
`${apiConfig.basePath}/api/validate`,
+5 -2
View File
@@ -18,6 +18,7 @@ module.exports = {
"640e3e38dd31aec254f214ba38541a82ddb615e73ce9c6129f33ef549b154ab9",
files: {
query: ["trashed = false"],
field:
"id, name, mimeType, thumbnailLink, fileExtension, modifiedTime, size, imageMediaMetadata, videoMediaMetadata, webContentLink, iconLink, trashed",
orderBy: "folder, name asc, modifiedTime desc",
@@ -40,8 +41,10 @@ module.exports = {
searchResult: 10,
/**
* Starting point of the drive
* Use 'root' to use My Drive as starting point
* Or use folder id to use a specific folder as starting point
* U̶s̶e̶ ̶'̶r̶o̶o̶t̶'̶ ̶t̶o̶ ̶u̶s̶e̶ ̶M̶y̶ ̶D̶r̶i̶v̶e̶ ̶a̶s̶ ̶s̶t̶a̶r̶t̶i̶n̶g̶ ̶p̶o̶i̶n̶t̶
* O̶r̶ ̶u̶s̶e̶ ̶f̶o̶l̶d̶e̶r̶ ̶i̶d̶ ̶t̶o̶ ̶u̶s̶e̶ ̶a̶ ̶s̶p̶e̶c̶i̶f̶i̶c̶ ̶f̶o̶l̶d̶e̶r̶ ̶a̶s̶ ̶s̶t̶a̶r̶t̶i̶n̶g̶ ̶p̶o̶i̶n̶t̶
* Since service account can't access 'root' folder, we need to use folder id
* Why using service account? Since refresh token always expired, I need to use service account to make sure the app always work
*/
rootFolder: "1KgPV6QB1GYT8fmn2uTfbtr9rDXqcRR0j",
download: {
+2 -1
View File
@@ -76,7 +76,8 @@ html, body {
}
button {
@apply bg-blue-600 text-zinc-100 px-4 py-2 rounded-xl opacity-100;
@apply bg-blue-600 text-zinc-100 px-4 py-2 opacity-100;
@apply rounded-xl focus:rounded-xl active:rounded-xl;
@apply hover:bg-blue-500 hover:text-zinc-100;
@apply active:bg-blue-700 active:text-zinc-100;
@apply focus:outline-none;
+2
View File
@@ -6,6 +6,8 @@ export enum Constant {
apiBadRequest = "Bad request",
apiInternalError = "Internal server error",
reasonNotFound = "Can't find file you requested. It may have been deleted or you may not have permission to access it.",
cookiePassword = "next-gdrive-password",
cookieMaster = "x-gdrive-key",
+25 -1
View File
@@ -9,6 +9,17 @@ const config = {
refresh_token: process.env.DRIVE_REFRESH_TOKEN,
};
const serviceAccountConfig = {
email: process.env.DRIVE_SERVICE_EMAIL,
key: (process.env.DRIVE_SERVICE_KEY as string).replace(
/\\n/g,
"\n",
),
projectId: process.env.DRIVE_SERVICE_PROJECT_ID,
clientId: process.env.DRIVE_SERVICE_CLIENT,
scopes: ["https://www.googleapis.com/auth/drive"],
};
//TODO: Refetch token if it's become invalid
let gdrive: drive_v3.Drive | undefined;
@@ -21,8 +32,21 @@ const oauth2Client = new google.auth.OAuth2({
oauth2Client.setCredentials({
refresh_token: config.refresh_token as string,
});
const serviceAccountAuth = new google.auth.GoogleAuth({
credentials: {
type: "service_account",
private_key: serviceAccountConfig.key,
client_email: serviceAccountConfig.email,
client_id: serviceAccountConfig.clientId,
},
projectId: serviceAccountConfig.projectId,
scopes: serviceAccountConfig.scopes,
});
gdrive = google.drive({
version: "v3",
auth: oauth2Client,
auth: serviceAccountAuth,
});
export default gdrive as drive_v3.Drive;
+54 -54
View File
@@ -290,10 +290,10 @@
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"
"@next/env@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.3.tgz#cb00bdd43a0619a79a52c9336df8a0aa84f8f4bf"
integrity sha512-pa1ErjyFensznttAk3EIv77vFbfSYT6cLzVRK5jx4uiRuCQo+m2wCFAREaHKIy63dlgvOyMlzh6R8Inu8H3KrQ==
"@next/env@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.4.tgz#46b620f6bef97fe67a1566bf570dbb791d40c50a"
integrity sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==
"@next/eslint-plugin-next@13.4.3":
version "13.4.3"
@@ -302,50 +302,50 @@
dependencies:
glob "7.1.7"
"@next/swc-darwin-arm64@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.3.tgz#2d6c99dd5afbcce37e4ba0f64196317a1259034d"
integrity sha512-yx18udH/ZmR4Bw4M6lIIPE3JxsAZwo04iaucEfA2GMt1unXr2iodHUX/LAKNyi6xoLP2ghi0E+Xi1f4Qb8f1LQ==
"@next/swc-darwin-arm64@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.4.tgz#8c14083c2478e2a9a8d140cce5900f76b75667ff"
integrity sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==
"@next/swc-darwin-x64@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.3.tgz#162b15fb8a54d9f64e69c898ebeb55b7dac9bddd"
integrity sha512-Mi8xJWh2IOjryAM1mx18vwmal9eokJ2njY4nDh04scy37F0LEGJ/diL6JL6kTXi0UfUCGbMsOItf7vpReNiD2A==
"@next/swc-darwin-x64@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.4.tgz#5fe01c65c80fcb833c8789fd70f074ea99893864"
integrity sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==
"@next/swc-linux-arm64-gnu@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.3.tgz#aee57422f11183d6a2e4a2e8aa23b9285873e18f"
integrity sha512-aBvtry4bxJ1xwKZ/LVPeBGBwWVwxa4bTnNkRRw6YffJnn/f4Tv4EGDPaVeYHZGQVA56wsGbtA6nZMuWs/EIk4Q==
"@next/swc-linux-arm64-gnu@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.4.tgz#f2e071f38e8a6cdadf507cc5d28956f73360d064"
integrity sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==
"@next/swc-linux-arm64-musl@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.3.tgz#c10b6aaaa47b341c6c9ea15f8b0ddb37e255d035"
integrity sha512-krT+2G3kEsEUvZoYte3/2IscscDraYPc2B+fDJFipPktJmrv088Pei/RjrhWm5TMIy5URYjZUoDZdh5k940Dyw==
"@next/swc-linux-arm64-musl@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.4.tgz#23bf75c544e54562bc24ec1be036e4bd9cf89e2c"
integrity sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==
"@next/swc-linux-x64-gnu@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.3.tgz#3f85bc5591c6a0d4908404f7e88e3c04f4462039"
integrity sha512-AMdFX6EKJjC0G/CM6hJvkY8wUjCcbdj3Qg7uAQJ7PVejRWaVt0sDTMavbRfgMchx8h8KsAudUCtdFkG9hlEClw==
"@next/swc-linux-x64-gnu@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.4.tgz#bd42590950a01957952206f89cf5622e7c9e4196"
integrity sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==
"@next/swc-linux-x64-musl@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.3.tgz#f4535adc2374a86bc8e43af149b551567df065de"
integrity sha512-jySgSXE48shaLtcQbiFO9ajE9mqz7pcAVLnVLvRIlUHyQYR/WyZdK8ehLs65Mz6j9cLrJM+YdmdJPyV4WDaz2g==
"@next/swc-linux-x64-musl@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.4.tgz#907d81feb1abec3daec0ecb61e3f39b56e7aeafe"
integrity sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==
"@next/swc-win32-arm64-msvc@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.3.tgz#e76106d85391c308c5ed70cda2bca2c582d65536"
integrity sha512-5DxHo8uYcaADiE9pHrg8o28VMt/1kR8voDehmfs9AqS0qSClxAAl+CchjdboUvbCjdNWL1MISCvEfKY2InJ3JA==
"@next/swc-win32-arm64-msvc@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.4.tgz#1d754d2bb10bdf9907c0acc83711438697c3b5fe"
integrity sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==
"@next/swc-win32-ia32-msvc@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.3.tgz#8eb5d9dd71ed7a971671291605ad64ad522fb3bc"
integrity sha512-LaqkF3d+GXRA5X6zrUjQUrXm2MN/3E2arXBtn5C7avBCNYfm9G3Xc646AmmmpN3DJZVaMYliMyCIQCMDEzk80w==
"@next/swc-win32-ia32-msvc@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.4.tgz#77b2c7f7534b675d46e46301869e08d504d23956"
integrity sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==
"@next/swc-win32-x64-msvc@13.4.3":
version "13.4.3"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.3.tgz#c7b2b1b9e158fd7749f8209e68ee8e43a997eb4c"
integrity sha512-jglUk/x7ZWeOJWlVoKyIAkHLTI+qEkOriOOV+3hr1GyiywzcqfI7TpFSiwC7kk1scOiH7NTFKp8mA3XPNO9bDw==
"@next/swc-win32-x64-msvc@13.4.4":
version "13.4.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.4.tgz#faab69239f8a9d0be7cd473e65f5a07735ef7b0e"
integrity sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -3977,12 +3977,12 @@ next-seo@^6.0.0:
resolved "https://registry.yarnpkg.com/next-seo/-/next-seo-6.0.0.tgz#4568dc61a44dbdf5fe5ff44156cd0ff8804889a2"
integrity sha512-jKKt1p1z4otMA28AyeoAONixVjdYmgFCWwpEFtu+DwRHQDllVX3RjtyXbuCQiUZEfQ9rFPBpAI90vDeLZlMBdg==
next@^13.4.3:
version "13.4.3"
resolved "https://registry.yarnpkg.com/next/-/next-13.4.3.tgz#7f417dec9fa2731d8c1d1819a1c7d0919ad6fc75"
integrity sha512-FV3pBrAAnAIfOclTvncw9dDohyeuEEXPe5KNcva91anT/rdycWbgtu3IjUj4n5yHnWK8YEPo0vrUecHmnmUNbA==
next@^13.4.4:
version "13.4.4"
resolved "https://registry.yarnpkg.com/next/-/next-13.4.4.tgz#d1027c8d77f4c51be0b39f671b4820db03c93e60"
integrity sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==
dependencies:
"@next/env" "13.4.3"
"@next/env" "13.4.4"
"@swc/helpers" "0.5.1"
busboy "1.6.0"
caniuse-lite "^1.0.30001406"
@@ -3990,15 +3990,15 @@ next@^13.4.3:
styled-jsx "5.1.1"
zod "3.21.4"
optionalDependencies:
"@next/swc-darwin-arm64" "13.4.3"
"@next/swc-darwin-x64" "13.4.3"
"@next/swc-linux-arm64-gnu" "13.4.3"
"@next/swc-linux-arm64-musl" "13.4.3"
"@next/swc-linux-x64-gnu" "13.4.3"
"@next/swc-linux-x64-musl" "13.4.3"
"@next/swc-win32-arm64-msvc" "13.4.3"
"@next/swc-win32-ia32-msvc" "13.4.3"
"@next/swc-win32-x64-msvc" "13.4.3"
"@next/swc-darwin-arm64" "13.4.4"
"@next/swc-darwin-x64" "13.4.4"
"@next/swc-linux-arm64-gnu" "13.4.4"
"@next/swc-linux-arm64-musl" "13.4.4"
"@next/swc-linux-x64-gnu" "13.4.4"
"@next/swc-linux-x64-musl" "13.4.4"
"@next/swc-win32-arm64-msvc" "13.4.4"
"@next/swc-win32-ia32-msvc" "13.4.4"
"@next/swc-win32-x64-msvc" "13.4.4"
nextjs-progressbar@^0.0.16:
version "0.0.16"