Skip to content

Commit

Permalink
feat: make admin-watch behave more like project ci building
Browse files Browse the repository at this point in the history
  • Loading branch information
shyim committed Dec 10, 2023
1 parent 21499ce commit d4899db
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ dist/
/go-shopware-admin-api-sdk
/*.zip
/FroshTools
/FroshPlatformTemplateMail
/result
/project
dump.sql*
Expand Down
32 changes: 16 additions & 16 deletions cmd/extension/extension_admin_watch.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"io"
"net/http"
"net/url"
"os"
"path"
"regexp"
"strings"
Expand Down Expand Up @@ -64,19 +63,21 @@ var extensionAdminWatchCmd = &cobra.Command{
sources = append(sources, extension.ConvertExtensionsToSources(cmd.Context(), []extension.Extension{ext})...)
}

esbuildInstances := make(map[string]adminWatchExtension)
cfgs := extension.BuildAssetConfigFromExtensions(cmd.Context(), sources, extension.AssetBuildConfig{}).FilterByAdmin()

for _, source := range sources {
options := esbuild.NewAssetCompileOptionsAdmin(source.Name, source.Path)
options.ProductionMode = false
if len(cfgs) == 0 {
return fmt.Errorf("found nothing to compile")
}

if _, err := extension.InstallNodeModulesOfConfigs(cfgs); err != nil {
return err
}

_, jsEntryErr := os.Stat(path.Join(source.Path, options.EntrypointDir, "main.js"))
_, tsEntryErr := os.Stat(path.Join(source.Path, options.EntrypointDir, "main.ts"))
esbuildInstances := make(map[string]adminWatchExtension)

// does not have any admin js, skip it
if jsEntryErr != nil && tsEntryErr != nil {
continue
}
for name, entry := range cfgs {
options := esbuild.NewAssetCompileOptionsAdmin(name, entry.BasePath)
options.ProductionMode = false

esbuildContext, err := esbuild.Context(cmd.Context(), options)

Expand All @@ -96,13 +97,12 @@ var extensionAdminWatchCmd = &cobra.Command{
return err
}

technicalName := esbuild.ToKebabCase(source.Name)
esbuildInstances[technicalName] = adminWatchExtension{
name: source.Name,
assetName: technicalName,
esbuildInstances[entry.TechnicalName] = adminWatchExtension{
name: name,
assetName: entry.TechnicalName,
context: esbuildContext,
watchServer: watchServer,
staticDir: path.Join(source.Path, "Resources", "app", "static"),
staticDir: path.Join(entry.BasePath, "Resources", "app", "static"),
}
}

Expand Down
32 changes: 22 additions & 10 deletions extension/asset_platform.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ type AssetBuildConfig struct {
}

func BuildAssetsForExtensions(ctx context.Context, sources []asset.Source, assetConfig AssetBuildConfig) error { // nolint:gocyclo
cfgs := buildAssetConfigFromExtensions(ctx, sources, assetConfig)
cfgs := BuildAssetConfigFromExtensions(ctx, sources, assetConfig)

if len(cfgs) == 0 {
return nil
Expand All @@ -62,7 +62,7 @@ func BuildAssetsForExtensions(ctx context.Context, sources []asset.Source, asset
defer deletePaths(ctx, shopwareRoot)
}

paths, err := installNodeModulesOfConfigs(cfgs)
paths, err := InstallNodeModulesOfConfigs(cfgs)
if err != nil {
return err
}
Expand All @@ -71,15 +71,15 @@ func BuildAssetsForExtensions(ctx context.Context, sources []asset.Source, asset

if !assetConfig.DisableAdminBuild && cfgs.RequiresAdminBuild() {
// Build all extensions compatible with esbuild first
for name, entry := range cfgs.FilterByAdmin(true) {
for name, entry := range cfgs.FilterByAdminAndEsBuild(true) {
options := esbuild.NewAssetCompileOptionsAdmin(name, entry.BasePath)

if _, err := esbuild.CompileExtensionAsset(ctx, options); err != nil {
return err
}
}

nonCompatibleExtensions := cfgs.FilterByAdmin(false)
nonCompatibleExtensions := cfgs.FilterByAdminAndEsBuild(false)

if len(nonCompatibleExtensions) != 0 {
if err := prepareShopwareForAsset(shopwareRoot, nonCompatibleExtensions); err != nil {
Expand All @@ -105,15 +105,15 @@ func BuildAssetsForExtensions(ctx context.Context, sources []asset.Source, asset

if !assetConfig.DisableStorefrontBuild && cfgs.RequiresStorefrontBuild() {
// Build all extensions compatible with esbuild first
for name, entry := range cfgs.FilterByStorefront(true) {
for name, entry := range cfgs.FilterByStorefrontAndEsBuild(true) {
options := esbuild.NewAssetCompileOptionsStorefront(name, entry.BasePath)

if _, err := esbuild.CompileExtensionAsset(ctx, options); err != nil {
return err
}
}

nonCompatibleExtensions := cfgs.FilterByStorefront(false)
nonCompatibleExtensions := cfgs.FilterByStorefrontAndEsBuild(false)

if len(nonCompatibleExtensions) != 0 {
// add the storefront itself as plugin into json
Expand Down Expand Up @@ -185,7 +185,7 @@ func BuildAssetsForExtensions(ctx context.Context, sources []asset.Source, asset
return nil
}

func installNodeModulesOfConfigs(cfgs ExtensionAssetConfig) ([]string, error) {
func InstallNodeModulesOfConfigs(cfgs ExtensionAssetConfig) ([]string, error) {
paths := make([]string, 0)

// Install shared node_modules between admin and storefront
Expand Down Expand Up @@ -310,7 +310,7 @@ func prepareShopwareForAsset(shopwareRoot string, cfgs map[string]ExtensionAsset
return nil
}

func buildAssetConfigFromExtensions(ctx context.Context, sources []asset.Source, assetCfg AssetBuildConfig) ExtensionAssetConfig {
func BuildAssetConfigFromExtensions(ctx context.Context, sources []asset.Source, assetCfg AssetBuildConfig) ExtensionAssetConfig {
list := make(ExtensionAssetConfig)

for _, source := range sources {
Expand Down Expand Up @@ -489,7 +489,19 @@ func (c ExtensionAssetConfig) RequiresStorefrontBuild() bool {
return false
}

func (c ExtensionAssetConfig) FilterByAdmin(esbuildEnabled bool) ExtensionAssetConfig {
func (c ExtensionAssetConfig) FilterByAdmin() ExtensionAssetConfig {
filtered := make(ExtensionAssetConfig)

for name, entry := range c {
if entry.Administration.EntryFilePath != nil {
filtered[name] = entry
}
}

return filtered
}

func (c ExtensionAssetConfig) FilterByAdminAndEsBuild(esbuildEnabled bool) ExtensionAssetConfig {
filtered := make(ExtensionAssetConfig)

for name, entry := range c {
Expand All @@ -501,7 +513,7 @@ func (c ExtensionAssetConfig) FilterByAdmin(esbuildEnabled bool) ExtensionAssetC
return filtered
}

func (c ExtensionAssetConfig) FilterByStorefront(esbuildEnabled bool) ExtensionAssetConfig {
func (c ExtensionAssetConfig) FilterByStorefrontAndEsBuild(esbuildEnabled bool) ExtensionAssetConfig {
filtered := make(ExtensionAssetConfig)

for name, entry := range c {
Expand Down
10 changes: 5 additions & 5 deletions extension/asset_platform_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func TestGenerateConfigWithAdminAndStorefrontFiles(t *testing.T) {
assert.NoError(t, os.MkdirAll(path.Join(dir, "Resources", "app", "storefront", "src"), os.ModePerm))
assert.NoError(t, os.WriteFile(path.Join(dir, "Resources", "app", "storefront", "src", "main.js"), []byte("test"), os.ModePerm))

config := buildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "FroshTools", Path: dir}}, AssetBuildConfig{})
config := BuildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "FroshTools", Path: dir}}, AssetBuildConfig{})

assert.True(t, config.Has("FroshTools"))
assert.True(t, config.RequiresAdminBuild())
Expand Down Expand Up @@ -56,7 +56,7 @@ func TestGenerateConfigWithTypeScript(t *testing.T) {
assert.NoError(t, os.WriteFile(path.Join(dir, "Resources", "app", "storefront", "src", "main.ts"), []byte("test"), os.ModePerm))
assert.NoError(t, os.WriteFile(path.Join(dir, "Resources", "app", "storefront", "build", "webpack.config.js"), []byte("test"), os.ModePerm))

config := buildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "FroshTools", Path: dir}}, AssetBuildConfig{})
config := BuildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "FroshTools", Path: dir}}, AssetBuildConfig{})

assert.True(t, config.Has("FroshTools"))
assert.True(t, config.RequiresAdminBuild())
Expand All @@ -71,7 +71,7 @@ func TestGenerateConfigWithTypeScript(t *testing.T) {
}

func TestGenerateConfigAddsStorefrontAlwaysAsEntrypoint(t *testing.T) {
config := buildAssetConfigFromExtensions(getTestContext(), []asset.Source{}, AssetBuildConfig{})
config := BuildAssetConfigFromExtensions(getTestContext(), []asset.Source{}, AssetBuildConfig{})

assert.False(t, config.RequiresStorefrontBuild())
assert.False(t, config.RequiresAdminBuild())
Expand All @@ -80,15 +80,15 @@ func TestGenerateConfigAddsStorefrontAlwaysAsEntrypoint(t *testing.T) {
func TestGenerateConfigDoesNotAddExtensionWithoutConfig(t *testing.T) {
dir := t.TempDir()

config := buildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "FroshApp", Path: dir}}, AssetBuildConfig{})
config := BuildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "FroshApp", Path: dir}}, AssetBuildConfig{})

assert.False(t, config.Has("FroshApp"))
}

func TestGenerateConfigDoesNotAddExtensionWithoutName(t *testing.T) {
dir := t.TempDir()

config := buildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "", Path: dir}}, AssetBuildConfig{})
config := BuildAssetConfigFromExtensions(getTestContext(), []asset.Source{{Name: "", Path: dir}}, AssetBuildConfig{})

assert.Len(t, config, 0)
}

0 comments on commit d4899db

Please sign in to comment.