58 lines
1.7 KiB
TypeScript
58 lines
1.7 KiB
TypeScript
|
import * as fs from 'fs'
|
||
|
import * as path from 'path'
|
||
|
import * as yaml from 'yaml'
|
||
|
|
||
|
describe(`Docker-compose`, () => {
|
||
|
test(`should exclude all node_modules folders`, () => {
|
||
|
const dockerComposeFile = fs.readFileSync(
|
||
|
path.join(__dirname, '../docker-compose.yml'),
|
||
|
{encoding: 'utf8'},
|
||
|
)
|
||
|
|
||
|
const yamlContent = yaml.parse(dockerComposeFile)
|
||
|
const dockerVolumes = yamlContent.services['node'].volumes
|
||
|
const dockerVolumesThatExludeNodeModules = dockerVolumes.filter(
|
||
|
(volume: string) => volume.includes('node_modules'),
|
||
|
)
|
||
|
|
||
|
const allFoldersToExclude = findAllNodejsFoldersAt(
|
||
|
path.join(__dirname, '..'),
|
||
|
).map((fullPath) => {
|
||
|
return path.join(
|
||
|
'/app',
|
||
|
path.relative(path.join(__dirname, '..'), fullPath),
|
||
|
)
|
||
|
})
|
||
|
|
||
|
const missingExclusions = allFoldersToExclude.filter(
|
||
|
(folder) => !dockerVolumesThatExludeNodeModules.includes(folder),
|
||
|
)
|
||
|
|
||
|
if (missingExclusions.length > 0) {
|
||
|
throw new Error(
|
||
|
`Some node_modules folders are not excluded from docker-compose.yml. You should add them
|
||
|
to the voluems section of the node service:\n${missingExclusions
|
||
|
.map((s) => '- ' + s)
|
||
|
.join('\n')}`,
|
||
|
)
|
||
|
}
|
||
|
})
|
||
|
})
|
||
|
|
||
|
function findAllNodejsFoldersAt(dir: string): string[] {
|
||
|
const files = fs.readdirSync(dir)
|
||
|
const found: string[] = []
|
||
|
for (const file of files) {
|
||
|
if (file === 'package.json') {
|
||
|
found.push(path.join(dir, 'node_modules'))
|
||
|
} else if (file !== 'node_modules') {
|
||
|
const filePath = path.join(dir, file)
|
||
|
const stats = fs.statSync(filePath)
|
||
|
if (stats.isDirectory()) {
|
||
|
found.push(...findAllNodejsFoldersAt(filePath))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return found
|
||
|
}
|