Skip to content

Commit

Permalink
Merge pull request #16 from hehehai/hehehai/crate-only-info
Browse files Browse the repository at this point in the history
  • Loading branch information
hehehai committed Jun 16, 2022
2 parents af0a666 + e7f5aa6 commit 2cf2479
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 95 deletions.
16 changes: 15 additions & 1 deletion src/contentScripts/fetch.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { CrateDepsVO, CrateDetailVO, CrateIntroVO, PlayCrateTopCrateVO } from "./interface";
import { chunkIntoN } from "~/util";
import type { CrateDepsVO, CrateDetailVO, CrateIntroVO } from "./interface";

export async function getCrateDetail(name: string): Promise<CrateDetailVO | undefined | null> {
try {
Expand All @@ -14,6 +14,20 @@ export async function isPublicCrate(name: string): Promise<boolean> {
return !!getCrateDetail(name)
}

export async function inDayTop100(name: string): Promise<boolean> {
try {
const response = await fetch('https://play.rust-lang.org/meta/crates');
const data = response.status === 200 ? await response.json() : null;
if (!data?.crates || data?.crates?.length === 0) {
return false;
}
return (<PlayCrateTopCrateVO[]>(data.crates)).some(item => item.name === name);
} catch (err) {
console.error(err);
return false
}
}

export async function getCrateDeps(name: string, version: string): Promise<CrateDepsVO | undefined | null> {
try {
const response = await fetch(`https://crates.io/api/v1/${name}/rand/${version}/dependencies`);
Expand Down
29 changes: 23 additions & 6 deletions src/contentScripts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,16 @@ import { gitHubInjection } from '~/util/github-injection';
import Deps from './views/Deps.svelte';
import Crate from './views/Crate.svelte';
import { getCargoJson, getCargoTomlURL, getRepoBlobPath, hasCargoToml, isCargoToml } from '~/logic/cargo-toml';
import { getCrateDetail } from './fetch';
import type { CrateDetailVO } from './interface';

interface InitProps {
isCrate: boolean;
isCargoToml: boolean;
cargoTomlURL?: string;
repoBlobPath?: string;
cargoData?: any;
crateData?: CrateDetailVO | null;
}

const initDeps = async (props: InitProps) => {
Expand All @@ -30,17 +34,14 @@ const initCrate = async (props: InitProps) => {
}

new Crate({
props: {
repoBlobPath: props.repoBlobPath,
cargoData: props.cargoData,
},
props,
target
});
}

// Firefox `browser.tabs.executeScript()` requires scripts return a primitive value.
const init = async () => {
console.info('[vitesse-webext] Hello world from content script');
console.info('[cratehub] script init');

try {
// If this fragment exists, then the list is deferred.
Expand Down Expand Up @@ -69,10 +70,26 @@ const init = async () => {
return;
}

const props = {
let isCrate = false
let crateData = null
if (cargoData?.package?.name) {
crateData = await getCrateDetail(cargoData?.package?.name);
if (crateData) {
if (crateData?.crate?.repository && cargoData?.package?.repository === crateData?.crate?.repository) {
isCrate = true
} else if (cargoData?.package?.version === crateData?.crate?.max_version) {
// empty repository fallback equals version
isCrate = true
}
}
}

const props: InitProps = {
isCrate,
isCargoToml: isCargoTomlVal,
cargoTomlURL: cargoTomlURL,
repoBlobPath,
crateData,
cargoData,
}

Expand Down
6 changes: 6 additions & 0 deletions src/contentScripts/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,9 @@ export interface Meta {
prev_page?: null;
total?: number;
}

export interface PlayCrateTopCrateVO {
name: string;
version: string;
id: string;
}
94 changes: 37 additions & 57 deletions src/contentScripts/views/Crate.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,73 +5,53 @@
import CopyInput from '~/components/CopyInput.svelte';
import AttrList from '~/components/AttrList.svelte';
import DetailList from '~/components/DetailList.svelte';
import { getCrateDetail } from '../fetch';
import { sizeFormat } from '~/util/size';
export let isCrate: boolean = false;
export let crateData: CrateDetailVO | null | undefined = null;
export let cargoData: any;
export let repoBlobPath: string | undefined = undefined;
let crateInfo: CrateDetailVO | undefined;
let loading = false;
$: copyVal = `${crateInfo?.crate?.name} = "${crateInfo?.crate?.max_version}"`;
$: sizeVal = crateInfo?.versions?.at(0)?.crate_size
? sizeFormat(crateInfo?.versions?.at(0)?.crate_size!)
: '';
const getCreateInfo = async () => {
if (!cargoData?.package?.name) {
return;
}
loading = true;
try {
const res = await getCrateDetail(cargoData?.package?.name);
if (res) {
crateInfo = res;
}
} catch (e) {
console.log(e);
// do something
} finally {
loading = false;
}
};
getCreateInfo();
$: attrData =
isCrate && crateData?.crate
? {
name: crateData?.crate?.name,
copyVal: `${crateData?.crate?.name} = "${crateData?.crate?.max_version}"`,
sizeVal: crateData?.versions?.at(0)?.crate_size
? sizeFormat(crateData?.versions?.at(0)?.crate_size!)
: '',
downloadsVal: crateData?.crate?.downloads,
}
: null;
</script>

<div class="BorderGrid-row cratehub-crate-row">
<div class="BorderGrid-cell">
{#if loading}
<span>Loading...</span>
{:else}
{#if crateInfo?.crate}
<h2 class="h4 mb-3">
<a
href="https://crates.io/crates/{crateInfo?.crate?.name}"
class="Link--primary no-underline"
>
{crateInfo?.crate?.name}
</a>
</h2>
<AttrList size={sizeVal} download={crateInfo?.crate?.downloads} />
<div class="mt-2">
<div class="mb-2 color-fg-muted text-xs">
Add the following line to your Cargo.toml file:
</div>
<CopyInput value={copyVal} />
</div>
{/if}
{#if cargoData?.workspace?.members?.length}
<div class:mt-2={crateInfo?.crate}>
<DetailList
title="WorkSpaces"
{repoBlobPath}
workspaces={cargoData?.workspace?.members}
/>
{#if attrData}
<h2 class="h4 mb-3">
<a
href="https://crates.io/crates/{attrData?.name}"
class="Link--primary no-underline"
>
{attrData?.name}
</a>
</h2>
<AttrList size={attrData?.sizeVal} download={attrData?.downloadsVal} />
<div class="mt-2">
<div class="mb-2 color-fg-muted text-xs">
Add the following line to your Cargo.toml file:
</div>
{/if}
<CopyInput value={attrData?.copyVal} />
</div>
{/if}
{#if cargoData?.workspace?.members?.length}
<div class:mt-2={attrData}>
<DetailList
title="WorkSpaces"
{repoBlobPath}
workspaces={cargoData?.workspace?.members}
/>
</div>
{/if}
</div>
</div>
66 changes: 35 additions & 31 deletions src/contentScripts/views/Deps.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
import type { CrateIntro } from '../interface';
import Box from '~/components/Box.svelte';
import HeaderLink from '~/components/HeaderLink.svelte';
import { getAllCreatesIntroByChunk, isPublicCrate } from '../fetch';
import { getAllCreatesIntroByChunk, inDayTop100 } from '../fetch';
export let cargoTomlURL: string;
export let isCrate: boolean = false;
export let isCargoToml: boolean;
export let cargoTomlURL: string;
export let cargoData: any;
let depMap: Record<string, string[]> = {};
Expand Down Expand Up @@ -62,43 +63,46 @@
<HeaderLink href={cargoTomlURL} label={CARGO_TOML_FILE} />
{/if}

{#if crateName}
{#await isPublicCrate(crateName) then isPublic}
{#if isPublic}
<HeaderLink
href="https://crates.io/crates/{crateName}"
label="Crates.io"
/>
<HeaderLink
href="https://docs.rs/{crateName}/latest/{crateName}"
label="Docs.rs"
/>
{#if isCrate && crateName}
<HeaderLink
href="https://crates.io/crates/{crateName}"
label="Crates.io"
/>
<HeaderLink
href="https://docs.rs/{crateName}/latest/{crateName}"
label="Docs.rs"
/>

{#await inDayTop100(crateName) then canPlayground}
{#if canPlayground}
<HeaderLink
href="https://play.rust-lang.org/?edition=2018&code=use%20{crateName}%3B%0A%0Afn%20main()%20%7B%0A%20%20%20%20%2F%2F%20try%20using%20the%20%60{crateName}%60%20crate%20here%0A%7D"
label="Rust Playground"
/>
<details
class="dropdown details-reset details-overlay d-inline-block BtnGroup-parent"
>
<summary class="btn btn-sm BtnGroup-item" aria-haspopup="true">
<div class="dropdown-caret m-0" />
</summary>

<ul class="dropdown-menu dropdown-menu-sw">
<li>
<a
class="dropdown-item"
href="https://crates.io/crates/{crateName}/versions"
>
Version
</a>
</li>
</ul>
</details>
{/if}
{/await}

<details
class="dropdown details-reset details-overlay d-inline-block BtnGroup-parent"
>
<summary class="btn btn-sm BtnGroup-item" aria-haspopup="true">
<div class="dropdown-caret m-0" />
</summary>

<ul class="dropdown-menu dropdown-menu-sw">
<li>
<a
class="dropdown-item"
href="https://crates.io/crates/{crateName}/versions"
>
Version
</a>
</li>
</ul>
</details>
{/if}
</Box>

{#each Object.entries(depMapCrates) as [title, crates]}
{#if title !== 'dependencies'}
<Box {loading} {title} dependencies={crates} />
Expand Down

0 comments on commit 2cf2479

Please sign in to comment.