diff --git a/docs/HyperIndex/Guides/configuration-file.mdx b/docs/HyperIndex/Guides/configuration-file.mdx index 6088904d..a4e6bef2 100644 --- a/docs/HyperIndex/Guides/configuration-file.mdx +++ b/docs/HyperIndex/Guides/configuration-file.mdx @@ -27,17 +27,17 @@ name: Greeter description: Greeter Indexer Example contracts: - - name: Greeter - abi: - - event: "NewGreeting(address user, string greeting)" - - event: "ClearGreeting(address user)" + - name: Greeter + abi: + - event: "NewGreeting(address user, string greeting)" + - event: "ClearGreeting(address user)" networks: - - id: 1 # ethereum-mainnet - start_block: 12345678 - contracts: - - name: Greeter - address: 0x9D02A17dE4E68545d3a58D3a20BbBE0399E05c9c + - id: 1 # ethereum-mainnet + start_block: 12345678 + contracts: + - name: Greeter + address: 0x9D02A17dE4E68545d3a58D3a20BbBE0399E05c9c ``` --- @@ -63,10 +63,10 @@ address: 0xContractAddress ```yaml contracts: - - name: MyContract - address: - - 0xAddress1 - - 0xAddress2 + - name: MyContract + address: + - 0xAddress1 + - 0xAddress2 ``` :::tip @@ -78,14 +78,14 @@ You can also avoid repeating addresses by using global contract definitions: ```yaml contracts: - - name: Greeter - abi: greeter.json + - name: Greeter + abi: greeter.json networks: - - id: ethereum-mainnet - contracts: - - name: Greeter - address: 0xProxyAddressHere + - id: ethereum-mainnet + contracts: + - name: Greeter + address: 0xProxyAddressHere ``` --- @@ -94,26 +94,26 @@ networks: By default, contracts use the network `start_block`. Starting from `envio@2.27`, you can set a per-contract `start_block` to override it. Handy when: -- Contracts were deployed at different blocks -- You only need data from a contract starting at a specific block -- You want to skip unnecessary historical data for some contracts -- Works nicely with [Dynamic Contract Registration](/docs/HyperIndex/dynamic-contracts) +- Contracts were deployed at different blocks +- You only need data from a contract starting at a specific block +- You want to skip unnecessary historical data for some contracts +- Works nicely with [Dynamic Contract Registration](/docs/HyperIndex/dynamic-contracts) **Example with optional per-contract start_block override:** ```yaml networks: - - id: 1 # ethereum-mainnet - start_block: 18000000 # Default start block for all contracts on this network - contracts: - - name: ERC20Token - address: - - 0x1111111111111111111111111111111111111111 - - 0x2222222222222222222222222222222222222222 - start_block: 18500000 # Override for this contract - - name: Greeter - address: 0x9D02A17dE4E68545d3a58D3a20BbBE0399E05c9c - # Uses network default (18000000) + - id: 1 # ethereum-mainnet + start_block: 18000000 # Default start block for all contracts on this network + contracts: + - name: ERC20Token + address: + - 0x1111111111111111111111111111111111111111 + - 0x2222222222222222222222222222222222222222 + start_block: 18500000 # Override for this contract + - name: Greeter + address: 0x9D02A17dE4E68545d3a58D3a20BbBE0399E05c9c + # Uses network default (18000000) ``` --- @@ -124,8 +124,8 @@ Define specific events to index in a human-readable format: ```yaml events: - - event: "NewGreeting(address user, string greeting)" - - event: "ClearGreeting(address user)" + - event: "NewGreeting(address user, string greeting)" + - event: "ClearGreeting(address user)" ``` By default, all events defined in the contract are indexed, but you can selectively disable them by removing them from this list. @@ -138,9 +138,9 @@ a more descriptive name in your Envio project. ```yaml events: - - event: Assigned(address indexed recipientId, uint256 amount, address token) - - event: Assigned(address indexed recipientId, uint256 amount, address token, address sender) - name: AssignedWithSender + - event: Assigned(address indexed recipientId, uint256 amount, address token) + - event: Assigned(address indexed recipientId, uint256 amount, address token, address sender) + name: AssignedWithSender ``` --- @@ -157,9 +157,9 @@ raw_events: true When enabled, all indexed events will be stored in the `raw_events` table in the database, which you can view through the Hasura interface. This is particularly useful for: -- Debugging event processing issues -- Verifying that events are being captured correctly -- Creating custom queries against raw blockchain data +- Debugging event processing issues +- Verifying that events are being captured correctly +- Creating custom queries against raw blockchain data Note that enabling this option will increase database storage requirements and may slightly impact indexing performance. @@ -173,15 +173,15 @@ To access fields that are not provided by default, specify them using the `field ```yaml events: - - event: "Assigned(address indexed user, uint256 amount)" - field_selection: - transaction_fields: - - transactionIndex - block_fields: - - timestamp + - event: "Assigned(address indexed user, uint256 amount)" + field_selection: + transaction_fields: + - transactionIndex + block_fields: + - timestamp ``` -See all possible options in the [Config File Reference](/docs/HyperIndex/config-schema-reference#transactionfield) or use IDE autocomplete for your help. +See all possible options in the [Config File Reference](/docs/HyperIndex/config-schema-reference#fieldselection) or use IDE autocomplete for your help. #### Global Field Selection @@ -189,11 +189,11 @@ You can also specify fields globally for all events in the root of the config fi ```yaml field_selection: - transaction_fields: - - hash - - gasUsed - block_fields: - - parentHash + transaction_fields: + - hash + - gasUsed + block_fields: + - parentHash ``` Try to use this option sparingly as it can cause redundant Data Source calls and increased credits usage. @@ -242,9 +242,9 @@ preload_handlers: true # default is false Be aware of: -- [Double-Run Footgun](/docs/HyperIndex/preload-optimization#double-run-footgun) -- [Effect API for External Calls](/docs/HyperIndex/effect-api) -- [Migrating from Loaders](/docs/HyperIndex/preload-optimization#migrating-from-loaders) (recommended) +- [Double-Run Footgun](/docs/HyperIndex/preload-optimization#double-run-footgun) +- [Effect API for External Calls](/docs/HyperIndex/effect-api) +- [Migrating from Loaders](/docs/HyperIndex/preload-optimization#migrating-from-loaders) (recommended) --- @@ -254,10 +254,10 @@ Since `envio@2.9.0`, environment variable interpolation is supported for flexibi ```yaml networks: - - id: ${ENVIO_CHAIN_ID:-ethereum-mainnet} - contracts: - - name: Greeter - address: ${ENVIO_GREETER_ADDRESS} + - id: ${ENVIO_CHAIN_ID:-ethereum-mainnet} + contracts: + - name: Greeter + address: ${ENVIO_GREETER_ADDRESS} ``` Run your indexer with custom environment variables: @@ -268,8 +268,8 @@ ENVIO_CHAIN_ID=optimism ENVIO_GREETER_ADDRESS=0xYourContractAddress pnpm dev **Interpolation syntax:** -- `${ENVIO_VAR}` – Use the value of `ENVIO_VAR` -- `${ENVIO_VAR:-default}` – Use `ENVIO_VAR` if set, otherwise use `default` +- `${ENVIO_VAR}` – Use the value of `ENVIO_VAR` +- `${ENVIO_VAR:-default}` – Use `ENVIO_VAR` if set, otherwise use `default` For more detailed information about environment variables, see our [Environment Variables Guide](./environment-variables). @@ -312,44 +312,44 @@ name: envio-indexer unordered_multichain_mode: true preload_handlers: true contracts: - - name: PoolManager - handler: src/EventHandlers.ts - events: - - event: Swap(bytes32 indexed id, address indexed sender, int128 amount0, int128 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint24 fee) - - name: PositionManager - handler: src/EventHandlers.ts - events: - - event: Transfer(address indexed from, address indexed to, uint256 indexed id) + - name: PoolManager + handler: src/EventHandlers.ts + events: + - event: Swap(bytes32 indexed id, address indexed sender, int128 amount0, int128 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint24 fee) + - name: PositionManager + handler: src/EventHandlers.ts + events: + - event: Transfer(address indexed from, address indexed to, uint256 indexed id) networks: - - id: 1 - # Keep it 0 and HyperSync will automatically find the first block for your contracts - start_block: 0 - contracts: - - name: PositionManager - address: - - 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e - start_block: 18500000 # OPTIONAL: Override for contract deployed later - - name: PoolManager - address: - - "0x000000000004444c5dc75cB358380D2e3dE08A90" - - id: 10 - start_block: 0 - contracts: - - name: PositionManager - address: - - 0x3C3Ea4B57a46241e54610e5f022e5c45859A1017 - - name: PoolManager - address: - - 0x9a13F98Cb987694C9F086b1F5eB990EeA8264Ec3 - - id: 42161 - start_block: 0 - contracts: - - name: PositionManager - address: - - 0xd88f38f930b7952f2db2432cb002e7abbf3dd869 - - name: PoolManager - address: - - 0x360e68faccca8ca495c1b759fd9eee466db9fb32 + - id: 1 + # Keep it 0 and HyperSync will automatically find the first block for your contracts + start_block: 0 + contracts: + - name: PositionManager + address: + - 0xbD216513d74C8cf14cf4747E6AaA6420FF64ee9e + start_block: 18500000 # OPTIONAL: Override for contract deployed later + - name: PoolManager + address: + - "0x000000000004444c5dc75cB358380D2e3dE08A90" + - id: 10 + start_block: 0 + contracts: + - name: PositionManager + address: + - 0x3C3Ea4B57a46241e54610e5f022e5c45859A1017 + - name: PoolManager + address: + - 0x9a13F98Cb987694C9F086b1F5eB990EeA8264Ec3 + - id: 42161 + start_block: 0 + contracts: + - name: PositionManager + address: + - 0xd88f38f930b7952f2db2432cb002e7abbf3dd869 + - name: PoolManager + address: + - 0x360e68faccca8ca495c1b759fd9eee466db9fb32 ``` --- @@ -358,7 +358,7 @@ networks: Explore detailed configuration schema parameters here: -- See the full, deep-linkable reference: [Config Schema Reference](/docs/HyperIndex/config-schema-reference) +- See the full, deep-linkable reference: [Config Schema Reference](/docs/HyperIndex/config-schema-reference) :::info For AI/LLM Systems **Recommended**: Use the [Config Schema Reference](/docs/HyperIndex/config-schema-reference) for programmatic access to schema information. The interactive viewer below is optimized for human users. diff --git a/docusaurus.config.js b/docusaurus.config.js index d20123ae..2f1cc753 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -3,231 +3,231 @@ const lightCodeTheme = themes.github; const darkCodeTheme = themes.dracula; const redirectsList = [ - { - from: "/docs", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/quickstart", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/overview", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/getting-started", - to: "/docs/HyperIndex/getting-started", - }, - { - from: "/docs/contract-import", - to: "/docs/HyperIndex/contract-import", - }, - { - from: "/docs/configuration-file", - to: "/docs/HyperIndex/configuration-file", - }, - { - from: "/docs/schema", - to: "/docs/HyperIndex/schema", - }, - { - from: "/docs/event-handlers", - to: "/docs/HyperIndex/event-handlers", - }, - { - from: "/docs/testing", - to: "/docs/HyperIndex/testing", - }, - { - from: "/docs/running-locally", - to: "/docs/HyperIndex/running-locally", - }, - { - from: "/docs/navigating-hasura", - to: "/docs/HyperIndex/navigating-hasura", - }, - { - from: "/docs/cli-commands", - to: "/docs/HyperIndex/cli-commands", - }, - { - from: "/docs/hosted-service", - to: "/docs/HyperIndex/hosted-service", - }, - { - from: "/docs/hosted-service-deployment", - to: "/docs/HyperIndex/hosted-service-deployment", - }, - { - from: "/docs/hosted-service-billing", - to: "/docs/HyperIndex/hosted-service-billing", - }, - { - from: "/docs/licensing", - to: "/docs/HyperIndex/licensing", - }, - { - from: "/docs/fuel", - to: "/docs/HyperIndex/fuel", - }, - { - from: "/docs/tutorial-op-bridge-deposits", - to: "/docs/HyperIndex/tutorial-op-bridge-deposits", - }, - { - from: "/docs/tutorial-erc20-token-transfers", - to: "/docs/HyperIndex/tutorial-erc20-token-transfers", - }, - { - from: "/docs/tutorial-indexing-fuel", - to: "/docs/HyperIndex/tutorial-indexing-fuel", - }, - { - from: "/docs/greeter-tutorial", - to: "/docs/HyperIndex/greeter-tutorial", - }, - { - from: "/docs/linked-entity-loaders", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/HyperIndex/v2/migration-guide-v1-v2", - to: "/docs/HyperIndex/migration-guide-v1-v2", - }, - { - from: "/docs/HyperIndex/linked-entity-loaders", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/dynamic-contracts", - to: "/docs/HyperIndex/dynamic-contracts", - }, - { - from: "/docs/multichain-indexing", - to: "/docs/HyperIndex/multichain-indexing", - }, - { - from: "/docs/hypersync/", - to: "/docs/HyperIndex/hypersync", - }, - { - from: "/docs/rpc-sync", - to: "/docs/HyperIndex/rpc-sync", - }, - { - from: "/docs/persisted_files", - to: "/docs/HyperIndex/persisted_files", - }, - { - from: "/docs/generated-files", - to: "/docs/HyperIndex/generated-files", - }, - { - from: "/docs/terminology", - to: "/docs/HyperIndex/terminology", - }, - { - from: "/docs/async-mode", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/HyperIndex/async-mode", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/labels", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/HyperIndex/labels", - to: "/docs/HyperIndex/overview", - }, - { - from: "/docs/performance", - to: "/docs/HyperIndex/performance", - }, - { - from: "/docs/example-sablier-v2", - to: "/docs/HyperIndex/example-sablier", - }, - { - from: "/docs/example-liquidation-metrics", - to: "/docs/HyperIndex/example-liquidation-metrics", - }, - { - from: "/docs/example-uniswap-v3", - to: "/docs/HyperIndex/example-uniswap-v4-multi-chain-indexer", - }, - { - from: "/docs/example-uniswap-v4", - to: "/docs/HyperIndex/example-uniswap-v4-multi-chain-indexer", - }, - { - from: "/docs/example-ens", - to: "/docs/HyperIndex/example-ens", - }, - { - from: "/docs/logging", - to: "/docs/HyperIndex/logging", - }, - { - from: "/docs/common-issues", - to: "/docs/HyperIndex/common-issues", - }, - { - from: "/docs/error-codes", - to: "/docs/HyperIndex/error-codes", - }, - { - from: "/docs/reserved-words", - to: "/docs/HyperIndex/reserved-words", - }, - { - from: "/docs/hyperfuel", - to: "/docs/HyperIndex/fuel", - }, - //// HyperSync - { - from: "/docs/overview-hypersync", - to: "/docs/HyperSync/overview", - }, - { - from: "/docs/hypersync-usage", - to: "/docs/HyperSync/hypersync-usage", - }, - { - from: "/docs/hypersync-query", - to: "/docs/HyperSync/hypersync-query", - }, - { - from: "/docs/hypersync-clients", - to: "/docs/HyperSync/hypersync-clients", - }, - { - from: "/docs/hypersync-curl-example", - to: "/docs/HyperSync/hypersync-curl-examples", - }, - { - from: "/docs/hypersync-url-endpoints", - to: "/docs/HyperSync/hypersync-supported-networks", - }, - { - from: "/docs/HyperSync/hypersync-url-endpoints", - to: "/docs/HyperSync/hypersync-supported-networks", - }, - { - from: "/docs/HyperSync/hyperrpc-url-endpoints", - to: "/docs/HyperRPC/hyperrpc-supported-networks", - }, - { - from: "/docs/hyperfuel-query", - to: "/docs/HyperSync/hyperfuel-query", - }, - { - from: "/docs/overview-hyperrpc", - to: "/docs/HyperRPC/overview-hyperrpc", - }, + { + from: "/docs", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/quickstart", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/overview", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/getting-started", + to: "/docs/HyperIndex/getting-started", + }, + { + from: "/docs/contract-import", + to: "/docs/HyperIndex/contract-import", + }, + { + from: "/docs/configuration-file", + to: "/docs/HyperIndex/configuration-file", + }, + { + from: "/docs/schema", + to: "/docs/HyperIndex/schema", + }, + { + from: "/docs/event-handlers", + to: "/docs/HyperIndex/event-handlers", + }, + { + from: "/docs/testing", + to: "/docs/HyperIndex/testing", + }, + { + from: "/docs/running-locally", + to: "/docs/HyperIndex/running-locally", + }, + { + from: "/docs/navigating-hasura", + to: "/docs/HyperIndex/navigating-hasura", + }, + { + from: "/docs/cli-commands", + to: "/docs/HyperIndex/cli-commands", + }, + { + from: "/docs/hosted-service", + to: "/docs/HyperIndex/hosted-service", + }, + { + from: "/docs/hosted-service-deployment", + to: "/docs/HyperIndex/hosted-service-deployment", + }, + { + from: "/docs/hosted-service-billing", + to: "/docs/HyperIndex/hosted-service-billing", + }, + { + from: "/docs/licensing", + to: "/docs/HyperIndex/licensing", + }, + { + from: "/docs/fuel", + to: "/docs/HyperIndex/fuel", + }, + { + from: "/docs/tutorial-op-bridge-deposits", + to: "/docs/HyperIndex/tutorial-op-bridge-deposits", + }, + { + from: "/docs/tutorial-erc20-token-transfers", + to: "/docs/HyperIndex/tutorial-erc20-token-transfers", + }, + { + from: "/docs/tutorial-indexing-fuel", + to: "/docs/HyperIndex/tutorial-indexing-fuel", + }, + { + from: "/docs/greeter-tutorial", + to: "/docs/HyperIndex/greeter-tutorial", + }, + { + from: "/docs/linked-entity-loaders", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/HyperIndex/v2/migration-guide-v1-v2", + to: "/docs/HyperIndex/migration-guide-v1-v2", + }, + { + from: "/docs/HyperIndex/linked-entity-loaders", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/dynamic-contracts", + to: "/docs/HyperIndex/dynamic-contracts", + }, + { + from: "/docs/multichain-indexing", + to: "/docs/HyperIndex/multichain-indexing", + }, + { + from: "/docs/hypersync/", + to: "/docs/HyperIndex/hypersync", + }, + { + from: "/docs/rpc-sync", + to: "/docs/HyperIndex/rpc-sync", + }, + { + from: "/docs/persisted_files", + to: "/docs/HyperIndex/persisted_files", + }, + { + from: "/docs/generated-files", + to: "/docs/HyperIndex/generated-files", + }, + { + from: "/docs/terminology", + to: "/docs/HyperIndex/terminology", + }, + { + from: "/docs/async-mode", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/HyperIndex/async-mode", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/labels", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/HyperIndex/labels", + to: "/docs/HyperIndex/overview", + }, + { + from: "/docs/performance", + to: "/docs/HyperIndex/performance", + }, + { + from: "/docs/example-sablier-v2", + to: "/docs/HyperIndex/example-sablier", + }, + { + from: "/docs/example-liquidation-metrics", + to: "/docs/HyperIndex/example-liquidation-metrics", + }, + { + from: "/docs/example-uniswap-v3", + to: "/docs/HyperIndex/example-uniswap-v4-multi-chain-indexer", + }, + { + from: "/docs/example-uniswap-v4", + to: "/docs/HyperIndex/example-uniswap-v4-multi-chain-indexer", + }, + { + from: "/docs/example-ens", + to: "/docs/HyperIndex/example-ens", + }, + { + from: "/docs/logging", + to: "/docs/HyperIndex/logging", + }, + { + from: "/docs/common-issues", + to: "/docs/HyperIndex/common-issues", + }, + { + from: "/docs/error-codes", + to: "/docs/HyperIndex/error-codes", + }, + { + from: "/docs/reserved-words", + to: "/docs/HyperIndex/reserved-words", + }, + { + from: "/docs/hyperfuel", + to: "/docs/HyperIndex/fuel", + }, + //// HyperSync + { + from: "/docs/overview-hypersync", + to: "/docs/HyperSync/overview", + }, + { + from: "/docs/hypersync-usage", + to: "/docs/HyperSync/hypersync-usage", + }, + { + from: "/docs/hypersync-query", + to: "/docs/HyperSync/hypersync-query", + }, + { + from: "/docs/hypersync-clients", + to: "/docs/HyperSync/hypersync-clients", + }, + { + from: "/docs/hypersync-curl-example", + to: "/docs/HyperSync/hypersync-curl-examples", + }, + { + from: "/docs/hypersync-url-endpoints", + to: "/docs/HyperSync/hypersync-supported-networks", + }, + { + from: "/docs/HyperSync/hypersync-url-endpoints", + to: "/docs/HyperSync/hypersync-supported-networks", + }, + { + from: "/docs/HyperSync/hyperrpc-url-endpoints", + to: "/docs/HyperRPC/hyperrpc-supported-networks", + }, + { + from: "/docs/hyperfuel-query", + to: "/docs/HyperSync/hyperfuel-query", + }, + { + from: "/docs/overview-hyperrpc", + to: "/docs/HyperRPC/overview-hyperrpc", + }, ]; /** @type {import('@docusaurus/types').Config} */ const config = { @@ -268,236 +268,354 @@ const config = { ], ], - stylesheets: [ - { - href: "/custom.css", - type: "text/css", - }, - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - - ({ - image: "img/preview-banner.png", - colorMode: { - defaultMode: "dark", - disableSwitch: false, - respectPrefersColorScheme: true, - }, - announcementBar: { - id: "support_us", - content: - 'If you like Envio, give us a star on GitHub ⭐️', - backgroundColor: "#fafbfc", - textColor: "#091E42", - isCloseable: true, - }, - // Add custom CSS for smaller sidebar text stylesheets: [ - { - href: "/custom.css", - type: "text/css", - }, + { + href: "/custom.css", + type: "text/css", + }, ], - navbar: { - title: "", - logo: { - alt: "Envio Logo", - src: "img/envio-logo.png", - srcDark: "img/envio-logo.png", - style: { - maxWidth: 200, - maxHeight: 40, - }, - href: "https://envio.dev", - }, - items: [ - { - to: "docs/HyperIndex/overview", - label: "HyperIndex Docs", - position: "left", - }, - { - to: "docs/HyperSync/overview", - label: "HyperSync Docs", - position: "left", - }, - { - to: "docs/HyperRPC/overview-hyperrpc", - label: "HyperRPC Docs", - position: "left", - }, - { - to: "showcase", - label: "Showcase", - position: "left", - }, - { - to: "blog", - label: "Blog", - position: "left", - }, - { - href: "https://github.com/enviodev", - label: "GitHub", - position: "right", - }, - ], - }, - algolia: { - apiKey: "0f966036bca0e26d512dc59f023d64c5", - indexName: "envio", - appId: "584MK2OMPZ", - contextualSearch: true, // algolia prioritizes results that are more related to the current section of the docs. - }, - footer: { - style: "dark", - links: [ - { - title: "Community", - items: [ - { label: "Discord", href: "https://discord.gg/Q9qt8gZ2fX" }, - { label: "Twitter", href: "https://twitter.com/envio_indexer" }, - { label: "Lens", href: "https://lenster.xyz/u/envio.lens" }, + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + + ({ + image: "img/preview-banner.png", + colorMode: { + defaultMode: "dark", + disableSwitch: false, + respectPrefersColorScheme: true, + }, + announcementBar: { + id: "support_us", + content: + 'If you like Envio, give us a star on GitHub ⭐️', + backgroundColor: "#fafbfc", + textColor: "#091E42", + isCloseable: true, + }, + // Add custom CSS for smaller sidebar text + stylesheets: [ + { + href: "/custom.css", + type: "text/css", + }, ], - }, - { - title: "More", - items: [ - { - label: "Blog", - to: "blog", - }, - { - label: "GitHub", - href: "https://github.com/enviodev", - }, + navbar: { + title: "", + logo: { + alt: "Envio Logo", + src: "img/envio-logo.png", + srcDark: "img/envio-logo.png", + style: { + maxWidth: 200, + maxHeight: 40, + }, + href: "https://envio.dev", + }, + items: [ + { + to: "docs/HyperIndex/overview", + label: "HyperIndex Docs", + position: "left", + }, + { + to: "docs/HyperSync/overview", + label: "HyperSync Docs", + position: "left", + }, + { + to: "docs/HyperRPC/overview-hyperrpc", + label: "HyperRPC Docs", + position: "left", + }, + { + to: "showcase", + label: "Showcase", + position: "left", + }, + { + to: "blog", + label: "Blog", + position: "left", + }, + { + href: "https://github.com/enviodev", + label: "GitHub", + position: "right", + }, + ], + }, + algolia: { + apiKey: "0f966036bca0e26d512dc59f023d64c5", + indexName: "envio", + appId: "584MK2OMPZ", + contextualSearch: true, // algolia prioritizes results that are more related to the current section of the docs. + }, + footer: { + style: "dark", + links: [ + { + title: "Community", + items: [ + { + label: "Discord", + href: "https://discord.gg/Q9qt8gZ2fX", + }, + { + label: "Twitter", + href: "https://twitter.com/envio_indexer", + }, + { + label: "Lens", + href: "https://lenster.xyz/u/envio.lens", + }, + ], + }, + { + title: "More", + items: [ + { + label: "Blog", + to: "blog", + }, + { + label: "GitHub", + href: "https://github.com/enviodev", + }, + ], + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} Envio`, + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + additionalLanguages: [ + "rescript", + "bash", + "diff", + "json", + "javascript", + "typescript", + ], + }, + metadata: [ + { name: "twitter:card", content: "summary_large_image" }, + { name: "twitter:site", content: "@envio_indexer" }, + { property: "og:type", content: "website" }, + { property: "og:locale", content: "en" }, ], - }, + }), + plugins: [ + [ + require.resolve("./plugins/plugin-generate-llms"), + { + filesConfigs: [ + { + main: true, // this will become llms.txt + name: "envio", + root: ` +# Envio: Fast, Multi-Chain Blockchain Indexer + +> Envio.dev is a high-performance, multi-chain blockchain indexing framework designed for developers. It offers real-time and historical data querying via GraphQL APIs, supports automatic reorg handling, and enables rapid deployment with zero-downtime rollbacks. Built for EVM-compatible chains and Fuel, Envio empowers developers to build scalable blockchain applications efficiently. + + +This file contains links to documentation sections following the llmstxt.org standard. +`, + includeOrder: [ + "docs/HyperIndex/overview.md", + "docs/HyperIndex/getting-started.md", + "docs/HyperIndex/contract-import.md", + "docs/HyperIndex/benchmarks.md", + "docs/HyperIndex/migration-guide.md", + "docs/HyperIndex/Guides/**", + "docs/HyperIndex/Examples/**", + "docs/HyperIndex/Hosted_Service/**", + "docs/HyperIndex/Tutorials/**", + "docs/HyperIndex/Advanced/**", + "docs/HyperIndex/Troubleshoot/**", + "docs/HyperIndex/supported-networks/**", + "docs/HyperIndex/fuel/**", + "docs/HyperSync/overview.md", + "docs/HyperSync/quickstart.md", + "docs/HyperSync/hypersync-usage.md", + "docs/HyperSync/hypersync-clients.md", + "docs/HyperSync/hypersync-query.md", + "docs/HyperSync/hypersync-presets.md", + "docs/HyperSync/hypersync-curl-examples.md", + "docs/HyperSync/api-tokens.mdx", + "docs/HyperSync/hypersync-supported-networks.md", + "docs/HyperSync/tutorial-address-transactions.md", + "docs/HyperSync/HyperFuel/**", + "docs/HyperRPC/overview-hyperrpc.md", + "docs/HyperRPC/hyperrpc-supported-networks.md", + ], + }, + { + name: "hyperindex", + root: ` +# HyperIndex Docs + +> HyperIndex is a complete indexing framework with schema management, event handling, and GraphQL APIs. + +This file contains links to documentation sections following the llmstxt.org standard. +`, + includeOrder: [ + "docs/HyperIndex/overview.md", + "docs/HyperIndex/getting-started.md", + "docs/HyperIndex/contract-import.md", + "docs/HyperIndex/benchmarks.md", + "docs/HyperIndex/migration-guide.md", + "docs/HyperIndex/Guides/**", + "docs/HyperIndex/Examples/**", + "docs/HyperIndex/Hosted_Service/**", + "docs/HyperIndex/Tutorials/**", + "docs/HyperIndex/Advanced/**", + "docs/HyperIndex/Troubleshoot/**", + "docs/HyperIndex/supported-networks/**", + "docs/HyperIndex/fuel/**", + ], + }, + { + name: "hypersync", + root: ` +# HyperSync Docs + +> HyperSync is Envio's high-performance blockchain data engine that serves as a direct replacement for traditional RPC endpoints, delivering up to 2000x faster data access. + +This file contains links to documentation sections following the llmstxt.org standard. +`, + includeOrder: [ + "docs/HyperSync/overview.md", + "docs/HyperSync/quickstart.md", + "docs/HyperSync/hypersync-usage.md", + "docs/HyperSync/hypersync-clients.md", + "docs/HyperSync/hypersync-query.md", + "docs/HyperSync/hypersync-presets.md", + "docs/HyperSync/hypersync-curl-examples.md", + "docs/HyperSync/api-tokens.mdx", + "docs/HyperSync/hypersync-supported-networks.md", + "docs/HyperSync/tutorial-address-transactions.md", + "docs/HyperSync/HyperFuel/**", + ], + }, + { + name: "hyperrpc", + root: ` +# HyperRPC Docs + +> HyperRPC is an extremely fast read-only RPC designed specifically for data-intensive blockchain tasks. It provides simple drop-in replacement for existing RPC-based code. + +This file contains links to documentation sections following the llmstxt.org standard. +`, + includeOrder: [ + "docs/HyperRPC/overview-hyperrpc.md", + "docs/HyperRPC/hyperrpc-supported-networks.md", + ], + }, + ], + }, ], - copyright: `Copyright © ${new Date().getFullYear()} Envio`, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - additionalLanguages: [ - "rescript", - "bash", - "diff", - "json", - "javascript", - "typescript", + [ + "@docusaurus/plugin-content-docs", + { + id: "HyperSync", + path: "docs/HyperSync", + routeBasePath: "docs/HyperSync", + sidebarPath: require.resolve("./sidebarsHyperSync.js"), + editUrl: "https://github.com/enviodev/docs/edit/main/", + showLastUpdateAuthor: false, + showLastUpdateTime: false, + // versions: { + // current: { + // label: 'latest(4.0.0)', + // path: '4.0.0', + // }, + // }, + }, + ], + [ + "@docusaurus/plugin-content-docs", + { + id: "HyperIndex", + path: "docs/HyperIndex", + routeBasePath: "docs/HyperIndex", + sidebarPath: require.resolve("./sidebarsHyperIndex.js"), + editUrl: "https://github.com/enviodev/docs/edit/main/", + showLastUpdateAuthor: false, + showLastUpdateTime: false, + disableVersioning: true, + // versions: { + // current: { + // label: "v2", + // path: "", + // }, + // }, + }, + ], + [ + "@docusaurus/plugin-content-docs", + { + id: "HyperRPC", + path: "docs/HyperRPC", + routeBasePath: "docs/HyperRPC", + sidebarPath: require.resolve("./sidebarsHyperRPC.js"), + editUrl: "https://github.com/enviodev/docs/edit/main/", + showLastUpdateAuthor: false, + showLastUpdateTime: false, + //disableVersioning: true, + // versions: { + // current: { + // label: "v2", + // path: "", + // }, + // }, + }, + ], + [ + "@docusaurus/plugin-content-docs", + { + id: "HyperIndex-LLM", + path: "docs/HyperIndex-LLM", + routeBasePath: "docs/HyperIndex-LLM", + sidebarPath: require.resolve("./sidebarsHyperIndexLLM.js"), + editUrl: "https://github.com/enviodev/docs/edit/main/", + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + "@docusaurus/plugin-content-docs", + { + id: "HyperSync-LLM", + path: "docs/HyperSync-LLM", + routeBasePath: "docs/HyperSync-LLM", + sidebarPath: require.resolve("./sidebarsHyperSyncLLM.js"), + editUrl: "https://github.com/enviodev/docs/edit/main/", + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + "@docusaurus/plugin-content-docs", + { + id: "HyperRPC-LLM", + path: "docs/HyperRPC-LLM", + routeBasePath: "docs/HyperRPC-LLM", + sidebarPath: require.resolve("./sidebarsHyperRPCLLM.js"), + editUrl: "https://github.com/enviodev/docs/edit/main/", + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + "@docusaurus/plugin-client-redirects", + { + redirects: redirectsList, + }, ], - }, - metadata: [ - { name: "twitter:card", content: "summary_large_image" }, - { name: "twitter:site", content: "@envio_indexer" }, - { property: "og:type", content: "website" }, - { property: "og:locale", content: "en" }, - ], - }), - plugins: [ - [ - "@docusaurus/plugin-content-docs", - { - id: "HyperSync", - path: "docs/HyperSync", - routeBasePath: "docs/HyperSync", - sidebarPath: require.resolve("./sidebarsHyperSync.js"), - editUrl: "https://github.com/enviodev/docs/edit/main/", - showLastUpdateAuthor: false, - showLastUpdateTime: false, - // versions: { - // current: { - // label: 'latest(4.0.0)', - // path: '4.0.0', - // }, - // }, - }, - ], - [ - "@docusaurus/plugin-content-docs", - { - id: "HyperIndex", - path: "docs/HyperIndex", - routeBasePath: "docs/HyperIndex", - sidebarPath: require.resolve("./sidebarsHyperIndex.js"), - editUrl: "https://github.com/enviodev/docs/edit/main/", - showLastUpdateAuthor: false, - showLastUpdateTime: false, - disableVersioning: true, - // versions: { - // current: { - // label: "v2", - // path: "", - // }, - // }, - }, - ], - [ - "@docusaurus/plugin-content-docs", - { - id: "HyperRPC", - path: "docs/HyperRPC", - routeBasePath: "docs/HyperRPC", - sidebarPath: require.resolve("./sidebarsHyperRPC.js"), - editUrl: "https://github.com/enviodev/docs/edit/main/", - showLastUpdateAuthor: false, - showLastUpdateTime: false, - //disableVersioning: true, - // versions: { - // current: { - // label: "v2", - // path: "", - // }, - // }, - }, - ], - [ - "@docusaurus/plugin-content-docs", - { - id: "HyperIndex-LLM", - path: "docs/HyperIndex-LLM", - routeBasePath: "docs/HyperIndex-LLM", - sidebarPath: require.resolve("./sidebarsHyperIndexLLM.js"), - editUrl: "https://github.com/enviodev/docs/edit/main/", - showLastUpdateAuthor: false, - showLastUpdateTime: false, - }, - ], - [ - "@docusaurus/plugin-content-docs", - { - id: "HyperSync-LLM", - path: "docs/HyperSync-LLM", - routeBasePath: "docs/HyperSync-LLM", - sidebarPath: require.resolve("./sidebarsHyperSyncLLM.js"), - editUrl: "https://github.com/enviodev/docs/edit/main/", - showLastUpdateAuthor: false, - showLastUpdateTime: false, - }, - ], - [ - "@docusaurus/plugin-content-docs", - { - id: "HyperRPC-LLM", - path: "docs/HyperRPC-LLM", - routeBasePath: "docs/HyperRPC-LLM", - sidebarPath: require.resolve("./sidebarsHyperRPCLLM.js"), - editUrl: "https://github.com/enviodev/docs/edit/main/", - showLastUpdateAuthor: false, - showLastUpdateTime: false, - }, - ], - [ - "@docusaurus/plugin-client-redirects", - { - redirects: redirectsList, - }, ], - ], - themes: ["docusaurus-json-schema-plugin"], + themes: ["docusaurus-json-schema-plugin"], }; module.exports = config; diff --git a/package.json b/package.json index cb10283e..e854c525 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "clsx": "^1.2.1", "docusaurus": "^1.14.7", "docusaurus-json-schema-plugin": "^1.12.2", + "minimatch": "^10.0.3", "prism-react-renderer": "^2.1.0", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/plugins/plugin-generate-llms.js b/plugins/plugin-generate-llms.js new file mode 100644 index 00000000..c7dcd88b --- /dev/null +++ b/plugins/plugin-generate-llms.js @@ -0,0 +1,217 @@ +const fs = require("fs"); +const path = require("path"); +const matter = require("gray-matter"); +const glob = require("glob"); +const { minimatch } = require("minimatch"); + +// Docusaurus Plugin: Generate LLMS files +// -------------------------------------- +// This plugin generates `llms.txt` (and optional variants) during the Docusaurus build. +// It is designed for integrating with LLMs or tools that need a structured list of docs +// in text/Markdown format. +// +// What it does: +// 1. Scans all docs from `@docusaurus/plugin-content-docs`. +// 2. Collects metadata (title, slug, description, URL). +// 3. Orders docs according to `includeOrder` patterns (glob-like). +// 4. Writes an `llms.txt` file (or multiple) into the build output folder. +// 5. Optionally writes stripped-down `.md` copies of the docs (without frontmatter). +// +// How to use: +// ----------- +// In your `docusaurus.config.js`, add the plugin with configuration: +// +// plugins: [ +// [ +// require.resolve("./plugins/generate-llms"), // path to this plugin file +// { +// filesConfigs: [ +// { +// main: true, // Marks this as the main config +// name: "default", // Identifier (used for filename if not main) +// root: "Welcome to the docs!",// Text that appears at the top of llms.txt +// includeOrder: [ // Order of docs (glob patterns) +// "**/intro.md", +// "**/getting-started.md", +// "**/guides/*", +// ], +// }, +// { +// main: false, // Optional secondary config +// name: "advanced", // Will output as llms-advanced.txt +// root: "Advanced Topics", // Intro text +// includeOrder: [ +// "**/advanced/*", +// "**/api/*", +// ], +// }, +// ], +// }, +// ], +// ], +// +// Output: +// ------- +// - `build/llms.txt` (main file, always generated if `main: true` exists). +// - `build/llms-.txt` (for secondary configs). +// - `build/.../*.md` stripped copies of docs (only for the main config). +// +// Notes: +// - Paths in `includeOrder` are matched against doc file paths, so you can use wildcards. +// - The `.md` copies are saved at the same relative path as the doc's URL. + +function GenerateLLMSPlugin(context, options) { + return { + name: "docusaurus-plugin-generate-llms", + + async postBuild({ siteConfig }) { + const { url, plugins } = siteConfig; + + const filesConfigs = options.filesConfigs || []; + + let collectedDocs = []; + + // 1. collect docs metadata + for (const plugin of plugins) { + if ( + Array.isArray(plugin) && + plugin[0] === "@docusaurus/plugin-content-docs" + ) { + const config = plugin[1]; + const docsPath = path.resolve(config.path); + const routeBasePath = config.routeBasePath || ""; + + const allFiles = glob.sync("**/*.{md,mdx}", { + cwd: docsPath, + }); + + for (const file of allFiles) { + const fullPath = path.join(docsPath, file); + const raw = fs.readFileSync(fullPath, "utf-8"); + const parsed = matter(raw); + + const slug = parsed.data.slug; + const title = parsed.data.title; + const description = parsed.data.description || ""; + + if (!slug || !title) continue; + + const pageUrl = `${url.replace( + /\/$/, + "" + )}/${routeBasePath.replace(/^\//, "")}/${slug.replace( + /^\//, + "" + )}`; + + collectedDocs.push({ + filePath: path.join(config.path, file), + title, + description, + pageUrl, + }); + } + } + } + + // Helper to convert Windows paths to POSIX + function toPosix(p) { + return p.split(path.sep).join("/"); + } + + function orderDocs(includeOrder) { + if (!includeOrder || includeOrder.length === 0) { + return []; + } + + const matched = new Set(); + const ordered = []; + const duplicates = new Set(); + + for (const pattern of includeOrder) { + for (const doc of collectedDocs) { + const docPath = toPosix(doc.filePath); + const pat = toPosix(pattern); + + if (minimatch(docPath, pat)) { + if (matched.has(doc.filePath)) { + duplicates.add(doc.filePath); + } else { + ordered.push(doc); + matched.add(doc.filePath); + } + } + } + } + + return ordered; + } + + function renderLLMS(rootText, docs) { + let output = rootText.trim() + "\n\n"; + for (const doc of docs) { + const desc = + doc.description || + (doc.title.length > 20 + ? `${doc.title} section of the docs.` + : ""); + output += `- [${doc.title}](${doc.pageUrl}.md): ${desc}\n`; + } + return output; + } + + // --- NEW: write .md copies into build folder --- + function writeMarkdownCopies(docs) { + for (const doc of docs) { + const rawContent = fs.readFileSync(doc.filePath, "utf-8"); + + // Use gray-matter to strip frontmatter + const parsed = matter(rawContent); + const cleanContent = parsed.content.trimStart(); + + // Convert pageUrl to relative path inside build + let relativePath = doc.pageUrl.replace( + siteConfig.url.replace(/\/$/, ""), + "" + ); + relativePath = relativePath.replace(/^\//, ""); + + // Save as .md file (same path as page, but with .md) + const targetPath = path.join( + context.outDir, + `${relativePath}.md` + ); + + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + fs.writeFileSync(targetPath, cleanContent, "utf-8"); + } + } + + // 2. generate files + for (const cfg of filesConfigs) { + const { main, name, root = "", includeOrder = [] } = cfg; + + // Order docs based on includeOrder patterns + const orderedDocs = orderDocs(includeOrder); + + // Inject "## Table of Contents" after root text + const tocRoot = root.trim() + "\n\n## Table of Contents\n"; + + const output = renderLLMS(tocRoot, orderedDocs); + + // Use llms.txt for the first/main config, others as llms-.txt + const outFileName = cfg.main ? "llms.txt" : `llms-${name}.txt`; + const outPath = path.join(context.outDir, outFileName); + + fs.writeFileSync(outPath, output, "utf-8"); + + // ✅ Only run markdown copy for main config + if (main) { + writeMarkdownCopies(orderedDocs); + } + } + }, + }; +} + +module.exports = GenerateLLMSPlugin; diff --git a/yarn.lock b/yarn.lock index 66159cc6..b7cae1e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2683,6 +2683,18 @@ resolved "https://registry.yarnpkg.com/@headlessui/tailwindcss/-/tailwindcss-0.2.1.tgz#1becc201f69358a40e08bd676acc234b2cabe6e4" integrity sha512-2+5+NZ+RzMyrVeCZOxdbvkUSssSxGvcUxphkIfSVLpRiKsj+/63T2TOL9dBYMXVfj/CGr6hMxSRInzXv6YY7sA== +"@isaacs/balanced-match@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" + integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== + +"@isaacs/brace-expansion@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" + integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== + dependencies: + "@isaacs/balanced-match" "^4.0.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" @@ -5099,6 +5111,13 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -6811,15 +6830,6 @@ docusaurus-json-schema-plugin@^1.12.2: monaco-editor-webpack-plugin "^7.0.1" react-monaco-editor "^0.55.0" -docusaurus-plugin-llms@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/docusaurus-plugin-llms/-/docusaurus-plugin-llms-0.2.2.tgz#3461e8295d18d4057cf0fbcf5e3feac561ea6fd1" - integrity sha512-DZlZ6cv9p5poFE00Qg78aurBNWhLa4o0VhH4kI33DUT0y4ydlFEJJbf8Bks9BuuGPFbY/Guebn+hRc2QymMImg== - dependencies: - gray-matter "^4.0.3" - minimatch "^9.0.3" - yaml "^2.8.1" - docusaurus@^1.14.7: version "1.14.7" resolved "https://registry.yarnpkg.com/docusaurus/-/docusaurus-1.14.7.tgz#f51858ab643b29ec52264d6dd85e0d629e5b3a4a" @@ -11421,6 +11431,20 @@ minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimatch@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.3.tgz#cf7a0314a16c4d9ab73a7730a0e8e3c3502d47aa" + integrity sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw== + dependencies: + "@isaacs/brace-expansion" "^5.0.0" + +minimatch@^9.0.3: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimatch@^9.0.3: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" @@ -16387,6 +16411,11 @@ yaml@^2.8.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== +yaml@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.1.tgz#1870aa02b631f7e8328b93f8bc574fac5d6c4d79" + integrity sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== + yamljs@^0.2.1: version "0.2.10" resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.10.tgz#481cc7c25ca73af59f591f0c96e3ce56c757a40f"