Skip to content

Commit 6884470

Browse files
Merge pull request #42 from raideer/codegen
Codegen
2 parents 3ac7241 + b8ff211 commit 6884470

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1113
-71
lines changed

package-lock.json

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@
2424
"type": "string",
2525
"default": "bin/magento",
2626
"description": "Path to Magento CLI tool. Relative to workspace root or absolute path."
27+
},
28+
"magento-toolbox.phpFileHeaderComment": {
29+
"type": "string",
30+
"editPresentation": "multilineText",
31+
"default": "",
32+
"markdownDescription": "`%module%` will be replaced with the module name. \n\n **Do not add comment symbols like `/*` or `*/`, they will be added automatically.** \n\n Separate lines with the newline character `\\n`"
33+
},
34+
"magento-toolbox.xmlFileHeaderComment": {
35+
"type": "string",
36+
"editPresentation": "multilineText",
37+
"default": "",
38+
"markdownDescription": "`%module%` will be replaced with the module name. \n\n **Do not add comment symbols like `<!--` or `-->`, they will be added automatically.**"
2739
}
2840
}
2941
},
@@ -42,6 +54,10 @@
4254
"command": "magento-toolbox.generateModule",
4355
"title": "Magento Toolbox: Generate Module"
4456
},
57+
{
58+
"command": "magento-toolbox.generateBlock",
59+
"title": "Magento Toolbox: Generate Block"
60+
},
4561
{
4662
"command": "magento-toolbox.indexWorkspace",
4763
"title": "Magento Toolbox: Index Workspace"
@@ -61,6 +77,30 @@
6177
{
6278
"command": "magento-toolbox.generateObserver",
6379
"title": "Magento Toolbox: Generate Observer"
80+
},
81+
{
82+
"command": "magento-toolbox.generateEventsXml",
83+
"title": "Magento Toolbox: Generate Events XML"
84+
},
85+
{
86+
"command": "magento-toolbox.generateGraphqlSchemaFile",
87+
"title": "Magento Toolbox: Generate GraphQL Schema File"
88+
},
89+
{
90+
"command": "magento-toolbox.generateRoutesXmlFile",
91+
"title": "Magento Toolbox: Generate Routes XML"
92+
},
93+
{
94+
"command": "magento-toolbox.generateAclXmlFile",
95+
"title": "Magento Toolbox: Generate ACL XML"
96+
},
97+
{
98+
"command": "magento-toolbox.generateDiXmlFile",
99+
"title": "Magento Toolbox: Generate DI XML"
100+
},
101+
{
102+
"command": "magento-toolbox.generateWebapiXmlFile",
103+
"title": "Magento Toolbox: Generate Webapi XML"
64104
}
65105
],
66106
"menus": {
@@ -97,6 +137,39 @@
97137
"command": "magento-toolbox.copyMagentoPath",
98138
"title": "Magento Toolbox: Copy Magento Path",
99139
"when": "resourceExtname in magento-toolbox.supportedMagentoPathExtensions && resourcePath =~ /view/"
140+
},
141+
{
142+
"command": "magento-toolbox.generateObserver",
143+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i",
144+
"arguments": []
145+
},
146+
{
147+
"command": "magento-toolbox.generateBlock",
148+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
149+
},
150+
{
151+
"command": "magento-toolbox.generateEventsXml",
152+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
153+
},
154+
{
155+
"command": "magento-toolbox.generateGraphqlSchemaFile",
156+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
157+
},
158+
{
159+
"command": "magento-toolbox.generateRoutesXmlFile",
160+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
161+
},
162+
{
163+
"command": "magento-toolbox.generateAclXmlFile",
164+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
165+
},
166+
{
167+
"command": "magento-toolbox.generateDiXmlFile",
168+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
169+
},
170+
{
171+
"command": "magento-toolbox.generateWebapiXmlFile",
172+
"when": "resourcePath =~ /app\\/code\\/.+\\/.+/i"
100173
}
101174
]
102175
}
@@ -157,6 +230,7 @@
157230
"php-parser": "^3.2.2",
158231
"react": "^19.0.0",
159232
"react-dom": "^19.0.0",
233+
"slugify": "^1.6.6",
160234
"typescript-json-serializer": "^6.0.1",
161235
"typescript-memoize": "^1.1.1",
162236
"validatorjs": "^3.22.1"

src/codelens/ObserverCodelensProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export default class ObserverCodelensProvider implements CodeLensProvider {
6161
const codelens = new CodeLens(range, {
6262
title: 'Create an Observer',
6363
command: 'magento-toolbox.generateObserver',
64-
arguments: [event.name],
64+
arguments: [undefined, event.name],
6565
});
6666

6767
codelenses.push(codelens);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { SimpleTemplateGeneratorCommand } from './SimpleTemplateGeneratorCommand';
2+
import { TemplateWizardData } from 'wizard/SimpleTemplateWizard';
3+
4+
export default class GenerateAclXmlFileCommand extends SimpleTemplateGeneratorCommand {
5+
constructor() {
6+
super('magento-toolbox.generateAclXmlFile');
7+
}
8+
9+
getWizardTitle(): string {
10+
return 'ACL XML File';
11+
}
12+
13+
getTemplatePath(data: TemplateWizardData): string {
14+
const [vendor, module] = data.module.split('_');
15+
16+
return `app/code/${vendor}/${module}/etc/acl.xml`;
17+
}
18+
19+
getTemplateName(data: TemplateWizardData): string {
20+
return 'xml/blank-acl';
21+
}
22+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { Command } from 'command/Command';
2+
import BlockClassGenerator from 'generator/block/BlockClassGenerator';
3+
import BlockWizard, { BlockWizardData } from 'wizard/BlockWizard';
4+
import FileGeneratorManager from 'generator/FileGeneratorManager';
5+
import { Uri, window } from 'vscode';
6+
import Common from 'util/Common';
7+
import WizzardClosedError from 'webview/error/WizzardClosedError';
8+
import IndexManager from 'indexer/IndexManager';
9+
import ModuleIndexer from 'indexer/module/ModuleIndexer';
10+
11+
export default class GenerateBlockCommand extends Command {
12+
constructor() {
13+
super('magento-toolbox.generateBlock');
14+
}
15+
16+
public async execute(uri?: Uri): Promise<void> {
17+
const moduleIndex = IndexManager.getIndexData(ModuleIndexer.KEY);
18+
let contextModule: string | undefined;
19+
20+
const contextUri = uri || window.activeTextEditor?.document.uri;
21+
22+
if (moduleIndex && contextUri) {
23+
const module = moduleIndex.getModuleByUri(contextUri);
24+
25+
if (module) {
26+
contextModule = module.name;
27+
}
28+
}
29+
30+
const blockWizard = new BlockWizard();
31+
32+
let data: BlockWizardData;
33+
34+
try {
35+
data = await blockWizard.show(contextModule);
36+
} catch (error) {
37+
if (error instanceof WizzardClosedError) {
38+
return;
39+
}
40+
41+
throw error;
42+
}
43+
44+
const manager = new FileGeneratorManager([new BlockClassGenerator(data)]);
45+
46+
const workspaceFolder = Common.getActiveWorkspaceFolder();
47+
48+
if (!workspaceFolder) {
49+
window.showErrorMessage('No active workspace folder');
50+
return;
51+
}
52+
53+
await manager.generate(workspaceFolder.uri);
54+
await manager.writeFiles();
55+
await manager.refreshIndex(workspaceFolder);
56+
manager.openFirstFile();
57+
}
58+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { MagentoScope } from 'types';
2+
import { SimpleTemplateGeneratorCommand } from './SimpleTemplateGeneratorCommand';
3+
import { TemplateWizardData } from 'wizard/SimpleTemplateWizard';
4+
5+
export default class GenerateDiXmlFileCommand extends SimpleTemplateGeneratorCommand {
6+
constructor() {
7+
super('magento-toolbox.generateDiXmlFile');
8+
}
9+
10+
getAreas(): MagentoScope[] {
11+
return [
12+
MagentoScope.Global,
13+
MagentoScope.Adminhtml,
14+
MagentoScope.Frontend,
15+
MagentoScope.Cron,
16+
MagentoScope.WebapiRest,
17+
MagentoScope.WebapiSoap,
18+
MagentoScope.Graphql,
19+
];
20+
}
21+
22+
getWizardTitle(): string {
23+
return 'DI XML File';
24+
}
25+
26+
getTemplatePath(data: TemplateWizardData): string {
27+
const [vendor, module] = data.module.split('_');
28+
29+
if (data.area && data.area !== MagentoScope.Global) {
30+
return `app/code/${vendor}/${module}/etc/${data.area}/di.xml`;
31+
}
32+
33+
return `app/code/${vendor}/${module}/etc/di.xml`;
34+
}
35+
36+
getTemplateName(data: TemplateWizardData): string {
37+
return 'xml/blank-di';
38+
}
39+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { SimpleTemplateGeneratorCommand } from './SimpleTemplateGeneratorCommand';
2+
import { TemplateWizardData } from 'wizard/SimpleTemplateWizard';
3+
import { MagentoScope } from 'types';
4+
import FileHeader from 'common/xml/FileHeader';
5+
6+
export default class GenerateEventsXmlCommand extends SimpleTemplateGeneratorCommand {
7+
constructor() {
8+
super('magento-toolbox.generateEventsXml');
9+
}
10+
11+
getWizardTitle(): string {
12+
return 'Events XML File';
13+
}
14+
15+
getAreas(): MagentoScope[] {
16+
return [
17+
MagentoScope.Global,
18+
MagentoScope.Adminhtml,
19+
MagentoScope.Frontend,
20+
MagentoScope.Cron,
21+
MagentoScope.WebapiRest,
22+
MagentoScope.WebapiSoap,
23+
MagentoScope.Graphql,
24+
];
25+
}
26+
27+
getFileHeader(data: TemplateWizardData): string | undefined {
28+
return FileHeader.getHeader(data.module);
29+
}
30+
31+
getTemplatePath(data: TemplateWizardData): string {
32+
const [vendor, module] = data.module.split('_');
33+
34+
if (data.area && data.area !== MagentoScope.Global) {
35+
return `app/code/${vendor}/${module}/etc/${data.area}/events.xml`;
36+
}
37+
38+
return `app/code/${vendor}/${module}/etc/events.xml`;
39+
}
40+
41+
getTemplateName(data: TemplateWizardData): string {
42+
return 'xml/blank-events';
43+
}
44+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { SimpleTemplateGeneratorCommand } from './SimpleTemplateGeneratorCommand';
2+
import { TemplateWizardData } from 'wizard/SimpleTemplateWizard';
3+
4+
export default class GenerateGraphqlSchemaFileCommand extends SimpleTemplateGeneratorCommand {
5+
constructor() {
6+
super('magento-toolbox.generateGraphqlSchemaFile');
7+
}
8+
9+
getWizardTitle(): string {
10+
return 'GraphQL Schema File';
11+
}
12+
13+
getTemplatePath(data: TemplateWizardData): string {
14+
const [vendor, module] = data.module.split('_');
15+
16+
return `app/code/${vendor}/${module}/etc/schema.graphqls`;
17+
}
18+
19+
getTemplateName(data: TemplateWizardData): string {
20+
return 'graphql/blank-schema';
21+
}
22+
}

src/command/GenerateObserverCommand.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,39 @@ import ObserverWizard, { ObserverWizardData } from 'wizard/ObserverWizard';
33
import WizzardClosedError from 'webview/error/WizzardClosedError';
44
import FileGeneratorManager from 'generator/FileGeneratorManager';
55
import Common from 'util/Common';
6-
import { window } from 'vscode';
6+
import { Uri, window } from 'vscode';
77
import ObserverClassGenerator from 'generator/observer/ObserverClassGenerator';
88
import ObserverEventsGenerator from 'generator/observer/ObserverEventsGenerator';
9+
import IndexManager from 'indexer/IndexManager';
10+
import ModuleIndexer from 'indexer/module/ModuleIndexer';
911

1012
export default class GenerateObserverCommand extends Command {
1113
constructor() {
1214
super('magento-toolbox.generateObserver');
1315
}
1416

15-
public async execute(eventName?: string): Promise<void> {
17+
public async execute(uri?: Uri, eventName?: string): Promise<void> {
18+
eventName = typeof eventName === 'string' ? eventName : undefined;
19+
20+
const moduleIndex = IndexManager.getIndexData(ModuleIndexer.KEY);
21+
let contextModule: string | undefined;
22+
23+
const contextUri = uri || window.activeTextEditor?.document.uri;
24+
25+
if (moduleIndex && contextUri) {
26+
const module = moduleIndex.getModuleByUri(contextUri);
27+
28+
if (module) {
29+
contextModule = module.name;
30+
}
31+
}
32+
1633
const observerWizard = new ObserverWizard();
1734

1835
let data: ObserverWizardData;
1936

2037
try {
21-
data = await observerWizard.show(eventName);
38+
data = await observerWizard.show(eventName, contextModule);
2239
} catch (error) {
2340
if (error instanceof WizzardClosedError) {
2441
return;

0 commit comments

Comments
 (0)