|
| 1 | +import GeneratedFile from 'generator/GeneratedFile'; |
| 2 | +import ModuleFileGenerator from 'generator/ModuleFileGenerator'; |
| 3 | +import GenerateFromTemplate from 'generator/util/GenerateFromTemplate'; |
| 4 | +import { Uri } from 'vscode'; |
| 5 | +import { ObserverWizardData } from 'wizard/ObserverWizard'; |
| 6 | +import indentString from 'indent-string'; |
| 7 | +import PhpNamespace from 'common/PhpNamespace'; |
| 8 | +import FindOrCreateEventsXml from 'generator/util/FindOrCreateEventsXml'; |
| 9 | +import { MagentoScope } from 'types'; |
| 10 | + |
| 11 | +export default class ObserverDiGenerator extends ModuleFileGenerator { |
| 12 | + public constructor(protected data: ObserverWizardData) { |
| 13 | + super(); |
| 14 | + } |
| 15 | + |
| 16 | + public async generate(workspaceUri: Uri): Promise<GeneratedFile> { |
| 17 | + const [vendor, module] = this.data.module.split('_'); |
| 18 | + const moduleDirectory = this.getModuleDirectory(vendor, module, workspaceUri); |
| 19 | + const observerNamespace = PhpNamespace.fromParts([vendor, module, this.data.directoryPath]); |
| 20 | + const areaPath = this.data.area === MagentoScope.Global ? '' : this.data.area; |
| 21 | + |
| 22 | + const eventsFile = Uri.joinPath(moduleDirectory, 'etc', areaPath, 'events.xml'); |
| 23 | + const eventsXml = await FindOrCreateEventsXml.execute( |
| 24 | + workspaceUri, |
| 25 | + vendor, |
| 26 | + module, |
| 27 | + this.data.area |
| 28 | + ); |
| 29 | + const insertPosition = this.getInsertPosition(eventsXml); |
| 30 | + |
| 31 | + const observerXml = await GenerateFromTemplate.generate('xml/observer', { |
| 32 | + name: this.data.observerName, |
| 33 | + className: observerNamespace.append(this.data.className).toString(), |
| 34 | + eventName: this.data.eventName, |
| 35 | + }); |
| 36 | + |
| 37 | + const newEventsXml = |
| 38 | + eventsXml.slice(0, insertPosition) + |
| 39 | + '\n' + |
| 40 | + indentString(observerXml, 4) + |
| 41 | + '\n' + |
| 42 | + eventsXml.slice(insertPosition); |
| 43 | + |
| 44 | + return new GeneratedFile(eventsFile, newEventsXml, false); |
| 45 | + } |
| 46 | + |
| 47 | + private getInsertPosition(diXml: string): number { |
| 48 | + return diXml.indexOf('</config>'); |
| 49 | + } |
| 50 | +} |
0 commit comments