
Research
Shai-Hulud Descends to Hades: Miasma Worm Campaign Spreads with New PyPI Wave
Socket found 37 malicious PyPI wheels that abuse Python startup hooks to launch a Bun-powered credential stealer tied to Mini Shai-Hulud/Miasma.
@nestpress/next
Advanced tools
@nestpress/next
The Next.js Integration Module for NestJS
$ npm install --save @nestpress/next
First, populate package.json, tsconfig.json and tsconfig.server.json:
{
"name": "sample-app",
"scripts": {
"dev": "ts-node --project tsconfig.server.json server/main.ts",
"build": "next build && tsc --project tsconfig.server.json",
"start": "cross-env NODE_ENV=production node .next/production-server/main.js"
},
"dependencies": {
"@nestjs/common": "latest",
"@nestjs/core": "latest",
"@nestpress/next": "latest",
"next": "latest",
"react": "latest",
"react-dom": "latest",
"reflect-metadata": "latest",
"rxjs": "latest"
},
"devDependencies": {
"@types/node": "latest",
"@types/react": "latest",
"@types/react-dom": "latest",
"cross-env": "latest",
"ts-node": "latest",
"typescript": "latest"
}
}
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"jsx": "preserve",
"lib": [
"dom",
"dom.iterable",
"esnext"
],
"strict": true,
"noEmit": true,
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"isolatedModules": true,
"resolveJsonModule": true,
"forceConsistentCasingInFileNames": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"incremental": true
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx"
],
"exclude": [
"node_modules"
]
}
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"noEmit": false,
"outDir": ".next/production-server"
},
"include": [
"server"
]
}
Register NextModule in your application module so that the Nest can handle dependencies:
import {
Module,
NestModule,
MiddlewareConsumer,
RequestMethod,
} from '@nestjs/common';
import {
NextModule,
NextMiddleware,
} from '@nestpress/next';
import { AppController } from './app.controller';
@Module({
imports: [
// register NextModule
NextModule,
],
controllers: [
AppController,
],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
// handle scripts
consumer
.apply(NextMiddleware)
.forRoutes({
path: '_next*',
method: RequestMethod.GET,
});
// handle other assets
consumer
.apply(NextMiddleware)
.forRoutes({
path: 'images/*',
method: RequestMethod.GET,
});
consumer
.apply(NextMiddleware)
.forRoutes({
path: 'favicon.ico',
method: RequestMethod.GET,
});
}
}
Prepare the Next.js service in the main entry point:
import { NestFactory } from '@nestjs/core';
import { NextModule } from '@nestpress/next';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.get(NextModule).prepare().then(() => {
app.listen(3000, 'localhost', () => {
console.log('> Ready on http://localhost:3000 with Next.js!');
});
});
}
bootstrap();
Use NextService in your controllers like this:
import {
IncomingMessage,
ServerResponse,
} from 'http';
import {
Controller,
Get,
Req,
Res,
} from '@nestjs/common';
import { NextService } from '@nestpress/next';
@Controller()
export class AppController {
constructor(
private readonly next: NextService,
) {}
@Get()
public async showHome(@Req() req: IncomingMessage, @Res() res: ServerResponse) {
// this will render `pages/index.tsx`!
await this.next.render('/index', req, res);
}
}
In the pages directory, we can do the same as the Next.js way:
export default () => (
<p>Next.js on top of NestJS!</p>
);
$ yarn dev (or `npm run dev`)
Go to http://localhost:3000 and you'll see Next.js on top of NestJS!.
$ yarn build (or `npm run build`)
$ yarn start (or `npm start`)
import { NestFactory } from '@nestjs/core';
import { NextModule } from '@nestpress/next';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.get(NextModule).prepare({
/**
* Whether to launch Next.js in dev mode
*/
dev: process.env.NODE_ENV !== 'production',
/**
* Where the Next project is located
*/
dir: process.cwd(),
/**
* Hide error messages containing server information
*/
quiet: false,
/**
* Object what you would use in next.config.js
*/
conf: {},
}).then(() => {
app.listen(3000, 'localhost', () => {
console.log('> Ready on http://localhost:3000 with Next.js!');
});
});
}
bootstrap();
@Controller()
export class AppController {
constructor(
private readonly next: NextService,
private readonly articleService: ArticleService,
) {}
@Get()
public async showHome(@Req() req: IncomingMessage, @Res() res: ServerResponse) {
const articles = await this.articleService.findAll();
const data = { articles };
await this.next.render('/index', data, req, res);
}
}
import fetch from 'isomorphic-unfetch';
const HomePage = (props) => {
const { articles } = props;
return (
<ul>
{articles.map((article, index) => (
<li key={index}>{article.title}</li>
))}
</ul>
);
};
// we must define `getInitialProps` so that the NEXT.js can generate static markups
HomePage.getInitialProps = async ({ req, query }) => {
const isServer: boolean = !!req;
let articles;
if (isServer) {
// in the NEXT.js server side, we can pass the server data
// this `query.articles` is passed from AppController
articles = query.articles;
} else {
// in the NEXT.js client side, we need to fetch the same data above
const response = await fetch('http://localhost:3000/api/articles');
articles = await response.json();
}
return {
articles,
};
};
export default HomePage;
FAQs
The Next.js integration module for NestJS
The npm package @nestpress/next receives a total of 12 weekly downloads. As such, @nestpress/next popularity was classified as not popular.
We found that @nestpress/next demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
Socket found 37 malicious PyPI wheels that abuse Python startup hooks to launch a Bun-powered credential stealer tied to Mini Shai-Hulud/Miasma.

Security News
RubyGems and Bundler 4.0.13 introduced an opt-in cooldown feature that delays newly published gems during dependency resolution.

Security News
pnpm 11.5 now recognizes npm staged publish approvals in release metadata, preventing those releases from being mistaken for lower-trust package publishes.