diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b42abca..69a76ca 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ If you would like to contribute a bugfix, please first create an issue detailing Again, please create a feature request detailing the functionality you intend to add, and state that you would like to implement it. When creating commits, please follow the commit message format below. New feature pull requests should be made against the `minor` branch. -When adding new public APIs to support your new feature, add a `@since 1.2.0` tag (where "1.2.0" corresponds to what will be the next minor version) to the doc block. This will let readers of the documentation know the version in which the API was introduced. See the [docs readme](./docs/README.md) for more details on the valid docs tags. +When adding new public APIs to support your new feature, add a `@since 1.2.0` tag (where "1.2.0" corresponds to what will be the next minor version) to the doc block. This will let readers of the documentation know the version in which the API was introduced. See the [docs readme](./README.md) for more details on the valid docs tags. ```TypeScript /** diff --git a/README.md b/README.md index d0fa5b0..7c2c483 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ GitHub top language - + Licence @@ -52,7 +52,65 @@ yarn add @hyperse/track ## Development > [!IMPORTANT] -> The following instructions are for those who want to develop the hyperse related framework or plugins (e.g. if you intend to make a pull request). For instructions on how to build a project _using_ Hyperse, please see the [Getting Started guide](https://hyperse-io.github.io/track/docs/intro/installation). +> The following instructions are for those who want to develop the hyperse related framework or plugins (e.g. if you intend to make a pull request). For instructions on how to build a project _using_ Hyperse, please see the [Getting Started guide](https://hyperse-io.github.io/track/docs/community/contributing). + +### 1. Clone project to the local directory + +```bash +git clone https://github.com/hyperse-io/track.git +``` + +### 2. Install dependencies in the root directory + +```bash +yarn install +``` + +or + +```bash +npm install +``` + +The root directory has a `package.json` which contains build-related dependencies for tasks including: + +- Building & deploying the docs +- Project for online presentation +- Linting, formatting & testing tasks to run on git commit & push + +### 3. Testing + +Make sure to thoroughly test your changes before submitting them. This includes running unit tests, integration tests, and any other relevant testing methods to ensure code quality and functionality. + +The core and several other packages have unit tests which are can be run all together by running `npm run test` from the root directory, or individually by running it from the package directory. + +Unit tests are co-located with the files which they test, and have the suffix `.spec.ts`. + +### 4. Improve documentation + +Documentation is a critical part of any software project. To improve or update the documentation: + +1. Update Documentation Files: If your changes introduce new features, modify existing functionality, or fix bugs, update the relevant documentation files located in the /website directory. + +2. Build and Preview: Ensure that your documentation builds correctly and looks good by running: + +```bash +cd website + +npm run start +``` + +3. Commit Documentation Changes: Make sure all updates to documentation are committed alongside your code changes. + +### 5. Release Process + +To make a release: + +1. Commit the Changes: Push your updated files to your branch. + +2. Create a Pull Request: [Open a pull request (PR)](https://github.com/hyperse-io/track/compare) with your changes. Make sure to include a clear description of what has been updated and why. + +3. GitHub Actions: Once the PR is merged into the main branch, the release process will be automatically handled by GitHub Actions. This includes tasks such as publishing to npm and updating documentation. ## Documentation @@ -60,10 +118,6 @@ You can find the Track documentation [on the website](https://hyperse-io.github. Check out the [Sample Example](https://hyperse-io.github.io/track/docs/intro/sample-example) page for a quick start. -## Contributing - -Contributions are welcome! If you encounter any issues or have ideas for improvements, feel free to open an issue or submit a pull request. - ## License -Code released under [Track LICENSE](https://github.com/hyperse-io/track/blob/main/LICENSE) +See [LICENSE](https://github.com/hyperse-io/track/blob/main/LICENSE.md) diff --git a/examples/next-example/app/globals.css b/examples/next-example/app/globals.css index fd81e88..3560cee 100644 --- a/examples/next-example/app/globals.css +++ b/examples/next-example/app/globals.css @@ -24,4 +24,50 @@ body { rgb(var(--background-end-rgb)) ) rgb(var(--background-start-rgb)); + margin: unset; +} + +#modal{ + z-index: 999; + height: 50%; + width: 100vw; + background-color: white; + position: fixed; + bottom: 0px; + padding: 12px; + color:black; + font-size: 16px; + padding: 10px; +} + +#pre{ + overflow-y: auto; + height: 100%; + padding-bottom: 10px; + padding: 0 24px; +} + +#head{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + border-bottom: 1px solid #ccc; +} + +#title{ + font-size: 20px; + width: 100%; + text-align: center; +} + +#close{ + width: 24px; + height: 24px; + cursor: pointer; + border-radius: 2px; + background-color: #ccc; + text-align: center; + position: absolute; + right: 24px; } diff --git a/examples/next-example/app/page.tsx b/examples/next-example/app/page.tsx index ffd78e1..ab01bc5 100644 --- a/examples/next-example/app/page.tsx +++ b/examples/next-example/app/page.tsx @@ -1,28 +1,63 @@ 'use client'; import { useEffect, useState } from 'react'; -import { fetchGoodsList, GoodsRecord } from './service'; +import mockjs from 'mockjs'; +import { reportTrack } from '@/track/track'; +import { GoodsRecord } from '@/track/types'; +import { fetchGoodsList } from './service'; export default function Home() { const [mounted, setMounted] = useState(false); + const [text, setText] = useState(); + const [data] = useState(fetchGoodsList()); useEffect(() => { setMounted(true); }, []); + + useEffect(() => { + const listener = (event: MessageEvent) => { + const { data } = event; + if (data && data.type === 'report') { + setText(`${JSON.stringify(data.data, null, 2)}`); + } + }; + + window.addEventListener('message', listener); + return () => { + window.removeEventListener('message', listener); + }; + }, [mounted]); + + useEffect(() => { + if (!mounted) { + return; + } + reportTrack() + .select('reportAdapter') + .track( + 'pv', + mockjs.mock({ + timeStamp: Date.now(), + url: '@url()', + userName: '@name()', + userId: '@id(12)', + }) + ); + }, [mounted]); + const onAddToCart = (item: GoodsRecord) => { - console.log('onAddToCart', JSON.stringify(item)); - // await reportTrack().select('reportAdapter').track('addCart', { - // price: 25.99, - // goodsId: '23432252', - // goodsName: 'Long Chair', - // count: 1, - // }); + reportTrack() + .select('reportAdapter') + .track('addCart', { + ...item, + }); }; return (
{mounted && - fetchGoodsList().map((item, index: number) => { + data.map((item, index: number) => { return (
); })} + +
); } diff --git a/examples/next-example/app/service.ts b/examples/next-example/app/service.ts index 9c33cd6..09aac7f 100644 --- a/examples/next-example/app/service.ts +++ b/examples/next-example/app/service.ts @@ -1,16 +1,11 @@ import Mock from 'mockjs'; - -export interface GoodsRecord { - goodsName: string; - goodsId: string; - price: number; -} +import { GoodsRecord } from '@/track/types'; export const fetchGoodsList = (): GoodsRecord[] => { const data = Mock.mock({ 'list|10-20': [ { - goodsName: '@cword(3,5)', + goodsName: '@word(3,5)', goodsId: '@id()', price: '@float(10, 100, 2, 2)', }, diff --git a/examples/next-example/package.json b/examples/next-example/package.json index 82f91fe..d254b78 100644 --- a/examples/next-example/package.json +++ b/examples/next-example/package.json @@ -21,7 +21,7 @@ } }, "dependencies": { - "@hyperse/track": "latest", + "@hyperse/track": "1.0.2", "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", diff --git a/examples/next-example/track/report-adapter.ts b/examples/next-example/track/report-adapter.ts index e69de29..f6e017b 100644 --- a/examples/next-example/track/report-adapter.ts +++ b/examples/next-example/track/report-adapter.ts @@ -0,0 +1,37 @@ +import { AdapterReportData, BaseAdapter, TrackContext } from '@hyperse/track'; +import { + ReportAdapterOptions, + ReportEventData, + ReportTrackData, +} from './types'; + +export class ReportAdapter extends BaseAdapter< + TrackContext, + ReportEventData, + ReportAdapterOptions, ReportEventData> +> { + isTrackable( + ctx: TrackContext, + eventType: EventType, + eventData: ReportEventData[EventType] + ): boolean | Promise { + return true; + } + + protected report( + ctx: TrackContext, + reportData: AdapterReportData, + setupData?: + | { name: 'setup' | 'setup2' | 'setup3'; timeStamp: number } + | undefined + ): void | Promise { + window.postMessage({ + type: 'report', + data: { + ctx, + reportData, + setupData, + }, + }); + } +} diff --git a/examples/next-example/track/track.ts b/examples/next-example/track/track.ts index 7696e41..14f1c48 100644 --- a/examples/next-example/track/track.ts +++ b/examples/next-example/track/track.ts @@ -1 +1,77 @@ -export const reportTrack = () => {}; +import { + createAdapterBuilder, + createTrackBuilder, + TrackContext, +} from '@hyperse/track'; +import { ReportAdapter } from './report-adapter'; +import { + ReportAdapterOptions, + ReportEventData, + ReportTrackData, +} from './types'; + +export const reportTrack = () => { + const reportAdapter = new ReportAdapter(); + + const adapterBuilder = createAdapterBuilder< + TrackContext, + ReportEventData, + ReportAdapterOptions, ReportEventData> + >(reportAdapter); + + const adapter = adapterBuilder + .setup(() => { + return Promise.resolve({ + name: 'setup', + timeStamp: Date.now(), + }); + }) + .before((ctx, eventType, eventData) => { + console.log('before', ctx, eventType, eventData); + }) + .transform('addCart', (ctx, eventType, eventData) => { + return { + eventType, + goodName: 'ac_' + eventData?.goodsName, + goodsId: 'ac_' + eventData?.goodsId, + price: eventData?.price, + }; + }) + .transform('pv', (ctx, eventType, eventData) => { + return { + eventType, + url: eventData?.url, + timeStamp: 'pv_' + eventData?.timeStamp, + userName: 'pv_' + eventData?.userName, + userId: 'pv_' + eventData?.userId, + }; + }) + .after((ctx, eventType, reportData) => { + console.log('after', ctx, eventType, reportData); + }) + .build(); + + const trackBuilder = createTrackBuilder< + TrackContext, + ReportEventData + >({ + createData: { + env: 'prod', + platform: 'ios', + ip: '0.0.0.0', + }, + }); + + return trackBuilder + .init(() => { + return { + reportAdapter: adapter, + }; + }) + .before((ctx) => { + console.log('before track', ctx); + }) + .after((ctx) => { + console.log('after track', ctx); + }); +}; diff --git a/examples/next-example/track/types.ts b/examples/next-example/track/types.ts index 8537556..631da45 100644 --- a/examples/next-example/track/types.ts +++ b/examples/next-example/track/types.ts @@ -21,10 +21,11 @@ export type ReportEventData = { userName: string; userId: string; }; - addCart?: { - price: number; - goodsId: string; - goodsName: string; - count: number; - }; + addCart?: GoodsRecord; }; + +export interface GoodsRecord { + goodsName: string; + goodsId: string; + price: number; +} diff --git a/examples/next-example/tsconfig.json b/examples/next-example/tsconfig.json index 1acc222..ce0d479 100644 --- a/examples/next-example/tsconfig.json +++ b/examples/next-example/tsconfig.json @@ -19,7 +19,8 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": ["./*"], + "@hyperse/track": ["../../src/index.js"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/website/docs/community/contributing.md b/website/docs/community/contributing.md index 783ac86..406145a 100644 --- a/website/docs/community/contributing.md +++ b/website/docs/community/contributing.md @@ -1,135 +1,103 @@ -## All contributions are welcome! +# Contribution Guidelines -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; +Hi! Thank you for taking the time to contribute to Hyperse! -:::info +In order to make the best use of both your time and that of the Hyperse maintainers, please follow the guidelines in this document. -Thank you for your interest in contributing to our documentation site! We appreciate your support and value the insights and expertise of our community. This page outlines the guidelines and process for contributing, as well as the rewards you can earn for your efforts. +## Branches -::: +There are 3 important branches to know about: -We welcome contributions in a variety of forms, including but not limited to: +- `master` - the default branch +- `minor` - a branch for commits which introduce new features which would go in the next [SemVer minor](https://semver.org/) release. +- `major` - a branch for commits which introduce breaking changes which would go in the next [SemVer major](https://semver.org/) release. -1. Pointing out a mistake/typo and (optionally) providing a solution -2. Providing translation -3. Creating or improving diagrams, charts, or visual aids -4. Suggesting improvements to the documentation structure or organization -5. Writing or updating a tutorial or guide -6. Creating or updating code samples, examples, or demos -7. Polishing or improving document writing +Bug fixes should go direct in the `master` branch, from which new patch releases will be made regularly. Periodically the master branch will be merged into the `minor` and `major` branches. -To make a contribution, please take one of the following actions: +## Bug fixes -- **Report an Issue**: If you spot a problem or is willing to suggest improvements, [create an issue](https://github.com/hyperse-io/track/issues/new/choose) to let us know. -- **Submit Changes**: For direct contributions to content, [create a pull request](https://github.com/hyperse-io/track/compare). +If you would like to contribute a bugfix, please first create an issue detailing the bug, and indicate that you intend to fix it. When creating commits, please follow the commit message format below. -## Create an Issue +## New features -You can create an issue for the following purposes: +Again, please create a feature request detailing the functionality you intend to add, and state that you would like to implement it. When creating commits, please follow the commit message format below. New feature pull requests should be made against the `minor` branch. -- To report any mistakes or typos. -- To request new content or improvements to current content. +When adding new public APIs to support your new feature, add a `@since 1.2.0` tag (where "1.2.0" corresponds to what will be the next minor version) to the doc block. This will let readers of the documentation know the version in which the API was introduced. See the [docs readme](https://github.com/hyperse-io/track/blob/main/README.md) for more details on the valid docs tags. -You can typically create an issue directly through the [GitHub web page](https://github.com/hyperse-io/track/issues/new/choose). Here, you'll find various templates to guide your issue submission. +```TypeScript +/** + * @description + * Sets the value of the new API thing. + * + * @since 1.2.0 + */ +myNewApi: number; +``` -If you're able to address the issue yourself, we encourage you to take the initiative. When creating an issue, you can indicate your willingness to resolve it. For bug reports, select the option “I'd be willing to fix this issue myself” in the BUG template. For feature requests, select “I'd be willing to contribute this feature myself” in the Feature Request template. +## Commit message format - - +This repo uses [Conventional Commits](https://www.conventionalcommits.org). -**Describe the bug** +``` +type(scope): Message in present tense +``` -A clear and concise description of what the bug is. +`type` may be one of: -**To Reproduce** +- **feat** (A new feature) +- **fix** (A bug fix) +- **docs** (Documentation only changes) +- **style** (Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)) +- **refactor** (A code change that neither fixes a bug nor adds a feature) +- **perf** (A code change that improves performance) +- **test** (Adding missing tests or correcting existing tests) +- **chore** (Other changes that don't modify src or test file) -Steps to reproduce the behavior: +`scope` indicates the package affected by the commit: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error +- website +- core +- common +- etc. -**Expected behavior** +If a commit affects more than one package, separate them with a comma: -A clear and concise description of what you expected to happen. +```shell +fix(core,common): Fix the thing +``` -**Environment (please complete the following information):** +```shell +You can use `yarn g:cz` to interactively prompt you on how to commit. +``` -- @hyperse/track version: -- Nodejs version +If a commit applies to no particular package (e.g. a tooling change in the root package.json), the scope can be omitted. -**Additional context** +#### Breaking Changes -Add any other context about the problem here. - - +If your contribution includes any breaking changes (including any backwards-incompatible changes; backwards-incompatible changes to current behavior), please include a `BREAKING CHANGE` section in your commit message as per the [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/#commit-message-with-both-and-breaking-change-footer). -**Is your feature request related to a problem? Please describe.** +Please also make your pull request against the `major` branch rather than `master` in the case of breaking changes. -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] +Example: -**Describe the solution you'd like** +```shell +feat(core): Add new field to Customer -A clear and concise description of what you want to happen. +Relates to #123. This commit adds the "foo" field to the Custom entity. -**Describe alternatives you've considered** +BREAKING CHANGE: A DB migration will be required in order to add the new "foo" field to the customer table. +``` -A clear and concise description of any alternative solutions or features you've considered. +#### Linting -**Additional context** +Commit messages are linted on commit, so you'll know if your message is not quite right. -Add any other context or screenshots about the feature request here. +## Setting up the dev environment - - +After cloning the Hyperse repo, please follow the [Development guide](https://github.com/hyperse-io/track/blob/main/README.md#development) in the README for instructions on how to get up and running locally. -## Create a Pull Request +## Contributor License Agreement -Contributing to projects through a pull request (PR) is a valuable way to improve existing documentation or code. This guide will walk you through the process step by step, ensuring clarity and ease of understanding, especially for those new to GitHub and git operations. +All contributors are required to agree to the [Contributor License Agreement](https://github.com/hyperse-io/.github/blob/main/license/CLA.md) before their contributions can be merged. -For complex operations, you can also check the [closed pull requests](https://github.com/hyperse-io/track/pulls?q=is%3Apr+is%3Aclosed) for grammar reference. - -### Local Development for Substantial Changes - -:::tip - -Refer to [Github's tutorial](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project) if you are not familiar with git or Github operations. - -::: - -For more significant contributions like adding a new page or extensive revisions: - -1. Setting Up: - - - Ensure you have [node.js](https://nodejs.org/en) (version `>= 18`) and [yarn](https://yarnpkg.com/getting-started/install) installed. - - Fork and clone the [hyperse-io/track](https://github.com/hyperse-io/track)repository. Detailed instructions for forking and cloning are available on GitHub's help pages. - -2. Making Changes Locally: - -- Run `yarn` in your terminal to preview the project. -- Complete the place you need to change and provide the corresponding UT. -- Run `yarn test` command to check whether the function is complete. -- Navigate to the `website/**` folder and complete documentation for new features. - -3. Submitting Your Changes: - -- After making changes, run `npx changeset add` to improve the changelog. -- Commit your changes with a meaningful message, then push to your forked repository. Initiate a pull request on GitHub by comparing your branch to the original repository. - -### Working on an Existing Issue - -To avoid overlapping efforts and streamline contributions, it is suggested to follow these steps: - -1. Check for Accepted Issues: - -- Look for issues labeled "ACCEPTED" or similarly indicating readiness for contributions. If unsure, ask in the issue comments. - -2. Announce Your Intentions: - -- Comment on the issue stating that you are working on it. This helps prevent duplicate efforts. - -3. (Optional)Link Your Contributions: - -- When committing your changes, reference the issue number in your commit message, e.g., `fix: typo. Ref #123456`. +This is done via an automation bot which will prompt you to sign the CLA when you open a pull request. diff --git a/website/docs/faq.md b/website/docs/faq.md index 32fa856..78f1bb6 100644 --- a/website/docs/faq.md +++ b/website/docs/faq.md @@ -12,7 +12,7 @@ Regardless of cjs for the time being. Track is a library based on esm implementa Track has transitioned to a new licensing model, which impacts how the software can be used, particularly in commercial settings. The new license aims to balance the needs of open-source community use with the commercial sustainability of the project. -This change includes specifics on usage rights, redistribution, and potential costs for commercial entities. More information please see [LICENSE](https://github.com/hyperse-io/track/blob/main/LICENSE) +This change includes specifics on usage rights, redistribution, and potential costs for commercial entities. More information please see [LICENSE](https://github.com/hyperse-io/track/blob/main/LICENSE.md) @@ -28,7 +28,7 @@ However we also provide some highly packaged plugins to facilitate rapid busines
What is Hyperse? -Hyperse is an open source full stack development suites, front end, architecture, tech solutions, built with TypeScript, GraphQL and Node.js +Leveraging a cutting-edge, robust open-source full-stack core, we deliver comprehensive and innovative architectural solutions and expert consulting services for medium to large tech enterprises. Our offerings encompass advanced front-end, back-end, big data, Android, and iOS technologies. Additionally, we specialize in crafting bespoke e-commerce platform solutions, tailored to meet the unique needs of your business. More information please see [Hyperse](https://www.hyperse.net/) diff --git a/website/sidebars.ts b/website/sidebars.ts index 2547064..90fa1d0 100644 --- a/website/sidebars.ts +++ b/website/sidebars.ts @@ -111,7 +111,7 @@ const sidebars: SidebarsConfig = { { type: 'link', label: 'LICENSE', - href: 'https://github.com/hyperse-io/track/blob/main/LICENSE', + href: 'https://github.com/hyperse-io/track/blob/main/LICENSE.md', }, { type: 'doc', diff --git a/website/src/components/Stackblitz/index.tsx b/website/src/components/Stackblitz/index.tsx index ab56265..694d1cd 100644 --- a/website/src/components/Stackblitz/index.tsx +++ b/website/src/components/Stackblitz/index.tsx @@ -1,7 +1,7 @@ import React from 'react'; const GithubUrl = { - 'next-example': `https://stackblitz.com/fork/github/hyperse-io/track/tree/feat/track/examples/next-example?title=next-example&startScript=dev&embed=1&theme=dark`, + 'next-example': `https://stackblitz.com/fork/github/hyperse-io/track/tree/main/examples/next-example?title=next-example&startScript=dev&embed=1&theme=dark`, }; export default function Stackblitz(props: { id: keyof typeof GithubUrl }) { diff --git a/website/src/pages/index.tsx b/website/src/pages/index.tsx index 856ccaa..582aa0a 100644 --- a/website/src/pages/index.tsx +++ b/website/src/pages/index.tsx @@ -5,13 +5,13 @@ import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import { CheckIcon } from '@heroicons/react/24/outline'; import { DocumentDuplicateIcon } from '@heroicons/react/24/outline'; -import DynamicCoding from '@site/src/components/Amimate/DynamicCoding'; import HomepageFeatures from '@site/src/components/HomepageFeatures'; import LogoDark from '@site/static/img/logo-dark.svg'; import LogoWhite from '@site/static/img/logo-white.svg'; import Layout from '@theme/Layout'; import TabItem from '@theme/TabItem'; import Tabs from '@theme/Tabs'; +import DynamicCoding from '../components/Amimate/DynamicCoding'; import styles from './index.module.css'; function HomepageHeader() { @@ -104,6 +104,7 @@ export default function Home() { title={`A typed, smart, scalable , powerful data collection engine written in typescript`} description={siteConfig.tagline} > +
diff --git a/yarn.lock b/yarn.lock index d14dc96..62d77a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3273,7 +3273,7 @@ __metadata: resolution: "@hyperse/next-example@workspace:examples/next-example" dependencies: "@hyperse/eslint-config-hyperse": "npm:1.1.3" - "@hyperse/track": "npm:latest" + "@hyperse/track": "npm:1.0.2" "@types/mockjs": "npm:^1" "@types/node": "npm:20.6.2" "@types/react": "npm:18.2.22" @@ -3291,7 +3291,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperse/pipeline@npm:^1.0.1, @hyperse/pipeline@npm:^1.0.4": +"@hyperse/pipeline@npm:^1.0.4": version: 1.0.4 resolution: "@hyperse/pipeline@npm:1.0.4" dependencies: @@ -3338,16 +3338,7 @@ __metadata: languageName: unknown linkType: soft -"@hyperse/track@npm:latest": - version: 1.0.1 - resolution: "@hyperse/track@npm:1.0.1" - dependencies: - "@hyperse/pipeline": "npm:^1.0.1" - checksum: 10/84045db71e332ddbc8593674bbb671806cc516994217c370a5c19ef45c6e51236fa63bf21b161564bd46f1a4eb32a64829cd7b67ed0c7f4b45050f3b4f9057ec - languageName: node - linkType: hard - -"@hyperse/track@workspace:.": +"@hyperse/track@npm:1.0.2, @hyperse/track@workspace:.": version: 0.0.0-use.local resolution: "@hyperse/track@workspace:." dependencies: