Skip to content

Commit dbd4a1f

Browse files
Merge branch 'main' into fix-ui-leave
2 parents 3de1e4c + d15c0fc commit dbd4a1f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+364
-61
lines changed

.github/workflows/title.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: "Lint PR title"
2+
3+
on:
4+
pull_request_target:
5+
types:
6+
- opened
7+
- edited
8+
- synchronize
9+
10+
permissions:
11+
pull-requests: read
12+
13+
jobs:
14+
main:
15+
name: Validate PR title
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: amannn/action-semantic-pull-request@v5
19+
env:
20+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
21+
with:
22+
types: |
23+
BREAKING
24+
deprecation
25+
feat
26+
fix
27+
docs
28+
refactor
29+
perf
30+
test
31+
ci
32+
chore
33+
revert
34+
requireScope: false

api/.sqlx/query-8433bacb42d0833b723781eff2467ab27542e94691c1a5626c3f3d8c090caa54.json

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/src/api/package.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ use crate::iam::ReqIamExt;
7171
use crate::ids::PackageName;
7272
use crate::ids::PackagePath;
7373
use crate::ids::ScopeName;
74+
use crate::ids::Version;
7475
use crate::metadata::PackageMetadata;
7576
use crate::metadata::VersionMetadata;
7677
use crate::npm::generate_npm_version_manifest;
@@ -333,12 +334,30 @@ pub async fn get_handler(req: Request<Body>) -> ApiResult<ApiPackage> {
333334
Span::current().record("package", field::display(&package));
334335

335336
let db = req.data::<Database>().unwrap();
336-
let package = db
337+
let res_package = db
337338
.get_package(&scope, &package)
338339
.await?
339340
.ok_or(ApiError::PackageNotFound)?;
340341

341-
Ok(ApiPackage::from(package))
342+
let mut api_package = ApiPackage::from(res_package);
343+
344+
if let Some(latest_v) = &api_package.latest_version {
345+
let latest_version = Version::new(latest_v).unwrap();
346+
let dependency_count = db
347+
.count_package_dependencies(&scope, &package, &latest_version)
348+
.await?;
349+
api_package.dependency_count = dependency_count as u64;
350+
}
351+
352+
let dependent_count = db
353+
.count_package_dependents(
354+
crate::db::DependencyKind::Jsr,
355+
&format!("@{}/{}", scope, package),
356+
)
357+
.await?;
358+
api_package.dependent_count = dependent_count as u64;
359+
360+
Ok(api_package)
342361
}
343362

344363
#[instrument(

