Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/fork/module/Project/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Manager extends Base {

handleProjectDir(dir: string, framework: string) {
return new ForkPromise(async (resolve, reject) => {
const pdir = join(dir, 'flyenv-create-project')
const pdir = join(dir, 'flyenv-created-project')
if (!existsSync(pdir)) {
return reject(new Error(I18nT('appLog.newProjectFail')))
}
Expand Down
136 changes: 108 additions & 28 deletions src/render/components/Host/CreateProject/phpCreate.vue
Original file line number Diff line number Diff line change
Expand Up @@ -37,48 +37,59 @@
</div>
<div class="park">
<div class="title">
<span>{{ I18nT('base.phpVersion') }}</span>
<span>{{ I18nT('host.frameworkVersion') }}</span>
</div>
<el-select
v-model="ProjectSetup.form.PHP.php"
v-model="ProjectSetup.form.PHP.version"
class="w-56 max-w-56"
filterable
:disabled="loading || created"
>
<el-option value="" :label="I18nT('host.useSysVersion')"></el-option>
<template v-for="(v, _k) in phpVersions" :key="_k">
<el-option :value="v.bin" :label="`${v.version}-${v.bin}`"></el-option>
<template v-for="(v, _k) in app.list" :key="_k">
<el-option :value="v.version" :label="getLabel(v)"></el-option>
</template>
</el-select>
</div>
<div class="park">
<div class="title">
<span>{{ I18nT('host.composerVersion') }}</span>
<span>{{ I18nT('host.projectName') }}</span>
</div>
<el-input
v-model="ProjectSetup.form.PHP.name"
class="w-56 max-w-56"
placeholder="example-app"
:disabled="loading || created"
/>
</div>
<div class="park">
<div class="title">
<span>{{ I18nT('base.phpVersion') }}</span>
</div>
<el-select
v-model="ProjectSetup.form.PHP.composer"
v-model="ProjectSetup.form.PHP.php"
class="w-56 max-w-56"
filterable
:disabled="loading || created"
:disabled="loading || created || !ProjectSetup.form.PHP.version"
>
<el-option value="" :label="I18nT('host.useSysVersion')"></el-option>
<template v-for="(v, _k) in composerVersions" :key="_k">
<el-option :value="v.bin" :label="`${v.version}-${v.bin}`"></el-option>
<template v-for="(v, _k) in phpVersions" :key="_k">
<el-option :value="v.bin" :label="`${v.version}-${v.bin}`" :disabled="isPhpVersionDisabled(v.version)"></el-option>
</template>
</el-select>
</div>
<div class="park">
<div class="title">
<span>{{ I18nT('host.frameworkVersion') }}</span>
<span>{{ I18nT('host.composerVersion') }}</span>
</div>
<el-select
v-model="ProjectSetup.form.PHP.version"
v-model="ProjectSetup.form.PHP.composer"
class="w-56 max-w-56"
filterable
:disabled="loading || created"
>
<template v-for="(v, _k) in app.list" :key="_k">
<el-option :value="v.version" :label="v.name"></el-option>
<el-option value="" :label="I18nT('host.useSysVersion')"></el-option>
<template v-for="(v, _k) in composerVersions" :key="_k">
<el-option :value="v.bin" :label="`${v.version}-${v.bin}`"></el-option>
</template>
</el-select>
</div>
Expand Down Expand Up @@ -109,14 +120,15 @@
</el-dialog>
</template>
<script lang="ts" setup>
import { computed, markRaw, nextTick, onBeforeUnmount, onMounted, ref } from 'vue'
import { computed, markRaw, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import { AsyncComponentSetup } from '@/util/AsyncComponent'
import { I18nT } from '@lang/index'
import { BrewStore } from '@/store/brew'
import { compareVersions } from '@shared/compare-versions'
import AppVersions from './version'
import { ProjectSetup } from '@/components/Host/CreateProject/project'
import XTerm from '@/util/XTerm'
import { join } from '@/util/path-browserify'
import { join, dirname } from '@/util/path-browserify'
import { dialog, fs } from '@/util/NodeFn'

const { show, onClosed, onSubmit, closedFn, callback } = AsyncComponentSetup()
Expand All @@ -125,6 +137,8 @@
type: keyof typeof AppVersions
}>()

ProjectSetup.form.PHP.name = props.type.toLowerCase()

const xterm = ref<HTMLElement>()

const app = computed(() => {
Expand All @@ -151,7 +165,53 @@
})

const createAble = computed(() => {
return !!ProjectSetup.form.PHP.dir && !!ProjectSetup.form.PHP.version
return (
!!ProjectSetup.form.PHP.dir &&
!!ProjectSetup.form.PHP.version &&
!!ProjectSetup.form.PHP.name.trim()
)
})

const getLabel = (v: any) => {
return v.php ? `${v.name} (${v.php})` : v.name
}

const isLaravel8OrAbove = (version?: string) => {
if (!version) return false
if (version === '*') return true
const major = parseInt(version.split('.')[0])
return !isNaN(major) && major >= 8
}

const getMinPhpVersion = (phpConstraint?: string) => {
if (!phpConstraint) return null
return phpConstraint.replace(/[^\d.]/g, '')
}

const isPhpVersionDisabled = (phpVersion: string) => {
const currentFrameworkVersion = ProjectSetup.form.PHP.version
if (!currentFrameworkVersion) return false

const currentFramework = app.value.list.find((f: any) => f.version === currentFrameworkVersion)
if (!currentFramework || !currentFramework.php) return false

const minPhp = getMinPhpVersion(currentFramework.php)
if (!minPhp) return false

try {
return compareVersions(phpVersion, minPhp) < 0
} catch (e) {
return false
}
}

watch(() => ProjectSetup.form.PHP.version, () => {
if (ProjectSetup.form.PHP.php) {
const selectedVersionObj = phpVersions.value.find(p => p.bin === ProjectSetup.form.PHP.php)
if (selectedVersionObj && isPhpVersionDisabled(selectedVersionObj.version)) {
ProjectSetup.form.PHP.php = ''
}
}
})

const phpVersions = computed(() => {
Expand Down Expand Up @@ -201,8 +261,7 @@
command.push(`export ${k}="${v}"`)
}
}
command.push(`cd "${form.dir}"`)

const projectDir = join(form.dir, form.name)
if (props.type === 'WordPress') {
const tmpl = `{
"require": {
Expand All @@ -215,8 +274,10 @@
}
}
`
await fs.writeFile(join(form.dir, 'composer.json'), tmpl)
await fs.mkdirp(projectDir)
await fs.writeFile(join(projectDir, 'composer.json'), tmpl)

command.push(`cd "${projectDir}"`)
if (form.php && form.composer) {
command.push(`export PATH="${form.php}:$PATH"`)
command.push(`"${form.php}" "${form.composer}" self-update`)
Expand All @@ -232,7 +293,26 @@
command.push(`composer self-update`)
command.push(`composer update`)
}
} else if (props.type === 'Laravel' && form.version === '*') {
command.push(`cd "${form.dir}"`)
if (form.php) {
command.push(`export PATH="${dirname(form.php)}:$PATH"`)
}
let composerCmd = 'composer'
if (form.php && form.composer) {
composerCmd = `"${form.php}" "${form.composer}"`
} else if (form.composer) {
composerCmd = `php "${form.composer}"`
}
command.push(`${composerCmd} global require laravel/installer`)
command.push(
`export COMPOSER_BIN=$(${composerCmd} global config bin-dir --absolute 2>/dev/null || echo "$HOME/.composer/vendor/bin")`
)
command.push(`export PATH="$COMPOSER_BIN:$PATH"`)
command.push(`laravel new "${form.name}" --no-interaction`)
} else {
await fs.mkdirp(projectDir)
command.push(`cd "${projectDir}"`)
const name = app.value.package
if (form.php && form.composer) {
command.push(`export PATH="${form.php}:$PATH"`)
Expand Down Expand Up @@ -297,47 +377,47 @@
let dir = ProjectSetup.form.PHP.dir
let nginxRewrite = ''
if (framework.includes('wordpress')) {
dir = join(ProjectSetup.form.PHP.dir, 'wordpress')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'wordpress')
nginxRewrite = `location /
{
\t try_files $uri $uri/ /index.php?$args;
}

rewrite /wp-admin$ $scheme://$host$uri/ permanent;`
} else if (framework.includes('laravel')) {
dir = join(ProjectSetup.form.PHP.dir, 'public')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'public')
nginxRewrite = `location / {
\ttry_files $uri $uri/ /index.php$is_args$query_string;
}`
} else if (framework.includes('yii2')) {
dir = join(ProjectSetup.form.PHP.dir, 'web')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'web')
nginxRewrite = `location / {
try_files $uri $uri/ /index.php?$args;
}`
} else if (framework.includes('thinkphp')) {
dir = join(ProjectSetup.form.PHP.dir, 'public')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'public')
nginxRewrite = `location / {
\tif (!-e $request_filename){
\t\trewrite ^(.*)$ /index.php?s=$1 last; break;
\t}
}`
} else if (framework.includes('symfony')) {
dir = join(ProjectSetup.form.PHP.dir, 'public')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'public')
nginxRewrite = `location / {
try_files $uri /index.php$is_args$args;
}`
} else if (framework.includes('cakephp')) {
dir = join(ProjectSetup.form.PHP.dir, 'webroot')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'webroot')
nginxRewrite = `location / {
try_files $uri $uri/ /index.php?$args;
}`
} else if (framework.includes('slim')) {
dir = join(ProjectSetup.form.PHP.dir, 'public')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'public')
nginxRewrite = `location / {
try_files $uri /index.php$is_args$args;
}`
} else if (framework.includes('codeIgniter')) {
dir = join(ProjectSetup.form.PHP.dir, 'public')
dir = join(ProjectSetup.form.PHP.dir, ProjectSetup.form.PHP.name, 'public')
nginxRewrite = `location / {
try_files $uri $uri/ /index.php$is_args$args;
}`
Expand Down
Loading