Added commands for adding UWP/WPF app projects to existing projects

This commit is contained in:
amorokh 2017-04-13 11:04:31 +02:00
parent 4c877ad339
commit ef2717f6b6
2 changed files with 131 additions and 35 deletions

View File

@ -24,10 +24,13 @@ projNameRx = /\$PROJECT_NAME\$/g
projNameHyphRx = /\$PROJECT_NAME_HYPHENATED\$/g
projNameUsRx = /\$PROJECT_NAME_UNDERSCORED\$/g
interfaceDepsRx = /\$INTERFACE_DEPS\$/g
devProfilesRx = /\$DEV_PROFILES\$/g
prodProfilesRx = /\$PROD_PROFILES\$/g
platformRx = /\$PLATFORM\$/g
platformCleanRx = /\$PLATFORM_CLEAN\$/g
devProfilesRx = /#_\(\$DEV_PROFILES\$\)/g
devProfilesId = "#_($DEV_PROFILES$)"
prodProfilesRx = /#_\(\$PROD_PROFILES\$\)/g
prodProfilesId = "#_($PROD_PROFILES$)"
platformCleanRx = /#_\(\$PLATFORM_CLEAN\$\)/g
platformCleanId = "#_($PLATFORM_CLEAN$)"
devHostRx = /\$DEV_HOST\$/g
ipAddressRx = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/i
figwheelUrlRx = /ws:\/\/[0-9a-zA-Z\.]*:/g
@ -181,7 +184,9 @@ generateConfig = (interfaceName, projName) ->
platforms: {}
for platform in platforms
config.platforms[platform] = {"host": "localhost"}
config.platforms[platform] =
host: "localhost"
modules: []
writeConfig config
config
@ -294,26 +299,30 @@ deviceTypeIsIpAddress = (deviceType, allowedTypes) ->
log("Value '#{deviceType}' is not a valid IP address, still configured it as development host. Did you mean one of: [#{allowedTypes}] ?", 'yellow')
deviceType
copyDevEnvironmentFilesForPlatform = (platform, interfaceName, projNameHyph, projName, devEnvRoot, devHost) ->
cljsDir = interfaceConf[interfaceName].cljsDir
fs.mkdirpSync "#{devEnvRoot}/env/#{platform}"
mainDevPath = "#{devEnvRoot}/env/#{platform}/main.cljs"
fs.copySync("#{resources}/#{cljsDir}/main_dev.cljs", mainDevPath)
edit mainDevPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, platform], [devHostRx, devHost]]
copyDevEnvironmentFiles = (interfaceName, projNameHyph, projName, devEnvRoot, devHost) ->
userNsPath = "#{devEnvRoot}/user.clj"
fs.copySync("#{resources}/user.clj", userNsPath)
cljsDir = interfaceConf[interfaceName].cljsDir
for platform in platforms
fs.mkdirpSync "#{devEnvRoot}/env/#{platform}"
mainDevPath = "#{devEnvRoot}/env/#{platform}/main.cljs"
fs.copySync("#{resources}/#{cljsDir}/main_dev.cljs", mainDevPath)
edit mainDevPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, platform], [devHostRx, devHost]]
copyDevEnvironmentFilesForPlatform platform, interfaceName, projNameHyph, projName, devEnvRoot, devHost
copyProdEnvironmentFilesForPlatform = (platform, interfaceName, projNameHyph, projName, prodEnvRoot) ->
cljsDir = interfaceConf[interfaceName].cljsDir
fs.mkdirpSync "#{prodEnvRoot}/env/#{platform}"
mainProdPath = "#{prodEnvRoot}/env/#{platform}/main.cljs"
fs.copySync("#{resources}/#{cljsDir}/main_prod.cljs", mainProdPath)
edit mainProdPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, platform]]
copyProdEnvironmentFiles = (interfaceName, projNameHyph, projName, prodEnvRoot) ->
cljsDir = interfaceConf[interfaceName].cljsDir
for platform in platforms
fs.mkdirpSync "#{prodEnvRoot}/env/#{platform}"
mainProdPath = "#{prodEnvRoot}/env/#{platform}/main.cljs"
fs.copySync("#{resources}/#{cljsDir}/main_prod.cljs", mainProdPath)
edit mainProdPath, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, platform]]
copyProdEnvironmentFilesForPlatform platform, interfaceName, projNameHyph, projName, prodEnvRoot
copyFigwheelBridge = (projNameUs) ->
fs.copySync("#{resources}/figwheel-bridge.js", "./figwheel-bridge.js")
@ -321,8 +330,9 @@ copyFigwheelBridge = (projNameUs) ->
updateGitIgnore = () ->
fs.appendFileSync(".gitignore", "\n# Generated by re-natal\n#\n")
for platform in platforms
fs.appendFileSync(".gitignore", "index.#{platform}.js\n")
indexFiles = platforms.map (platform) -> "index.#{platform}.js"
fs.appendFileSync(".gitignore", indexFiles.join("\n"))
fs.appendFileSync(".gitignore", "target\n")
fs.appendFileSync(".gitignore", "\n# Figwheel\n#\nfigwheel_server.log")
@ -338,6 +348,15 @@ shimCljsNamespace = (ns) ->
fs.mkdirpSync fpath.dirname(filePath)
fs.writeFileSync(filePath, "(ns #{ns})")
copySrcFilesForPlatform = (platform, interfaceName, projName, projNameUs, projNameHyph) ->
cljsDir = interfaceConf[interfaceName].cljsDir
fs.mkdirSync "src/#{projNameUs}/#{platform}"
fileNames = platformMeta[platform].sources
for fileName in fileNames
path = "src/#{projNameUs}/#{platform}/#{fileName}"
fs.copySync("#{resources}/#{cljsDir}/#{fileName}", path)
edit path, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, platform]]
copySrcFiles = (interfaceName, projName, projNameUs, projNameHyph) ->
cljsDir = interfaceConf[interfaceName].cljsDir
@ -348,12 +367,7 @@ copySrcFiles = (interfaceName, projName, projNameUs, projNameHyph) ->
edit path, [[projNameHyphRx, projNameHyph], [projNameRx, projName]]
for platform in platforms
fs.mkdirSync "src/#{projNameUs}/#{platform}"
fileNames = platformMeta[platform].sources
for fileName in fileNames
path = "src/#{projNameUs}/#{platform}/#{fileName}"
fs.copySync("#{resources}/#{cljsDir}/#{fileName}", path)
edit path, [[projNameHyphRx, projNameHyph], [projNameRx, projName], [platformRx, platform]]
copySrcFilesForPlatform platform, interfaceName, projName, projNameUs, projNameHyph
otherFiles = interfaceConf[interfaceName].sources.other;
for cpFile in otherFiles
@ -366,16 +380,39 @@ copySrcFiles = (interfaceName, projName, projNameUs, projNameHyph) ->
shimCljsNamespace(namespace)
copyProjectClj = (interfaceName, projNameHyph) ->
devProfileTemplate = readFile "#{resources}/dev.profile"
prodProfileTemplate = readFile "#{resources}/prod.profile"
fs.copySync("#{resources}/project.clj", "project.clj")
deps = interfaceConf[interfaceName].deps.join("\n")
cleans = platforms.map (platform) -> "\"index.#{platform}.js\""
cleans.push platformCleanId
devProfileTemplate = readFile "#{resources}/dev.profile"
devProfiles = platforms.map (platform) -> devProfileTemplate.replace(platformRx, platform)
devProfiles.push devProfilesId
prodProfileTemplate = readFile "#{resources}/prod.profile"
prodProfiles = platforms.map (platform) -> prodProfileTemplate.replace(platformRx, platform)
prodProfiles.push prodProfilesId
edit 'project.clj', [[projNameHyphRx, projNameHyph], [interfaceDepsRx, deps], [platformCleanRx, cleans.join(' ')], [devProfilesRx, devProfiles.join("\n")], [prodProfilesRx, prodProfiles.join("\n")]]
updateProjectClj = (platform) ->
cleans = []
cleans.push "\"index.#{platform}.js\""
cleans.push platformCleanId
devProfileTemplate = readFile "#{resources}/dev.profile"
devProfiles = []
devProfiles.push devProfileTemplate.replace(platformRx, platform)
devProfiles.push devProfilesId
prodProfileTemplate = readFile "#{resources}/prod.profile"
prodProfiles = []
prodProfiles.push prodProfileTemplate.replace(platformRx, platform)
prodProfiles.push prodProfilesId
edit 'project.clj', [[platformCleanRx, cleans.join(' ')], [devProfilesRx, devProfiles.join("\n")], [prodProfilesRx, prodProfiles.join("\n")]]
init = (interfaceName, projName) ->
if projName.toLowerCase() is 'react' or !projName.match validNameRx
logErr 'Invalid project name. Use an alphanumeric CamelCase name.'
@ -436,13 +473,13 @@ init = (interfaceName, projName) ->
"
if 'windows' in platforms
log 'Creating React Native UWP skeleton.'
log 'Creating React Native UWP project.'
exec "node -e
\"require('react-native-windows/local-cli/generate-windows')('.', '#{projName}', '#{projName}')\"
"
if 'wpf' in platforms
log 'Creating React Native WPF skeleton.'
log 'Creating React Native WPF project.'
exec "node -e
\"require('react-native-windows/local-cli/generate-wpf')('.', '#{projName}', '#{projName}')\"
"
@ -489,6 +526,55 @@ init = (interfaceName, projName) ->
else
message
addPlatform = (platform) ->
config = readConfig()
platforms = Object.keys config.platforms
if platform in platforms
log "A project for a #{platformMeta[platform].name} app already exists"
else
interfaceName = config.interface
projName = config.name
projNameHyph = projName.replace(camelRx, '$1-$2').toLowerCase()
projNameUs = toUnderscored projName
log "Preparing for #{platformMeta[platform].name} app."
updateProjectClj(platform)
copySrcFilesForPlatform(platform, interfaceName, projName, projNameUs, projNameHyph)
copyDevEnvironmentFilesForPlatform(platform, interfaceName, projNameHyph, projName, defaultEnvRoots.dev, "localhost")
copyProdEnvironmentFilesForPlatform(platform, interfaceName, projNameHyph, projName, defaultEnvRoots.prod)
pkg = JSON.parse readFile 'package.json'
unless 'react-native-windows' in pkg.dependencies
pkg.dependencies['react-native-windows'] = rnVersion
fs.writeFileSync 'package.json', JSON.stringify pkg, null, 2
exec 'npm i'
if platform is 'windows'
log 'Creating React Native UWP project.'
exec "node -e
\"require('react-native-windows/local-cli/generate-windows')('.', '#{projName}', '#{projName}')\"
"
if platform is 'wpf'
log 'Creating React Native WPF project.'
exec "node -e
\"require('react-native-windows/local-cli/generate-wpf')('.', '#{projName}', '#{projName}')\"
"
fs.appendFileSync(".gitignore", "index.#{platform}.js\n")
config.platforms[platform] =
host: "localhost"
modules: []
writeConfig(config)
log 'Compiling ClojureScript'
exec 'lein prod-build'
openXcode = (name) ->
try
exec "open ios/#{name}.xcodeproj"
@ -651,8 +737,8 @@ cli.version pkgJson.version
cli.command 'init <name>'
.description 'create a new ClojureScript React Native project'
.option "-i, --interface [#{interfaceNames.join ' '}]", 'specify React interface', defaultInterface
.option '-u, --uwp', 'create skeleton for UWP'
.option '-w, --wpf', 'create skeleton for WPF'
.option '-u, --uwp', 'create project for UWP app'
.option '-w, --wpf', 'create project for WPF app'
.action (name, cmd) ->
if typeof name isnt 'string'
logErr '''
@ -675,6 +761,16 @@ cli.command 'upgrade'
.action ->
doUpgrade readConfig(false)
cli.command 'windows'
.description 'add project for UWP app'
.action ->
addPlatform('windows')
cli.command 'wpf'
.description 'add project for WPF app'
.action ->
addPlatform('wpf')
cli.command 'xcode'
.description 'open Xcode project'
.action ->

View File

@ -8,7 +8,7 @@
$INTERFACE_DEPS$]
:plugins [[lein-cljsbuild "1.1.4"]
[lein-figwheel "0.5.8"]]
:clean-targets ["target/" $PLATFORM_CLEAN$]
:clean-targets ["target/" #_($PLATFORM_CLEAN$)]
:aliases {"prod-build" ^{:doc "Recompile code with prod profile."}
["do" "clean"
["with-profile" "prod" "cljsbuild" "once"]]}
@ -16,9 +16,9 @@
[com.cemerick/piggieback "0.2.1"]]
:source-paths ["src" "env/dev"]
:cljsbuild {:builds [
$DEV_PROFILES$]}
#_($DEV_PROFILES$)]}
:repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}}
:prod {:cljsbuild {:builds [
$PROD_PROFILES$]}}})
#_($PROD_PROFILES$)]}}})