Giter Club home page Giter Club logo

magento2-phpstorm-plugin's Introduction

Magento Commerce

PhpStorm Magento 2 Plugin

Version Downloads Made With Love

Installation

  1. Go to Settings > Preferences in the PhpStorm IDE
  2. Navigate to Plugins
  3. Click the Browse repositories... button and search for "Magento PhpStorm"
  4. Install the plugin and restart PhpStorm
  5. Go to Settings > Preferences > Languages & Frameworks > PHP > Frameworks > Magento in the PhpStorm IDE
  6. Check Enable and click the OK button

Works with

  • PhpStorm >= 2023.1
  • JRE >= 17

Features

  • Configuration smart completion and references for XML/JavaScript files
  • Navigate to configuration reference in scope of class/interface
  • Go to plugin reference in scope of class/interface and method
  • Navigate to Web API configuration reference in scope of class/interface and method
  • Plugin class methods generation
  • Plugin declaration inspection
  • RequireJS reference navigation and completion
  • MFTF reference navigation and completion
  • GraphQL navigation line markers
  • Code generation
  • Inspections for XML configuration

Setting up development environment

  1. Check out this repository
  2. Open a folder with the project in the IntelliJ Ultimate using the open action button.
  3. Make sure that you on the latest develop branch (e.g 5.2.0-develop)
  4. Right-click on the build.gradle file, choose "Import Gradle project" (if this is not exist look for "Build module ''") (you need to have Gradle plugin installed)
  5. Check if the right SDK version is used for the project.
    • Current Java version for the project is java 11, so you should additionally download SDK 11 and choose it in the module settings: Right click by the project root > Open Module Settings > Project Settings > Project > Project SDK
    • Check if right SDK version is used for the Gradle plugin: Intellij IDEA > Preferences... > Build, Execution, Deployment > Build Tools > Gradle > Gradle JVM and choose your JDK.
  6. When the Gradle sections appeared in the right bar, navigate there and right-click magento-2-php-storm-plugin > Tasks -> Intellij -> runIde
  7. Click Run "magento-2-php-storm-plugin" to run the plugin. You should see a new instance of IntelliJ launched with the plugin installed. Make sure the plugin is enabled in IntelliJ settings and indexing is finished. Plugin features should be accessible at this point.

How to contribute

  1. Start with looking into Community Backlog. Any ticket in Ready for Development and Good First Issue columns are a good candidates to start.
  2. Didn't satisfy your requirements? Create a new issue. It can be for example:
    • Bug report - Found a bug in the code? Let us know!
    • Enhancement - Know how to improve existing functionality? Open an issue describe how to enhance the plugin.
    • New feature proposal - Know how to make a killer feature? Do not hesitate to submit your proposal.
  3. The issue will appear in the Ready for Grooming column of the Community Backlog. Once it will be discussed and approved the issue will be ready for development.
  4. Refer to the Contributing Guide for more information on how to contribute.

How to create SandBox for development

  1. Create sandbox folder
  2. Copy to sandbox folder composer.json and composer.lock
  3. In sandbox folder create app/code and vendor/magento
  4. Copy any of the magento modules (as for example: framework, module-catalog, module-checkout, module-customer, module-sales) into the vendor/magento folder. It is better to add as few modules as possible to reduce reindexing time during application running
  5. (Nice to have) Open IDE and go to Preferences > Editor > File and Code Templates > Includes tab and add default headers for PHP File Header and XML File Header

PHP File Header:

/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

XML File Header:

<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->

Join the #phpstorm-plugin Slack channel to get more involved

License

Each Magento source file included in this distribution is licensed under OSL-3.0 license.

Please read the LICENSE.txt for the full text of the Open Software License v. 3.0 (OSL-3.0).

magento2-phpstorm-plugin's People

Contributors

