fix: use createRequire for ESM, fixes #334

This commit is contained in:
Harttle
2022-04-18 00:43:17 +08:00
parent c7216c6358
commit eec381ec72
13 changed files with 89 additions and 4 deletions
+9
View File
@@ -0,0 +1,9 @@
# LiquidJS for Node.js
## Get Started
```bash
cd demo/nodejs
npm install
npm start
```
+30
View File
@@ -0,0 +1,30 @@
import { Liquid } from 'liquidjs'
const engine = new Liquid({
extname: '.liquid',
globals: { title: 'LiquidJS Demo' },
// root files for `.render()` and `.parse()`
root: process.cwd(),
// layout files for `{% layout %}`
layouts: process.cwd() + '/layouts',
// partial files for `{% include %}` and `{% render %}`
partials: process.cwd() + '/partials'
})
const ctx = {
todos: ['fork and clone', 'make it better', 'make a pull request']
}
async function main () {
console.log('==========renderFile===========')
const html = await engine.renderFile('todolist', ctx)
console.log(html)
console.log('===========Streamed===========')
const tpls = await engine.parseFile('todolist')
engine.renderToNodeStream(tpls, ctx)
.on('data', data => process.stdout.write(data))
.on('end', () => console.log(''))
}
main()
+7
View File
@@ -0,0 +1,7 @@
<html>
<head><meta name="title" content="{{title}}"></head>
<body>
{% block %}{% endblock %}
{% render "footer.liquid" %}
</body>
</html>
+13
View File
@@ -0,0 +1,13 @@
{
"name": "liquidjs-demo-nodejs",
"description": "Node.js demo for liquidjs",
"private": true,
"main": "index.mjs",
"scripts": {
"start": "node index.mjs"
},
"dependencies": {
"hello-liquid": "^1.0.0",
"liquidjs": "^9.28.3"
}
}
+1
View File
@@ -0,0 +1 @@
<small>{{title}}</small>
+1
View File
@@ -0,0 +1 @@
<li>{{index}} - {{todo}}</li>
+7
View File
@@ -0,0 +1,7 @@
{% layout 'html.liquid' %}
<h1>{% include "hello-liquid" %}</h1>
<ul>
{% for todo in todos %}
{% render 'todo.liquid' with todo, index: forloop.index%}
{% endfor %}
</ul>
+10 -1
View File
@@ -47,6 +47,11 @@ const browserStream = {
delimiters: ['', ''],
'../emitters/streamed-emitter': '../emitters/streamed-emitter-browser'
}
const esmRequire = {
include: './src/fs/node.ts',
delimiters: ['', ''],
'./node-require': './node-require.mjs'
}
const nodeCjs = {
output: [{
@@ -67,7 +72,11 @@ const nodeEsm = {
banner
}],
external: ['path', 'fs'],
plugins: [versionInjection, typescript(tsconfig)],
plugins: [
versionInjection,
replace(esmRequire),
typescript(tsconfig)
],
treeshake,
input
}
+2 -2
View File
@@ -1,10 +1,10 @@
import { stringify } from '../util/underscore'
import { Emitter } from './emitter'
import { PassThrough } from 'stream'
export class StreamedEmitter implements Emitter {
public buffer = '';
// eslint-disable-next-line @typescript-eslint/no-var-requires
public stream: NodeJS.ReadWriteStream = new (require('stream').PassThrough)()
public stream: NodeJS.ReadWriteStream = new PassThrough()
public write (html: any) {
this.stream.write(stringify(html))
}
+5
View File
@@ -0,0 +1,5 @@
import { createRequire } from 'module'
const require = createRequire(import.meta.url)
export const requireResolve = require.resolve
+1
View File
@@ -0,0 +1 @@
export declare function requireResolve(file: string): string;
+1
View File
@@ -0,0 +1 @@
export const requireResolve = require.resolve
+2 -1
View File
@@ -1,6 +1,7 @@
import * as _ from '../util/underscore'
import { sep, resolve as nodeResolve, extname, dirname as nodeDirname } from 'path'
import { stat, statSync, readFile as nodeReadFile, readFileSync as nodeReadFileSync } from 'fs'
import { requireResolve } from './node-require'
const statAsync = _.promisify(stat)
const readFileAsync = _.promisify<string, string, string>(nodeReadFile)
@@ -33,7 +34,7 @@ export function resolve (root: string, file: string, ext: string) {
}
export function fallback (file: string) {
try {
return require.resolve(file)
return requireResolve(file)
} catch (e) {}
}
export function dirname (filepath: string) {