manishkatyan / strapi-stripe Goto Github PK
View Code? Open in Web Editor NEWStripe Plugin for Strapi CMS
Stripe Plugin for Strapi CMS
Hi,
I'm testing this out now on latest Strapi version and latest plugin version.
Unfortunately on product create it failes in the console with the following message:
invalid_request_error - product
Plans may only be created with products of type service, but the supplied product (prod_N0Dr4ozVp9z7rw) had type good.
However, looking at the Stripe backend the products were partially created, with just the product name and no other details, despite having all the info filled in.
But they don't exist on the Strapi side.
There was also no error on the Strapi console that they failed.
I'm in test mode, running on localhost.
Running on node v18.12.1
The Quasar app is a basic quickstart generated Quasar app.
Strapi is a basic localhost quickstart Strapi 4 app with the following plugins added:
Sendgrid (tested and working)
VueAuth (tested and working)
Strapi-stripe (this plugin, errors as noted)
Stripe logs for the partially created plan show two transactions:
400 ERR
POST /v1/plans
12/18/22, 12:19:39 PM
200 OK
POST /v1/products
12/18/22, 12:19:38 PM
They also indicate the API being used is a very old version:
2015-07-28
Could you please clarify what's happening?
Also, why is a product image mandatory as input on the Strapi side, when it's optional on the Stripe side?
Thanks!
The plugin allows to create subscriptions, but there is no way to cancel the subscription through the plugin !
Also, thanks for this great plugin 🙏
Infrastructure
Strapi: 4.6.1
Strapi-Stripe: 3.2.1
Error
When I try to create a Subscription type product an error is thrown in the console and the product doesn't get created in Strapi. However, the product is partially created in Stripe. I don't get errors when creating One-Time type products.
Steps to reproduce
Strapi version: 4.1.11, 4.3.0
Strapi-Stripe Plugin version: 2.3.0
If I could edit the content-types, then I could update some things like the description to be "Rich Text" or "Currency" to be a drop-down.
Many of these fields should follow this: (I am unsure why Media type isn't populating the button) #38
https://docs.strapi.io/user-docs/latest/content-manager/writing-content.html#filling-up-fields
When creating a product with UAE currency AED
set in the configuration,
the strapi plugin dashbard is unable to map over the products.
STRAPI VERSION: v4.3.6
NODE VERSION: v16.14.0
In the stripe plugin configuration select AED currency
Create a product and view plugin dashboard
Dashboard with white screen and in console the following error..
[request].d0f30510.chunk.js:1381 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'symbol')
at getProductPrice ([request].d0f30510.chunk.js:1381:32)
at [request].d0f30510.chunk.js:1474:6
at Array.map (<anonymous>)
at ProductTable ([request].d0f30510.chunk.js:1464:238)
at Ch (main.9fcd4a78.js:97497:137)
at li (main.9fcd4a78.js:97520:154)
at ck (main.9fcd4a78.js:97609:343)
at bk (main.9fcd4a78.js:97590:347)
at ak (main.9fcd4a78.js:97590:278)
at Tj (main.9fcd4a78.js:97590:138)
Products are being created in Stripe as well as can be queried from the endpoint.
localhost:1337/strapi-stripe/getProduct/0/5/name/asc
Reponse
{
"res": [
{
"id": 2,
"title": "asdadadas",
"slug": null,
"description": "asdafasda",
"price": 10,
"currency": "aed",
"isSubscription": false,
"interval": "",
"trialPeriodDays": null,
"stripeProductId": "prod_MJGSqefiKgyEj2",
"stripePriceId": "price_1LadvOFYNCDuZTtJRGVtVC7e",
"stripePlanId": "",
"createdAt": "2022-08-25T11:08:38.145Z",
"updatedAt": "2022-08-25T11:08:38.145Z",
"productImage": {
"id": 4,
"name": "strapi-logo.jpeg",
"alternativeText": null,
"caption": null,
"width": 657,
"height": 350,
"formats": {
"thumbnail": {
"name": "thumbnail_strapi-logo.jpeg",
"hash": "thumbnail_strapi_logo_11f90f4573",
"ext": ".jpeg",
"mime": "image/jpeg",
"path": null,
"width": 245,
"height": 131,
"size": 4.46,
"url": "/uploads/thumbnail_strapi_logo_11f90f4573.jpeg"
},
"small": {
"name": "small_strapi-logo.jpeg",
"hash": "small_strapi_logo_11f90f4573",
"ext": ".jpeg",
"mime": "image/jpeg",
"path": null,
"width": 500,
"height": 266,
"size": 10.14,
"url": "/uploads/small_strapi_logo_11f90f4573.jpeg"
}
},
"hash": "strapi_logo_11f90f4573",
"ext": ".jpeg",
"mime": "image/jpeg",
"size": 13.48,
"url": "/uploads/strapi_logo_11f90f4573.jpeg",
"previewUrl": null,
"provider": "local",
"provider_metadata": null,
"folderPath": "/",
"createdAt": "2022-08-25T11:08:36.777Z",
"updatedAt": "2022-08-25T11:08:36.777Z"
},
"stripePayment": [],
"createdBy": null,
"updatedBy": null
},
// ....second object
],
"count": 2
}
Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side-effects in your templates, such as <script>, as they will not be parsed.
How do I use this in vue?
Can you please add also the RON (Romanian Lei) currency to the plugin ?
Hi, I'd love the ability to invoke a server sided function on a callback to setup some records. This plugin would be perfect if it could be used for SAAS subscriptions.
strapi version 4.4.5
strapi-stripe version 2.5.1
Payment type Subscription doesn't add product, in terminal it shows error "Not a valid URL". Payment type One-Time adds product successfully
I have installed strapi-stripe plugin, created poduct, make an order.
But there is an error connected with collections.
So there are no plugin's collections there.
in logs:
error: select "t0".*, "t0"."id" from "strapi-stripe_strapi-stripe-product" as "t0" where ("t0"."id" = $1) limit $2 - invalid input syntax for type integer: "undefined"
Errors also appear on handling (adding) order data
Strapi version: 4.1.11, 4.3.0
Strapi-Stripe Plugin version: 2.3.0
If I create a product in Content-Manager, it populates in products via payment link on dashboard as it should.
I want to change the following:
The image box should open up Strapi Media library GUI to select an image, rather than manually copy / paste link.
The copy / paste of absolute url works and allows for 3rd party CDN, but initially, the image by default should be Strapi Media Library.
Hello,
I'm trying to use strapi-stripe but I'm facing a mysql error at initialization :
[2022-11-17 15:56:47.083] debug: ⛔️ Server wasn't able to start properly.
[2022-11-17 15:56:47.086] error: alter table `strapi_stripe_strapi_stripe_payment_stripe_product_links` add index `strapi_stripe_strapi_stripe_payment_stripe_product_links_order_inv_fk`(`strapi_stripe_payment_order`) - ER_TOO_LONG_IDENT: Le nom de l'identificateur 'strapi_stripe_strapi_stripe_payment_stripe_product_links_order_inv_fk' est trop long
Error: ER_TOO_LONG_IDENT: Le nom de l'identificateur 'strapi_stripe_strapi_stripe_payment_stripe_product_links_order_inv_fk' est trop long
at Query.Sequence._packetToError (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Query.ErrorPacket (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\sequences\Query.js:79:18)
at Protocol._parsePacket (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\Protocol.js:291:23)
at Parser._parsePacket (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\Parser.js:433:10)
at Parser.write (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\Parser.js:43:10)
at Protocol.write (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket.<anonymous> (C:\Dev\bestmum\strapi\node_modules\mysql\lib\Connection.js:88:28)
at Socket.<anonymous> (C:\Dev\bestmum\strapi\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:400:28)
at Socket.emit (domain.js:475:12)
--------------------
at Protocol._enqueue (C:\Dev\bestmum\strapi\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Connection.query (C:\Dev\bestmum\strapi\node_modules\mysql\lib\Connection.js:198:25)
at C:\Dev\bestmum\strapi\node_modules\knex\lib\dialects\mysql\index.js:132:18
at new Promise (<anonymous>)
at Client_MySQL._query (C:\Dev\bestmum\strapi\node_modules\knex\lib\dialects\mysql\index.js:126:12)
at executeQuery (C:\Dev\bestmum\strapi\node_modules\knex\lib\execution\internal\query-executioner.js:37:17)
at Client_MySQL.query (C:\Dev\bestmum\strapi\node_modules\knex\lib\client.js:146:12)
at C:\Dev\bestmum\strapi\node_modules\knex\lib\execution\transaction.js:363:24
at new Promise (<anonymous>)
at Client_MySQL.trxClient.query (C:\Dev\bestmum\strapi\node_modules\knex\lib\execution\transaction.js:358:12)
The table name and consequently the foreign key name length is huge so mysql refuse it.
Can you check it please ?
Hi,
We need to configure discounts cupons in our subscriptions by set the allow_promotion_codes
parameter to true
.
Any chances to allow it in the configuration panel in Strapi admins page?
See bellow the allow_promotion_codes
in Stripe API documentation:
https://stripe.com/docs/api/checkout/sessions/object#checkout_session_object-allow_promotion_codes
Please do correct me if I am wrong.
I don't see a method with the plugin APIs to poll the current status of any existing subscriptions for the user.
This makes the subscription integration far less useful as anyone using it will need to write custom APIs to get this status.
Less troublesome, but also would be great:
It also doesn't seem to associate the purchase with the current user, but rather with the email given to stripe.
It also doesn't pre-populate the stripe form with the current user's account email which would be convenient.
I have successfully linked stripe with strapi but on strapi checkout, the page image is not shown, and completing a successful transaction on test mode the transaction is not shown on the transaction report.
Hey,
I'm currently working on a mentoring website. I sell offers inside using strapi-stripe
When I'm clicking on the button "Acheter", I'm calling this current fonction reimplement createCheckout
In src/api/stripe/controllers/stripe.js
async createCheckoutSession(ctx) {
try {
const {id} = ctx.request.body;
const {stripePriceId, stripeProductId, title} = await strapi
.query('plugin::strapi-stripe.ss-product')
.findOne({
select: ['stripePriceId', 'stripeProductId', 'title'], where: {id}
});
const checkoutSessionResponse = await strapi
.service('api::stripe.stripe')
.createCheckoutSession({
stripePriceId,
customerEmail: ctx.state.user.email,
productId: stripeProductId,
productName: title
});
ctx.send(checkoutSessionResponse, 200);
} catch (e) {
ctx.badRequest(e.message);
}
},
And service src/api/stripe/services/stripe.js
'use strict';
/**
* stripe service.
*/
const {createCoreService} = require('@strapi/strapi').factories;
const Stripe = require('stripe');
const {ApplicationError} = require("@strapi/utils/lib/errors");
module.exports = createCoreService('api::stripe.stripe', ({strapi}) => ({
async createCheckoutSession({stripePriceId, customerEmail, productId, productName}) {
try {
const stripeSettings = await strapi
.plugin('strapi-stripe')
.service('stripeService')
.initialize();
let stripe;
if (stripeSettings.isLiveMode) {
stripe = new Stripe(stripeSettings.stripeLiveSecKey);
} else {
stripe = new Stripe(stripeSettings.stripeTestSecKey);
}
const priceId = stripePriceId;
const paymentMode = 'payment';
return stripe.checkout.sessions.create({
line_items: [
{
// Provide the exact Price ID (for example, pr_1234) of the product you want to sell
price: priceId,
quantity: 1,
},
],
mode: paymentMode,
customer_email: customerEmail,
payment_method_types: ['card'],
success_url: `${stripeSettings.checkoutSuccessUrl}?sessionId={CHECKOUT_SESSION_ID}`,
cancel_url: `${stripeSettings.checkoutCancelUrl}`,
metadata: {
productId: `${productId}`,
productName: `${productName}`,
},
});
} catch (error) {
throw new ApplicationError(error.message);
}
},
}));
It pretty the same code you have, just change options and get better errors.
After the checkout page, user is redirect but the route I put there
is not called.
Thank you for helping me. I'm trying now to investigate this error.
Strapi version: 4.1.11, 4.3.0
Strapi-Stripe Plugin version: 2.3.0
As an example, I goto https://api.example.com/api/posts?populate=* to populate all posts data.
I see I have a products collection with a product and that my api and stripe are connected and sharing data.
when I goto: https://api.example.com/api/products I receive a 404.
when I view the roles and permissions for public, I don't have a products role to choose from like I do for "posts".
In my collection, I also have the product collection and the products data for created product from the payment link on dashboard.
Furthermore, I create a new test collection type and it allows me to view it via as should, but with Stripe plugin, I am unable to view product data.
error: select "t0"., "t0"."id", "t0"."created_by_id", "t0"."updated_by_id" from "public"."strapi-stripe_ss-product" as "t0" where ("t0"."id" = $1) limit $2 - invalid input syntax for type integer: "undefined"
error: select "t0"., "t0"."id", "t0"."created_by_id", "t0"."updated_by_id" from "public"."strapi-stripe_ss-product" as "t0" where ("t0"."id" = $1) limit $2 - invalid input syntax for type integer: "undefined"
at Parser.parseErrorMessage (D:\Projects BeardBoy\reseed-api\node_modules\pg-protocol\dist\parser.js:287:98)
at Parser.handlePacket (D:\Projects BeardBoy\reseed-api\node_modules\pg-protocol\dist\parser.js:126:29)
at Parser.parse (D:\Projects BeardBoy\reseed-api\node_modules\pg-protocol\dist\parser.js:39:38)
at Socket. (D:\Projects BeardBoy\reseed-api\node_modules\pg-protocol\dist\index.js:11:42)
at Socket.emit (node:events:513:28)
at Socket.emit (node:domain:489:12)
at addChunk (node:internal/streams/readable:324:12)
at readableAddChunk (node:internal/streams/readable:297:9)
at Readable.push (node:internal/streams/readable:234:10)
at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
only occurs when using yarn develop --watch-admin in console
Whitescreen on admin/settings/users-permissions/roles after i install this plugin
request
function is deprecated and will be removed in the next major version. Please use useFetchClient
instead."Page loads
After setting up the configuration with the API keys, I attempted to add a product. I could put all of the required information in, except for product description. For some reason, I am able to focus the field, but am unable to type a description. I can't submit a product while the description is empty.
I've reproduced this issue with a separate repo using the latest version of strapi and the plugin. Not sure if I'm missing something here.
Not really an issue, more a question.
But is recurring payments supported with this plugin or is this something that is yet to be added.
If not added, would like to try an contribute to the project to have it implemented.
Just a question around security...
It seems that the /strapi-stripe/getSubscriptionStatus/<user-email>
endpoint is a public endpoint for the plugin.
This means anyone can hit that endpoint with someone else's email address and get all the data about their subscription.
Is this the way Stripe's API works? I'm guessing the data returned is all non-sensitive?
Or should this be locked down?
Ideally, I'd like a custom endpoint that I can handle the check the user is authenticated and using their token I'd make an internal request to getSubscriptionStatus to ensure logged in users can only get their own subscription information.
Hi. Is there a way I can configure the plugin to detect/respect my upload config? It currently appends the http://localhost:1337 to the image url which stripe detects as an invalid url.
This is what it sends
And this is stripe
's response
this is what I have in my middleware.ts
{
// more codes
{
name: "strapi::security",
config: {
contentSecurityPolicy: {
useDefaults: true,
directives: {
"connect-src": ["'self'", "https:"],
"img-src": [
"'self'",
"data:",
"blob:",
"dl.airtable.com",
"<bucket>.ap-southeast-1.amazonaws.com",
],
"media-src": [
"'self'",
"data:",
"blob:",
"dl.airtable.com",
"<bucket>.s3.ap-southeast-1.amazonaws.com",
],
upgradeInsecureRequests: null,
},
},
},
},
}
and on my plugins.ts
{
// more codes
upload: {
config: {
provider: "aws-s3",
providerOptions: {
accessKeyId: env("AWS_ACCESS_KEY_ID"),
secretAccessKey: env("AWS_ACCESS_SECRET"),
region: env("AWS_REGION"),
params: {
Bucket: env("AWS_BUCKET"),
},
},
actionOptions: {
upload: {},
uploadStream: {},
delete: {},
},
},
},
}
Thanks in advance and really great work in here.
The getSettings
route is not authenticated, leaving all secret values open to the public.
To reproduce, launch a Strapi instance on your local machine, install the plugin, fill out the configuration page, then a simple curl http://localhost:1337/strapi-stripe/getSettings
shows all your credentials in the terminal.
Production environment doesn't do anything more.
Solution : remove the config: { auth: false }}
on both routes related to the settings in server/routes/index.js
Best : set the admin::isAuthenticatedAdmin
policy on both routes with config: { policies: ['admin::isAuthenticatedAdmin'] }
So as to follow the official node version recommendation for Strapi, maybe the node version in package.json should be changed to include 18.x.x ?
I would like to help maintaining this project, but I don't know exactly what can I work on to help.
It would be really good if there was some roadmap for the next features or fixes that should be implemented. Is there any roadmap/backlog yet? If there is, in which tasks could I help?
Thank you for the good work on the library!
Hey! I faced with issue when I try to update product or subscription it doesn't update on stripe side. How should I properly update a product to update it in the stripe?
Also, non-required fields return an errors:
Hi,
is there any support for the Shopping Cart?
Hi,
Thanks for the great plugin. One disadvantage that I see is that Stripe API keys configuration is stored in the database along with all other settings. This makes it inconvenient to import-export settings between environments because API keys will be revealed in plain text.
It would be great if API keys could be loaded (optionally) from .env variables. It's a minor change so I hope you will have it in mind.
Regards.
strapi version: v4.1.11
Tested in latest Google Chrome and FireFox
When I goto this link: https://api.example.com/admin/plugins/strapi-stripe
Debug Console Log:
Seems to be no manual way of removing an existing products in the plugin UI. You can remove the products from Stripe but not from Strapi. Currently, we are doing the removal manually in the database. There is an API call to remove a product from Stripe (https://stripe.com/docs/api/products/delete)
When you remove a product, remove it also from Stripe database.
Preferably, I would love to create all my products and manage them in Strapi only. Managing Strapi dashboard for posts and products, then managing Stripe products is lots of repetition.
On uninstalling this plugin, I received an error on yarn develop
after yarn install and yarn build. I add the plugin back and error goes away.
Error: Error on attribute strapi_stripe_product in model tag(api::tag.tag): Unknown target plugin::strapi-stripe.strapi-stripe-product
$ strapi develop
Error: Unknown target plugin::strapi-stripe.strapi-stripe-product
at createJoinTable (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/metadata/relations.js:393:11)
at createManyToOne (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/metadata/relations.js:114:5)
at createRelation (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/metadata/relations.js:333:14)
at createMetadata (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/metadata/index.js:61:11)
at new Database (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/index.js:17:21)
at Function.Database.init (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/index.js:77:33)
at Strapi.bootstrap (/home/name/nodes/strapi/dashboard/node_modules/@strapi/strapi/lib/Strapi.js:392:30)
at Strapi.load (/home/name/nodes/strapi/dashboard/node_modules/@strapi/strapi/lib/Strapi.js:457:16)
at async Strapi.start (/home/name/nodes/strapi/dashboard/node_modules/@strapi/strapi/lib/Strapi.js:198:9)
[2022-08-05 12:50:07.697] debug: ⛔️ Server wasn't able to start properly.
[2022-08-05 12:50:07.699] error: Error on attribute strapi_stripe_product in model tag(api::tag.tag): Unknown target plugin::strapi-stripe.strapi-stripe-product
Error: Error on attribute strapi_stripe_product in model tag(api::tag.tag): Unknown target plugin::strapi-stripe.strapi-stripe-product
at createMetadata (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/metadata/index.js:68:15)
at new Database (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/index.js:17:21)
at Function.Database.init (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/index.js:77:33)
at Strapi.bootstrap (/home/name/nodes/strapi/dashboard/node_modules/@strapi/strapi/lib/Strapi.js:392:30)
at Strapi.load (/home/name/nodes/strapi/dashboard/node_modules/@strapi/strapi/lib/Strapi.js:457:16)
at async Strapi.start (/home/name/nodes/strapi/dashboard/node_modules/@strapi/strapi/lib/Strapi.js:198:9)
error Command failed with exit code 1.
at Function.Database.init (/home/name/nodes/strapi/dashboard/node_modules/@strapi/database/lib/index.js:77:33) this plugin doesn't remove the database tables or am I missing something?
Hi, I wonder if this in not a vulnerability: the '/stripePayment' endpoint is configured as 'auth: false' and its respective 'savePayment' controller doesn't apply any specific security measures. This leads me to the conslusion that any person knowing that I use strapi-stipe plugin will be able to make a POST request and register a fake transaction in my Strapi backend. In case if I'm missing something - sorry for bothering. Thanks. Greg
Hi, I've installed and used the plugin for Strapi 4.2.0 and playing around a bit but I couldn't figure out how to do, or if possible
Thanks!
Strapi version: 4.1.11, 4.3.0
Strapi-Stripe Plugin version: 2.3.0
When a user creates a product on Stripe dashboard, it should sync with the Strapi-Stripe.
Maybe a refresh or sync button in case the user decides to create a product on Stripe dashboard?
As stated in the title, PLN (złoty) currency doesn't exist in a dropdown, which make using this plugin for Polish e-commerces impossible. Is there anyway to go around this issue?
2022-07-30 08:50:21.968] debug: ⛔️ Server wasn't able to start properly.
[2022-07-30 08:50:21.969] error: The "path" argument must be of type string. Received undefined
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
<button
className="css style SS_ProductCheckout"
type="button"
data-id="2"
data-email="[email protected]"
data-customerId="cus_abc"
data-url="http://localhost:1337"> Subscribe - Pro - Mensal </button>
I would like to know how you would ensure the user has an active subscription.
Do you store the stripe subscription id so that you can check the user has an active subscription?
I can't see anything obvious that I can use to access a user's subscription (like an id), any suggestions?
Hi 👋
I am wanting to edit the names of the stripe strapi plugin.
The names should be: Product from StrapiStripeProduct and Purchase from StrapiStripePurchase in content manager.
Do you have any plans to add this?
I implemented the strapi-stripe plugin like the documentation says and I realized that the transactions were not being recorded. I can only see in the Stripe dashboard in the tab Payments
, but not in the Stripe CMS.
Is there any rule that I need to follow to register automatically the paymente data after some client buy a product?
package.json
file of the CMS:
{
"name": "my-name",
"private": true,
"version": "0.1.0",
"description": "my-description",
"scripts": {
"develop": "strapi develop",
"start": "NODE_ENV=production node server.js",
"build": "strapi build",
"strapi": "strapi"
},
"devDependencies": {
"rimraf": "^3.0.2"
},
"dependencies": {
"@strapi/admin": "4.1.12",
"@strapi/plugin-content-manager": "^4.1.12",
"@strapi/plugin-i18n": "4.1.12",
"@strapi/plugin-users-permissions": "4.1.12",
"@strapi/provider-email-nodemailer": "^4.1.12",
"@strapi/strapi": "4.1.12",
"@strapi/utils": "4.1.12",
"better-sqlite3": "7.4.6",
"pg": "8.6.0",
"pg-connection-string": "^2.5.0",
"sharp": "^0.30.4",
"strapi-plugin-magic": "^0.9.0",
"strapi-stripe": "^1.9.0"
},
"author": {
"name": "the-author"
},
"strapi": {
"uuid": "..."
},
"engines": {
"node": ">=12.x.x <=16.x.x",
"npm": ">=6.0.0"
},
"license": "MIT"
}
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.