purgetss
Version:
A package that simplifies mobile app creation for Titanium developers.
208 lines (172 loc) • 6.68 kB
JavaScript
/**
* PurgeTSS v7.1 - Init Command
*
* CLI command for project initialization.
* COPIED from src/index.js during refactorization - NO CHANGES to logic.
*
* @fileoverview Project initialization command
* @version 7.1.0
* @author César Estrada
* @since 2025-06-15
*/
import fs from 'fs'
import _ from 'lodash'
import chalk from 'chalk'
import { alloyProject, makeSureFolderExists } from '../../shared/utils.js'
import {
projectsConfigJS,
projectsTailwind_TSS,
projectsAlloyJMKFile,
projectsPurgeTSSFolder,
projectsPurge_TSS_Fonts_Folder,
projectsPurge_TSS_Brand_Folder,
projectsPurge_TSS_Images_Folder,
srcConfigFile,
projectsFA_TSS_File,
srcFontAwesomeTSSFile,
srcFramework7FontTSSFile,
srcMaterialIconsTSSFile,
srcMaterialSymbolsTSSFile,
PurgeTSSPackageJSON
} from '../../shared/constants.js'
import { logger } from '../../shared/logger.js'
import { getConfigOptions, getConfigFile, ensureConfig } from '../../shared/config-manager.js'
import { addHook, deleteHook, createJMKFile } from '../utils/hook-management.js'
import { getFiles } from '../utils/font-utilities.js'
import { buildTailwindBasedOnConfigOptions } from '../../core/builders/tailwind-builder.js'
const cwd = process.cwd()
/**
* Get command configuration for hooks
* COPIED exactly from original getCommands() function
*
* @returns {Object} Command configuration object
*/
function getCommands() {
// Use the already imported getConfigFile function
const configFile = getConfigFile()
let methodCommand
let oppositeCommand
if (configFile.purge.method === 'sync' || configFile.purge.method === '') {
oppositeCommand = 'require(\'child_process\').exec(\'purgetss'
methodCommand = '\trequire(\'child_process\').execSync(\'purgetss\', logger.warn(\'::PurgeTSS:: Auto-Purging \' + event.dir.project));'
} else {
oppositeCommand = 'require(\'child_process\').execSync(\'purgetss'
methodCommand = '\trequire(\'child_process\').exec(\'purgetss\', logger.warn(\'::PurgeTSS:: Auto-Purging \' + event.dir.project));'
}
return { methodCommand, oppositeCommand }
}
/**
* Create PurgeTSS config file
* COPIED exactly from original createConfigFile() function
*/
export function createConfigFile() {
if (alloyProject()) {
makeSureFolderExists(projectsPurgeTSSFolder)
makeSureFolderExists(projectsPurge_TSS_Fonts_Folder)
makeSureFolderExists(projectsPurge_TSS_Brand_Folder)
makeSureFolderExists(projectsPurge_TSS_Images_Folder)
if (fs.existsSync(projectsConfigJS)) {
logger.warn('./purgetss/config.cjs', chalk.red('file already exists!'))
} else {
fs.copyFileSync(srcConfigFile, projectsConfigJS)
logger.file('./purgetss/config.cjs')
}
}
}
/**
* Create the definitions.css file with all class definitions
* COPIED exactly from original createDefinitionsFile() function
*/
function createDefinitionsFile() {
let classDefinitions = ''
// read classes from _app.tss file
if (fs.existsSync(`${cwd}/app/styles`)) {
_.each(getFiles(`${cwd}/app/styles`).filter(file => file.endsWith('.tss') && file.endsWith('_app.tss')), file => {
classDefinitions += fs.readFileSync(file, 'utf8')
})
}
if (fs.existsSync(projectsTailwind_TSS)) {
classDefinitions += fs.readFileSync(projectsTailwind_TSS, 'utf8')
}
const configOptions = getConfigOptions()
if (configOptions.widgets && fs.existsSync(`${cwd}/app/widgets/`)) {
_.each(getFiles(`${cwd}/app/widgets`).filter(file => file.endsWith('.tss')), file => {
classDefinitions += fs.readFileSync(file, 'utf8')
})
}
// ! Get Styles from Themes
if (fs.existsSync(`${cwd}/app/themes/`)) {
_.each(getFiles(`${cwd}/app/themes`).filter(file => file.endsWith('.tss')), file => {
classDefinitions += fs.readFileSync(file, 'utf8')
})
}
if (fs.existsSync(`${cwd}/purgetss/styles/fonts.tss`)) {
classDefinitions += fs.readFileSync(`${cwd}/purgetss/styles/fonts.tss`, 'utf8')
}
classDefinitions += (fs.existsSync(projectsFA_TSS_File)) ? fs.readFileSync(projectsFA_TSS_File, 'utf8') : fs.readFileSync(srcFontAwesomeTSSFile, 'utf8')
classDefinitions += fs.readFileSync(srcFramework7FontTSSFile, 'utf8')
classDefinitions += fs.readFileSync(srcMaterialIconsTSSFile, 'utf8')
classDefinitions += fs.readFileSync(srcMaterialSymbolsTSSFile, 'utf8')
classDefinitions = classDefinitions
.replace(/\/\/[^\n]*\n/g, '')
.replace(/\/\*\*\n([\s\S]*?)\*\//gm, '')
.replace(/\{[\s\S]*?\}/gm, '{ }')
.replace(/{(.*)}/g, '{}')
.replace(/\[(.*)\]/g, '')
.replace(/[:'"]/g, '')
.replace(/^[a-zA-Z].*$/gm, '')
.replace(/\s/g, '')
classDefinitions += '.ios{}.android{}.handheld{}.tablet{}.open{}.close{}.complete{}.drag{}.drop{}.bounds{}'
// Ensure styles folder exists before writing
makeSureFolderExists(`${cwd}/purgetss/styles`)
fs.writeFileSync(`${cwd}/purgetss/styles/definitions.css`, `/* Class definitions (v${PurgeTSSPackageJSON.version}) */${classDefinitions}`)
logger.file('./purgetss/styles/definitions.css')
}
/**
* Initialize PurgeTSS project
* COPIED exactly from original init() function
*
* @param {Object} options - Command options
* @returns {boolean} Success status
*/
/**
* Export for use in other modules
*/
export { createDefinitionsFile }
export function init(options = {}) {
// Check if we're in an Alloy project first
if (!alloyProject()) {
return false
}
// Only show warning for explicit init command (not when called from other commands)
const isExplicitInitCommand = options.isExplicitInit === true
const configExisted = isExplicitInitCommand ? fs.existsSync(projectsConfigJS) : false
// SUPER SIMPLE: Ensure config exists (migrate or create)
ensureConfig()
// Show warning ONLY if this is an explicit init command AND config already existed
if (isExplicitInitCommand && configExisted) {
logger.warn('./purgetss/config.cjs', chalk.red('file already exists!'))
}
// Get commands when needed
const { methodCommand, oppositeCommand } = getCommands()
// utilities.tss
if (!fs.existsSync(projectsTailwind_TSS)) {
buildTailwindBasedOnConfigOptions(options)
}
// definitions file
if (!fs.existsSync(`${cwd}/purgetss/styles/definitions.css`)) {
createDefinitionsFile()
}
// auto purge hook
if (fs.existsSync(projectsAlloyJMKFile)) {
if (!fs.readFileSync(projectsAlloyJMKFile, 'utf8').includes('::PurgeTSS::')) {
addHook(methodCommand)
} else if (fs.readFileSync(projectsAlloyJMKFile, 'utf8').includes(oppositeCommand)) {
deleteHook()
addHook(methodCommand)
}
} else {
createJMKFile(methodCommand)
}
return true
}