diff --git a/examples/local-ollama/.env.example b/examples/local-ollama/.env.example new file mode 100644 index 000000000..00e6636cb --- /dev/null +++ b/examples/local-ollama/.env.example @@ -0,0 +1 @@ +OLLAMA_API_URL= \ No newline at end of file diff --git a/examples/local-ollama/.eslintrc.json b/examples/local-ollama/.eslintrc.json new file mode 100644 index 000000000..372241854 --- /dev/null +++ b/examples/local-ollama/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next/core-web-vitals", "next/typescript"] +} diff --git a/examples/local-ollama/.gitignore b/examples/local-ollama/.gitignore new file mode 100644 index 000000000..4e12d4acd --- /dev/null +++ b/examples/local-ollama/.gitignore @@ -0,0 +1,63 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# OS generated files +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ +*.cab +*.msi +*.msm +*.msp \ No newline at end of file diff --git a/examples/local-ollama/README.md b/examples/local-ollama/README.md new file mode 100644 index 000000000..32bd8c47b --- /dev/null +++ b/examples/local-ollama/README.md @@ -0,0 +1,65 @@ +## Project Overview + +This project configures `assistant-ui` to work with Ollama hosted on a local instance. Additionally, it changes the theme to dark mode. + +This source code was generated using the `Getting Started` guide hosted on [assistant-ui.com/docs](https://www.assistant-ui.com/docs). + +```bash +npx assistant-ui@latest create my-app +cd my-app +``` + + + +## Prerequisites + +Ensure you have the following installed: + +- Node.js +- npm + +## Installation + +Clone the repository: + +```bash +git clone https://github.com/yourusername/assistant-ui-local-ollama.git +cd assistant-ui-local-ollama +``` + +Install the dependencies: + +```bash +npm install +``` + +## Configuration +Copy the `.env.local.example` file to `.env`: + +Add `OLLAMA_API_URL` to the `.env` file: +``` +OLLAMA_API_URL=http:/x.x.x.x:11434/api +``` + +## Running the Development Server + +Start the development server: + +```bash +npm run dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +## Editing the Project + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +## Changing the Theme to Dark Mode + +The theme has been set to dark mode by default. You can customize the theme by annotating html with the className `dark`. + + +## License + +This project is licensed under the MIT License. diff --git a/examples/local-ollama/app/api/chat/route.ts b/examples/local-ollama/app/api/chat/route.ts new file mode 100644 index 000000000..97c306190 --- /dev/null +++ b/examples/local-ollama/app/api/chat/route.ts @@ -0,0 +1,10 @@ +import { createOllama } from "ollama-ai-provider"; +import { createEdgeRuntimeAPI } from "@assistant-ui/react/edge"; + +const local_ollama = createOllama({ + baseURL: process.env.OLLAMA_API_URL, +}); + +export const { POST } = createEdgeRuntimeAPI({ + model: local_ollama("llama3.1"), +}); \ No newline at end of file diff --git a/examples/local-ollama/app/favicon.ico b/examples/local-ollama/app/favicon.ico new file mode 100644 index 000000000..718d6fea4 Binary files /dev/null and b/examples/local-ollama/app/favicon.ico differ diff --git a/examples/local-ollama/app/fonts/GeistMonoVF.woff b/examples/local-ollama/app/fonts/GeistMonoVF.woff new file mode 100644 index 000000000..f2ae185cb Binary files /dev/null and b/examples/local-ollama/app/fonts/GeistMonoVF.woff differ diff --git a/examples/local-ollama/app/fonts/GeistVF.woff b/examples/local-ollama/app/fonts/GeistVF.woff new file mode 100644 index 000000000..1b62daacf Binary files /dev/null and b/examples/local-ollama/app/fonts/GeistVF.woff differ diff --git a/examples/local-ollama/app/globals.css b/examples/local-ollama/app/globals.css new file mode 100644 index 000000000..b5c61c956 --- /dev/null +++ b/examples/local-ollama/app/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/examples/local-ollama/app/layout.tsx b/examples/local-ollama/app/layout.tsx new file mode 100644 index 000000000..189d2be4d --- /dev/null +++ b/examples/local-ollama/app/layout.tsx @@ -0,0 +1,35 @@ +import type { Metadata } from "next"; +import localFont from "next/font/local"; +import "./globals.css"; + +const geistSans = localFont({ + src: "./fonts/GeistVF.woff", + variable: "--font-geist-sans", + weight: "100 900", +}); +const geistMono = localFont({ + src: "./fonts/GeistMonoVF.woff", + variable: "--font-geist-mono", + weight: "100 900", +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/examples/local-ollama/app/page.tsx b/examples/local-ollama/app/page.tsx new file mode 100644 index 000000000..68bc8a181 --- /dev/null +++ b/examples/local-ollama/app/page.tsx @@ -0,0 +1,9 @@ +import { MyAssistant } from "@/components/MyAssistant"; + +export default function Home() { + return ( +
+ +
+ ); +} diff --git a/examples/local-ollama/components/MyAssistant.tsx b/examples/local-ollama/components/MyAssistant.tsx new file mode 100644 index 000000000..e75bf4274 --- /dev/null +++ b/examples/local-ollama/components/MyAssistant.tsx @@ -0,0 +1,18 @@ +"use client"; + +import { useEdgeRuntime } from "@assistant-ui/react"; +import { Thread } from "@assistant-ui/react"; +import { makeMarkdownText } from "@assistant-ui/react-markdown"; + +const MarkdownText = makeMarkdownText(); + +export function MyAssistant() { + const runtime = useEdgeRuntime({ api: "/api/chat" }); + + return ( + + ); +} diff --git a/examples/local-ollama/next.config.mjs b/examples/local-ollama/next.config.mjs new file mode 100644 index 000000000..4678774e6 --- /dev/null +++ b/examples/local-ollama/next.config.mjs @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {}; + +export default nextConfig; diff --git a/examples/local-ollama/package.json b/examples/local-ollama/package.json new file mode 100644 index 000000000..933dbf2c7 --- /dev/null +++ b/examples/local-ollama/package.json @@ -0,0 +1,31 @@ +{ + "name": "with-local-ollama", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@assistant-ui/react": "^0.5", + "@assistant-ui/react-markdown": "^0.2", + "next": "14.2.11", + "ollama-ai-provider": "^0.15.0", + "react": "^18", + "react-dom": "^18", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^22", + "@types/react": "^18", + "@types/react-dom": "^18", + "eslint": "^8", + "eslint-config-next": "14.2.11", + "postcss": "^8", + "tailwindcss": "^3.4.11", + "typescript": "^5" + } +} diff --git a/examples/local-ollama/postcss.config.mjs b/examples/local-ollama/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/examples/local-ollama/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/examples/local-ollama/tailwind.config.ts b/examples/local-ollama/tailwind.config.ts new file mode 100644 index 000000000..50e69b32c --- /dev/null +++ b/examples/local-ollama/tailwind.config.ts @@ -0,0 +1,17 @@ +import type { Config } from "tailwindcss"; + +const config = { + darkMode: "class", + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + plugins: [ + require("tailwindcss-animate"), + require("@assistant-ui/react/tailwindcss"), + require("@assistant-ui/react-markdown/tailwindcss"), + ], +} satisfies Config; + +export default config; diff --git a/examples/local-ollama/tsconfig.json b/examples/local-ollama/tsconfig.json new file mode 100644 index 000000000..e7ff90fd2 --- /dev/null +++ b/examples/local-ollama/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 895342e93..320745385 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,6 +157,58 @@ importers: specifier: ^5.6.2 version: 5.6.2 + examples/local-ollama: + dependencies: + '@assistant-ui/react': + specifier: ^0.5 + version: link:../../packages/react + '@assistant-ui/react-markdown': + specifier: ^0.2 + version: link:../../packages/react-markdown + next: + specifier: 14.2.11 + version: 14.2.11(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + ollama-ai-provider: + specifier: ^0.15.0 + version: 0.15.0(zod@3.23.8) + react: + specifier: ^18 + version: 18.3.1 + react-dom: + specifier: ^18 + version: 18.3.1(react@18.3.1) + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.11) + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: ^22 + version: 22.5.5 + '@types/react': + specifier: ^18 + version: 18.3.6 + '@types/react-dom': + specifier: ^18 + version: 18.3.0 + eslint: + specifier: ^8 + version: 8.57.1 + eslint-config-next: + specifier: 14.2.11 + version: 14.2.11(eslint@8.57.1)(typescript@5.6.2) + postcss: + specifier: ^8 + version: 8.4.47 + tailwindcss: + specifier: ^3.4.11 + version: 3.4.11 + typescript: + specifier: ^5 + version: 5.6.2 + examples/search-agent-for-e-commerce: dependencies: '@ai-sdk/openai': @@ -1453,6 +1505,15 @@ packages: peerDependencies: zod: ^3.0.0 + '@ai-sdk/provider-utils@1.0.18': + resolution: {integrity: sha512-9u/XE/dB1gsIGcxiC5JfGOLzUz+EKRXt66T8KYWwDg4x8d02P+fI/EPOgkf+T4oLBrcQgvs4GPXPKoXGPJxBbg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + '@ai-sdk/provider-utils@1.0.19': resolution: {integrity: sha512-p02Fq5Mnc8T6nwRBN1Iaou8YXvN1sDS6hbmJaD5UaRbXjizbh+8rpFS/o7jqAHTwf3uHCDitP3pnODyHdc/CDQ==} engines: {node: '>=18'} @@ -5083,6 +5144,15 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} + ollama-ai-provider@0.15.0: + resolution: {integrity: sha512-pBRv2PjOPFdjB2fxOcu4dV3oT6NUxUI+V3c0Cu3r8Dwv6WmhHkRGLMscyRMU4Q2YVAtbghrvkfBGQmaqpMh/KQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5188,6 +5258,9 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -6321,6 +6394,15 @@ snapshots: '@ai-sdk/provider-utils': 1.0.19(zod@3.23.8) zod: 3.23.8 + '@ai-sdk/provider-utils@1.0.18(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.23 + eventsource-parser: 1.1.2 + nanoid: 3.3.6 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + '@ai-sdk/provider-utils@1.0.19(zod@3.23.8)': dependencies: '@ai-sdk/provider': 0.0.23 @@ -8945,8 +9027,8 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-react: 7.36.1(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) @@ -8965,37 +9047,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -9006,7 +9088,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -10728,6 +10810,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + ollama-ai-provider@0.15.0(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 0.0.23 + '@ai-sdk/provider-utils': 1.0.18(zod@3.23.8) + partial-json: 0.1.7 + optionalDependencies: + zod: 3.23.8 + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -10864,6 +10954,8 @@ snapshots: dependencies: entities: 4.5.0 + partial-json@0.1.7: {} + path-browserify@1.0.1: {} path-exists@4.0.0: {}