summaryrefslogtreecommitdiff
path: root/packages/integrations/vercel/src/lib/nft.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/integrations/vercel/src/lib/nft.ts')
-rw-r--r--packages/integrations/vercel/src/lib/nft.ts38
1 files changed, 38 insertions, 0 deletions
diff --git a/packages/integrations/vercel/src/lib/nft.ts b/packages/integrations/vercel/src/lib/nft.ts
new file mode 100644
index 000000000..d88429714
--- /dev/null
+++ b/packages/integrations/vercel/src/lib/nft.ts
@@ -0,0 +1,38 @@
+import * as fs from 'node:fs/promises';
+import { fileURLToPath } from 'node:url';
+import { nodeFileTrace } from '@vercel/nft';
+
+export async function copyDependenciesToFunction(
+ root: URL,
+ functionFolder: URL,
+ serverEntry: string
+) {
+ const entryPath = fileURLToPath(new URL(`./${serverEntry}`, functionFolder));
+
+ const result = await nodeFileTrace([entryPath], {
+ base: fileURLToPath(root),
+ });
+
+ for (const file of result.fileList) {
+ if (file.startsWith('.vercel/')) continue;
+ const origin = new URL(file, root);
+ const dest = new URL(file, functionFolder);
+
+ const meta = await fs.stat(origin);
+ const isSymlink = (await fs.lstat(origin)).isSymbolicLink();
+
+ // Create directories recursively
+ if (meta.isDirectory() && !isSymlink) {
+ await fs.mkdir(new URL('..', dest), { recursive: true });
+ } else {
+ await fs.mkdir(new URL('.', dest), { recursive: true });
+ }
+
+ if (isSymlink) {
+ const link = await fs.readlink(origin);
+ await fs.symlink(link, dest, meta.isDirectory() ? 'dir' : 'file');
+ } else {
+ await fs.copyFile(origin, dest);
+ }
+ }
+}