Skip to content

Commit

Permalink
feat: ci build/test cli, use jsxImportSource (QwikDev#154)
Browse files Browse the repository at this point in the history
Co-authored-by: Adam Bradley <adamdbradley@users.noreply.github.com>
  • Loading branch information
manucorporat and adamdbradley authored Jan 29, 2022
1 parent b693643 commit 8b7916d
Showing 53 changed files with 753 additions and 797 deletions.
37 changes: 29 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -25,7 +25,7 @@ jobs:
if: "!contains(github.event.head_commit.message, 'skip ci')"
runs-on: ubuntu-latest
steps:
- name: Setup Node.js
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 16.x
@@ -46,7 +46,7 @@ jobs:
- name: Build Package
run: node scripts --tsc --build --api --set-dist-tag="${{ github.event.inputs.disttag }}"

- name: Print WASM Dist Build
- name: Print Package Dist Build
run: ls -R dist-dev/@builder.io-qwik/

- name: Upload Package Build Artifacts
@@ -56,13 +56,26 @@ jobs:
path: dist-dev/@builder.io-qwik/
if-no-files-found: error

- name: Build Create Qwik CLI
run: node scripts --cli

- name: Print Create Qwik CLI Dist Build
run: ls -R dist-dev/create-qwik/

- name: Upload Create Qwik CLI Build Artifacts
uses: actions/upload-artifact@master
with:
name: dist-dev-create-qwik
path: dist-dev/create-qwik/
if-no-files-found: error

############ BUILD WASM ############
build-wasm:
name: Build WASM
if: "!contains(github.event.head_commit.message, 'skip ci')"
runs-on: ubuntu-latest
steps:
- name: Setup Node.js
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 16.x
@@ -148,7 +161,7 @@ jobs:
- name: Checkout
uses: actions/checkout@v2

- name: Setup Node.js
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 16.x
@@ -221,7 +234,7 @@ jobs:
- validate-rust

steps:
- name: Setup Node.js
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 16.x
@@ -269,7 +282,7 @@ jobs:
- test-e2e

steps:
- name: Setup Node.js
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 16.x
@@ -335,7 +348,7 @@ jobs:
- build-distribution

steps:
- name: Setup Node.js
- name: Setup Node ${{ matrix.settings.node }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.settings.node }}
@@ -350,11 +363,16 @@ jobs:
- name: Print Distribution Artifacts
run: ls -R builderio-qwik-distribution/

- name: Print Create Qwik CLI Artifacts
run: ls -R dist-dev-create-qwik/

