Skip to content

Commit

Permalink
feat: move nitro integration into separate vite plugin package (#341)
Browse files Browse the repository at this point in the history
Closes #318
  • Loading branch information
goetzrobin committed Apr 15, 2023
1 parent 1e0b965 commit aeea815
Show file tree
Hide file tree
Showing 29 changed files with 508 additions and 60 deletions.
3 changes: 2 additions & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ What kind of change does this PR introduce?

## Which package are you modifying?

- [ ] vite-angular-plugin
- [ ] vite-plugin-angular
- [ ] vite-plugin-nitro
- [ ] astro-angular
- [ ] create-analog
- [ ] router
Expand Down
3 changes: 2 additions & 1 deletion apps/nx-plugin-e2e/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"options": {
"target": "platform:build",
"jestConfig": "apps/nx-plugin-e2e/jest.config.ts",
"coverageDirectory": "../../coverage/apps/nx-plugin-e2e"
"coverageDirectory": "../../coverage/apps/nx-plugin-e2e",
"passWithNoTests": true
}
}
},
Expand Down
6 changes: 5 additions & 1 deletion apps/nx-plugin-e2e/tests/nx-plugin.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
uniq,
} from '@nrwl/nx-plugin/testing';

describe('nx-plugin e2e', () => {
describe.skip('nx-plugin e2e', () => {
// Setting up individual workspaces per
// test can cause e2e runs to take a long time.
// For this reason, we recommend each suite only
Expand All @@ -18,6 +18,10 @@ describe('nx-plugin e2e', () => {
'@analogjs/vite-plugin-angular',
'node_modules/@analogjs/vite-plugin-angular'
);
ensureNxProject(
'@analogjs/vite-plugin-nitro',
'node_modules/@analogjs/vite-plugin-nitro'
);
ensureNxProject('@analogjs/platform', 'node_modules/@analogjs/platform');
});

Expand Down
1 change: 1 addition & 0 deletions commitlint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ module.exports = {
'always',
[
'vite-plugin-angular',
'vite-plugin-nitro',
'create-analog',
'astro-angular',
'router',
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,9 @@
"ts-node": "10.9.1",
"typescript": "5.0.3",
"vite": "4.2.1",
"vite-plugin-eslint": "^1.8.1",
"vite-tsconfig-paths": "4.0.5",
"vitest": "0.25.8",
"vitest": "0.30.1",
"webpack-bundle-analyzer": "^4.7.0"
}
}
3 changes: 2 additions & 1 deletion packages/platform/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
},
"dependencies": {
"nitropack": "^1.0.0",
"@analogjs/vite-plugin-angular": "^0.2.0-beta.1"
"@analogjs/vite-plugin-angular": "^0.2.0-beta.1",
"@analogjs/vite-plugin-nitro": "latest"
},
"generators": "./src/lib/nx-plugin/generators.json",
"schematics": "./src/lib/nx-plugin/generators.json"
Expand Down
10 changes: 4 additions & 6 deletions packages/platform/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@
"outputPath": "node_modules/@analogjs/platform",
"main": "packages/platform/src/index.ts",
"tsConfig": "packages/platform/tsconfig.lib.json",
"assets": [
"packages/platform/*.md",
"packages/platform/src/lib/runtime/*.js"
],
"assets": ["packages/platform/*.md"],
"updateBuildableProjectDepsInPackageJson": false
},
"configurations": {
Expand All @@ -25,7 +22,8 @@
"tsConfig": "packages/platform/tsconfig.lib.json"
}
},
"defaultConfiguration": "production"
"defaultConfiguration": "production",
"dependsOn": ["^build"]
},
"build": {
"executor": "nx:run-commands",
Expand All @@ -50,5 +48,5 @@
}
},
"tags": [],
"implicitDependencies": ["vite-plugin-angular"]
"implicitDependencies": ["vite-plugin-angular", "vite-plugin-nitro"]
}
6 changes: 3 additions & 3 deletions packages/platform/src/lib/platform-plugin.spec.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { describe, expect } from 'vitest';
import { platformPlugin } from './platform-plugin';

