Skip to content

Commit

Permalink
Simplify giget dependency (#12143)
Browse files Browse the repository at this point in the history
  • Loading branch information
bluwy authored Oct 7, 2024
1 parent b28bd74 commit 2385d58
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 193 deletions.
5 changes: 5 additions & 0 deletions .changeset/red-bugs-pump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'create-astro': patch
---

Uses `@bluwy/giget-core` instead of `giget` for smaller installation size when downloading the CLI
2 changes: 1 addition & 1 deletion packages/create-astro/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"//b": "DEPENDENCIES IS FOR UNBUNDLED PACKAGES",
"dependencies": {
"@astrojs/cli-kit": "^0.4.1",
"giget": "1.2.3"
"@bluwy/giget-core": "^0.1.0"
},
"devDependencies": {
"arg": "^5.0.2",
Expand Down
10 changes: 1 addition & 9 deletions packages/create-astro/src/actions/template.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { Context } from './context.js';
import fs from 'node:fs';
import path from 'node:path';
import { color } from '@astrojs/cli-kit';
import { downloadTemplate } from 'giget';
import { downloadTemplate } from '@bluwy/giget-core';
import { error, info, title } from '../messages.js';

export async function template(
Expand Down Expand Up @@ -125,14 +125,6 @@ export default async function copyTemplate(tmpl: string, ctx: Context) {
throw new Error(`Unable to download template ${color.reset(tmpl)}`);
}

// It's possible the repo exists (ex. `withastro/astro`),
// But the template route is invalid (ex. `withastro/astro/examples/DNE`).
// `giget` doesn't throw for this case,
// so check if the directory is still empty as a heuristic.
if (fs.readdirSync(ctx.cwd).length === 0) {
throw new Error(`Template ${color.reset(tmpl)} ${color.dim('is empty!')}`);
}

// Post-process in parallel
const removeFiles = FILES_TO_REMOVE.map(async (file) => {
const fileLoc = path.resolve(path.join(ctx.cwd, file));
Expand Down
60 changes: 3 additions & 57 deletions packages/create-astro/src/actions/verify.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { Context } from './context.js';

import dns from 'node:dns/promises';
import { color } from '@astrojs/cli-kit';
import { verifyTemplate } from '@bluwy/giget-core';
import { bannerAbort, error, info, log } from '../messages.js';
import { getTemplateTarget } from './template.js';

Expand All @@ -19,7 +20,8 @@ export async function verify(
}

if (ctx.template) {
const ok = await verifyTemplate(ctx.template, ctx.ref);
const target = getTemplateTarget(ctx.template, ctx.ref);
const ok = await verifyTemplate(target);
if (!ok) {
bannerAbort();
log('');
Expand All @@ -36,59 +38,3 @@ function isOnline(): Promise<boolean> {
() => false,
);
}

async function verifyTemplate(tmpl: string, ref?: string) {
const target = getTemplateTarget(tmpl, ref);
const { repo, subdir, ref: branch } = parseGitURI(target.replace('github:', ''));
const url = new URL(`/repos/${repo}/contents${subdir}?ref=${branch}`, 'https://api.github.com/');

let res = await fetch(url.toString(), {
headers: {
Accept: 'application/vnd.github+json',
'X-GitHub-Api-Version': '2022-11-28',
},
});

// If users hit a ratelimit, fallback to the GitHub website
if (res.status === 403) {
res = await fetch(`https://github.com/${repo}/tree/${branch}${subdir}`);
}

return res.status === 200;
}

// Adapted from https://github.com/unjs/giget/blob/main/src/_utils.ts
// MIT License

// Copyright (c) Pooya Parsa <[email protected]>

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// Disable eslint rule to not touch the original code
// eslint-disable-next-line regexp/no-misleading-capturing-group
const GIT_RE = /^(?<repo>[\w.-]+\/[\w.-]+)(?<subdir>[^#]+)?(?<ref>#[\w.-]+)?/;

function parseGitURI(input: string) {
const m = GIT_RE.exec(input)?.groups;
if (!m) throw new Error(`Unable to parse "${input}"`);
return {
repo: m.repo,
subdir: m.subdir || '/',
ref: m.ref ? m.ref.slice(1) : 'main',
};
}
Loading

0 comments on commit 2385d58

Please sign in to comment.