andrewbess avatar andreychorniy avatar anzin avatar artemii-karkusha avatar bohdan-harniuk avatar coderimus avatar danmooney2 avatar dkvashninbay avatar dmitryfurs avatar doninatwix avatar drpayyne avatar eduard13 avatar ferrmolina avatar iamdylanngo avatar iamwade avatar ihor-sviziev avatar joni-jones avatar konarshankar07 avatar korovitskyi avatar lenaorobei avatar mgonzalez-droid avatar mmezhensky avatar paliarush avatar pmclain avatar prokopovvitaliy avatar roma-glushko avatar serhiyzhovnir avatar vitaliyboyko avatar vrann avatar yevhenzvieriev avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

magento2-phpstorm-plugin's Issues

Very aggressive auto completion in XML

When typing in an XML file, the auto completion looks to be set to auto fill when you press the space bar. A lot of times you don't need to fill in class paths, etc. when typing between tags. Is there a way to tone this down a bit, give it a delay of some sort? I always have to delete autofilled text in XML.

screencast 2019-04-07 12-08-08

In the screencast, I was trying to type Custom cache, and when I typed the word cache and then hit the space bar, it force autofilled the only entry it could find:

image

The only way to make it not do that is to hit the escape key after each word.

Not sure if this is something in PhpStorm (the fact that it selects the only entry it finds and fills it), but after disabling the plugin, the behavior does not occur.

NullPointerException

Hello,

PHPStorm is raising an "IDE Fatal Error" on this plugin.

I don't why and how, and the plugin seems to be working fine even if this is raised.

Here is my stack:

java.lang.NullPointerException
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:15)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.findViewVfs(FilePathCompletionProvider.java:105)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.addCompletions(FilePathCompletionProvider.java:56)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.magento.idea.magento2plugin.completion.provider.CompositeCompletionProvider.addCompletions(CompositeCompletionProvider.java:23)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:132)
	at com.intellij.codeInsight.completion.XmlNoVariantsDelegator.fillCompletionVariants(XmlNoVariantsDelegator.java:28)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$2.addCompletions(LiveTemplateCompletionContributor.java:90)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:112)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.a(CompletionProgressIndicator.java:839)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.access$600(CompletionProgressIndicator.java:92)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator$1CalculateItems.run(CompletionProgressIndicator.java:821)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1127)
	at com.intellij.codeInsight.completion.AsyncCompletion.tryReadOrCancel(CompletionThreading.java:181)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.b(CompletionProgressIndicator.java:832)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:108)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:157)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:534)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:479)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:94)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:104)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:315)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

Just in case it lights up something in someone's head...

Action/Code Generation. Controller generation

Add action and templates for generating controllers.

  • Right-click on the module Controller directory
  • Create a controller action is accessible
  • Click on the action
  • Create a controller dialog is shown
  • Dialog contains (select Controller Type [admin, storefront], select HttpMethod, text input Controller Name, text input Action Name, Ok button, Cancel Button)
  • Controller created after filling out required fields and click the Ok button

phpstorm meta plugin file

By adding the following .phpstorm.meta.php into the root of the repo, you can get better code completion when using magento's DI ObjectManager get method.

<?php

namespace PHPSTORM_META
{
    override(\Magento\Framework\ObjectManagerInterface::get(0), map(['' => '@']));
}

It looks like this file can be easily added into the system via the library root feature shown here: https://github.com/artspb/phpstorm-library-plugin

Action/Code Generation. Add license select to the new module

Action New Module MVP was added in #39.

We need to implement a license select for the new module action.
Select should have the following options:

  • Open Software License (OSL)
  • Mozilla Public License (MPL)
  • Massachusetts Institute of Technology License (MITL)
  • GNU Lesser General Public License (LGPL)
  • GNU General Public License (GPL)
  • Berkeley Software Distribution License (BSDL)
  • Apache Software License (ASL)
  • Academic Free License (AFL)

The selected license should be automatically added to the composer JSON.

image
image

Action/Code Generation. Block generation

