-
Notifications
You must be signed in to change notification settings - Fork 86
/
Copy pathhandleFileTracking.js
61 lines (49 loc) · 2.43 KB
/
handleFileTracking.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
const { join } = require('path')
const findCacheDir = require('find-cache-dir')
const { existsSync, readdirSync, readFileSync, removeSync, writeFileSync } = require('fs-extra')
const { NETLIFY_PUBLISH_PATH, NETLIFY_FUNCTIONS_PATH } = require('../config')
const TRACKING_FILE_SEPARATOR = '---'
const getDifference = (before, after) => after.filter((filePath) => !before.includes(filePath))
// Clean configured publish and functions folders and track next-on-netlify files
// for future cleans
const handleFileTracking = ({ functionsPath, publishPath }) => {
const isConfiguredFunctionsDir = functionsPath !== NETLIFY_FUNCTIONS_PATH
const isConfiguredPublishDir = publishPath !== NETLIFY_PUBLISH_PATH
const cacheDir = findCacheDir({ name: 'next-on-netlify', create: true })
if (!cacheDir) return () => {}
const trackingFilePath = join(cacheDir, '.nonfiletracking')
if (existsSync(trackingFilePath)) {
const trackingFile = readFileSync(trackingFilePath, 'utf8')
const [trackedFunctions, trackedPublish] = trackingFile.split(TRACKING_FILE_SEPARATOR)
const cleanConfiguredFiles = (trackedFiles, dirPath) => {
trackedFiles
.map((file) => file.trim())
.filter(Boolean)
.forEach((file) => {
const filePath = join(dirPath, file)
removeSync(filePath)
})
}
if (isConfiguredPublishDir) {
cleanConfiguredFiles(trackedPublish.split('\n'), publishPath)
}
if (isConfiguredFunctionsDir) {
cleanConfiguredFiles(trackedFunctions.split('\n'), functionsPath)
}
}
const functionsBeforeRun = existsSync(functionsPath) ? readdirSync(functionsPath) : []
const publishBeforeRun = existsSync(publishPath) ? readdirSync(publishPath) : []
// this callback will run at the end of nextOnNetlify()
const trackNewFiles = () => {
const functionsAfterRun =
isConfiguredFunctionsDir && existsSync(functionsPath) ? readdirSync(functionsPath) : functionsBeforeRun
const publishAfterRun =
isConfiguredPublishDir && existsSync(publishPath) ? readdirSync(publishPath) : publishBeforeRun
const newFunctionsFiles = getDifference(functionsBeforeRun, functionsAfterRun)
const newPublishFiles = getDifference(publishBeforeRun, publishAfterRun)
const allTrackedFiles = [...newFunctionsFiles, TRACKING_FILE_SEPARATOR, ...newPublishFiles]
writeFileSync(trackingFilePath, allTrackedFiles.join('\n'))
}
return trackNewFiles
}
module.exports = handleFileTracking