notion-ts-client
Version:
Generates an easy to use and fully typed API to access and modify the data in Notion Databases
77 lines (60 loc) • 2.4 kB
text/typescript
import chalk from 'chalk'
import fs from 'fs'
import { confirmNewDatabases, mergeDatabaseConfigs, moveDefaultReadOnlyPropertiesToTheEnd } from '../parsers'
import { ConfigFile, ConfigFileDatabasesConfig } from '../types'
import { log, logError, logSuccess, logWarn } from './log'
const isEqual = <T>(a?: T[], b?: T[]) => JSON.stringify(a?.sort()) === JSON.stringify(b?.sort())
const defaultConfig: ConfigFile = { ignore: [], databases: {} }
export async function updateConfigFile(configFile: string, dbConfigData: ConfigFileDatabasesConfig) {
if (!fs.existsSync(configFile)) {
logError(`File ${chalk.yellow(configFile)} does not exists, will not update.`)
process.exit(1)
}
const userConfig = readUserConfig(configFile)
const newConfig = await confirmNewDatabases(userConfig, { databases: dbConfigData })
const { mergedDbConfigs, changes } = await mergeDatabaseConfigs(userConfig.databases, newConfig.databases)
const numChanges = Object.keys(changes).length
moveDefaultReadOnlyPropertiesToTheEnd(mergedDbConfigs)
const resultConfig = { ignore: newConfig.ignore, databases: mergedDbConfigs }
if (
numChanges !== 0 ||
!isEqual(
resultConfig.ignore?.map((i) => i.id),
userConfig.ignore?.map((i) => i.id),
)
) {
fs.writeFileSync(configFile, JSON.stringify(resultConfig, null, 2))
logSuccess('Updated config file.')
if (numChanges !== 0) {
log('Changes:', JSON.stringify(changes, null, 2))
}
} else {
log('No changes detected. Not updating the config file.')
}
return resultConfig
}
export function readUserConfig(configPath: string) {
let userConfig: string
if (!fs.existsSync(configPath)) {
logWarn(`File ${chalk.yellow(configPath)} does not exists. Creating it...`)
fs.writeFileSync(configPath, JSON.stringify(defaultConfig, null, 2))
return defaultConfig
}
try {
userConfig = fs.readFileSync(configPath, 'utf8')
} catch (err) {
logError(`Failed reading ${chalk.yellow(configPath)}.`, err)
process.exit(1)
}
try {
const userConfigData = JSON.parse(userConfig) as ConfigFile
if (!userConfigData.databases) {
logWarn(`File ${chalk.yellow(configPath)} is invalid, will overwrite...`)
return defaultConfig
}
return userConfigData
} catch (err) {
logError(`Error parsing ${chalk.yellow(configPath)}.`, err)
process.exit(1)
}
}