bitbagcommerce / syliuswishlistplugin Goto Github PK
View Code? Open in Web Editor NEWThis plugin allows you to integrate wishlist features with Sylius platform app.
License: MIT License
This plugin allows you to integrate wishlist features with Sylius platform app.
License: MIT License
Hi,
Do you plan to add compatibility with Sylius 1.12
?
Sylius version: 1.11.7
Wishlist plugin version: 2.0.5
Since the 2.0.5 version an error occurred when I run the cache:clear command with the %kernel.debug%
set to false
:
request.CRITICAL: Uncaught PHP Exception Error: "Failed opening required '/srv/sylius/var/cache/prod/doctrine/orm/Proxies/__CG__SyliusComponentChannelModelChannel.php' (include_path='.:/usr/local/lib/php')" at /srv/sylius/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php line 197 {"exception":"[object] (Error(code: 0): Failed opening required '/srv/sylius/var/cache/prod/doctrine/orm/Proxies/__CG__SyliusComponentChannelModelChannel.php' (include_path='.:/usr/local/lib/php') at /srv/sylius/vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php:197)"}
Apparently the proxy class for Sylius\Component\Channel\Model\Channel
cannot be generated. Actually we don't need a proxy class for the Sylius channel model, because we extend it as an entity.
After investigations it appears that the wishlist entity definition in the bitbag wishlist plugin is responsible for this error. The PR #158 will fix it.
This is a list of missing ones I've faced (but there may be more):
services:
# Missed services required for autowiring
BitBag\SyliusWishlistPlugin\Factory\WishlistFactoryInterface:
alias: bitbag_sylius_wishlist_plugin.custom_factory.wishlist
BitBag\SyliusWishlistPlugin\Factory\WishlistProductFactoryInterface:
alias: bitbag_sylius_wishlist_plugin.custom_factory.wishlist_product
BitBag\SyliusWishlistPlugin\Context\WishlistContextInterface:
alias: bitbag_sylius_wishlist_plugin.context.wishlist
I'am using the version 4.0 of this Plugin.
In our project every transport is async by default. So every action i make with wishlists is also async after installing the plugin. When creating a new wishlist i will get an error because the message was not handled in sync
. Which also makes totally sense.
In my messenger configuration i had to configure the following, in order to get every single SyliusWishlistPlugin
message handled by a sync
transport.
framework:
messenger:
transports:
sync:
dsn: 'sync://'
routing:
'BitBag\SyliusWishlistPlugin\Command\Wishlist\RemoveWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\RemoveProductVariantFromWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\RemoveProductFromWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\UpdateWishlistNameInterface': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\RemoveSelectedProductsFromWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\ExportSelectedProductsFromWishlistToPdfInterface': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\AddWishlistToUser': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\CopySelectedProductsToOtherWishlistInterface': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\AddSelectedProductsToCart': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\CreateNewWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\CreateWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\AddProductToSelectedWishlist': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\AddProductsToCartInterface': sync
'BitBag\SyliusWishlistPlugin\Command\Wishlist\WishlistTokenValueAwareInterface': sync
My idea here is to minimize the configuration by adding a WishlistSyncInterface
to every messenger relevant command. And also adding a hint to the documentation that when you are using async transports only, you have to configure your messenger like this:
framework:
messenger:
transports:
sync:
dsn: 'sync://'
routing:
'BitBag\SyliusWishlistPlugin\Command\Wishlist\WishlistSyncInterface': sync
Hello,
I'm using this package and I recently wanted to upgrade to Sylius 1.6, but the package's dependancy to Sylius 1.4 make it impossible. It would be good to make a new tag for these new version au Sylius!
Thank you !
With version 2.0, wishlists for logged in user have a lot of inconsistencies.
Not logged in user
The first time a user enter the website a new token is generated and assigned to the user. This token is stored both on DB and as cookie. The token is used as identifier to retrieve the wishlists of the user. If the user cleans his cookie the wishlist resets as a new token is generated and assigned to him. This is ok.
The user logs in
Now, if a not logged in user has a wishlist with some products and logs in, he will see the new wishlist as his token is still the same, but if he clean his cookies, the wishlist disappears. This is bad, and this is due to the fact that, on the DB, the field "shop_user_id" of the wishlist is not populated with the id of the user upon login.
Now, a new token has been generated, and the user can add products to the wishlist, and this wishlist has the "shop_user_id" populated. Ok, but now, everytime the user cleans his cookies a new token will be generated and a new wishlist will be created for him.
P.S. the demo here doesn't seems to have the last version of this plugin. Moreover, it seems impossibile to register and login, cause the verification email is never delivered.
Sylius\Component\Channel\Model\Channel
class should not be a target of the entity in mappings. The App\Entity\Channel\Channel
should be used instead. Whenever the component entity is extended the application will fail. An example is Sylius Plus.
<many-to-one field="channel" target-entity="Sylius\Component\Channel\Model\Channel">
<join-column name="channel_id" on-delete="CASCADE" />
</many-to-one>
# src/Resources/config/doctrine/Wishlist.orm.xml
<many-to-one field="channel" target-entity="App\Entity\Channel\Channel">
<join-column name="channel_id" on-delete="CASCADE" />
</many-to-one>
Hi guys,
there is a huge performance problem with the version 2.0.0 of this plugin. It's a combination of 2 changes that were made in this version and that were not properly addressed:
On EVERY first request of a "new user", a record is added to the btibag wishlist. This is done here with an event listener on the kernel request. As you can see, this logic check if the cookie "wishlist_cookie_token" is set, otherwise it creates a NEW WISHLIST record in the table. Maybe a normal user would navigate the website for sometime with that cookie properly set, but if we consider all the traffic coming from bots, that can easily ignore cookies, this will lead to a new record on the table for each request!
Moreover, there aren't any services that clean this table, so this will grow indefinitely.
The "unique" constraint on the token field in the wishlist bitbag plugin has been removed, and the only index of the table is on the "shop_user_id" (excluding the ID), but all queries are made by using the shop_user_id and the token, that is not indexed, resulting in a very slow query that reads all the records. Combined with the previous point, this leads to a slower and slower website: the table grows on each request and the wishlist is read on a huge table without proper indexes.
Versions:
Steps to reproduce:
Possible fix:
Tried to provide some fix here: #226
public function removeProduct(WishlistProductInterface $product): self
should be renamed to public function removeWishlistProduct(WishlistProductInterface $wishlistProduct): self
.
Currently it looks like this:
public function removeProduct(WishlistProductInterface $product): self
{
if ($this->hasWishlistProduct($product)) {
$this->wishlistProducts->removeElement($product);
}
return $this;
}
Exprcting this:
public function removeWishlistProduct(WishlistProductInterface $wishlistProduct): self
{
if ($this->hasWishlistProduct($product)) {
$this->wishlistProducts->removeElement($product);
}
return $this;
}
public function removeProduct(ProductInterface $product): self
{
foreach ($this->wishlistProducts as $wishlistProduct) {
if ($wishlistProduct->getProduct() === $product) {
$this->wishlistProducts->removeElement($wishlistProduct);
}
}
return $this;
}
Hi,
I have an error message when i install plugin on fresh install :
"You have requested a non-existent parameter "wishlist_cookie_token"
Can you help me ?
Thank you
Hello
I want to know if there is any possibilities to share a wishlist ? By mail for example
Thanks
It's ok on symfony version 4.3.11. But not works on symfony version 4.4.5.
`Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException:
An error has occurred resolving the options of the form "Sylius\Bundle\CoreBundle\Form\Type\Order\AddToCartType": The option "is_wishlist" does not exist. Defined options are: "action", "allow_extra_fields", "allow_file_upload", "attr", "attr_translation_parameters", "auto_initialize", "block_name", "block_prefix", "by_reference", "compound", "constraints", "csrf_field_name", "csrf_message", "csrf_protection", "csrf_token_id", "csrf_token_manager", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_mapping", "extra_fields_message", "help", "help_attr", "help_html", "help_translation_parameters", "inherit_data", "invalid_message", "invalid_message_parameters", "label", "label_attr", "label_format", "label_translation_parameters", "mapped", "method", "post_max_size_message", "product", "property_path", "required", "row_attr", "translation_domain", "trim", "upload_max_size_message", "validation_groups".
at vendor/symfony/symfony/src/Symfony/Component/Form/ResolvedFormType.php:99
at Symfony\Component\Form\ResolvedFormType->createBuilder(object(FormFactory), '0', array('label' => false, 'required' => false, 'product' => object(Product), 'data' => object(AddToCartCommand), 'is_wishlist' => true))
(vendor/symfony/symfony/src/Symfony/Component/Form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php:74)
at Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeDataCollectorProxy->createBuilder(object(FormFactory), '0', array('label' => false, 'required' => false, 'product' => object(Product), 'data' => object(AddToCartCommand), 'is_wishlist' => true))
(vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php:76)
at Symfony\Component\Form\FormFactory->createNamedBuilder(0, object(ResolvedTypeDataCollectorProxy), null, array('label' => false, 'required' => false, 'product' => object(Product), 'data' => object(AddToCartCommand), 'is_wishlist' => true))
(vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php:94)
at Symfony\Component\Form\FormBuilder->create(0, 'Sylius\Bundle\CoreBundle\Form\Type\Order\AddToCartType', array('label' => false, 'required' => false, 'product' => object(Product), 'data' => object(AddToCartCommand), 'is_wishlist' => true))
(vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php:244)
at Symfony\Component\Form\FormBuilder->resolveChildren()
(vendor/symfony/symfony/src/Symfony/Component/Form/FormBuilder.php:195)
at Symfony\Component\Form\FormBuilder->getForm()
(vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php:30)
at Symfony\Component\Form\FormFactory->create('BitBag\SyliusWishlistPlugin\Form\Type\AddProductsToCartType', null, array('cart' => object(Order), 'wishlist_products' => object(PersistentCollection)))
(vendor/bitbag/wishlist-plugin/src/Controller/Action/ListWishlistProductsAction.php:82)
at BitBag\SyliusWishlistPlugin\Controller\Action\ListWishlistProductsAction->__invoke(object(Request))
(vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:146)
at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
(vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php:68)
at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
(vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php:201)
at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
(public/index.php:25)`
When calling the URL to add a product to the wishlist without having a referer, a TypeError exception is thrown :
Symfony\Component\HttpFoundation\Request::create(): Argument #1 ($uri) must be of type string, null given, called in [...]/vendor/bitbag/wishlist-plugin/src/Controller/Action/AddProductToWishlistAction.php on line 110
This happens when bots are browsing the site, but also when a visitor shares the "Add to wishlist" button URL to someone instead of the product page URL.
I thought this could be fixed by redirecting to the homepage if there is no referer:
$referer = $request->headers->get('referer');
$redirectURL = $referer ? Request::create($referer)->getPathInfo() : $request->getSchemeAndHttpHost();
return new RedirectResponse($redirectURL);
Another option would be to inject the router in the controller and generate the URL to the product page.
I can submit a PR !
Hi all.
We are using the wishlist plugin in a different language, and we are able to override all translations that are used in the Twig templates, so that is great. But i am not able to easily change the content of the modal. And i believe all the text in this modal is all set in javascript. Is there an easy way to add the required translations instead of forking this repository?
Thanks for this plugin and your time.
The AddProductsToCartHandler checks only if the variant is in stock, but this is not always sufficient. For this purpose, Sylius gives a service the AvailabilityCheckerInterface. This should be used in this handler instead of manual check for stock quantity.
If you try, to create a resource route with standard ResourceController
for wishlist_product
, you end up with an error of non-existing method.
Got dug into the code and found that the default controller is โ probably accidentally โ specified as one of EntityRepository
aliases.
A workaround:
bit_bag_sylius_wishlist:
resources:
wishlist_product:
classes:
controller: Sylius\Bundle\ResourceBundle\Controller\ResourceController
hello :)
Your demo doesn't work. The button to add to wishlist add to the cart.
In my project it's the same and i'm unable to add a variant product to the wishlist
thanks
Sylius version : 1.9
Plugin version : v1.5.3
After installing the plugin, I noticed that all the migrations that we create using the doctrine:migrations:diff (or :generate) ends up in the plugins migration folder, instead of the project's directory.
Turns out the plugin's BitBagSyliusWishlistExtension class prepend its migration_path, causing the following thing :
Migrations are correctly setup in our project (see our config/packages/doctrine_migrations.yaml file)
Is there a reason as to why this approach was chosen instead of a doctrine:migrations:diff then :migrate ?
Thanks
When a new user agent lands directly on /wishlist, a server-side error will occur. This can be experienced even at the demo website.
Call to a member function getWishlistProducts() on null
Steps to reproduce:
In BitBag\SyliusWishlistPlugin\Form\Extension\AddToCartTypeExtension::buildForm()
there is a call to resolveAndCreate()
which is not that good, because just hitting the product detail page writes data to DB :/
->add('wishlists', EntityType::class, [
'class' => Wishlist::class,
'choices' => $this->wishlistsResolver->resolveAndCreate(),
'choice_label' => 'name',
'mapped' => false,
])
Not sure what to do here jet, but maybe just call $this->wishlistsResolver->resolve()
is also fine and we can live with a empty list of wishlists here?
when i type bin/console debug:event-dispatcher -vvv
the command is blocked by:
[Webmozart\Assert\InvalidArgumentException]
The class has to be used in HTTP context only
Webmozart\Assert\Assert::notNull() at vendor/bitbag/wishlist-plugin/src/EventSubscriber/CreateNewWishlistSubscriber.php:48
I modified the code by not injecting the Request
into constructor and using the request object from the RequestEvent
. Also removed the Assert.
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
$currentPath = $request->getPathInfo();
if (!str_starts_with($currentPath, self::ALLOWED_ENDPOINTS_PREFIX)) {
return;
}
/** @var WishlistInterface[] $wishlists */
$wishlists = $this->wishlistsResolver->resolve();
$wishlistCookieToken = $request->cookies->get($this->wishlistCookieToken);
if (!empty($wishlists)) {
if (null === $wishlistCookieToken) {
$request->attributes->set($this->wishlistCookieToken, reset($wishlists)->getToken());
}
return;
}
if (null === $wishlistCookieToken) {
$wishlistCookieToken = $this->wishlistCookieTokenResolver->resolve();
}
$request->attributes->set($this->wishlistCookieToken, $wishlistCookieToken);
}
public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
if (!str_starts_with($request->getPathInfo(), self::ALLOWED_ENDPOINTS_PREFIX)) {
return;
}
if ($request->cookies->has($this->wishlistCookieToken)) {
return;
}
$response = $event->getResponse();
$wishlistCookieToken = $request->attributes->get($this->wishlistCookieToken);
if (!$wishlistCookieToken) {
return;
}
$cookie = new Cookie($this->wishlistCookieToken, $wishlistCookieToken, strtotime('+1 year'));
$response->headers->setCookie($cookie);
$request->attributes->remove($this->wishlistCookieToken);
}
The add to wishlist button in the example template supplied at /tests/Application/templates/ShopBundle/Product/Show/_addToCart.html.twig adds the product to the cart instead of the wishlist.
PHP: 7.3.29
Sylius: 1.9.5
Symfony: 5.3.3
Hi,
after launching composer require bitbag/wishlist-plugin
, i got this error:
The service "bitbag_sylius_wishlist_plugin.controller.action.list_wishlist_products" has a dependency on a non-existent service "templating.engine.twig".
Any suggest?
Thanks
Hello,
There's an issue with your Migration (Version20201029161558.php
) while upgrading from version below 1.5 to version 1.5.x.
When executing php bin/console doctrine:migration:migrate -q
it returns this error
Script doctrine:migration:migrate -q returned with error code 1
!!
!! In AbstractMySQLDriver.php line 57:
!!
!! An exception occurred while executing 'CREATE TABLE bitbag_wishlist (id INT
!! AUTO_INCREMENT NOT NULL, shop_user_id INT DEFAULT NULL, token VARCHAR(255)
!! NOT NULL, UNIQUE INDEX UNIQ_578D4E775F37A13B (token), UNIQUE INDEX UNIQ_57
!! 8D4E77A45D93BF (shop_user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8
!! COLLATE `UTF8_unicode_ci` ENGINE = InnoDB':
!!
!! SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'bitbag_wish
!! list' already exists
!!
!!
!! In Exception.php line 18:
!!
!! SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'bitbag_wish
!! list' already exists
!!
!!
!! In PDOConnection.php line 52:
!!
!! SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'bitbag_wish
!! list' already exists
!!
!!
!! doctrine:migrations:migrate [--write-sql [WRITE-SQL]] [--dry-run] [--query-time] [--allow-no-migration] [--all-or-nothing [ALL-OR-NOTHING]] [--configuration CONFIGURATION] [--db-configuration DB-CONFIGURATION] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> [<version>]
!!
!!
It is actually because you don't check tables and columns in your migration class with methods like $schema->hasTable('xxx')
or $schema->getTable('xxx')->hasColumn('xxx')
.
Thx
After migrating migration BitBag\SyliusWishlistPlugin\Migrations\Version20201029161558
and checking schema by following commad
bin/console doctrine:schema:validate
It will return an error
[ERROR] The database schema is not in sync with the current mapping file.
and after checking for missing SQL queries
bin/console doctrine:schema:update --dump-sql
returns:
The following SQL statements will be executed:
ALTER TABLE bitbag_wishlist_product DROP FOREIGN KEY FK_3DBE67A0FB8E54CD;
ALTER TABLE bitbag_wishlist_product ADD CONSTRAINT FK_3DBE67A0FB8E54CD FOREIGN KEY (wishlist_id) REFERENCES bitbag_wishlist (id) ON DELETE CASCADE;
The next migration file should be created?
In Version 4.0.1 with the Merge of the PR the bug where on every Request there is a new wishlist created.
After updating to 4.0.0 i created a test wich makes several request to sylius and counts the number of wishlists in database. Maybe also a good test for this plugin?
Anyways, i think the Wishlist Resolver and the CreateWishList Command must be modified to also return null or at least not persisting to database. Evereytime when renering the add_item_to_cart form, it creates a wishlist in database.
Hey, I just ran phpstan on the code and it found 22 errors.
Thing is, we use a fork of this plugin in our project where we don't want any phpstan errors.
I could fix them in the fork, but pulling updates from this repository would probably bring them back.
Steps to reproduce:
Result: You have items in your account2's wishlist that account1 put in its wishlist.
I presume it should be due to local storage, but if users are logged in, the plugin shouldnt use local storage
Hello,
Is it possible to deactivate a specific apiPlatform route? for example, some routes are not necessary,
I don't use the front side, but the api route side for my project.
I would like to configure this in a resource yaml.
Sincerely, kamel.
How to pull the api of the wishlist?
See line:
Previously, we check in line 67 if $cookieWishlist is null, therefore we don't need to check that again in line 73 and 79 since we used return statement.
The AddProductsToCartHandler will try to add to the cart all items, even if they are not selected. This will cause an error flash message because the quantities of not selected products can be empty.
Hello,
I have this error message after install plugin (on sylius fresh install) :
An exception occurred while executing 'SELECT b0_.name AS name_0, b0_.token AS token_1, b0_.id AS id_2, b0_.shop_user_id AS shop_user_id_3, b0_.channel_id AS channel_id_4 FROM bitbag_wishlist b0_ WHERE b0_.shop_user_id = ? OR b0_.token = ? ORDER BY b0_.id ASC' with params [22, ""]:
Any idea ?
Thank you
After upgrading to Sylius 1.5.9 and Sf 4.4.5
the services in file /vendor/bitbag/wishlist-plugin/src/Resources/config/services.yml
are not correctly loading the services . (I have ensured that services.yml is read)
In OrderItemController at this line $addToWishlist = $form->get('addToWishlist');
form child 'addToWishlist' is not loaded.
An exception has been thrown during the rendering of a template ("Child "addToWishlist" does not exist.").
That corresponds to service
bitbag_sylius_wishlist_plugin.form.type.extension.add_to_cart_type_extension: class: BitBag\SyliusWishlistPlugin\Form\Extension\AddToCartTypeExtension tags: - { name: form.type_extension, extended_type: Sylius\Bundle\CoreBundle\Form\Type\Order\AddToCartType }
If I copy this service to our /config/services.yaml this error disappears. and console command console debug:form 'Sylius\Bundle\CoreBundle\Form\Type\Order\AddToCartType'
confirms.
But we should not copy all your services into our files!
Do you know something about this ?
Hi @bitbager , thanks for this plugin. I want to know how i can extend the plugin's views. Maybe you need to call them without 'Resources/views':
When creating a wishlist using the modal, it sometimes happens that a user presses submits the form using the keyboard instead of pressing 'Perform' in the modal.
Since the form in the modal does not have action or a submit event handler, the form posts its action to /wishlist
instead of /wishlist/create
. This causes either a 422 Method not allowed error
, but in most cases nothing happens.
Is there something i am missing or is this not yet implemented?
When it is not yet implemented, I believe this can fixed/implemented by doing the following.
Add either a action to the form in the modal to /wishlists/create
. Or call the performAction
javascript function when the form is submitted, instead of only handling the performAction
function on the click
event of the 'Perform' button.
Due to time constraints i am unable to submit a PR in the near future.
Thank for your time and this plugin.
We are using Mysql and the DB Schema of this plugin is not in sync with the provided migrations.
When you exec bin/console do:mi:mi -n
the migration bundle will create a new migration file.
Please add the missing token_idx
migration to this plugin.
Hi,
I was wondering is there is a reason why you don't take into account if the product stock is tracked or not.
If the product stock is marked as non tracked, we can still add the product to the cart, even is the stock is not set higher than 0, but we can't add it from the wishlist.
I can do a simple PR is that 's a mistake
Hello
Does the plugin support with Shop Api ?
When i come on the page as a new user, the wishlist is created without the shop user id. Then i create an account, an the wishlist is not updated, the shop user is not set
in this issue there is the same behaviour, the field "shop_user_id" of the wishlist is not populated with the id of the user
This can happen after logging in to Account area
when you set something like this at plugin's config:
bit_bag_sylius_wishlist:
wishlist_cookie_token: false
(I've misunderstood purpose of wishlist_cookie_token
option and set false there)...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.