diff --git a/packages/app/src/cli/models/extensions/extension-instance.ts b/packages/app/src/cli/models/extensions/extension-instance.ts index 3a37dd9aaf..ffeb76080b 100644 --- a/packages/app/src/cli/models/extensions/extension-instance.ts +++ b/packages/app/src/cli/models/extensions/extension-instance.ts @@ -366,7 +366,13 @@ export class ExtensionInstance(spec: { identifier: string schema: ZodSchemaType + buildConfig?: BuildConfig appModuleFeatures?: (config?: TConfiguration) => ExtensionFeature[] transformConfig: TransformationConfig | CustomTransformationConfig uidStrategy?: UidStrategy getDevSessionUpdateMessages?: (config: TConfiguration) => Promise patchWithAppDevURLs?: (config: TConfiguration, urls: ApplicationURLs) => void + copyStaticAssets?: (config: TConfiguration, directory: string, outputPath: string) => Promise }): ExtensionSpecification { const appModuleFeatures = spec.appModuleFeatures ?? (() => []) return createExtensionSpecification({ @@ -258,6 +260,7 @@ export function createConfigExtensionSpecification { @@ -31,6 +36,17 @@ const appHomeSpec = createConfigExtensionSpecification({ getDevSessionUpdateMessages: async (config) => { return [`Using URL: ${config.application_url}`] }, + copyStaticAssets: async (config, directory, outputPath) => { + console.log({config}) + config.static_root = 'hosted-app/dist' + if (!config.static_root) return + const sourceDir = joinPath(directory, config.static_root) + const outputDir = dirname(outputPath) + + return copyDirectoryContents(sourceDir, outputDir).catch((error) => { + throw new Error(`Failed to copy static assets from ${sourceDir} to ${outputDir}: ${error.message}`) + }) + }, }) export default appHomeSpec diff --git a/packages/app/src/cli/services/dev/app-events/app-event-watcher.ts b/packages/app/src/cli/services/dev/app-events/app-event-watcher.ts index 5a760de633..313869f0cc 100644 --- a/packages/app/src/cli/services/dev/app-events/app-event-watcher.ts +++ b/packages/app/src/cli/services/dev/app-events/app-event-watcher.ts @@ -148,6 +148,7 @@ export class AppEventWatcher extends EventEmitter { this.fileWatcher.onChange((events) => { handleWatcherEvents(events, this.app, this.options) .then(async (appEvent) => { + console.log({appEvent}) if (appEvent?.extensionEvents.length === 0) outputDebug('Change detected, but no extensions were affected') if (!appEvent) return @@ -169,6 +170,13 @@ export class AppEventWatcher extends EventEmitter { await this.app.generateExtensionTypes() } + if (appEvent.appWasReloaded) { + const appHomeExtension = this.app.realExtensions.find((ext) => ext.specification.identifier === 'app_home') + if (appHomeExtension) { + await appHomeExtension.copyStaticAssets(this.buildOutputPath) + } + } + // Find deleted extensions and delete their previous build output await this.deleteExtensionsBuildOutput(appEvent) this.emit('all', appEvent)