| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import fs from 'fs'
- import chalk from 'chalk'
- import Constants from '../src/constants/index.js'
- let errorSum = 0
- const exampleFilesFolder = './bootstrap-table-examples/'
- const exampleFilesFound = fs.existsSync(exampleFilesFolder)
- let exampleFiles = []
- if (exampleFilesFound) {
- exampleFiles = [
- ...fs.readdirSync(exampleFilesFolder + 'welcomes'),
- ...fs.readdirSync(exampleFilesFolder + 'options'),
- ...fs.readdirSync(exampleFilesFolder + 'column-options'),
- ...fs.readdirSync(exampleFilesFolder + 'methods')
- ]
- } else {
- console.log((chalk.yellow(chalk.bold('Warning: ') + 'Cant check if example files are correct formatted and have a valid url.')))
- console.log((chalk.yellow(chalk.bold('Warning: ') + 'To enable that check, please clone the "bootstrap-table-examples" repository in the tools folder or create a symlink (if you already cloned the repository on an other path).')))
- }
- class API {
- constructor () {
- this.init()
- this.sortOptions()
- this.check()
- }
- sortOptions () {
- this.options.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
- }
- check () {
- const file = `../site/docs/api/${this.file}`
- const md = {}
- const content = fs.readFileSync(file).toString()
- const lines = content.split('## ')
- const outLines = lines.slice(0, 1)
- const errors = []
- const exampleRegex = /\[.*\]\(.*\/(.*\.html)\)/m
- const attributeRegex = /\*\*Attribute:\*\*\s`(.*)data-(.*)`/m
- for (const item of lines.slice(1)) {
- md[item.split('\n')[0]] = item
- }
- console.log('-------------------------')
- console.log(`Checking file: ${file}`)
- console.log('-------------------------')
- const noDefaults = Object.keys(md).filter(it => !this.options.includes(it))
- if (noDefaults.length) {
- errorSum += noDefaults.length
- console.log(chalk.red(`No default option was found for "${noDefaults.join(', ')}", should the documentation be removed!`))
- return
- }
- for (const [i, key] of this.options.entries()) {
- try {
- if (md[key]) {
- outLines.push(md[key])
- const details = md[key].split('\n\n- ')
- for (let i = 0; i < this.attributes.length; i++) {
- const name = this.attributes[i]
- if (this.ignore && this.ignore[key] && this.ignore[key].includes(name)) {
- continue
- }
- const tmpDetails = details[i + 1].trim()
- if (name === 'Example' && exampleFilesFound) {
- const matches = exampleRegex.exec(tmpDetails)
- if (!matches) {
- errors.push(chalk.red(`[${key}] missing or wrong formatted example`, `"${tmpDetails}"`))
- continue
- }
- if (!exampleFiles.includes(matches[1])) {
- errors.push(chalk.red(`[${key}] example '${matches[1]}' could not be found`))
- }
- } else if (name === 'Attribute' && key !== 'columns') {
- const attributeMatches = attributeRegex.exec(tmpDetails)
- if (!attributeMatches) {
- errors.push(chalk.red(`[${key}] missing or wrong formatted attribute`, `"${tmpDetails}"`))
- continue
- }
- }
- if (!tmpDetails || tmpDetails.indexOf(`**${name}:**`) === -1) {
- errors.push(chalk.red(`[${key}] missing '${name}'`))
- }
- }
- } else {
- errors.push(chalk.red(`[${key}] option could not be found`))
- }
- } catch (ex) {
- console.log(ex)
- }
- }
- errorSum += errors.length
- if (errors.length > 0) {
- errors.forEach((error) => {
- console.log(error)
- })
- }
- fs.writeFileSync(file, outLines.join('## '))
- }
- }
- class TableOptions extends API {
- init () {
- this.file = 'table-options.md'
- this.options = Object.keys(Constants.DEFAULTS).filter(it => {
- return !/^(on|format)[A-Z]/.test(it)
- })
- this.options.unshift('-')
- this.attributes = ['Attribute', 'Type', 'Detail', 'Default', 'Example']
- this.ignore = {
- totalRows: ['Example'],
- totalNotFiltered: ['Example'],
- virtualScrollItemHeight: ['Example']
- }
- }
- }
- class ColumnOptions extends API {
- init () {
- this.file = 'column-options.md'
- this.options = Object.keys(Constants.COLUMN_DEFAULTS)
- this.attributes = ['Attribute', 'Type', 'Detail', 'Default', 'Example']
- }
- }
- class Methods extends API {
- init () {
- this.file = 'methods.md'
- this.options = Constants.METHODS
- this.attributes = ['Parameter', 'Detail', 'Example']
- }
- }
- class Events extends API {
- init () {
- this.file = 'events.md'
- this.options = Object.values(Constants.EVENTS)
- this.attributes = ['jQuery Event', 'Parameter', 'Detail']
- }
- }
- class Localizations extends API {
- init () {
- this.file = 'localizations.md'
- this.options = Object.keys(Constants.LOCALES.en)
- this.attributes = ['Parameter', 'Default']
- }
- }
- new TableOptions()
- new ColumnOptions()
- new Methods()
- new Events()
- new Localizations()
- if (errorSum === 0) {
- console.log('Good job! Anything up to date!')
- process.exit(0)
- }
- process.exit(1)
|