A Feathers service adapter for Prisma ORM.

Overview

feathers-prisma

Build Status Code Climate Test Coverage npm

A Feathers service adapter for Prisma ORM.

Installation

npm install feathers-prisma --save

Documentation

This adapter supports all methods (create, delete, update, patch, find, get) and the common way for querying (equality, $limit, $skip, $sort, $select, $in, $nin, $lt, $lte, $gt, $gte, $ne, $or). Also supports eager loading ($eager) and full-text search ($search).

Setup

import feathers from "@feathersjs/feathers";
import { service } from "feathers-prisma";
import { PrismaClient } from "@prisma/client";

// Initialize the application
const app = feathers();

// Initialize the plugin
const prismaClient = new PrismaClient();
prismaClient.$connect();
app.set("prisma", prismaClient);

const paginate = {
  default: 10,
  max: 50,
};

app.use(
  "/messages",
  service(
    {
      model: "messages",
      paginate,
      multi: ["create", "patch", "remove"],
      whitelist: ["$eager"],
    },
    prismaClient
  )
);

Eager Loading / Relation Queries

Relations can be resolved via $eager property in your query. It supports also deep relations. The $eager property has to be set in the whitelist option parameter. Otherwise the service will throw an error.

app.use(
  "/messages",
  service(
    {
      model: "message",
      whitelist: ["$eager"],
    },
    prismaClient
  )
);
// will load the recipients with the related user
// as well as all attachments  of the messages
app.service("messages").find({
  query: {
    $eager: [["recipients", ["user"]], "attachments"],
  },
});

Batch requests

This adapter supports batch requests. This is possible by allowing this in the multi property in the service options. Supported methods are create, patch and delete.

app.use(
  "/messages",
  service(
    {
      model: "messages",
      multi: ["create", "patch", "delete"],
    },
    prismaClient
  )
);

app.service("messages").create([{ body: "Lorem" }, { body: "Ipsum" }]);

Full-Text Search

Prisma supports a full-text search which is currently in preview mode. Find out more how to activate it here. If you activated it through your schema you have to allow it in the whitelist property:

app.use(
  "/messages",
  service(
    {
      model: "messages",
      whitelist: ["$search"],
    },
    prismaClient
  )
);

app.service("messages").find({
  query: {
    body: {
      $search: "hello | hola",
    },
  },
});

Complete Example

Here's an example of a Feathers server that uses feathers-prisma.

import feathers from "@feathersjs/feathers";
import { service } from "feathers-prisma";

// Initialize the application
const app = feathers();

// Initialize the plugin
const prismaClient = new PrismaClient();
prismaClient.$connect();
app.set("prisma", prismaClient);

const paginate = {
  default: 10,
  max: 50,
};

app.use(
  "/messages",
  service(
    {
      model: "messages",
      paginate,
      multi: ["create", "patch", "remove"],
      whitelist: ["$eager"],
    },
    prismaClient
  )
);
// Or if you want to extend the service class
import { PrismaService } from "feathers-prisma";

License

Copyright (c) 2021.

Licensed under the MIT license.

Comments
  • Unexpected behaviour on get method

    Unexpected behaviour on get method

    Steps to reproduce

    • Tried to use feathers-casl with prisma adapter, but setting permissions to specific issues gives the following error
    {
        "name": "NotFound",
        "message": "No record found for id 'ckzqtphw00000hz3x1g9szk3f' and query.id 'ckzqtphw00000hz3x1g9szk3f'",
        "code": 404,
        "className": "not-found",
        "errors": {}
    }
    
    • simple example to reproduce this issue
    // abilities.ts https://feathers-casl.netlify.app/getting-started.html#about for better reference 
    import { createAliasResolver, makeAbilityFromRules } from 'feathers-casl';
    import { AbilityBuilder, Ability } from '@casl/ability';
    import { User } from '@prisma/client';
    
    export const defineRulesFor = (user: User) => {
      const { can, rules } = new AbilityBuilder(Ability);
    
      can('read', 'users', { id: user.id }); # note that { id: user.id } causes this issue
      can('update', 'users', { id: user.id });
      can('delete', 'users', { id: user.id });
    
      return rules;
    };
    
    import { authorize } from 'feathers-casl/dist';
    
     before: {
        all: [authenticate('jwt'), loadAbilities()], // load abilities are basically same as https://feathers-casl.netlify.app/getting-started.html#add-abilities-to-hooks-context
        get: [authorize()], // this hook causes the JSON response written at the top
      },
    

    Expected behavior

    It should allow user to get only info related to their id, and give 403 on any other user

    Actual behavior

    image

    System details

    Macbook Pro M1 13inch MacOS Monterey 12.2

    Module versions (especially the part that's not working):

    [email protected]
    [email protected]
    

    NodeJS version:

    v16.13.0
    

    Operating System:

    MacOS
    
    bug 
    opened by harukaze-sm 3
  • Add adapter-tests

    Add adapter-tests

    This is amazing! Thanks for your work! 🚀 Do you know about @feathersjs/adapter-tests? It's an official package to check adapters against common use cases. Please have a look at

    • https://github.com/feathersjs-ecosystem/feathers-sequelize/blob/master/test/index.test.js#L13
    • https://github.com/feathersjs-ecosystem/feathers-knex/blob/master/test/index.test.js#L11
    • https://github.com/feathersjs-ecosystem/feathers-mongoose/blob/master/test/index.test.js#L10

    What do you think? Are you interested to add adapter-tests to this package? That would make this package even more reliable.

    enhancement 
    opened by fratzinger 3
  • no prisma.schema generated

    no prisma.schema generated

    Steps to reproduce

    When you run feathers generate app and select prisma as the ORM no schema.prisma is generated, but it does generate some service and class modules.

    Expected behavior

    schema.prisma would be generated to go along with the users.service and users.class modules and hooked into the starter app. Alternatively some sort of documentation for that portion of it so that the normal prisma commands could work from the command line.

    I can run npx prisma init to generate a schema file, but by default it is referencing .env for it's database URL, while the feather's config also has a database URL in its config. And I could add fields to that schema, but if you select something like Sequelize when initing feathers, it creates a model file with all the appropriate fields for the auth classes that you've selected. So I was expecting a similar experience to that.

    Actual behavior

    Some modules get generated that theoretically will use prisma, but despite knowing a bit about both feathers and prisma, I fail to see what I'm supposed to do next.

    System configuration

    Just installed feathers and ran feathers generate app .

    Module versions the latest of everything

    NodeJS version: v16.15.1 (LTS)

    Operating System: Mac OS 12.3.1

    Browser Version: N/A

    React Native Version: N/A

    Module Loader: N/A

    opened by rizen 2
  • Can't get $select, $sort, or $in to work via html request

    Can't get $select, $sort, or $in to work via html request

    Steps to reproduce

    • [x] Tell us what broke. The more detailed the better.

    I have created a basic feathers controller using this feathers-prisma adapter and have tried to use various query parameters with no success. I have tried various queries:

    $select

    The official feathers.js documentation says this should work, but:

    trying: http://127.0.0.1:5057/spaces?$select[]=organization_id,$select[]=space_id
    gives error: "Invalid query parameter $select[]"
    

    Looking through the code, it looks like the "[]" is not seen, so removing that gets us farther, but still have an error:

    trying: http://127.0.0.1:5057/spaces?$select=organization_id,$select=space_id
    gives error: "$select.forEach is not a function"
    

    The query $select value didn't get converted to an array... Am I missing something?

    $sort

    $sort via the official feathers documentation:

    trying: http://127.0.0.1:5057/spaces?$limit=2&$sort[created_at]=-1
    gives error: "Invalid query parameter $sort[created_at]"
    

    $in

    trying: 127.0.0.1:5057/spaces?organization_id[$in][]=60230961c459f31c3883c1f0&organization_id[$in][]=60230961c459f31c3883c1df
    gives the error: Invalid `this.Model.findMany() ...
    
    trying: 127.0.0.1:5057/spaces?organization_id[$in]=60230961c459f31c3883c1f0&organization_id[$in]=60230961c459f31c3883c1df
    gives the error: Invalid `this.Model.findMany() ...
    
    • [x] If you can, please create a simple example that reproduces the issue and link to a gist, jsbin, repo, etc.

    spaces.class.ts

    import { PrismaService, PrismaServiceOptions } from 'feathers-prisma';
    import { Application } from '../../declarations';
    
    interface Options extends PrismaServiceOptions {}
    
    export class Spaces extends PrismaService {
      //eslint-disable-next-line @typescript-eslint/no-unused-vars
      constructor(options: Options, app: Application) {
        super(options, app.get('prisma'));
      }
    }
    

    spaces.service.ts

    mport { ServiceAddons } from '@feathersjs/feathers';
    import { Application } from '../../declarations';
    import { Spaces } from './spaces.class';
    import hooks from './spaces.hooks';
    
    // Add this service to the service type index
    declare module '../../declarations' {
      interface ServiceTypes {
        'spaces': Spaces & ServiceAddons<any>;
      }
    }
    
    export default function (app: Application): void {
      const options = {
        model: 'spaces',
        client: app.get('prisma'),
        paginate: app.get('paginate')
      };
    
      // Initialize our service with any options it requires
      app.use('/spaces', new Spaces(options, app));
    
      // Get our initialized service so that we can register hooks
      const service = app.service('spaces');
    
      service.hooks(hooks);
    }
    
    

    prisma model

    model spaces {
      space_id          Int       @id @default(autoincrement())
      name              String?   @db.VarChar
      created_at        DateTime? @db.Timestamptz(6)
      description       String?
      organization_id   String?   @db.VarChar
      primary_color     String?   @db.VarChar
      secondary_color   String?   @db.VarChar
    
      @@index([organization_id], map: "spaces_link_organization_id_index")
    }
    

    Expected behavior

    $select

    Should select return only the organization_id and space_id's for the records.

    $sort

    Should sort by created_at descending

    $in

    Should return the records with the ids in the given array of ids.

    Actual behavior

    Errors: Invalid query parameter, $select.forEach is not a function, or Invalidthis.Model.findMany() ...`

    System configuration

    Tell us about the applicable parts of your setup.

    This is a bare bones feather setup with no hooks. Using feathersjs-serverless.

    Module versions (especially the part that's not working):

    "dependencies": {
        "@feathersjs/configuration": "^4.5.15",
        "@feathersjs/errors": "^4.5.15",
        "@feathersjs/express": "^4.5.15",
        "@feathersjs/feathers": "^4.5.15",
        "@feathersjs/primus": "^4.5.15",
        "@feathersjs/socketio": "^4.5.15",
        "@feathersjs/transport-commons": "^4.5.15",
        "@prisma/client": "^3.15.2",
        "aws-serverless-express": "^3.4.0",
        "body-parser": "^1.20.1",
        "class-transformer": "^0.5.1",
        "class-validator": "^0.13.2",
        "compression": "^1.7.4",
        "cors": "^2.8.5",
        "ejs": "^3.1.8",
        "express": "^4.18.2",
        "feathersjs-serverless": "^0.3.1",
        "feathers-prisma": "^0.6.0",
        "helmet": "^5.1.1",
        "install": "^0.13.0",
        "reflect-metadata": "^0.1.13",
        "rimraf": "^3.0.2",
        "rxjs": "^7.5.7",
        "serve-favicon": "^2.5.0",
        "serverless-express": "^2.0.12",
        "serverless-http": "^3.1.0",
        "winston": "^3.8.2",
        "ws": "^8.11.0"
      },
    

    NodeJS version: v16.18.0

    Operating System: OS/X M1

    Browser Version: Firefox, Chrome, Safari

    React Native Version: N/A

    Module Loader: N/A

    opened by robblovell 1
  • Automatic conversion of fields to numbers leads to errors (e.g. for GoogleOauthIDs or Ethereum Addresses)

    Automatic conversion of fields to numbers leads to errors (e.g. for GoogleOauthIDs or Ethereum Addresses)

    Steps to reproduce

    Strings that contain numbers are automatically converted to numbers, this is sometimes not the desired behavior.

    Service.create({ googleId: "123456789" })
    // --> { googleId: 123456789 }
    

    Or

    Service.create({ ethereumAddress: "0x71C7656EC7ab88b098defB751B7401B5f6d8976F" })
    // --> { ethereumAddress: 6.4956264143494794e+47 }
    

    Expected behavior

    Strings should not be converted to numbers

    Actual behavior

    Strings are converted to numbers

    System configuration

    Module versions 0.5.8

    NodeJS version: v16.13.1

    Operating System: Mac

    Browser Version: Chrome

    opened by pineappledafruitdude 1
  • Prisma Client error 'PrismaClientUnknownRequestError' is not handled and results in an error of undefined

    Prisma Client error 'PrismaClientUnknownRequestError' is not handled and results in an error of undefined

    The error handler is not handling the error PrismaClientUnknownRequestError. This causes the variable feathersError in the error handler to remain undefined, because no default error is set. Because of the undefined error the error cannot be processed correctly by feathers.

    The error can be reproduced by, for example, sending a query that contains an integer value that is too large.

    Module versions: 0.5.8

    NodeJS version: 16.15.1

    opened by NLaza 1
  • Some errors are not communicated to the frontend client.

    Some errors are not communicated to the frontend client.

    Steps to reproduce

    • Create a user model missing a property called for example missing_property_in_schema
    • Trigger a PrismaClientValidationError by calling for example service('users').create({ missing_property_in_schema: 'some_value' })

    Expected behavior

    The current returned error is : image

    The actual error I'd been able to console.log directly in the library is :

    Unknown arg `missing_property_in_schema` in data.missing_property_in_schema for type UserCreateInput. Did you mean `id`? Available args:`
    [...]
    

    We'd like to see the error in the frontend client.

    Guess

    The problem seems to come from error-handler.js.

        else if (error instanceof index_1.PrismaClientValidationError) {
            switch (prismaMethod) {
                case 'findUnique':
                case 'remove':
                case 'update':
                    feathersError = new errors.NotFound('Record not found.');
                    break;
                default:
                    break;
            }
        }
    

    On line 53 the switch does not set feathersError if prismaMethod is undefined (which is its value in the case I described above). I think it should always set an error (a errors.GeneralError maybe ?)

    opened by harijoe 1
  • Add support to query json fields

    Add support to query json fields

    Prisma supports querying JSON fields in postgres and mysql. It is currently in preview mode.

    • [ ] support path query as $path and support postgres and mysql
    • [ ] add $string_contains, $string_starts_with and $string_ends_with
    • [ ] add $array_contains, $array_starts_with and $array_ends_with
    enhancement 
    opened by ps73 1
  • Query relations

    Query relations

    It would be nice if we cannot just load relations via $eager but also query the related items with default feathers query and filter options.

    Could look like this:

    app.service('users').find({
      query: {
        $eager: {
          todos: ['title'],
        },
      },
    });
    

    Also it should be supported to filter for relations:

    app.service('users').find({
      query: {
        todos: {
          tag1: {
            $in: ['TEST'],
          },
        },
      },
    });
    
    enhancement 
    opened by ps73 1
  • Bump minimist from 1.2.5 to 1.2.6

    Bump minimist from 1.2.5 to 1.2.6

    Bumps minimist from 1.2.5 to 1.2.6.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Implemented @feathersjs/adapter-tests (#1)

    Implemented @feathersjs/adapter-tests (#1)

    Summary

    • [x] Test the adapter with @feathersjs/adapter-tests (#1)
    • [x] Fixed service to support full common api

    Other Information

    Fixed also a typo in endsWith so this operator is now working as expected.

    opened by ps73 0
  • Got invalid value '1' on prisma.deleteOneUser. Provided String, expected Int.

    Got invalid value '1' on prisma.deleteOneUser. Provided String, expected Int.

    Hi

    I get the following error when I try to delete a resource through the REST API

    {
        "name": "GeneralError",
        "message": "\nInvalid `this.Model.delete()` invocation in\n/home/leo/workspace/detale/prisma-bug/node_modules/feathers-prisma/dist/service.js:169:59\n\n  166 }, this.options.id);\n  167 try {\n  168     (0, utils_1.checkIdInQuery)({ id, query, allowOneOf: true, idField: this.options.id });\n→ 169     const result = yield this.Model.delete(Object.assign({\n            where: {\n              id: '1'\n                  ~~~\n            }\n          })\n\nArgument id: Got invalid value '1' on prisma.deleteOneUser. Provided String, expected Int.\n\n",
        "code": 500,
        "className": "general-error",
        "errors": {}
    }
    

    Steps to reproduce

    $ feathers generate app
    ? Do you want to use JavaScript or TypeScript? JavaScript
    ? Project name prisma-bug
    ? Description
    ? What folder should the source files live in? src
    ? Which package manager are you using (has to be installed globally)? Yarn
    ? What type of API are you making? REST
    ? Which testing framework do you prefer? Jest
    ? This app uses authentication No
    ? Which coding style do you want to use? StandardJS
    ...
    
    $ feathers generate service
    ? What kind of service is it? Prisma
    ? What is the name of the service? users
    ? Which path should the service be registered on? /users
    ? Which database are you connecting to? PostgreSQL
    ? What is the database connection string? postgres://postgres:@localhost:5432/prisma_bug
    ...
    
    // This is your Prisma schema file,
    // learn more about it in the docs: https://pris.ly/d/prisma-schema
    
    generator client {
      provider = "prisma-client-js"
    }
    
    datasource db {
      provider = "postgresql"
      url      = env("DATABASE_URL")
    }
    
    model User {
      id    Int    @id @default(autoincrement())
      email String
      name  String
    }
    
    $ yarn run prisma init
    ...
    
    $ node .
    ...
    
    $ curl -X POST -d '{"email":"[email protected]","name":"joe"}' -H "Content-Type: application/json" http://localhost:3030/users
    {"id":1,"email":"[email protected]","name":"joe"}
    
    $ curl -X DELETE http://localhost:3030/users/1
    {"name":"GeneralError","message":"\nInvalid `this.Model.delete()` invocation in\n/home/leo/workspace/detale/prisma-bug/node_modules/feathers-prisma/dist/service.js:169:59\n\n  166 }, this.options.id);\n  167 try {\n  168     (0, utils_1.checkIdInQuery)({ id, query, allowOneOf: true, idField: this.options.id });\n→ 169     const result = yield this.Model.delete(Object.assign({\n            where: {\n              id: '1'\n                  ~~~\n            }\n          })\n\nArgument id: Got invalid value '1' on prisma.deleteOneUser. Provided String, expected Int.\n\n","code":500,"className":"general-error","errors":{}}
    

    Prisma complains about the type of id, it expects an integer since the model uses an Int but id is a string. However, this error does not occur when using GET http://localhost:3030/users/1 even though it uses the same url as DELETE.

    Expected behavior

    The resource get deleted without errors.

    Actual behavior

    An error is returned when trying to delete a resource.

    opened by Leo843 1
Owner
Phil
JavaScript Developer
Phil
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
Create a C# .NET core EntityFramework ORM from your schema.prisma file

A note of forewarning to the would-be user... This was a failure. I'm making a note here: huge regret. It's hard to overstate my dissatisfaction. ?? S

Ian Ray 9 Dec 24, 2022
Prisma is a next-generation object–relational mapper (ORM) that claims to help developers build faster and make fewer errors.

This is a Next.js project bootstrapped with create-next-app. Getting Started First, run the development server: npm run dev # or yarn dev Open http://

Rhodin Emmanuel Nagwere 1 Oct 8, 2022
A testing focused Remix Stack, that integrates E2E & Unit testing with Playwright, Vitest, MSW and Testing Library. Driven by Prisma ORM. Deploys to Fly.io

Live Demo · Twitter A testing focused Remix Stack, that integrates E2E & Unit testing with Playwright, Vitest, MSW and Testing Library. Driven by Pris

Remix Stacks 18 Oct 31, 2022
Prisma +2 generator to emit Yup schemas from your Prisma schema

Prisma Yup Generator Automatically generate Yup schemas from your Prisma Schema, and use them to validate your API endpoints or any other use you have

Omar Dulaimi 31 Dec 24, 2022
Prisma 2+ generator to emit Joi schemas from your Prisma schema

Prisma Joi Generator Automatically generate Joi schemas from your Prisma Schema, and use them to validate your API endpoints or any other use you have

Omar Dulaimi 26 Dec 24, 2022
Prisma +2 generator to emit a tRPC shield from your Prisma schema

Prisma tRPC Shield Generator Automatically generate a tRPC Shield from your Prisma Schema. Updates every time npx prisma generate runs. Table of Conte

Omar Dulaimi 27 Dec 24, 2022
Prisma 2+ generator to emit Zod schemas from your Prisma schema

Prisma Zod Generator Automatically generate Zod schemas from your Prisma Schema, and use them to validate your API endpoints or any other use you have

Omar Dulaimi 212 Dec 27, 2022
This is a library to alternate and self-host the Prisma Data Proxy (cloud.prisma.io)

Alternative Prisma Data Proxy This is a library to alternate and self-host the Prisma Data Proxy (cloud.prisma.io). In order to deploy your project to

AijiUejima 60 Dec 28, 2022
A Deno ORM for MySQL, SQLite, PostgreSQL, MongoDB, GitHub and serverless service like Deta, InspireCloud, CloudBase, LeanCloud

A Deno ORM for MySQL, SQLite, PostgreSQL, MongoDB, GitHub and serverless service like Deta, InspireCloud, CloudBase, LeanCloud.

ʀᴀʏ 5 Dec 15, 2022
An adapter where you can define which function to run

Switch Functions An adapter where you can define which function to run Installation This is a Node.js module available through the npm registry. Befor

Badass Team 2 Jun 17, 2022
🔨 A more engineered, highly customizable, standard output format commitizen adapter.

cz-git Github | Installation | Website | 简体中文文档 Introduction A more engineered, highly customizable, standard output format commitizen adapter. What i

zhengqbbb 402 Dec 31, 2022
An example on how to use Solana Wallet Adapter as a Web Authentication Method.

Solana Wallet Auth: A FullStack example This example uses Solana's wallet adapter to sign messages and verifies their signatures on the backend, allow

Kevin Rodríguez 19 Dec 20, 2022
Adapter application for consuming web3 messages from ie. wallets, and passing them on to starknet

?? StarknNet web3 account Development setup Clone deps with submodules git clone --recurse-submodules [email protected]:software-mansion-labs/starknet-we

Software Mansion – Labs 20 Nov 21, 2022
Debug Adapter Protocol for Amiga development with FS-UAE or WinUAE

UAE Debug Adapter Protocol Debug Adapter Protocol for Amiga assembly development with FS-UAE or WinUAE. Adapted from @prb28's vscode-amiga-assembly ex

Graham Bates 5 Jul 7, 2022
Qwik City adapter for trpc.io

tRPC ?? Qwik City End-to-end typesafe APIs made easy with tRPC.io in Qwik City applications. Build & consume fully typesafe APIs, without schemas or c

Giorgio Boa 29 Oct 11, 2022
Angular material date-fns adapter (Support jalali)

Angular material date-fns adapter (Support jalali) What is this? This library provides a custom DateAdapter for the Angular Material Datepicker compon

mohsen 9 Dec 3, 2022