- name: Move Distribution Artifacts
run: |
mkdir dist-dev/
mkdir dist-dev/@builder.io-qwik/
mv builderio-qwik-distribution/* dist-dev/@builder.io-qwik/
mkdir dist-dev/create-qwik/
mv dist-dev-create-qwik/* dist-dev/create-qwik/
- name: Print Directory
run: ls -R ./
@@ -374,13 +392,16 @@ jobs:
- name: Playwright E2E Tests
run: yarn test.e2e.${{ matrix.settings.browser }}

- name: Validate Create Qwik Cli
run: node scripts/validate-cli.cjs

############ UNIT TEST ############
test-unit:
name: Unit Tests
if: "!contains(github.event.head_commit.message, 'skip ci')"
runs-on: ubuntu-latest
steps:
- name: Setup Node.js
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: 16.x
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@builder.io/qwik",
"version": "0.0.16-5",
"version": "0.0.16-6",
"description": "An Open-Source sub-framework designed with a focus on server-side-rendering, lazy-loading, and styling/animation.",
"scripts": {
"build": "node scripts --tsc --build --api --platform-binding --wasm",
@@ -9,7 +9,7 @@
"build.cli": "node scripts --cli --dev",
"build.cli.prod": "node scripts --cli",
"release.cli": "npm run build.cli.prod && cd dist-dev/create-qwik && npm publish",
"cli": "npm run build.cli && node dist-dev/create-qwik/index.js",
"cli": "npm run build.cli && node dist-dev/create-qwik/create-qwik",
"build.watch": "node scripts --build --watch --dev --platform-binding",
"api.update": "node scripts --tsc --api --dev",
"tsc.check": "tsc --noEmit",
2 changes: 1 addition & 1 deletion scripts/build.ts
Original file line number Diff line number Diff line change
@@ -47,7 +47,7 @@ export async function build(config: BuildConfig) {

console.log(
`🌎 Qwik v${config.distVersion}`,
`[node: ${process.version}, platform: ${process.platform}, arch: ${process.arch}]`
`[node ${process.version}, ${process.platform}/${process.arch}]`
);

if (config.tsc) {
79 changes: 64 additions & 15 deletions scripts/cli.ts
Original file line number Diff line number Diff line change
@@ -1,39 +1,79 @@
import { BuildConfig, copyFile, emptyDir, mkdir, PackageJSON, readFile, stat } from './util';
import { banner, fileSize, readdir, unlink, watcher } from './util';
import { BuildConfig, copyFile, emptyDir, importPath, mkdir, stat } from './util';
import { banner, readdir, watcher } from './util';
import { build } from 'esbuild';
import { basename, join } from 'path';
import { readPackageJson, writePackageJson } from './package-json';
import semver from 'semver';
import { statSync } from 'fs';

export async function buildCli(config: BuildConfig) {
const distCliDir = join(config.distDir, 'create-qwik');
const outFile = join(distCliDir, 'index.js');

await bundleCli(config, distCliDir);

const distStartersDir = join(distCliDir, 'starters');
await mkdir(distStartersDir);

const copyDirs = ['apps', 'servers'];
await Promise.all(
copyDirs.map(async (dirName) => {
const srcDir = join(config.startersDir, dirName);
const distDir = join(distStartersDir, dirName);
await copyDir(config, srcDir, distDir);
})
);

const tsconfigSrcPath = join(config.startersDir, 'apps', 'starter.tsconfig.json');
const appDistDir = join(distStartersDir, 'apps');
const appNames = (await readdir(appDistDir)).filter((appName) => {
return statSync(join(appDistDir, appName)).isDirectory();
});
await Promise.all(
appNames.map(async (appName) => {
const appPath = join(appDistDir, appName);
const appTsconfigPath = join(appPath, 'tsconfig.json');
await copyFile(tsconfigSrcPath, appTsconfigPath);
})
);

const srcCliDir = join(config.srcDir, 'cli');
await copyFile(join(srcCliDir, 'package.json'), join(distCliDir, 'package.json'));
await copyFile(join(srcCliDir, 'README.md'), join(distCliDir, 'README.md'));

console.log('🐠 create-qwik cli');
}

async function bundleCli(config: BuildConfig, distCliDir: string) {
emptyDir(distCliDir);

await build({
entryPoints: [join(config.srcDir, 'cli', 'index.ts')],
outfile: outFile,
entryPoints: [join(config.srcDir, 'cli', 'interface', 'index.ts')],
outfile: join(distCliDir, 'create-qwik'),
bundle: true,
sourcemap: false,
target: 'node10',
platform: 'node',
minify: !config.dev,
plugins: [importPath(/api$/, './index.js')],
banner: {
js: `#! /usr/bin/env node\n${banner.js}`,
},
watch: watcher(config),
});

const distStartersDir = join(distCliDir, 'starters');
await copyDir(config, config.startersDir, distStartersDir);
await unlink(join(distStartersDir, '.gitignore'));
await unlink(join(distStartersDir, 'README.md'));

const srcCliDir = join(config.srcDir, 'cli');
await copyFile(join(srcCliDir, 'package.json'), join(distCliDir, 'package.json'));
await copyFile(join(srcCliDir, 'README.md'), join(distCliDir, 'README.md'));

console.log('🐠 create-qwik cli', await fileSize(outFile));
await build({
entryPoints: [join(config.srcDir, 'cli', 'api', 'index.ts')],
outfile: join(distCliDir, 'index.js'),
bundle: true,
sourcemap: false,
target: 'node10',
platform: 'node',
minify: !config.dev,
banner: {
js: banner.js,
},
watch: watcher(config),
});
}

async function copyDir(config: BuildConfig, srcDir: string, destDir: string) {
@@ -72,8 +112,17 @@ async function updatePackageJson(config: BuildConfig, destDir: string) {
const IGNORE: { [path: string]: boolean } = {
'.rollup.cache': true,
build: true,
e2e: true,
node_modules: true,
'package-lock.json': true,
'starter.tsconfig.json': true,
'tsconfig.tsbuildinfo': true,
'yarn.lock': true,
};

export async function validateCreateQwikCli(config: BuildConfig, errors: string[]) {
try {
} catch (e: any) {
errors.push(String(e.message || e));
}
}
19 changes: 0 additions & 19 deletions scripts/util.ts
Original file line number Diff line number Diff line change
@@ -285,22 +285,3 @@ export interface PackageJSON {
private?: boolean;
priority?: number;
}

export interface CliGenerateOptions {
projectName?: string;
appId?: string;
serverId?: string;
}

export interface CliStarters {
apps: CliStarterData[];
servers: CliStarterData[];
}

export interface CliStarterData {
id: string;
name: string;
description: string;
dir: string;
priority: number;
}
60 changes: 60 additions & 0 deletions scripts/validate-cli.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
const { accessSync, readFileSync } = require('fs');
const assert = require('assert');
const { join } = require('path');

async function validateCreateQwikCli() {
console.log(`👾 validating create-qwik...`);

const distDevDir = join(__dirname, '..', 'dist-dev');

const cliDir = join(distDevDir, 'create-qwik');
accessSync(cliDir);

const cliBin = join(cliDir, 'create-qwik');
accessSync(cliBin);

const cliPkgJsonPath = join(cliDir, 'package.json');
const cliPkgJson = JSON.parse(readFileSync(cliPkgJsonPath, 'utf-8'));
assert.strictEqual(cliPkgJson.name, 'create-qwik');

const startersDir = join(cliDir, 'starters');
accessSync(startersDir);

const appsDir = join(startersDir, 'apps');
accessSync(appsDir);

const serversDir = join(startersDir, 'servers');
accessSync(serversDir);

const cliApi = join(cliDir, 'index.js');
const api = require(cliApi);
const starters = await api.getStarters();
assert.ok(starters.apps.length > 0);
assert.ok(starters.servers.length > 0);

const outDir = join(distDevDir, 'my-todo-app');
const result = await api.generateStarter({
projectName: 'My ToDo App',
appId: 'todo',
serverId: 'express',
outDir: outDir,
});

assert.strictEqual(result.projectName, 'My ToDo App');
assert.strictEqual(result.appId, 'todo');
assert.strictEqual(result.serverId, 'express');
assert.strictEqual(result.outDir, outDir);

accessSync(result.outDir);

const appPkgJsonPath = join(result.outDir, 'package.json');
const appPkgJson = JSON.parse(readFileSync(appPkgJsonPath, 'utf-8'));
assert.strictEqual(appPkgJson.name, 'my-todo-app');

const tsconfigPath = join(result.outDir, 'tsconfig.json');
accessSync(tsconfigPath);

console.log(`👽 create-qwik validated\n`);
}

validateCreateQwikCli();
19 changes: 19 additions & 0 deletions src/cli/README.md
Original file line number Diff line number Diff line change
@@ -18,6 +18,25 @@ npm init qwik@latest <starter> <projectName>
npm init qwik@latest todo my-app
```

## API

```javascript
const { getStarters, generateStarter } = require('create-qwik');

const starters = await getStarters();
console.log(starters);

const opts = {
projectName: 'my-project',
appId: 'todo',
serverId: 'express',
outDir: '/path/to/output/dir',
};

const result = await generateStarter(opts);
console.log(result);
```

## Community

- Ping us at [@QwikDev](https://twitter.com/QwikDev)
Loading

0 comments on commit 8b7916d

Please sign in to comment.