serverless/lib/utils/rename-service.js
2024-05-29 11:51:04 -04:00

69 lines
2.1 KiB
JavaScript

import path from 'path'
import fse from 'fs-extra'
import fileExistsSync from './fs/file-exists-sync.js'
import readFileSync from './fs/read-file-sync.js'
import writeFileSync from './fs/write-file-sync.js'
import ServerlessError from '../serverless-error.js'
function renameYmlService(name, ymlServiceFile) {
const serverlessYml = fse
.readFileSync(ymlServiceFile, 'utf-8')
.replace(
/(^|\s|#)service\s*:.+/,
(ignore, prefix) => `${prefix}service: ${name}`,
)
.replace(
/(^|\s|#)service\s*:\s*\n(\s+)name:.+/,
(match, prefix, indent) => `${prefix}service:\n${indent}name: ${name}`,
)
fse.writeFileSync(ymlServiceFile, serverlessYml)
}
function renameTsService(name, tsServicefile) {
const serverlessTs = fse
.readFileSync(tsServicefile, 'utf-8')
.replace(
/(^|\s)service\s*:\s*('|").+('|")/,
(ignore, prefix) => `${prefix}service: '${name}'`,
)
.replace(
/(^|\s)service\s*:\s*{\s*\n(\s+)name:\s*('|").+('|")/,
(match, prefix, indent) =>
`${prefix}service: {\n${indent}name: '${name}'`,
)
fse.writeFileSync(tsServicefile, serverlessTs)
}
export const renameService = (name, serviceDir) => {
const packageFile = path.join(serviceDir, 'package.json')
if (fileExistsSync(packageFile)) {
const json = readFileSync(packageFile)
writeFileSync(packageFile, Object.assign(json, { name }))
}
const packageLockFile = path.join(serviceDir, 'package-lock.json')
if (fileExistsSync(packageLockFile)) {
const json = readFileSync(packageLockFile)
writeFileSync(packageLockFile, Object.assign(json, { name }))
}
const ymlServiceFile = path.join(serviceDir, 'serverless.yml')
if (fileExistsSync(ymlServiceFile)) {
renameYmlService(name, ymlServiceFile)
return name
}
const tsServiceFile = path.join(serviceDir, 'serverless.ts')
if (fileExistsSync(tsServiceFile)) {
renameTsService(name, tsServiceFile)
return name
}
const errorMessage = [
'serverless.yml or serverlss.ts not found in',
` ${serviceDir}`,
].join('')
throw new ServerlessError(errorMessage, 'MISSING_SERVICE_FILE')
}