npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@instill-ai/toolkit

v0.111.1

Published

Instill AI's frontend toolkit

Downloads

10,323

Readme

cortex/toolkit

How to use

Install

pnpm add @instill-ai/toolkit

Import necessary CSS at the root

import "@instill-ai/toolkit/dist/index.css";

Env

Please reference to .env

About controller state

  • VDP backend is using etcd to control/record the true_state of the resource and the state query from the resource endpoint is just the user_desired_state.
  • But in the form, what we updated is the user_desired_state.
  • We are currently not combining these two states into a single object but separating them to make the code more readable.

About the flow of generating Airbyte component's form

We are using Airbyte protocol for generating, maintaining, create our components, frontend need to come up with a way that have backward compatability and onward support of any Airbyte components. Here is how we accomplishing it and the principle behind these implementation.

Principles and implementation

  • Loose couple to all the involved library
    • We use Formik just as Airbyte, but they had closely coupled with Formik to generate the whole form (ref). Every details are controled by the Formik from form's state, validation schema and submit action. In this way they may have hard time if they have much complicated form structure.
  • We try to isolated Airbyte component's logic
    • We separate all the types and functions into the folder
    • We make the form act like a small island, they have their own state, action and validation besides from our main form.

Implementation details

About selectedConditionMap

  • Internally we all use condition.title as selectedItem value. not the const field's value

How to get the condition's path

We rely on the field inside of condition with const key and use its path to set correct value. e.g. Snowflake's loading method

{
  title: "Data Staging Method",
  path: "loading_method",
  "conditions": [
    {
      "[Recommended] Internal Staging": {
        fieldKey: "loading_method"
        properties: [
          {
            "default": "Internal Staging",
            "description": "",
            "title": "",
            "const": "Internal Staging",
            "_type": "formItem",
            "path": "loading_method.method", // <-- This is the correct path
            "fieldKey": "method",
            "isRequired": true,
            "isSecret": false,
            "multiline": false,
            "type": "string"
            }
            ...
        ]
        ...
      }
    }
  ]
}
}

But sometimes the const field is not there (due to some human error of Airbyte side), we need to find the workaround. Normally there are multiple conditions under the conditionForm, we could loop though all the field to find the right one.

How to remove old condition configuration when user select new one?

Take this destination for example, what if user select another tunnel_method? How do we update the tunnel_method as whole.

{
  id: "sample",
  name: "destination-connectors/sample,
  uid: "badd8615-d68e-4fc1-8bc1-817766e285ec",
  {
    "description": "",
    "configuration": {
        "database": "foo-1",
        "host": "fooHost",
        "password": "admin",
        "port": 3306,
        "tunnel_method": {
            "ssh_key": "barKey",
            "tunnel_host": "barHost",
            "tunnel_method": "NO_TUNNEL",
            "tunnel_port": 22,
            "tunnel_user": "barUser"
        },
        "username": "yoyoyman"
    },
    "state": "STATE_UNSPECIFIED",
    "tombstone": false,
    "user": "users/local-user",
    "createTime": "2022-09-01T05:55:44.498367Z",
    "updateTime": "2022-09-01T05:55:44.498367Z"
  }
}

The short answer is we don't bother control the field values at the first place. Because we had built up Yup according to the user selected condition. We can use yup to help us strip un-used/not-wanted/old condition data.

// This is the original data
{
  "configuration": {
      "database": "we3",
      "host": "yojhojo",
      "password": "ewr",
      "port": 3306,
      "tunnel_method": {
          "ssh_key": "ewr",
          "tunnel_host": "wer",
          "tunnel_method": "SSH_KEY_AUTH",
          "tunnel_port": 22,
          "tunnel_user": "wer",
          "tunnel_user_password": "ewrewr343434"
      },
      "username": "234"
  },
  "database": "we3",
  "host": "yojhojo",
  "password": "ewr",
  "port": 3306,
  "tunnel_method.ssh_key": "ewr",
  "tunnel_method.tunnel_host": "wer",
  "tunnel_method.tunnel_method": "SSH_KEY_AUTH",
  "tunnel_method.tunnel_port": 22,
  "tunnel_method.tunnel_user": "wer",
  "username": "234",
  "tunnel_method": "SSH_KEY_AUTH",
  "tunnel_method.tunnel_user_password": "ewrewr343434"
}

// This is the striped data, we stripe tunnel_method.tunnel_user_password and others not used Ui
// data (data that is not in configuration)
{
  "configuration": {
    "username": "234",
    "tunnel_method": {
        "tunnel_user": "wer",
        "tunnel_port": 22,
        "tunnel_method": "SSH_KEY_AUTH",
        "tunnel_host": "wer",
        "ssh_key": "ewr"
    },
    "port": 3306,
    "password": "ewr",
    "host": "yojhojo",
    "database": "we3"
  }
}

How to edit OneOfCondition section when we have initial values?

When user created a new destination and they want to edit it at ConfigurationDestinationForm, how to let them edit OneOfCondition section?

Here is the sample destination response.

{
  id: "sample",
  name: "destination-connectors/sample,
  uid: "badd8615-d68e-4fc1-8bc1-817766e285ec",
  {
    "description": "",
    "configuration": {
        "database": "foo-1",
        "host": "fooHost",
        "password": "admin",
        "port": 3306,
        "tunnel_method": {
            "ssh_key": "barKey",
            "tunnel_host": "barHost",
            "tunnel_method": "NO_TUNNEL",
            "tunnel_port": 22,
            "tunnel_user": "barUser"
        },
        "username": "yoyoyman"
    },
    "state": "STATE_UNSPECIFIED",
    "tombstone": false,
    "user": "users/local-user",
    "createTime": "2022-09-01T05:55:44.498367Z",
    "updateTime": "2022-09-01T05:55:44.498367Z"
  }
}

Now we have a OneOfCondition field tunnel_method, how can we let the initial form construction knows we should display tunnel_method with "NO_TUNNEL" condition?

  • We use selectedConditionMap to store the current selection of condition. When the selectedConditionMap is empty (initial state), we choose the first condition as default.
  • When deal with configuration, once we get the initial value we have to map AirbyteFormTree and the configuration values to form the proper initial selectedConditionMap.
  • At OneOfConditionSection, when form is not dirty we will initialize correct selected condition.

Issues

  • How to validate all the form, including oneOf condition and the nested oneOf
  • SnowFlakes auth_type doesn't have const field

Caveats

  • Be careful of selectedConditionMap, it will affect the yup which will affect the strip value that will be sent as payload too.
  • When build the yup, airbyte use condition.title to find the target condition. Take tunnel_method for example, it will use tunnel_method's title like [Recommended] Internal Staging to find the target value. But we actually send it's value Internal Staging to the backend. So next time when we fetch the backend, the data will store Internal Staging not the [Recommended] Internal Staging

Useful refernece

About react query Service

  • Data preparation of join (collect pipeline-related recipe details) occurs at react-query hook inside of @services

About the long-running operation

Currently, there have two long-running operations in the instill backend.

  • Create model
    • Upon creation, the model won't be in the model-backend immediately, you need to check the operation status. Once it's finished the model will be in the model-backend that is queryable.
  • Deploy model

Note

  • The returned object will be the operation. You need to query the operation endpoint to access the operation resource.
  • The service will invalidate the whole data query. For example, once a model creation occur, we will invalidate the whole ["model"] key set immediately.
  • When you catch the onSuccess signal of react-query service and begin to periodically check the operation endpoint for status. You should update the whole react-query cache once you get the new resource.
  • Operation data is volatile, we don't persist it in react-query cache.

Dot lib

This lib converts dot notation like path.to.value to reference { path: { to: value }}

Reference

Caveats

  • Currently don't support bracket path foo[0][1], it only support foo.0.1
  • Error: Element type is invalid: expected a string Please double check your peerDeps. For example, this package should have instill-ai/design-system and instill-ai/design-token as its peerDeps.
  • We use pnpm -r publish at the root folder to publish the packages