api/src/api/types.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,8 @@ pub struct ApiPackage {
470470
pub updated_at: DateTime<Utc>,
471471
pub created_at: DateTime<Utc>,
472472
pub version_count: u64,
473+
pub dependency_count: u64,
474+
pub dependent_count: u64,
473475
pub score: Option<u32>,
474476
pub latest_version: Option<String>,
475477
pub when_featured: Option<DateTime<Utc>>,
@@ -491,6 +493,8 @@ impl From<PackageWithGitHubRepoAndMeta> for ApiPackage {
491493
updated_at: package.updated_at,
492494
created_at: package.created_at,
493495
version_count: package.version_count as u64,
496+
dependency_count: 0,
497+
dependent_count: 0,
494498
score: package
495499
.latest_version
496500
.as_ref()

api/src/db/database.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2858,6 +2858,48 @@ impl Database {
28582858
Ok((total_unique_package_dependents as usize, dependents))
28592859
}
28602860

2861+
#[instrument(name = "Database::count_package_dependents", skip(self), err)]
2862+
pub async fn count_package_dependents(
2863+
&self,
2864+
kind: DependencyKind,
2865+
name: &str,
2866+
) -> Result<usize> {
2867+
let total_unique_package_dependents = sqlx::query!(
2868+
r#"SELECT COUNT(DISTINCT (package_scope, package_name)) FROM package_version_dependencies
2869+
WHERE dependency_kind = $1 AND dependency_name = $2;"#,
2870+
kind as _,
2871+
name,
2872+
)
2873+
.map(|r| r.count.unwrap())
2874+
.fetch_one(&self.pool)
2875+
.await?;
2876+
2877+
Ok(total_unique_package_dependents as usize)
2878+
}
2879+
2880+
#[instrument(name = "Database::count_package_dependencies", skip(self), err)]
2881+
pub async fn count_package_dependencies(
2882+
&self,
2883+
scope: &ScopeName,
2884+
name: &PackageName,
2885+
version: &Version,
2886+
) -> Result<usize> {
2887+
let total_package_dependencies = sqlx::query!(
2888+
r#"SELECT COUNT(DISTINCT dependency_name)
2889+
FROM package_version_dependencies
2890+
WHERE package_scope = $1 AND package_name = $2 AND package_version = $3"#,
2891+
scope as _,
2892+
name as _,
2893+
version as _
2894+
)
2895+
.fetch_one(&self.pool)
2896+
.await?
2897+
.count
2898+
.unwrap();
2899+
2900+
Ok(total_package_dependencies as usize)
2901+
}
2902+
28612903
#[instrument(name = "Database::check_bad_word", skip(self), err)]
28622904
pub async fn check_is_bad_word(&self, word: &str) -> Result<bool> {
28632905
let res = sqlx::query!("SELECT * FROM bad_words WHERE word = $1", word)

frontend/components/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export function Header({
107107
? <UserMenu user={user} sudo={sudo} logoutUrl={logoutUrl} />
108108
: (
109109
<a href={loginUrl} class="link-header flex items-center gap-2">
110-
<TbBrandGithub class="size-5 flex-none" aria-hidden={true} />
110+
<TbBrandGithub class="size-5 flex-none" aria-hidden />
111111
Sign in
112112
</a>
113113
)}

frontend/components/HomepageHero.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export function HomepageHero(
7171
<GlobalSearch
7272
apiKey={apiKey}
7373
indexId={indexId}
74-
jumbo={true}
74+
jumbo
7575
/>
7676
</div>
7777
<div class="flex flex-col items-center gap-4">

frontend/components/Markdown.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export function Markdown(
2626
return (
2727
<div
2828
class="markdown-body"
29+
// deno-lint-ignore react-no-danger
2930
dangerouslySetInnerHTML={{ __html: html }}
3031
/>
3132
);

frontend/components/Modal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export default function Modal(
3434
onClick={(e) => e.stopPropagation()}
3535
>
3636
<button
37+
type="button"
3738
class="absolute top-8 right-8 hover:text-jsr-gray-400"
3839
onClick={() => setOpen(false)}
3940
>

frontend/components/Nav.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@ export function Nav(props: NavProps) {
1515
} border-b border-jsr-cyan-300/30 max-w-full flex justify-between overflow-x-auto items-end`}
1616
>
1717
<style
18+
// deno-lint-ignore react-no-danger
1819
dangerouslySetInnerHTML={{
1920
__html:
2021
"nav:has(#nav-items[data-unattached]) { visibility: hidden; }",
2122
}}
2223
/>
2324
<noscript>
2425
<style
26+
// deno-lint-ignore react-no-danger
2527
dangerouslySetInnerHTML={{
2628
__html:
2729
"nav:has(#nav-items[data-unattached]) { visibility: visible !important }",
@@ -49,7 +51,7 @@ export interface NavItemProps {
4951
export function NavItem(props: NavItemProps) {
5052
return (
5153
<a
52-
class={`md:px-3 px-4 py-2 text-sm md:text-base min-h-10 leading-none rounded-md hover:bg-jsr-cyan-100 flex items-center select-none focus:outline-none focus:border-1 focus:border-jsr-cyan-300 focus:ring-1 focus:ring-jsr-cyan-300 focus:ring-opacity-50 ${
54+
class={`md:px-3 px-4 py-2 text-sm md:text-base min-h-10 leading-none rounded-md hover:bg-jsr-cyan-100 flex items-center select-none focus:outline-none focus-visible:outline-1 focus-visible:outline-jsr-cyan-300 focus-visible:outline-offset-0 focus-visible:ring-0 ${
5355
props.active
5456
? "bg-jsr-cyan-50 border-1 border-jsr-cyan-300/30 font-semibold"
5557
: ""

0 commit comments

Comments
 (0)