Giter Club home page Giter Club logo

wsdl2rest's Introduction

Generates REST endpoints from WSDL

A tool allowing quick migration from existing JAX-WS services to REST services.

Derived from https://sourceforge.net/projects/wsdl2rest

Usage

wsdl2rest [options...]
 --wsdl URL               : URL to the input WSDL (required)
 --out PATH               : Output path for generated artefacts (required)
 --blueprint-context PATH : Path to the generated blueprint camel context file
 --camel-context PATH     : Path to the generated spring camel context file
 --jaxrs URL              : Address of the generated jaxrs endpoint
 --jaxws URL              : Address of the target jaxws endpoint

wsdl2rest's People

Contributors

apupier avatar bfitzpat avatar cunningt avatar djcoleman avatar fusesource-ci avatar grgrzybek avatar janstey avatar tdiesler 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

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

wsdl2rest's Issues

Automated test coverage for blueprint use case

Currently, the tool generates the blueprint descriptors from a template, similar to the spring descriptors. The generated spring descriptors are automatically verified in associated test cases. The generated blueprint descriptors have no test coverage yet.

This would require the use of Karaf in these test modules.

Relates to #18

Add support for Blueprint as well as Spring DSL

This came up during the tooling demo we had on 29-NOV-2017 with Keith.

Currently the utility generates a great Spring config for the REST DSL. But we also need to support the Blueprint DSL for some of our supported runtime platforms.

Any chance we can get this in for Fuse 7?

Generate client proxy instead of using provided bean implementation

This came up during the tooling demo we had on 29-NOV-2017 with Keith.

Currently the utility can use an optional bean input when generating the REST DSL output. It came up during the meeting that we should just require the WSDL and use a generated client proxy (CXF?) to wrap the existing service in REST terms.

From Keith:

  • Only prerequisite should be a WSDL - no other artifacts (beans, etc.) should be required. We should only ask for the location of the WSDL and the SOAP address (defaulted from WSDL) the user wants to use.
  • The utility should automatically generate the client proxy interface and we don't need the bean at all.

Any chance we can get this in for Fuse 7?

Disable automated merge of PR after successful PR build to enable more robust code reviews

We encountered a small hiccup when dealing with camel-tooling/generator-camel-project#38. As soon as the PR was marked "ok to test" and built successfully without errors, another automated process swooped in and merged the PR though a second review pass was in flight and two additional comments were noted for possible fixes to the code introduced.

Instead of an automated process, we might recommend making the merge a manual one? Or at the very least bumping up the time between a successful PR build and the automated merge (perhaps 24 hours?).

Cannot use array type return in doc/lit operation

@WebService
@SOAPBinding(style = Style.DOCUMENT)
public interface Address {