Add action and templates for generating blocks.

  • Right-click on the module Block directory
  • Create a block action is accessible
  • Click on the action
  • Create a block dialog is shown
  • Dialog contains (select Block Type [admin, storefront], text input Parent Directory, text input Block Name, Ok button, Cancel Button)
  • Block created within the Parent Directory after filling out required fields and click the Ok button

Action. Plugin method generation NullPointerException issue

Preconditions:

  • 1.0.0-develop branch
  • Grudle runIde command is launhced

Steps to reproduce:

  1. Declare a Plugin for a not existing class in di.xml
  2. Cmd + n/Cntrl + n on plugin class
  3. Select create Magento (any) plugin method
  4. Check logs

Acceptance criteria:
The error message is shown with the text like: "Target class is not found. Check the di.xml file."

java.lang.NullPointerException
	at com.magento.idea.magento2plugin.actions.generation.MagentoGeneratePluginMethodHandlerBase.targetMethods(MagentoGeneratePluginMethodHandlerBase.java:193)
	at com.magento.idea.magento2plugin.actions.generation.MagentoGeneratePluginMethodHandlerBase.invoke(MagentoGeneratePluginMethodHandlerBase.java:71)
	at com.intellij.codeInsight.actions.CodeInsightAction.lambda$null$0(CodeInsightAction.java:59)
	at com.intellij.codeInsight.actions.CodeInsightAction.lambda$actionPerformedImpl$1(CodeInsightAction.java:65)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:220)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:178)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:159)
	at com.intellij.codeInsight.actions.CodeInsightAction.actionPerformedImpl(CodeInsightAction.java:56)
	at com.intellij.codeInsight.actions.CodeInsightAction.actionPerformed(CodeInsightAction.java:29)
	at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:298)
	at com.intellij.openapi.application.TransactionGuardImpl.runSyncTransaction(TransactionGuardImpl.java:83)
	at com.intellij.openapi.application.TransactionGuardImpl.submitTransactionAndWait(TransactionGuardImpl.java:149)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:313)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAwareWithCallbacks(ActionUtil.java:289)
	at com.intellij.ui.popup.ActionPopupStep.performAction(ActionPopupStep.java:223)
	at com.intellij.ui.popup.ActionPopupStep.performAction(ActionPopupStep.java:213)
	at com.intellij.ui.popup.ActionPopupStep.lambda$onChosen$2(ActionPopupStep.java:207)
	at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:193)
	at com.intellij.ui.popup.AbstractPopup.lambda$dispose$13(AbstractPopup.java:1434)
	at com.intellij.util.ui.UIUtil.invokeLaterIfNeeded(UIUtil.java:2418)
	at com.intellij.ide.IdeEventQueue.ifFocusEventsInTheQueue(IdeEventQueue.java:177)
	at com.intellij.ide.IdeEventQueue.executeWhenAllFocusEventsLeftTheQueue(IdeEventQueue.java:129)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:159)
	at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.doWhenFocusSettlesDown(IdeFocusManagerImpl.java:36)
	at com.intellij.ui.popup.AbstractPopup.dispose(AbstractPopup.java:1430)
	at com.intellij.ui.popup.WizardPopup.dispose(WizardPopup.java:151)
	at com.intellij.ui.popup.list.ListPopupImpl.dispose(ListPopupImpl.java:326)
	at com.intellij.ui.popup.PopupFactoryImpl$ActionGroupPopup.dispose(PopupFactoryImpl.java:292)
	at com.intellij.openapi.util.ObjectNode.lambda$execute$0(ObjectNode.java:104)
	at com.intellij.openapi.util.ObjectTree.executeActionWithRecursiveGuard(ObjectTree.java:183)
	at com.intellij.openapi.util.ObjectNode.execute(ObjectNode.java:71)
	at com.intellij.openapi.util.ObjectTree.executeAll(ObjectTree.java:133)
	at com.intellij.openapi.util.Disposer.dispose(Disposer.java:123)
	at com.intellij.openapi.util.Disposer.dispose(Disposer.java:119)
	at com.intellij.ui.popup.WizardPopup.disposeAllParents(WizardPopup.java:252)
	at com.intellij.ui.popup.list.ListPopupImpl.handleNextStep(ListPopupImpl.java:461)
	at com.intellij.ui.popup.list.ListPopupImpl._handleSelect(ListPopupImpl.java:415)
	at com.intellij.ui.popup.list.ListPopupImpl.handleSelect(ListPopupImpl.java:356)
	at com.intellij.ui.popup.list.ListPopupImpl$1.actionPerformed(ListPopupImpl.java:269)
	at com.intellij.ui.popup.WizardPopup.proceedKeyEvent(WizardPopup.java:367)
	at com.intellij.ui.popup.WizardPopup.dispatch(WizardPopup.java:347)
	at com.intellij.ui.popup.PopupDispatcher.dispatchKeyEvent(PopupDispatcher.java:112)
	at com.intellij.ui.popup.PopupDispatcher.dispatch(PopupDispatcher.java:148)
	at com.intellij.ide.IdePopupManager.dispatch(IdePopupManager.java:93)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:748)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:424)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:698)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:423)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Action/Code Generation. Create a plugin for a method

