Added commands for adding UWP/WPF app projects to existing projects
This commit is contained in:
parent
4c877ad339
commit
ef2717f6b6
160
re-natal.coffee
160
re-natal.coffee
|
@ -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 ->
|
||||
|
|
|
@ -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$)]}}})
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue