Coder Social home page Coder Social logo

hashicorp / dev-portal Goto Github PK

View Code? Open in Web Editor NEW
63.0 172.0 26.0 86.6 MB

the home of developer.hashicorp.com

Home Page: https://developer.hashicorp.com

License: Mozilla Public License 2.0

JavaScript 3.56% TypeScript 77.47% CSS 11.18% Shell 0.03% Dockerfile 0.03% HCL 0.01% Makefile 0.01% MDX 7.71%

dev-portal's Introduction

HashiCorp Developer - developer.hashicorp.com

Welcome to HashiCorp Developer! This is the home for HashiCorp product reference documentation and tutorials for our practitioners. For background information on this project, refer to [MKTG-034].

Content Authors Please see this documentation for contributing content updates to Developer. Reach out in #proj-dev-portal on Slack if you have any issues / questions.

Table of contents

Local Development

Setting Up Environment Variables

There are a few things you need to set up before you can begin developing in this repository.

  1. Install the Vercel CLI

    The CLI is needed for the next 2 steps.

  2. Run vercel link

    This command will prompt you to connect your local copy of repo to the Vercel dev-portal project. The command creates a .vercel directory with a JSON file that contains the information that links to the Vercel project.

  3. Run vercel env pull .env.local

    This command will pull the development environment variables from the linked Vercel project and write them to a new file called .env.local.

  4. Remove the line containing VERCEL="1" from .env.local.

    This step is required to prevent the login flow from using HTTPS URLs.

Running The Project

If you're developing in this repository, get started by running:

npm install
npm start

This will give you a development server running on localhost:3000.

Note: Historically, the .io sites were served from this repository. They have been migrated into the hashicorp/web repository. See this RFC for full context.

Installing Recommended VS Code Extensions

In the .vscode directory, you'll find an extensions.json file that lists recommended VS Code extensions to use for this project.

To add the recommended extensions:

  1. Open VS Code
  2. Open the command palette
  3. Type Show Recommended Extensions
  4. Hit the Enter key
  5. Click the "Install Workspace Recommended Extensions" icon (it looks like a cloud with an arrow pointing down) under the Workspace Recommendations section of the sidebar

Project VS Code Settings

In the .vscode directory, you'll find a settings.json file with VS Code settings for this project.

  • source.fixAll.eslint enables auto-fixing of eslint issues when a file is saved
  • eslint.codeActionsOnSave.rules specifies which rules can be auto-fixed on save

Accessibility

@axe-core/react is a package that allows us to run accessibility checks against the rendered DOM and see results in a browser dev tools console.

** Note: it is recommended to use Chrome. There is limited functionality in Safari and Firefox

Why is it used in dev-portal?

We use it for local accessibility testing of the DOM. It does not replace other tools like linting rules and tools like linting rules also do not replace this tool. Both kinds of tools are important for different reasons. Linters can help us write accessible code and form good habits, but they can't check the full output of the code. Tools that check the DOM ensure that the final state of elements is accessible including all calculated text and colors.

How do I use it as a development tool?

The code is set up in _app.tsx to only use react-dom and @axe-core/react if the AXE_ENABLED environment variable is set. We've added an npm script to make setting that variable easy. To run the app locally with @axe-core/react enabled, run the following command in your terminal instead of npm start:

npm run start:with-axe

After you've got the project running locally with AXE_ENABLED set, you can open a browser to the local server and look at the dev tools console and inspect the console logs output by @axe-core/react.

Testing

We use jest to write unit tests for our code. We also have React Testing Library integrated for writing tests against our rendered React components.

To run tests:

npm test

To run tests in watch mode:

npm run test:watch

Additionally, we use Playwright for end-to-end integration tests. Playwright tests should be used when testing functionality that requires a running Next.js server, such as middleware and redirects.

To run the end-to-end tests:

npm run test:e2e

To view the report for an end-to-end test run:

npx playwright show-report

Helpers

Reset with clean

Auto-populated subdirectories such as .next and node_modules can sometimes become out of date. Delete all related subdirectories with the clean command.

npm install
npm run clean

Component Organization

In order to create some structure and consistency throughout this project, we're creating some light guidelines around where certain components should live. We have three top-level folders which should house components:

src/
  components/
  views/
  layouts/
  hooks/
  contexts/
  • components - Shareable, smaller components for use across any number of other components
  • views - Componentry which represents a full site "view." This is a way to abstract out page components and easily co-locate related code. Not necessarily intended for re-use, unless one needs to render the same view on multiple pages. This also allows us to co-locate sub-components and test files with page components, which is otherwise difficult with file-based routing
  • layouts - Layout components which are generic and possibly used across different pages (see Next.js docs)
    • Note: In support of future app-router adoption, we are no longer using the .layout or .getLayout pattern, which is not supported in the app directory.
  • hooks - Shared hooks which are applicable for use across a variety of other components. Hooks which access shared contexts should live in contexts/ (see below)
  • contexts - Shared contexts and utilities for accessing / interacting with the context values

An example implementation of components laid out this way:

// pages/some/page.tsx
import SomePageView from 'views/some-page'
import SomeLayout from 'layouts/some-layout'

// if we need to adjust props, can wrap this to make any changes necessary
export default function SomePage(props) {
	return (
		<SomeLayout>
			<SomePageView {...props} />
		</SomeLayout>
	)
}

Configuration

Per-environment configuration values are defined in JSON files in the config/ folder. Each environment has its own config file, controlled by the HASHI_ENV environment variable, currently:

config/
  base.json # May be used in any environment, including production (see below)
  development.json
  preview.json
  production.json

Each configuration can define an extends property, which will cause it to merge its properties with the extended configuration file. If no extends property is explicitly defined, the configuration file will extend from base.json.

The configuration values are available globally within the application. They can be accessed from a global __config object:

// config file:
{
   "my_config_value": "foo"
}

// in code:
console.log(__config.my_config_value)

Configuration files should be used for any non-sensitive configuration values needed throughout the application which might vary by environment. Consider API endpoints, constants, and flags in scope for the configuration files. Any references to __config are replaced at build-time with the values from the environment's configuration file using Webpack's DefinePlugin.

Search

We're using Algolia to make the repository searchable. The search index is automatically updated when content changes are pushed in the various content repositories. The scripts to update the search index live in mktg-content-workflows: docs, tutorials, and integrations.

The main branch and all preview builds use the production Algolia index, prod_DEVDOT_omni. To use the staging index, staging_DEVDOT_omni, update the algolia config value.

Analytics

Calls to window.analytics.track() are logged in development for easy iteration while adding analytics code. If you would prefer to reduce the noise created by these logs, start the app with NEXT_PUBLIC_ANALYTICS_LOG_LEVEL=0:

$ NEXT_PUBLIC_ANALYTICS_LOG_LEVEL=0 npm start

SEO Metadata

The meta tags for the site are rendered by the HeadMetadata component. Each page which uses getStaticProps can return a metadata property in its prop object to control the metadata which is ultimately rendered. The root site title is defined in our base config under dev_dot.meta.title.

export async function getStaticProps() {
	return {
		props: {
			metadata: {
				title: 'My Page', // Will be joined with the root site title
				description: 'This is a cool page',
			},
		},
	}
}

Social card images / OpenGraph images live in /public/og-image/. Each product should have a {product}.jpg file in that folder for its generic card image.

Performance

Next Bundle Analysis

We use the Next.js Bundle Analysis GitHub Action to track the size of our JavaScript bundles generated by Next.js's build step. To speed up the execution of the analysis step, we also have a custom build script which prevents the execution of the static generation build step, short-circuiting the Next.js build after the webpack compilation is finished.

Remote Content & Application context

This application pulls content from multiple different repositories (remote content) through our Learn API, content API, integrations API, from the local filesystem, as well as directly from the GitHub API. In order to facilitate development and previewing of this content, the application can be run within the context of one of these source repositories. In this scenario, we want to read content from the filesystem for that specific source. This can be distilled down into three specific contexts that need to be handled for any remote content:

  • Running the application in this repository (hashicorp/dev-portal): all content is sourced remotely
  • Running the application in a content's source repository (e.g. vault docs in hashicorp/vault): all content from the repository is read from the file system
  • Running the application in a different source repository (e.g. waypoint docs in hashicorp/vault): content is sourced remotely if not from the current context

Note: For content which is read from the GitHub API, we try to minimize loading this content from the API in source repositories to reduce reliance on GitHub PATs

If you are wiring up remote data which needs to change its loading strategy depending on the context, you can use isDeployPreview() from lib/env-checks:

import { isDeployPreview } from 'lib/env-checks'

isDeployPreview() // in any source repository?
isDeployPreview('vault') // in vault's source repository?

dev-portal's People

Contributors

alexcarpenter avatar ashleemboyer avatar brkalow avatar dependabot[bot] avatar didoo avatar dstaley avatar eganhashicorp avatar enmod avatar hashibot-web avatar hashicorp-copywrite[bot] avatar heatlikeheatwave avatar im2nguyen avatar jonathanfrappier avatar kendallstrautman avatar kylemac avatar laurapacilio avatar leahmariebush avatar lszpunar avatar mhonnatti avatar mwickett avatar nandereck avatar nayres avatar pbortnick avatar rubensandwich avatar stellarsquall avatar thiskevinwang avatar topfunky avatar tunzor avatar yhyakuna avatar zchsh 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  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

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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dev-portal's Issues

Weird layer file permissions

TL;DR: Could we get a --chown=0:0 added to the COPY --from=deps of the node_modules?


Ever since dc8b222, it appears the ast-types-flow files have weird permissions in the Docker image. This breaks pulling the image for me on Linux with Podman:

[cipherboy@xps15 59]$ podman pull hashicorp/dev-portal:sha-dc8b222 
Resolved "hashicorp/dev-portal" as an alias (/home/cipherboy/.cache/containers/short-name-aliases.conf)
Trying to pull docker.io/hashicorp/dev-portal:sha-dc8b222...
Getting image source signatures
Copying blob 671536a220a1 skipped: already exists  
Copying blob c53d85fc1a3d skipped: already exists  
Copying blob 371c3ce4a723 [--------------------------------------] 0.0b / 0.0b
Copying blob 985418a47cca [--------------------------------------] 0.0b / 0.0b
Copying blob 43e6571198fa skipped: already exists  
Copying blob 767d35d9047f skipped: already exists  
Copying blob 213ec9aee27d skipped: already exists  
Copying blob 08a19022f78c done  
Error: writing blob: adding layer with blob "sha256:08a19022f78c822230a8cfe95eb5eb2c46d0b51ec391c7afd47975545c8292a3": Error processing tar file(exit status 1): potentially insufficient UIDs or GIDs available in user namespace (requested 369884941:1876110778 for /app/website-preview/node_modules/ast-types-flow/README.md): Check /etc/subuid and /etc/subgid: lchown /app/website-preview/node_modules/ast-types-flow/README.md: invalid argument

Investigating with skopeo shows:

$ skopeo copy docker://docker.io/hashicorp/dev-portal:sha-dc8b222 dir:broken
$ cd broken
$ for file in *; do tar -tvf "$file" app/website-preview/node_modules/ast-types-flow/README.md && echo "$file"; done
-rw-r--r-- 369884941/1876110778 2007 2022-11-10 12:13 app/website-preview/node_modules/ast-types-flow/README.md
6aba365745d5618ce883aa1381a1055c511b235c0e262490174ca118de997353 <<--- Top layer

Previously, these files would get the root/root perms:

$ skopeo copy docker://docker.io/hashicorp/dev-portal:sha-f41423a dir:good
$ cd good
$ for file in *; do tar -tvf "$file" app/website-preview/node_modules/ast-types-flow/README.md && echo "$file"; done
-rw-r--r-- root/root      2007 2022-11-08 14:52 app/website-preview/node_modules/ast-types-flow/README.md
5591ae3dfaa5b187aad943e9f3ed1c825a2e876305554c35a9d37aaacdedba56 <<--- Top layer

It appears to come from the upstream ast-types-flow package:

$ curl https://registry.npmjs.org/ast-types-flow/ | jq -r '.versions[."dist-tags".latest].dist.tarball'
https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz
$ wget https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz
$ tar -tvf ast-types-flow-0.0.7.tgz
-rw-r--r-- 369884941/1876110778 749 2015-10-30 02:47 package/package.json
-rw-r--r-- 369884941/1876110778 2007 2015-09-14 00:17 package/README.md
-rw-r--r-- 369884941/1876110778 121821 2015-10-30 01:12 package/lib/types.js

No other package (e.g., ast-types) appears to have this problem with UID/GID being insane, only this one package (both on NPM and on our container builds).

Edit: From below, there do appear to be other slightly weird permissions in the layer, but they don't appear as insane as this package's. Older versions of this package have the same issue, which is rather weird.

Interestingly however, the NPM version appears the same between these two container versions as it comes from the same layer:

[cipherboy@xps15 broken]$ for file in *; do tar -tvf "$file" usr/local/lib/node_modules/npm/package.json && echo "$file"; done
-rw-r--r-- root/root      6721 2022-11-08 14:51 usr/local/lib/node_modules/npm/package.json
7667bd70e4b5ae1383312d072d242581e2d2a22c900c243cfc6c164b28bda433
-rw-r--r-- 0/0            6582 2022-11-04 07:22 usr/local/lib/node_modules/npm/package.json
e91d99bfd247b801afadb780fecc9c83c27af9452aedeb2fea391294f75d22d5
[cipherboy@xps15 good]$ for file in *; do tar -tvf "$file" usr/local/lib/node_modules/npm/package.json && echo "$file"; done
-rw-r--r-- root/root      6721 2022-11-08 14:51 usr/local/lib/node_modules/npm/package.json
7667bd70e4b5ae1383312d072d242581e2d2a22c900c243cfc6c164b28bda433
-rw-r--r-- 0/0            6582 2022-11-04 07:22 usr/local/lib/node_modules/npm/package.json
e91d99bfd247b801afadb780fecc9c83c27af9452aedeb2fea391294f75d22d

so this rules out a NPM version update being the cause of this (the first layer, e91d99bfd has NPM version 8.19.2, which was upgraded to NPM 8.19.3 in the later 7667bd970e).

(note above, that the layer with the bad ast-types-flow is different in the two container versions).

While the layer with the broken packages is the top-most layer, the layer below this is different between each container (but lower layers -- starting with 672ae47d7b -- are the same between these container versions).

This delta layer is the app -- here, the only change is linked above, and package-lock.json doesn't appear to show significant changes in anything interesting. And, outside of the changed permissions, the rest of the delta mostly looks as expected.

However, when we get to the top layer, things get interesting: the contents are roughly the same, but the permissions are all over the place:

[cipherboy@xps15 broken]$ tar --numeric-owner  -tvf 6aba* | awk '{print $2}' | sort -u
0/0
1000/10
1000/100
1000/1000
1001/1001
1008339469/1876110778
110779/100
120012366/120012366
1516583083/0
2119470584/2042662593
24561/20
340385/5762
369884941/1876110778
501/0
501/20
501/80
502/0
502/20
503/20
505/0
510/600
591400265/20
65534/65534
655369/89939
697256346/1876110778
718322462/454177323
[cipherboy@xps15 good]$ tar --numeric-owner  -tvf 5591ae* | awk '{print $2}' | sort -u
0/0

What went from a simple root/root container layer to a whole host of different UIDs/GIDs! It isn't clear (from what info I have here) why that is, perhaps a Docker version changed under us or something equivalent.

But I believe this should be fixed by adding a --chown=0:0 statement to that line. I'll open a PR. :-D

Poor user experience with auto-logout feature

I want to comment that I like the new design and the ability to login to the documentation so that I can bookmark pages, etc. However, I have noticed that if I am signed in, and then leave the page for a while, it will automatically log me out and redirect me to the home page. This is frustrating when I leave a couple of documentation pages open that I was researching only to come back and have those pages essentially wiped out. Sometimes I can click the back button and get back to the page I was on, sometimes I cannot. Either way, it provides a poor user experience.

Slow performance on Nomad API documentation pages

๐Ÿ‘‹,

Since the move to developer.hashicorp.com I've been running into a few performance issues compared to the old Nomad documentation (both time to render a page and ongoing memory usage, with things like the nomad jobs api page taking ~500-800MB of RAM alone).

For a specific example: https://developer.hashicorp.com/nomad/api-docs/jobs takes about 3 minutes to render on my 32 core / 64GB RAM desktop in Firefox 107. It also appears that this needs to recompute on every page load.

I'm not really a competent browser person, but I can upload a Firefox profile if that's helpful ๐Ÿ˜…

next-remote-watch failing on M1 mac

On a project which uses the dev-portal, It starts the website fine on local dev, however as soon as I save an edited file, I get the following error. In order for me to see the changes, I have to constantly restart node

> Ready on http://localhost:3000
 โœ“ Compiled /src/middleware in 271ms (74 modules)
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
 โ—‹ Compiling /redacted/docs/[[...page]] ...
 โœ“ Compiled /redacted/docs/[[...page]] in 7.2s (3855 modules)
[InstantSearch] The package `react-instantsearch-hooks` is replaced by `react-instantsearch-core`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/
[InstantSearch] The package `react-instantsearch-hooks-web` is replaced by `react-instantsearch`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/
[InstantSearch] The package `react-instantsearch-hooks` is replaced by `react-instantsearch-core`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/
[InstantSearch] The package `react-instantsearch-hooks-web` is replaced by `react-instantsearch`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/
 โ—‹ Compiling /api/tutorials-map ...
 โœ“ Compiled /api/tutorials-map in 2.6s (1318 modules)
 โœ“ Compiled /api/auth/[...nextauth] in 111ms (1328 modules)
[next-auth][warn][NO_SECRET]
https://next-auth.js.org/warnings#no_secret
TypeError: Cannot read properties of undefined (reading 'hotReloader')
    at FSWatcher.<anonymous> (/Users/glennsarti/redacted/website/website-preview/node_modules/next-remote-watch/bin/next-remote-watch:60:22)
    at FSWatcher.emit (node:events:514:28)
    at FSWatcher.emitWithAll (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/index.js:534:8)
    at FSWatcher._emit (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/index.js:626:8)
    at FsEventsHandler.handleEvent (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:288:14)
    at FsEventsHandler.addOrChange (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:238:8)
    at watchCallback (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:342:21)
    at filteredListener (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:127:7)
    at /Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:152:11
    at Set.forEach (<anonymous>)
    at /Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:151:24
 โจฏ unhandledRejection: TypeError: Cannot read properties of undefined (reading 'hotReloader')
    at FSWatcher.<anonymous> (/Users/glennsarti/redacted/website/website-preview/node_modules/next-remote-watch/bin/next-remote-watch:60:22)
    at FSWatcher.emit (node:events:514:28)
    at FSWatcher.emitWithAll (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/index.js:534:8)
    at FSWatcher._emit (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/index.js:626:8)
    at FsEventsHandler.handleEvent (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:288:14)
    at FsEventsHandler.addOrChange (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:238:8)
    at watchCallback (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:342:21)
    at filteredListener (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:127:7)
    at /Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:152:11
    at Set.forEach (<anonymous>)
    at /Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:151:24
 โจฏ unhandledRejection: TypeError: Cannot read properties of undefined (reading 'hotReloader')
    at FSWatcher.<anonymous> (/Users/glennsarti/redacted/website/website-preview/node_modules/next-remote-watch/bin/next-remote-watch:60:22)
    at FSWatcher.emit (node:events:514:28)
    at FSWatcher.emitWithAll (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/index.js:534:8)
    at FSWatcher._emit (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/index.js:626:8)
    at FsEventsHandler.handleEvent (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:288:14)
    at FsEventsHandler.addOrChange (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:238:8)
    at watchCallback (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:342:21)
    at filteredListener (/Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:127:7)
    at /Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:152:11
    at Set.forEach (<anonymous>)
    at /Users/glennsarti/redacted/website/website-preview/node_modules/chokidar/lib/fsevents-handler.js:151:24
[InstantSearch] The package `react-instantsearch-hooks` is replaced by `react-instantsearch-core`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/
[InstantSearch] The package `react-instantsearch-hooks-web` is replaced by `react-instantsearch`. The API is the same, but the package name has changed. Please update your dependencies and follow the migration guide: https://www.algolia.com/doc/guides/building-search-ui/upgrade-guides/react/
^C

It seems like next-remote-watch isn't compatible with something

node - v18.17.1
npm - 9.6.7
OS - OSX 13.6.3 (M1 architecture)

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.