From d8ceff5facbbe7d7b358c718e73c2cfaa31cae5a Mon Sep 17 00:00:00 2001 From: Matthew Phillips Date: Tue, 6 Jul 2021 15:14:22 -0400 Subject: [PATCH] Implements templates from external repos (#603) * Implements templates from external repos * Adds a changeset --- .changeset/tame-cheetahs-yawn.md | 11 +++++++ packages/create-astro/README.md | 6 ++++ packages/create-astro/src/index.ts | 7 ++++- .../create-astro/test/create-astro.test.js | 6 +--- packages/create-astro/test/external.test.js | 29 +++++++++++++++++++ packages/create-astro/test/helpers.js | 13 +++++++++ 6 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 .changeset/tame-cheetahs-yawn.md create mode 100644 packages/create-astro/test/external.test.js create mode 100644 packages/create-astro/test/helpers.js diff --git a/.changeset/tame-cheetahs-yawn.md b/.changeset/tame-cheetahs-yawn.md new file mode 100644 index 000000000..f490a29cc --- /dev/null +++ b/.changeset/tame-cheetahs-yawn.md @@ -0,0 +1,11 @@ +--- +'create-astro': patch +--- + +Allows using an external repo as a template + +You can do this with the `--template` flag: + +```bash +npm init astro my-shopify --template cassidoo/shopify-react-astro +``` \ No newline at end of file diff --git a/packages/create-astro/README.md b/packages/create-astro/README.md index 4a90b7eb4..d8c6213de 100644 --- a/packages/create-astro/README.md +++ b/packages/create-astro/README.md @@ -28,6 +28,12 @@ yarn create astro my-astro-project --template starter ``` [Check out the full list][examples] of example starter templates, available on GitHub. +You can also use any GitHub repo as a template: + +```bash +npm init astro my-astro-project -- --template cassidoo/shopify-react-astro +``` + ### CLI Flags May be provided in place of prompts diff --git a/packages/create-astro/src/index.ts b/packages/create-astro/src/index.ts index c63cca9ea..e3487e8d4 100644 --- a/packages/create-astro/src/index.ts +++ b/packages/create-astro/src/index.ts @@ -55,7 +55,12 @@ export async function main() { ]); const hash = args.commit ? `#${args.commit}` : ''; - const emitter = degit(`snowpackjs/astro/examples/${options.template}${hash}`, { + + const templateTarget = options.template.includes('/') ? + options.template : + `snowpackjs/astro/examples/${options.template}`; + + const emitter = degit(`${templateTarget}${hash}`, { cache: false, force: true, verbose: false, diff --git a/packages/create-astro/test/create-astro.test.js b/packages/create-astro/test/create-astro.test.js index 30f466d30..d095b2da9 100644 --- a/packages/create-astro/test/create-astro.test.js +++ b/packages/create-astro/test/create-astro.test.js @@ -1,15 +1,11 @@ import fs from 'fs'; import path from 'path'; -import { fileURLToPath } from 'url'; import http from 'http'; import { green, red } from 'kleur/colors'; import execa from 'execa'; import glob from 'tiny-glob'; import { TEMPLATES } from '../dist/templates.js'; - -// config -const GITHUB_SHA = process.env.GITHUB_SHA || execa.sync('git', ['rev-parse', 'HEAD']).stdout; // process.env.GITHUB_SHA will be set in CI; if testing locally execa() will gather this -const FIXTURES_DIR = path.join(fileURLToPath(path.dirname(import.meta.url)), 'fixtures'); +import { GITHUB_SHA, FIXTURES_DIR } from './helpers.js'; // helpers async function fetch(url) { diff --git a/packages/create-astro/test/external.test.js b/packages/create-astro/test/external.test.js new file mode 100644 index 000000000..9fac8c202 --- /dev/null +++ b/packages/create-astro/test/external.test.js @@ -0,0 +1,29 @@ +import assert from 'assert'; +import execa from 'execa'; +import { FIXTURES_URL } from './helpers.js'; +import { existsSync } from 'fs'; + +async function run(outdir, template) { + //--template cassidoo/shopify-react-astro + await execa('../../create-astro.mjs', [outdir, '--template', template, '--force-overwrite'], { + cwd: FIXTURES_URL.pathname, + }); +} + +const testCases = [ + ['shopify', 'cassidoo/shopify-react-astro'] +]; + +async function tests() { + for(let [dir, tmpl] of testCases) { + await run(dir, tmpl); + + const outPath = new URL('' + dir, FIXTURES_URL); + assert.ok(existsSync(outPath)); + } +} + +tests().catch(err => { + console.error(err); + process.exit(1); +}); \ No newline at end of file diff --git a/packages/create-astro/test/helpers.js b/packages/create-astro/test/helpers.js new file mode 100644 index 000000000..295f9c650 --- /dev/null +++ b/packages/create-astro/test/helpers.js @@ -0,0 +1,13 @@ +import execa from 'execa'; +import path from 'path'; +import { fileURLToPath, pathToFileURL } from 'url'; + +const GITHUB_SHA = process.env.GITHUB_SHA || execa.sync('git', ['rev-parse', 'HEAD']).stdout; // process.env.GITHUB_SHA will be set in CI; if testing locally execa() will gather this +const FIXTURES_DIR = path.join(fileURLToPath(path.dirname(import.meta.url)), 'fixtures'); +const FIXTURES_URL = pathToFileURL(FIXTURES_DIR + '/'); + +export { + GITHUB_SHA, + FIXTURES_DIR, + FIXTURES_URL +}; \ No newline at end of file