    /**
     * List the available resource ids.
     */
    @WebMethod
    Integer[] listAddresses();
    ...
}
Running org.slosc.wsdl2rest.test.doclit.CamelCxfWsDocLitTest
- No Server set for org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@72456279
- Interceptor for {http://doclit.test.wsdl2rest.slosc.org/}AddressService#{http://doclit.test.wsdl2rest.slosc.org/}listAddresses has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: java.lang.Integer cannot be cast to [Ljava.lang.Integer;
	at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:107)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
	at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:83)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
	at org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:278)
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:78)
	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:254)
	at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:234)
	at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:70)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1129)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1065)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:189)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
	at org.eclipse.jetty.server.Server.handleAsync(Server.java:549)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:318)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
	at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to [Ljava.lang.Integer;
	at org.slosc.wsdl2rest.test.doclit.jaxws_asm.ListAddressesResponse_WrapperTypeHelper1.createWrapperObject(Unknown Source)
	at org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor.handleMessage(WrapperClassOutInterceptor.java:91)
	... 20 more

Finish cleanup tasks for issue #18

The PR for issue #18 (camel-tooling/generator-camel-project#38) was automatically merged after a successful PR build, which left a few bits of feedback stranded.

  • There is an indentation issue in tests/spring/src/test/java/org/jboss/fuse/wsdl2rest/test/calculator/CalculatorDocLitTest.java in the searchForValue method (around line 138-140)
  • In the same method, @apupier suggested - "what about using try-with-resource notation, it will avoid the finally block to close the scanner"

NPE in CamelContextGenerator.getJavaMethod(CamelContextGenerator.java:117)

java.lang.NullPointerException
	at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.getJavaMethod(CamelContextGenerator.java:117)
	at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.addTypeMapping(CamelContextGenerator.java:94)
	at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.process(CamelContextGenerator.java:76)
	at org.jboss.fuse.wsdl2rest.impl.Wsdl2Rest.process(Wsdl2Rest.java:92)

wsdl file available on case support https://access.redhat.com/support/cases/#/case/02193740

Provide Code Coverage

It would be nice to have code coverage information.

Using JaCoCo would allow to link it with sonarcloud.io

Expose "no velocity" as a command-line option

While trying to wrap the wsdl2rest utility in a VS Code extension written in TypeScript, we have hit a similar issue (#61) to what we hit in Eclipse with the velocity log. I suspect it's a threading issue, but can't tell for sure. In order to avoid it in TS, we will need to expose the "noVelocityLog" option at command line. We didn't do it before because we didn't need to use it in Eclipse.

When testing helloworld.wsdl, utility does not pick up the jaxws address for the generated config

Unless we specify "--jaxws" as "http://localhost:3000/helloworldservice/", the generator goes with the default "http://localhost:8080/somepath" which does not run.

The CamelContextGenerator goes with the default if the jaxwsAddress isn't specified (

context.put("jaxwsAddress", jaxwsAddress != null ? jaxwsAddress : "http://localhost:8080/somepath");
)

But I think we can probably get the soap address somehow in here while processing the WSDL:

private void processBinding(Definition def, Binding binding) {

It seems that this would also be an issue with address.wsdl, but the tests usually specify a --jaxws address in the tool (see

tool.setJaxwsAddress(new URL("http://localhost:8080/doclit"));
)

Fix warning message during assembly

[INFO] --- maven-assembly-plugin:2.2-beta-5:single (assembly-directory) @ wsdl2rest-dist ---
[INFO] Reading assembly descriptor: scripts/assembly-directory.xml
[WARNING] Cannot include project artifact: org.jboss.fuse.wsdl2rest:wsdl2rest-dist:pom:0.7-SNAPSHOT; it doesn't have an associated file or directory.
[INFO] Copying files to C:\git\wsdl2rest\dist\target\wsdl2rest-0.7-SNAPSHOT
[WARNING] Assembly file: C:\git\wsdl2rest\dist\target\wsdl2rest-0.7-SNAPSHOT is not a regular file (it may be a directory). It cannot be attached to the project build for installation or deployment.

"Cannot obtain java method" error

java.lang.IllegalStateException: Cannot obtain java method for: Add
--
at org.jboss.fuse.wsdl2rest.util.IllegalStateAssertion.assertNotNull(IllegalStateAssertion.java:50)
at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.getJavaMethod(CamelContextGenerator.java:121)
at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.addTypeMapping(CamelContextGenerator.java:94)
at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.process(CamelContextGenerator.java:76)
at org.jboss.fuse.wsdl2rest.impl.Wsdl2Rest.process(Wsdl2Rest.java:92)
at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard.generate(Wsdl2RestWizard.java:323)
at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard.access$0(Wsdl2RestWizard.java:286)
at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard$1.run(Wsdl2RestWizard.java:112)

see more details on https://issues.jboss.org/browse/FUSETOOLS-3091 (includign the wsdl to reproduce)

adding support method to avoid Velocity log issue in Eclipse

So it seems that we've hit a snag with running the wsdl2rest utility within an Eclipse instance. The OSGI classloader setup in the latest updates to Eclipse Photon (and beyond) seem to cause issues when wsdl2rest attempts to update the velocity.log during its template process.

Adding the Velocity property "runtime.log.logsystem.class" and setting it to "org.apache.velocity.runtime.log.NullLogChute" is the known workaround for this issue if we don't mind Velocity actually not logging events during WSDL processing.

Adding this line to the org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator class (about line 58) resolves it:

        ve.setProperty("runtime.log.logsystem.class", org.apache.velocity.runtime.log.NullLogChute.class.getName());        

I'm thinking that maybe we can add a flag to the command line to set this property if we need the workaround, which will keep other uses of this utility not seeing an impact to the change. Edit: Unnecessary to have command-line flag at this point - just went with another utility method we could call to set the flag.

Otherwise we end up with a utility we can't run inside Eclipse and we get this error:

!ENTRY org.fusesource.ide.wsdl2rest.ui 4 0 2018-09-19 15:55:27.019
!MESSAGE Error initializing log: Failed to initialize an instance of org.apache.velocity.runtime.log.Log4JLogChute with the current runtime configuration.
!STACK 0
org.apache.velocity.exception.VelocityException: Error initializing log: Failed to initialize an instance of org.apache.velocity.runtime.log.Log4JLogChute with the current runtime configuration.
    at org.apache.velocity.runtime.RuntimeInstance.initializeLog(RuntimeInstance.java:875)
    at org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:262)
    at org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:93)
    at org.jboss.fuse.wsdl2rest.impl.codegen.CamelContextGenerator.process(CamelContextGenerator.java:59)
    at org.jboss.fuse.wsdl2rest.impl.Wsdl2Rest.process(Wsdl2Rest.java:92)
    at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard.generate(Wsdl2RestWizard.java:341)
    at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard.access$0(Wsdl2RestWizard.java:304)
    at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard$1.run(Wsdl2RestWizard.java:112)
    at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437)
    at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353)
    at org.eclipse.jface.wizard.WizardDialog.run(WizardDialog.java:974)
    at org.fusesource.ide.wsdl2rest.ui.wizard.Wsdl2RestWizard.performFinish(Wsdl2RestWizard.java:107)
    at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:772)
    at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:411)
    at org.eclipse.jface.dialogs.Dialog.lambda$0(Dialog.java:619)
    at org.eclipse.swt.events.SelectionListener$1.widgetSelected(SelectionListener.java:84)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:252)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4145)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1055)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3958)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3561)
    at org.eclipse.jface.window.Window.runEventLoop(Window.java:818)
    at org.eclipse.jface.window.Window.open(Window.java:794)
    at org.eclipse.ui.internal.handlers.WizardHandler$New.executeHandler(WizardHandler.java:269)
    at org.eclipse.ui.internal.handlers.WizardHandler.execute(WizardHandler.java:290)
    at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:291)
    at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:93)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:320)
    at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:254)
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:164)
    at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:153)
    at org.eclipse.core.commands.Command.executeWithChecks(Command.java:494)
    at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487)
    at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:204)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:305)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:579)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:648)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:438)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$2(KeyBindingDispatcher.java:381)
    at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:93)
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89)
    at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1193)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1054)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079)
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1064)
    at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1106)
    at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1102)
    at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1489)
    at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4888)
    at org.eclipse.swt.widgets.Tree.WM_CHAR(Tree.java:5968)
    at org.eclipse.swt.widgets.Control.windowProc(Control.java:4768)
    at org.eclipse.swt.widgets.Tree.windowProc(Tree.java:5963)
    at org.eclipse.swt.widgets.Display.windowProc(Display.java:4784)
    at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
    at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2309)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3559)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1170)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1059)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:153)
    at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:625)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:560)
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:656)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:592)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1498)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1471)
Caused by: org.apache.velocity.exception.VelocityException: Failed to initialize an instance of org.apache.velocity.runtime.log.Log4JLogChute with the current runtime configuration.
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:220)
    at org.apache.velocity.runtime.log.LogManager.updateLog(LogManager.java:269)
    at org.apache.velocity.runtime.RuntimeInstance.initializeLog(RuntimeInstance.java:871)
    ... 83 more
Caused by: java.lang.RuntimeException: Error configuring Log4JLogChute :
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.apache.velocity.util.ExceptionUtils.createWithCause(ExceptionUtils.java:68)
    at org.apache.velocity.util.ExceptionUtils.createRuntimeException(ExceptionUtils.java:45)
    at org.apache.velocity.runtime.log.Log4JLogChute.initAppender(Log4JLogChute.java:133)
    at org.apache.velocity.runtime.log.Log4JLogChute.init(Log4JLogChute.java:85)
    at org.apache.velocity.runtime.log.LogManager.createLogChute(LogManager.java:157)
    ... 85 more
Caused by: java.io.FileNotFoundException: velocity.log (Access is denied)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:207)
    at org.apache.log4j.FileAppender.<init>(FileAppender.java:110)
    at org.apache.log4j.RollingFileAppender.<init>(RollingFileAppender.java:79)
    at org.apache.velocity.runtime.log.Log4JLogChute.initAppender(Log4JLogChute.java:118)
    ... 87 more

Separate locations for generated Camel and Java files

Any chance we can add a command-line option that offers a specific location for the generated Camel XML file vs. the generated source? One single specified output path doesn't quite work when we're trying to put Java code in src/main/java for source and src/main/resources/OSGI-INF or src/main/resources/META-INF/spring for the Camel configuration.

Creates a invalid package name

Brian says:

"Destination Java Folder" automatically appends "/java" to the path when classes are generated, which creates a funky package name (i.e. "java.my.package.name"). Workaround is to remove the "/java" on the path in the wizard prior to hitting Finish.

Provide access as admin/developers to Fuse Tooling team

We were asked to fix issues/enhancements reported about wsdl2rest generation in Fuse Tooling (when not taking too much time to implement). In fact, most of them are related to this project.

Can @lhein @bfitzpat and I have:

it will help to be more efficient and to configure the job with Sonar analysis

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.