We need to implement the functionality to create a plugin by clicking on the public method.

User story:

  • Right-click on a class public method name
  • Select "Create a plugin for the method"
  • Dialog with the following field being shown (text input Module, Select Area, text input Plugin Class name, text input Plugin Directory, select with plugin type (around, after, before), Ok button, Cancel Button)
  • After filling out fields and click the Ok button the plugin file is created in the Plugin Directory and the plugin tag is added to the Module di.xml in the selected Area.

Navigation from PHP class to its XML declaration

Overview

Currently the navigation from PHP class to its xml declaration support only for

  • di.xml
  • events.xml
  • layout xml files

but Magento also has other xml files contains PHP classes like: crontab.xml, extension_attributes.xml, product_options.xml, etc...

Acceptance Criteria

  • It is possible to navigate from PHP class to its XML declaration regardless of xml file where PHP class was declared

Inspection for possible observer name duplication

We need to implement a check in a purpose to avoid accidentally overriding an observer.

Acceptance criteria [case warnig]:
Module_Module1 observer:

<event name="sales_order_save_before">
        <observer name="foo" instance="Bar"/>
    </event>

Module_Module2 observer:

<event name="sales_order_save_before">
        <observer name="foo" instance="Bar2"/>
    </event>

As a result, we need to show the warning like "The observer might override another observer. In case you do want to override the observer, please disable the original one and introduce the new one with the unique name".

Plugin Crash; Exception

null
java.lang.NullPointerException
at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:15)
at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.findViewVfs(FilePathCompletionProvider.java:105)
at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.addCompletions(FilePathCompletionProvider.java:56)
at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
at com.magento.idea.magento2plugin.completion.provider.CompositeCompletionProvider.addCompletions(CompositeCompletionProvider.java:23)
at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:132)
at com.intellij.codeInsight.completion.XmlNoVariantsDelegator.fillCompletionVariants(XmlNoVariantsDelegator.java:28)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$2.addCompletions(LiveTemplateCompletionContributor.java:90)
at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:112)
at com.intellij.codeInsight.completion.CompletionProgressIndicator.a(CompletionProgressIndicator.java:839)
at com.intellij.codeInsight.completion.CompletionProgressIndicator.access$600(CompletionProgressIndicator.java:92)
at com.intellij.codeInsight.completion.CompletionProgressIndicator$1CalculateItems.run(CompletionProgressIndicator.java:821)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1127)
at com.intellij.codeInsight.completion.AsyncCompletion.tryReadOrCancel(CompletionThreading.java:181)
at com.intellij.codeInsight.completion.CompletionProgressIndicator.b(CompletionProgressIndicator.java:832)
at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:108)
at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:157)
at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:543)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:488)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:94)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:104)
at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:315)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Line markers. Fix performance warnings

We have the following warning on the plugins and WEB API line markets:
image

The issue could be fixed using PsiTreeUtil.getDeepestFirst(psiElement) or PsiTreeUtil.getDeepestLast(psiElement) function (com.intellij.psi.util.PsiTreeUtil).

Periodic crash

image

Plugin Version: 0.2.3

PhpStorm 2017.3.3
Build #PS-173.4301.34, built on January 18, 2018
JRE: 1.8.0_152-release-1024-b11 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.13.0-041300-generic

PhpStorm 2017.3.4
Build #PS-173.4548.32, built on January 30, 2018
JRE: 1.8.0_152-release-1024-b11 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Linux 4.13.0-041300-generic

Crash in opened magento projects and less often laravel & symfony

Error message: null
Details:

null
java.lang.NullPointerException
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:15)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.findViewVfs(FilePathCompletionProvider.java:105)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.addCompletions(FilePathCompletionProvider.java:56)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.magento.idea.magento2plugin.completion.provider.CompositeCompletionProvider.addCompletions(CompositeCompletionProvider.java:23)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:132)
	at com.intellij.codeInsight.completion.XmlNoVariantsDelegator.fillCompletionVariants(XmlNoVariantsDelegator.java:28)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.XmlCompletionContributor$3.addCompletions(XmlCompletionContributor.java:139)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.XmlCompletionContributor.fillCompletionVariants(XmlCompletionContributor.java:194)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$2.addCompletions(LiveTemplateCompletionContributor.java:90)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:112)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.b(CompletionProgressIndicator.java:839)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.access$600(CompletionProgressIndicator.java:92)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator$1CalculateItems.run(CompletionProgressIndicator.java:821)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1127)
	at com.intellij.codeInsight.completion.AsyncCompletion.tryReadOrCancel(CompletionThreading.java:181)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.a(CompletionProgressIndicator.java:832)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:108)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:157)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:543)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:488)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:94)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:104)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:315)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)


java.lang.NullPointerException
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:15)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.findViewVfs(FilePathCompletionProvider.java:105)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.addCompletions(FilePathCompletionProvider.java:56)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.magento.idea.magento2plugin.completion.provider.CompositeCompletionProvider.addCompletions(CompositeCompletionProvider.java:23)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:132)
	at com.intellij.codeInsight.completion.XmlNoVariantsDelegator.fillCompletionVariants(XmlNoVariantsDelegator.java:28)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.XmlCompletionContributor$3.addCompletions(XmlCompletionContributor.java:139)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.XmlCompletionContributor.fillCompletionVariants(XmlCompletionContributor.java:194)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$2.addCompletions(LiveTemplateCompletionContributor.java:90)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:112)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.b(CompletionProgressIndicator.java:839)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.access$600(CompletionProgressIndicator.java:92)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator$1CalculateItems.run(CompletionProgressIndicator.java:821)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1127)
	at com.intellij.codeInsight.completion.AsyncCompletion.tryReadOrCancel(CompletionThreading.java:181)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.a(CompletionProgressIndicator.java:832)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:108)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:157)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:543)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:488)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:94)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:104)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:315)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)