vi.mock('./vite-nitro-plugin');
vi.mock('@analogjs/vite-plugin-nitro');
vi.mock('./ssr/ssr-build-plugin');
vi.mock('./ssr/dev-server-plugin');

describe('platformPlugin', () => {
const setup = async () => {
const viteNitroPluginImport = await import('./vite-nitro-plugin');
const viteNitroPluginImport = await import('@analogjs/vite-plugin-nitro');
const viteNitroPluginSpy = vi.fn();
viteNitroPluginImport.viteNitroPlugin = viteNitroPluginSpy;
viteNitroPluginImport.default = viteNitroPluginSpy;

const ssrBuildPluginImport = await import('./ssr/ssr-build-plugin');
const ssrBuildPluginSpy = vi.fn();
Expand Down
4 changes: 2 additions & 2 deletions packages/platform/src/lib/platform-plugin.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Plugin } from 'vite';
import angular from '@analogjs/vite-plugin-angular';
import { Options } from './options';
import { viteNitroPlugin } from './vite-nitro-plugin';
import { routerPlugin } from './router-plugin';
import { devServerPlugin } from './ssr/dev-server-plugin';
import { ssrBuildPlugin } from './ssr/ssr-build-plugin';
import { contentPlugin } from './content-plugin';
import viteNitroPlugin from '@analogjs/vite-plugin-nitro';
import angular from '@analogjs/vite-plugin-angular';

export function platformPlugin(opts: Options = {}): Plugin[] {
const { apiPrefix, ...platformOptions } = {
Expand Down
3 changes: 3 additions & 0 deletions packages/platform/tsconfig.lib.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
"paths": {
"@analogjs/vite-plugin-angular": [
"./node_modules/@analogjs/vite-plugin-angular"
],
"@analogjs/vite-plugin-nitro": [
"./node_modules/@analogjs/vite-plugin-nitro"
]
}
},
Expand Down
3 changes: 1 addition & 2 deletions packages/platform/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ import { defineConfig } from 'vite';
// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
return {
root: 'src',
test: {
globals: true,
environment: 'jsdom',
environment: 'node',
setupFiles: ['src/test-setup.ts'],
include: ['**/*.spec.ts'],
cache: {
Expand Down
18 changes: 18 additions & 0 deletions packages/vite-plugin-nitro/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extends": ["../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}
25 changes: 25 additions & 0 deletions packages/vite-plugin-nitro/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# @analogjs/vite-plugin-nitro

A Vite plugin for adding a nitro API server

## Install

yarn add @analogjs/vite-plugin-nitro

## Setup

Add the plugin to the `plugins` array in your Vite config

```ts
import { defineConfig } from 'vite';
import nitro from '@analogjs/vite-plugin-nitro';

// https://vitejs.dev/config/
export default defineConfig({
resolve: {
mainFields: ['module'],
},

plugins: [nitro()],
});
```
29 changes: 29 additions & 0 deletions packages/vite-plugin-nitro/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "@analogjs/vite-plugin-nitro",
"version": "0.2.0-beta.0",
"type": "commonjs",
"description": "A Vite plugin for adding a nitro API server",
"author": "Brandon Roberts <robertsbt@gmail.com>",
"exports": {
".": "./src/index.js",
"./package.json": "./package.json"
},
"keywords": [
"angular",
"vite",
"plugin-vite",
"meta-framework"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/analogjs/analog/issues"
},
"homepage": "https://analogjs.org",
"repository": {
"type": "git",
"url": "https://github.com/analogjs/analog.git"
},
"dependencies": {
"nitropack": "^1.0.0"
}
}
45 changes: 45 additions & 0 deletions packages/vite-plugin-nitro/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"name": "vite-plugin-nitro",
"$schema": "../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/vite-plugin-nitro/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nrwl/js:tsc",
"outputs": ["{options.outputPath}"],
"options": {
"outputPath": "node_modules/@analogjs/vite-plugin-nitro",
"main": "packages/vite-plugin-nitro/src/index.ts",
"tsConfig": "packages/vite-plugin-nitro/tsconfig.lib.json",
"assets": [
"packages/vite-plugin-nitro/*.md",
"packages/vite-plugin-nitro/src/lib/runtime/*.js"
],
"updateBuildableProjectDepsInPackageJson": false
}
},
"publish": {
"executor": "nx:run-commands",
"options": {
"command": "node tools/scripts/publish.mjs vite-plugin-nitro {args.ver} {args.tag}"
},
"dependsOn": ["build"]
},
"lint": {
"executor": "@nrwl/linter:eslint",
"outputs": ["{options.outputFile}"],
"options": {
"lintFilePatterns": ["packages/vite-plugin-nitro/**/*.ts"]
}
},
"test": {
"executor": "@nrwl/vite:test",
"outputs": ["coverage/packages/vite-plugin-nitro"],
"options": {
"passWithNoTests": true,
"reportsDirectory": "../../coverage/packages/vite-plugin-nitro"
}
}
},
"tags": []
}
4 changes: 4 additions & 0 deletions packages/vite-plugin-nitro/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { nitro } from './lib/vite-plugin-nitro';
export { Options } from './lib/options';

export default nitro;
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { loadEsmModule } from '@angular-devkit/build-angular/src/utils/load-esm';
import { NitroConfig } from 'nitropack';

import { Options } from './options';

export async function buildServer(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { build, mergeConfig, UserConfig } from 'vite';
import { Options } from '../options';
import { Options } from './options';

export async function buildSSRApp(config: UserConfig, options?: Options) {
const ssrBuildConfig = mergeConfig(config, {
Expand Down
22 changes: 22 additions & 0 deletions packages/vite-plugin-nitro/src/lib/options.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export interface Options {
ssr?: boolean;
ssrBuildDir?: string;
/**
* Prerender the static pages without producing the server output.
*/
static?: boolean;
prerender?: PrerenderOptions;
entryServer?: string;
}

export interface PrerenderOptions {
/**
* Add additional routes to prerender through crawling page links.
*/
discover?: boolean;

/**
* List of routes to prerender resolved statically or dynamically.
*/
routes?: string[] | (() => Promise<(string | undefined)[]>);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it, vi } from 'vitest';
import { viteNitroPlugin } from './vite-nitro-plugin';
import { nitro } from './vite-plugin-nitro';

const mockViteDevServer = {
middlewares: {
Expand All @@ -14,15 +14,15 @@ describe('viteNitroPlugin', () => {
});

it('should work', () => {
expect(viteNitroPlugin({}).name).toEqual('analogjs-vite-nitro-plugin');
expect(nitro({}).name).toEqual('analogjs-vite-nitro-plugin');
});

it(`should not call the route middleware in test mode `, async () => {
// Arrange
const spy = vi.spyOn(mockViteDevServer.middlewares, 'use');

// Act
await (viteNitroPlugin({}).configureServer as any)(mockViteDevServer);
await (nitro({}).configureServer as any)(mockViteDevServer);

// Assert
expect(spy).toHaveBeenCalledTimes(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,12 @@ import { loadEsmModule } from '@angular-devkit/build-angular/src/utils/load-esm'
import { NitroConfig } from 'nitropack';
import { toNodeListener } from 'h3';
import { Plugin, UserConfig, ViteDevServer } from 'vite';
import { Options } from './options';
import { buildServer } from './build-server';
import { buildSSRApp } from './ssr/build';
import { buildSSRApp } from './build-ssr';
import { normalizePath } from 'vite';
import { Options } from './options';

export function viteNitroPlugin(
options?: Options,
nitroOptions?: NitroConfig
): Plugin {
export function nitro(options?: Options, nitroOptions?: NitroConfig): Plugin {
const rootDir = nitroOptions?.rootDir || '.';
const isTest = process.env['NODE_ENV'] === 'test' || !!process.env['VITEST'];
const apiPrefix = `/${nitroOptions?.runtimeConfig?.['apiPrefix'] ?? 'api'}`;
Expand Down
22 changes: 22 additions & 0 deletions packages/vite-plugin-nitro/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
},
{
"path": "./tsconfig.spec.json"
}
]
}
11 changes: 11 additions & 0 deletions packages/vite-plugin-nitro/tsconfig.lib.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../dist/out-tsc",
"declaration": true,
"types": []
},
"include": ["src/**/*.ts"],
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
}

0 comments on commit aeea815

Please sign in to comment.