java.lang.NullPointerException
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:15)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.util.VfsUtil.findVfUp(VfsUtil.java:21)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.findViewVfs(FilePathCompletionProvider.java:105)
	at com.magento.idea.magento2plugin.completion.provider.FilePathCompletionProvider.addCompletions(FilePathCompletionProvider.java:56)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.magento.idea.magento2plugin.completion.provider.CompositeCompletionProvider.addCompletions(CompositeCompletionProvider.java:23)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:132)
	at com.intellij.codeInsight.completion.XmlNoVariantsDelegator.fillCompletionVariants(XmlNoVariantsDelegator.java:28)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.completion.XmlCompletionContributor$3.addCompletions(XmlCompletionContributor.java:139)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.XmlCompletionContributor.fillCompletionVariants(XmlCompletionContributor.java:194)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:149)
	at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
	at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$2.addCompletions(LiveTemplateCompletionContributor.java:90)
	at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:36)
	at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:152)
	at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:83)
	at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:112)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.b(CompletionProgressIndicator.java:839)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.access$600(CompletionProgressIndicator.java:92)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator$1CalculateItems.run(CompletionProgressIndicator.java:821)
	at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1127)
	at com.intellij.codeInsight.completion.AsyncCompletion.tryReadOrCancel(CompletionThreading.java:181)
	at com.intellij.codeInsight.completion.CompletionProgressIndicator.a(CompletionProgressIndicator.java:832)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:108)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:157)
	at com.intellij.openapi.progress.impl.CoreProgressManager.a(CoreProgressManager.java:543)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:488)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:94)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:144)
	at com.intellij.codeInsight.completion.AsyncCompletion.a(CompletionThreading.java:104)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:315)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)



Action/Code Generation. Override view file in a custom theme

User story:

  • Right-click on a module view file (PHTML template, js file, HTML template, layout, etc)
  • Select "Override in a theme"
  • Dialog with the (app/design)theme's selection being shown
  • After selecting a theme and click the Ok button the mentioned file is being copied to the appropriate directory of the theme, the file should contain proper copyrights

Inspection for possible plugin duplication

We need to implement a check in a purpose to avoid accidentally overriding a plugin.

Create 2 modules with di.xml files.
Module_Module1 di.xml:

<type name="Target">
        <plugin name="plugin_name" type="Module\Module1\Plugin" />
</type>

Module_Module2 di.xml:

<type name="Target">
        <plugin name="plugin_name" type="Module\Module2\Plugin" />
</type>

As a result, we need to show the warning like "The plugin might override another plugin. In case you do want to override the plugin, please disable the original one and introduce the new one with the unique name".

Eliminate irrelevant dependency on android

com.magento.idea.magento2plugin.indexes.DiIndex had dependency on com.android.annotations.NonNull which must be eliminated. org.jetbrains.annotations.NotNull should be used instead.

Action/Generation. Override a class by preference

We need to implement the functionality to override a class by preference.

User story:

  • Right-click on a class file/class name
  • Select "Override class by reference"
  • Dialog with the following field being shown (text input Module, Select Area, text input Preference Class name, text input Preference Directory, checkbox extend the overridden class , Ok button, Cancel Button)
  • After filling out fields and click the Ok button the preference file is created in the Preference Directory and preference tag is added to the Module di.xml in the selected Area.

Action. New Module.

MVP implementation of the new module template files generation (Module dir, module.xml, composer.json, registration.php)

Infrastructure. Add an automated test runner to the repo [Gradle]

Description (*)

  1. We need to configure Gradle for running automated tests
    image

Expected result (*)

  1. Each new pull request should trigger automated tests execution
  2. In case of failure, the PR merging should be blocked
  3. At least one automated test should be written in the scope of this task

JetBrains links to dkvashninbay/magento2plugin

It appears this was created under dkvashninbay/magento2plugin and then moved under the magento organization. JetBrains is still showing the original author of the plugin and not this one.

Templates. Fill information about Plugin Templates

Fill the information about the following templates to apropriate description files, see resources/fileTemplates/code/ on the branch 1.0.0-develop:

  • resources/fileTemplates/code/Magento Plugin After Method.php.ft
  • resources/fileTemplates/code/Magento Plugin Around Method.php.ft
  • resources/fileTemplates/code/Magento Plugin Before Method.php.ft

Information about plugins see here https://devdocs.magento.com/guides/v2.3/extension-dev-guide/plugins.html

Check the result under Editor > File and Code Templates
Example:
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.