From bb15ca3ebbe8e892cfb2c0da6375a0fc2715cd19 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 06:03:54 -0700 Subject: [PATCH 01/17] The `--save` no londer needed. https://stackoverflow.com/a/19578808/10799492 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2608203..d78e64e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ ## Installation ```bash -npm install express-edge --save +npm install express-edge ``` ## Usage From ddbce579cb0fdc30606657ff658f19e53a2ba62f Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 06:41:02 -0700 Subject: [PATCH 02/17] Updated README.md --- README.md | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index d78e64e..2f74335 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,47 @@ -# express-edge +# Edge Templating Engine for Express -> Use Edge templating engine with Express - -[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fecrmnn%2Fexpress-edge%2Fbadge%3Fref%3Dmaster&style=flat-square&label=build)](https://github.com/ecrmnn/express-edge/actions) -[![npm version](https://img.shields.io/badge/Node.js-v14%2B-green?style=flat-square)](https://github.com/ecrmnn/express-edge) -[![npm version](https://img.shields.io/npm/v/express-edge.svg?style=flat-square)](http://badge.fury.io/js/express-edge) -[![npm downloads](https://img.shields.io/npm/dm/express-edge.svg?style=flat-square)](http://badge.fury.io/js/express-edge) -[![npm license](https://img.shields.io/npm/l/express-edge.svg?style=flat-square)](http://badge.fury.io/js/express-edge) -[![prs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) -[![eslint](https://img.shields.io/badge/code_style-airbnb-blue.svg?style=flat-square)](https://github.com/airbnb/javascript) +Express Edge is an effortless solution for integrating the [Edge](https://github.com/edge-js/edge) templating engine with [Express](https://github.com/expressjs/express). Simplify your templating process and enjoy seamless compatibility. ## Installation ```bash -npm install express-edge +npm i express-edge ``` ## Usage See the [Edge documentation](https://docs.adonisjs.com/guides/views/introduction) for how to structure your templates. -Requires Node.js 14+ from `express-edge@3` +You'll need at least [Node](https://github.com/nodejs/node) v14 or higher to use Express Edge v3. -```javascript +```js const express = require('express'); -const app = express(); const engine = require('express-edge'); +const app = express(); + // Automatically sets view engine and adds dot notation to app.render app.use(engine); app.set('views', `${__dirname}/views`); -// Configure view caching -app.enable('view cache'); -// --- or --- -app.diable('view cache'); - app.get('/', (req, res) => { - res.render('users.index', { users }); + res.render('index', { greeting: 'Hello world' }); }); -app.listen(3000); +app.listen(PORT, () => { + console.log(`Listening on http://localhost:${PORT}`); +}); +``` + +`views/index.edge`: + +```html +

{{ greeting }}

``` -## License +### Configure view caching -MIT © [Daniel Eckermann](http://danieleckermann.com) +```js +app.enable('view cache'); +// app.diable('view cache'); +``` From 718c08210db55414f8d2be921861e3255418509d Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:26:00 -0700 Subject: [PATCH 03/17] Fixed LICENSE file --- LICENSE.md => LICENSE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename LICENSE.md => LICENSE (94%) diff --git a/LICENSE.md b/LICENSE similarity index 94% rename from LICENSE.md rename to LICENSE index b302eb8..efc5c87 100644 --- a/LICENSE.md +++ b/LICENSE @@ -1,6 +1,6 @@ -The MIT License (MIT) +MIT License -Copyright (c) Daniel Eckermann +Copyright (c) 2018 Daniel Eckermann Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +SOFTWARE. From f8dbc827e0ae0ee2ee3f45b7c8a8ab88718233b3 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:26:58 -0700 Subject: [PATCH 04/17] Updated .gitignore file --- .gitignore | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index fbadd14..6276d83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .idea -/node_modules -yarn.lock .vscode +/node_modules/ package-lock.json +yarn.lock +pnpm-lock.yaml From 61434cad7d22894a2601494931fe9f360fdbde49 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:30:45 -0700 Subject: [PATCH 05/17] Formatted package.json order --- package.json | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/package.json b/package.json index 9d71612..bf336c2 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "express-edge", "version": "3.0.0", "description": "Use Edge templating engine with Express", + "license": "MIT", "main": "dist/index.js", "scripts": { "pretest": "rm -rf dist && npm run transpile", @@ -10,6 +11,22 @@ "eslint": "node_modules/.bin/eslint src/ test/", "prepublishOnly": "npm run transpile" }, + "dependencies": { + "edge.js": "^5.5.1" + }, + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "body-parser": "^1.20.2", + "chai": "^4.3.7", + "eslint": "^8.38.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.27.5", + "express": "^4.18.2", + "mocha": "^10.2.0", + "supertest": "^6.3.3" + }, "repository": { "type": "git", "url": "https://github.com/ecrmnn/express-edge" @@ -19,38 +36,21 @@ "env" ] }, - "keywords": [ - "express", - "express.js", - "adonis", - "edge", - "template", - "templating" - ], "author": { "name": "Daniel Eckermann", "email": "danieleckermann@gmail.com", "url": "http://danieleckermann.com" }, - "license": "MIT", "bugs": { "url": "https://github.com/ecrmnn/express-edge/issues" }, "homepage": "https://github.com/ecrmnn/express-edge", - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-preset-env": "^1.7.0", - "body-parser": "^1.20.2", - "chai": "^4.3.7", - "eslint": "^8.38.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.27.5", - "express": "^4.18.2", - "mocha": "^10.2.0", - "supertest": "^6.3.3" - }, - "dependencies": { - "edge.js": "^5.5.1" - } + "keywords": [ + "express", + "express.js", + "adonis", + "edge", + "template", + "templating" + ] } From d8d80332e542db37cc55ef4e60993c2b062d97ba Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:31:03 -0700 Subject: [PATCH 06/17] Added new keyword --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index bf336c2..3a9313d 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "adonis", "edge", "template", - "templating" + "templating", + "engine" ] } From b819e2a0f0bfdde17485fabadcee3c76122ee529 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:38:47 -0700 Subject: [PATCH 07/17] Fixed package.json scripts --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 3a9313d..d2645b4 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "main": "dist/index.js", "scripts": { "pretest": "rm -rf dist && npm run transpile", - "test": "node_modules/.bin/mocha test/tests.js", - "transpile": "node_modules/babel-cli/bin/babel.js src --out-dir dist", - "eslint": "node_modules/.bin/eslint src/ test/", + "test": "mocha test/tests.js", + "transpile": "babel src --out-dir dist", + "eslint": "eslint src/ test/", "prepublishOnly": "npm run transpile" }, "dependencies": { From 392d6318246dd652523ae2aaf1781fd99df885bb Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:42:46 -0700 Subject: [PATCH 08/17] Added Prettier and removed .editorconfig --- .editorconfig | 10 ---------- .prettierignore | 0 .prettierrc.cjs | 5 +++++ package.json | 5 ++++- 4 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 .editorconfig create mode 100644 .prettierignore create mode 100644 .prettierrc.cjs diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 9e3a490..0000000 --- a/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true -end_of_line = lf -indent_size = 2 -indent_style = space diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..e69de29 diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..511189b --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,5 @@ +module.exports = { + semi: false, + tabWidth: 4, + arrowParens: "avoid", +} diff --git a/package.json b/package.json index d2645b4..48696a2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,9 @@ "test": "mocha test/tests.js", "transpile": "babel src --out-dir dist", "eslint": "eslint src/ test/", - "prepublishOnly": "npm run transpile" + "prepublishOnly": "npm run transpile", + "lint": "prettier --check .", + "format": "prettier --write ." }, "dependencies": { "edge.js": "^5.5.1" @@ -25,6 +27,7 @@ "eslint-plugin-import": "^2.27.5", "express": "^4.18.2", "mocha": "^10.2.0", + "prettier": "^3.0.1", "supertest": "^6.3.3" }, "repository": { From d91a292f43847f3705dc5b3ce11bb203ca890254 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 07:46:22 -0700 Subject: [PATCH 09/17] Formatted --- .eslintrc.js | 18 +-- .github/workflows/node.js.yml | 52 +++---- .prettierignore | 1 + README.md | 24 +-- package.json | 114 +++++++------- src/index.js | 78 +++++----- test/tests.js | 269 ++++++++++++++++++---------------- 7 files changed, 283 insertions(+), 273 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 011bae7..a146780 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,10 +1,10 @@ module.exports = { - extends: 'airbnb-base', - parserOptions: { - sourceType: 'script', - }, - env: { - browser: true, - node: true, - }, -}; + extends: "airbnb-base", + parserOptions: { + sourceType: "script", + }, + env: { + browser: true, + node: true, + }, +} diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 0d5e4cb..2846ea8 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -1,34 +1,34 @@ name: Express Edge CI on: - push: - branches: - - master - - 'feature/*' - - 'hotfix/*' - pull_request: - branches: [ main ] + push: + branches: + - master + - "feature/*" + - "hotfix/*" + pull_request: + branches: [main] jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - node-version: ['18', '16', '14'] + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: ["18", "16", "14"] - steps: - - name: Checkout code - uses: actions/checkout@v2 + steps: + - name: Checkout code + uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - - - name: Install Dependencies - run: npm install + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} - - name: Run Linter and Tests - run: | - npm test - npm run eslint + - name: Install Dependencies + run: npm install + + - name: Run Linter and Tests + run: | + npm test + npm run eslint diff --git a/.prettierignore b/.prettierignore index e69de29..178135c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -0,0 +1 @@ +/dist/ diff --git a/README.md b/README.md index 2f74335..687d135 100644 --- a/README.md +++ b/README.md @@ -15,33 +15,33 @@ See the [Edge documentation](https://docs.adonisjs.com/guides/views/introduction You'll need at least [Node](https://github.com/nodejs/node) v14 or higher to use Express Edge v3. ```js -const express = require('express'); -const engine = require('express-edge'); +const express = require("express") +const engine = require("express-edge") -const app = express(); +const app = express() // Automatically sets view engine and adds dot notation to app.render -app.use(engine); -app.set('views', `${__dirname}/views`); +app.use(engine) +app.set("views", `${__dirname}/views`) -app.get('/', (req, res) => { - res.render('index', { greeting: 'Hello world' }); -}); +app.get("/", (req, res) => { + res.render("index", { greeting: "Hello world" }) +}) app.listen(PORT, () => { - console.log(`Listening on http://localhost:${PORT}`); -}); + console.log(`Listening on http://localhost:${PORT}`) +}) ``` `views/index.edge`: ```html -

{{ greeting }}

+

{{ greeting }}

``` ### Configure view caching ```js -app.enable('view cache'); +app.enable("view cache") // app.diable('view cache'); ``` diff --git a/package.json b/package.json index 48696a2..ccf14e9 100644 --- a/package.json +++ b/package.json @@ -1,60 +1,60 @@ { - "name": "express-edge", - "version": "3.0.0", - "description": "Use Edge templating engine with Express", - "license": "MIT", - "main": "dist/index.js", - "scripts": { - "pretest": "rm -rf dist && npm run transpile", - "test": "mocha test/tests.js", - "transpile": "babel src --out-dir dist", - "eslint": "eslint src/ test/", - "prepublishOnly": "npm run transpile", - "lint": "prettier --check .", - "format": "prettier --write ." - }, - "dependencies": { - "edge.js": "^5.5.1" - }, - "devDependencies": { - "babel-cli": "^6.26.0", - "babel-core": "^6.26.3", - "babel-preset-env": "^1.7.0", - "body-parser": "^1.20.2", - "chai": "^4.3.7", - "eslint": "^8.38.0", - "eslint-config-airbnb-base": "^15.0.0", - "eslint-plugin-import": "^2.27.5", - "express": "^4.18.2", - "mocha": "^10.2.0", - "prettier": "^3.0.1", - "supertest": "^6.3.3" - }, - "repository": { - "type": "git", - "url": "https://github.com/ecrmnn/express-edge" - }, - "babel": { - "presets": [ - "env" + "name": "express-edge", + "version": "3.0.0", + "description": "Use Edge templating engine with Express", + "license": "MIT", + "main": "dist/index.js", + "scripts": { + "pretest": "rm -rf dist && npm run transpile", + "test": "mocha test/tests.js", + "transpile": "babel src --out-dir dist", + "eslint": "eslint src/ test/", + "prepublishOnly": "npm run transpile", + "lint": "prettier --check .", + "format": "prettier --write ." + }, + "dependencies": { + "edge.js": "^5.5.1" + }, + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "body-parser": "^1.20.2", + "chai": "^4.3.7", + "eslint": "^8.38.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-plugin-import": "^2.27.5", + "express": "^4.18.2", + "mocha": "^10.2.0", + "prettier": "^3.0.1", + "supertest": "^6.3.3" + }, + "repository": { + "type": "git", + "url": "https://github.com/ecrmnn/express-edge" + }, + "babel": { + "presets": [ + "env" + ] + }, + "author": { + "name": "Daniel Eckermann", + "email": "danieleckermann@gmail.com", + "url": "http://danieleckermann.com" + }, + "bugs": { + "url": "https://github.com/ecrmnn/express-edge/issues" + }, + "homepage": "https://github.com/ecrmnn/express-edge", + "keywords": [ + "express", + "express.js", + "adonis", + "edge", + "template", + "templating", + "engine" ] - }, - "author": { - "name": "Daniel Eckermann", - "email": "danieleckermann@gmail.com", - "url": "http://danieleckermann.com" - }, - "bugs": { - "url": "https://github.com/ecrmnn/express-edge/issues" - }, - "homepage": "https://github.com/ecrmnn/express-edge", - "keywords": [ - "express", - "express.js", - "adonis", - "edge", - "template", - "templating", - "engine" - ] } diff --git a/src/index.js b/src/index.js index 2519d54..d836325 100644 --- a/src/index.js +++ b/src/index.js @@ -1,53 +1,53 @@ -const fs = require('fs'); -const { Edge } = require('edge.js'); +const fs = require("fs") +const { Edge } = require("edge.js") const engine = (req, res, next) => { - /* - |------------------------------------------------------------------------------------------------- - | Override the app.render function so that we can use dot notation - |------------------------------------------------------------------------------------------------- - */ + /* + |------------------------------------------------------------------------------------------------- + | Override the app.render function so that we can use dot notation + |------------------------------------------------------------------------------------------------- + */ - const { render } = res; + const { render } = res - res.render = function _render(view, options, callback) { - const self = this; + res.render = function _render(view, options, callback) { + const self = this - render.call(self, view.replace(/\./gi, '/'), options, callback); - }; + render.call(self, view.replace(/\./gi, "/"), options, callback) + } - /* - |------------------------------------------------------------------------------------------------- - | Register the edge view engine - |------------------------------------------------------------------------------------------------- - */ + /* + |------------------------------------------------------------------------------------------------- + | Register the edge view engine + |------------------------------------------------------------------------------------------------- + */ - req.app.engine('edge', (filePath, options, callback) => { - const cache = req.app.settings['view cache'] || false; - req.app.settings['view cache'] = cache; + req.app.engine("edge", (filePath, options, callback) => { + const cache = req.app.settings["view cache"] || false + req.app.settings["view cache"] = cache - const edge = new Edge({ cache }); - edge.mount('default', req.app.settings.views); - const template = edge.getRenderer(); + const edge = new Edge({ cache }) + edge.mount("default", req.app.settings.views) + const template = edge.getRenderer() - fs.readFile(filePath, 'utf-8', (err, content) => { - if (err) { - return callback(err); - } + fs.readFile(filePath, "utf-8", (err, content) => { + if (err) { + return callback(err) + } - return callback(null, template.renderRawSync(content, options)); - }); - }); + return callback(null, template.renderRawSync(content, options)) + }) + }) - /* - |------------------------------------------------------------------------------------------------- - | Set the app view engine - |------------------------------------------------------------------------------------------------- - */ + /* + |------------------------------------------------------------------------------------------------- + | Set the app view engine + |------------------------------------------------------------------------------------------------- + */ - req.app.set('view engine', 'edge'); + req.app.set("view engine", "edge") - next(); -}; + next() +} -module.exports = engine; +module.exports = engine diff --git a/test/tests.js b/test/tests.js index 3f6c2c9..d4dbcd3 100644 --- a/test/tests.js +++ b/test/tests.js @@ -1,130 +1,139 @@ -const express = require('express'); -const bodyParser = require('body-parser'); - -const { describe, it, before } = require('mocha'); -const { expect } = require('chai'); -const request = require('supertest'); -const dist = require('../dist'); - -let app; - -describe('View Test Suite', () => { - before(() => { - app = express(); - - app.use(bodyParser.json()); - app.use(dist); - - app.set('views', `${__dirname}/views`); - - app.get('/hello', (req, res) => res.render('sub.hello', { name: 'John Doe' })); - app.get('/nested', (req, res) => res.render('sub.nested.hello')); - app.get('/conditionals', (req, res) => res.render('conditionals', req.body)); - app.post('/conditionals', (req, res) => res.render('conditionals', req.body)); - app.post('/iteration', (req, res) => res.render('iteration', req.body)); - app.post('/partial', (req, res) => res.render('partial', req.body)); - app.post('/cache', (req, res) => res.render('cache', req.body)); - }); - - it('should be able to render a basic view', (done) => { - request(app) - .get('/hello') - .end((err, res) => { - expect(res.text.trim()).to.eql('Hello world, John Doe'); - done(); - }); - }); - - it('should be able to render a nested basic view', (done) => { - request(app) - .get('/nested') - .end((err, res) => { - expect(res.text.trim()).to.eql('hello world'); - done(); - }); - }); - - it('should be able to render conditionals', (done) => { - request(app) - .post('/conditionals') - .send({ name: 'daniel' }) - .end((err, res) => { - expect(res.text.trim()).to.eql('hello, daniel'); - done(); - }); - }); - - it('should be able to render conditionals without data', (done) => { - request(app) - .get('/conditionals') - .end((err, res) => { - expect(res.text.trim()).to.eql('hello'); - done(); - }); - }); - - it('should be able to iterate data', (done) => { - request(app) - .post('/iteration') - .send({ - users: [{ - name: 'Daniel Eckermann', - username: 'ecrmnn', - }], - }) - .end((err, res) => { - expect(res.text.trim()).to.eql('Daniel Eckermann (ecrmnn)'); - done(); - }); - }); - - it('should be able to user partials', (done) => { - request(app) - .post('/partial') - .send({ - users: [{ - name: 'Daniel Eckermann', - username: 'ecrmnn', - }], - }) - .end((err, res) => { - expect(res.text.trim()).to.eql('Daniel Eckermann (ecrmnn)'); - done(); - }); - }); -}); - -describe('Cache Test Suite', () => { - before(() => { - app = express(); - - app.use(bodyParser.json()); - app.use(dist); - - app.set('views', `${__dirname}/views`); - - app.get('/hello', (req, res) => res.render('cache')); - }); - - it('should detect that view cache is enabled', (done) => { - app.enable('view cache'); - - request(app) - .get('/hello') - .end((err, res) => { - expect(res.text.trim()).to.eql('Cache enabled: true'); - done(); - }); - }); - - it('should detect that view cache is diabled', (done) => { - app.disable('view cache'); - - request(app) - .get('/hello') - .end((err, res) => { - expect(res.text.trim()).to.eql('Cache enabled: false'); - done(); - }); - }); -}); +const express = require("express") +const bodyParser = require("body-parser") +const { describe, it, before } = require("mocha") +const { expect } = require("chai") +const request = require("supertest") +const dist = require("../dist") + +let app + +describe("View Test Suite", () => { + before(() => { + app = express() + + app.use(bodyParser.json()) + app.use(dist) + + app.set("views", `${__dirname}/views`) + + app.get("/hello", (req, res) => + res.render("sub.hello", { name: "John Doe" }), + ) + app.get("/nested", (req, res) => res.render("sub.nested.hello")) + app.get("/conditionals", (req, res) => + res.render("conditionals", req.body), + ) + app.post("/conditionals", (req, res) => + res.render("conditionals", req.body), + ) + app.post("/iteration", (req, res) => res.render("iteration", req.body)) + app.post("/partial", (req, res) => res.render("partial", req.body)) + app.post("/cache", (req, res) => res.render("cache", req.body)) + }) + + it("should be able to render a basic view", done => { + request(app) + .get("/hello") + .end((err, res) => { + expect(res.text.trim()).to.eql("Hello world, John Doe") + done() + }) + }) + + it("should be able to render a nested basic view", done => { + request(app) + .get("/nested") + .end((err, res) => { + expect(res.text.trim()).to.eql("hello world") + done() + }) + }) + + it("should be able to render conditionals", done => { + request(app) + .post("/conditionals") + .send({ name: "daniel" }) + .end((err, res) => { + expect(res.text.trim()).to.eql("hello, daniel") + done() + }) + }) + + it("should be able to render conditionals without data", done => { + request(app) + .get("/conditionals") + .end((err, res) => { + expect(res.text.trim()).to.eql("hello") + done() + }) + }) + + it("should be able to iterate data", done => { + request(app) + .post("/iteration") + .send({ + users: [ + { + name: "Daniel Eckermann", + username: "ecrmnn", + }, + ], + }) + .end((err, res) => { + expect(res.text.trim()).to.eql("Daniel Eckermann (ecrmnn)") + done() + }) + }) + + it("should be able to user partials", done => { + request(app) + .post("/partial") + .send({ + users: [ + { + name: "Daniel Eckermann", + username: "ecrmnn", + }, + ], + }) + .end((err, res) => { + expect(res.text.trim()).to.eql("Daniel Eckermann (ecrmnn)") + done() + }) + }) +}) + +describe("Cache Test Suite", () => { + before(() => { + app = express() + + app.use(bodyParser.json()) + app.use(dist) + + app.set("views", `${__dirname}/views`) + + app.get("/hello", (req, res) => res.render("cache")) + }) + + it("should detect that view cache is enabled", done => { + app.enable("view cache") + + request(app) + .get("/hello") + .end((err, res) => { + expect(res.text.trim()).to.eql("Cache enabled: true") + done() + }) + }) + + it("should detect that view cache is diabled", done => { + app.disable("view cache") + + request(app) + .get("/hello") + .end((err, res) => { + expect(res.text.trim()).to.eql("Cache enabled: false") + done() + }) + }) +}) From 02706628be242100d73d3b03f3b4d67aa588d2d1 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 08:02:15 -0700 Subject: [PATCH 10/17] Updated tests --- test/mocha.opts | 2 +- test/tests.js | 38 +++++++++++----------- test/views/conditionals.edge | 4 +-- test/views/iteration.edge | 2 +- test/views/partials/iteration_partial.edge | 2 +- test/views/sub/hello.edge | 2 +- test/views/sub/nested/hello.edge | 2 +- 7 files changed, 26 insertions(+), 26 deletions(-) diff --git a/test/mocha.opts b/test/mocha.opts index 37b2359..2587a8c 100644 --- a/test/mocha.opts +++ b/test/mocha.opts @@ -1 +1 @@ ---timeout=5000 \ No newline at end of file +--timeout=5000 diff --git a/test/tests.js b/test/tests.js index d4dbcd3..99d6e95 100644 --- a/test/tests.js +++ b/test/tests.js @@ -3,7 +3,7 @@ const bodyParser = require("body-parser") const { describe, it, before } = require("mocha") const { expect } = require("chai") const request = require("supertest") -const dist = require("../dist") +const engine = require("../dist/index.js") let app @@ -12,14 +12,14 @@ describe("View Test Suite", () => { app = express() app.use(bodyParser.json()) - app.use(dist) + app.use(engine) app.set("views", `${__dirname}/views`) - app.get("/hello", (req, res) => + app.get("/hello", (_, res) => res.render("sub.hello", { name: "John Doe" }), ) - app.get("/nested", (req, res) => res.render("sub.nested.hello")) + app.get("/nested", (_, res) => res.render("sub.nested.hello")) app.get("/conditionals", (req, res) => res.render("conditionals", req.body), ) @@ -34,8 +34,8 @@ describe("View Test Suite", () => { it("should be able to render a basic view", done => { request(app) .get("/hello") - .end((err, res) => { - expect(res.text.trim()).to.eql("Hello world, John Doe") + .end((_, res) => { + expect(res.text.trim()).to.eql("Hello John Doe") done() }) }) @@ -43,8 +43,8 @@ describe("View Test Suite", () => { it("should be able to render a nested basic view", done => { request(app) .get("/nested") - .end((err, res) => { - expect(res.text.trim()).to.eql("hello world") + .end((_, res) => { + expect(res.text.trim()).to.eql("Hello World") done() }) }) @@ -52,9 +52,9 @@ describe("View Test Suite", () => { it("should be able to render conditionals", done => { request(app) .post("/conditionals") - .send({ name: "daniel" }) - .end((err, res) => { - expect(res.text.trim()).to.eql("hello, daniel") + .send({ name: "Daniel" }) + .end((_, res) => { + expect(res.text.trim()).to.eql("Hello Daniel") done() }) }) @@ -62,8 +62,8 @@ describe("View Test Suite", () => { it("should be able to render conditionals without data", done => { request(app) .get("/conditionals") - .end((err, res) => { - expect(res.text.trim()).to.eql("hello") + .end((_, res) => { + expect(res.text.trim()).to.eql("Hello") done() }) }) @@ -79,7 +79,7 @@ describe("View Test Suite", () => { }, ], }) - .end((err, res) => { + .end((_, res) => { expect(res.text.trim()).to.eql("Daniel Eckermann (ecrmnn)") done() }) @@ -96,7 +96,7 @@ describe("View Test Suite", () => { }, ], }) - .end((err, res) => { + .end((_, res) => { expect(res.text.trim()).to.eql("Daniel Eckermann (ecrmnn)") done() }) @@ -108,11 +108,11 @@ describe("Cache Test Suite", () => { app = express() app.use(bodyParser.json()) - app.use(dist) + app.use(engine) app.set("views", `${__dirname}/views`) - app.get("/hello", (req, res) => res.render("cache")) + app.get("/hello", (_, res) => res.render("cache")) }) it("should detect that view cache is enabled", done => { @@ -120,7 +120,7 @@ describe("Cache Test Suite", () => { request(app) .get("/hello") - .end((err, res) => { + .end((_, res) => { expect(res.text.trim()).to.eql("Cache enabled: true") done() }) @@ -131,7 +131,7 @@ describe("Cache Test Suite", () => { request(app) .get("/hello") - .end((err, res) => { + .end((_, res) => { expect(res.text.trim()).to.eql("Cache enabled: false") done() }) diff --git a/test/views/conditionals.edge b/test/views/conditionals.edge index b356a48..82aec62 100644 --- a/test/views/conditionals.edge +++ b/test/views/conditionals.edge @@ -1,5 +1,5 @@ @if(name) - hello, {{ name }} + Hello {{ name }} @else - hello + Hello @endif diff --git a/test/views/iteration.edge b/test/views/iteration.edge index f2fef9d..91b6a3b 100644 --- a/test/views/iteration.edge +++ b/test/views/iteration.edge @@ -1,3 +1,3 @@ @each(user in users) -{{ user.name }} ({{ user.username }}) + {{ user.name }} ({{ user.username }}) @endeach diff --git a/test/views/partials/iteration_partial.edge b/test/views/partials/iteration_partial.edge index f2fef9d..91b6a3b 100644 --- a/test/views/partials/iteration_partial.edge +++ b/test/views/partials/iteration_partial.edge @@ -1,3 +1,3 @@ @each(user in users) -{{ user.name }} ({{ user.username }}) + {{ user.name }} ({{ user.username }}) @endeach diff --git a/test/views/sub/hello.edge b/test/views/sub/hello.edge index fc0d397..cd775cb 100644 --- a/test/views/sub/hello.edge +++ b/test/views/sub/hello.edge @@ -1 +1 @@ -Hello world, {{ name }} +Hello {{ name }} diff --git a/test/views/sub/nested/hello.edge b/test/views/sub/nested/hello.edge index 3b18e51..557db03 100644 --- a/test/views/sub/nested/hello.edge +++ b/test/views/sub/nested/hello.edge @@ -1 +1 @@ -hello world +Hello World From abddfc2cd3ec97fd53acf3a29a4ddfabc2a75424 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 08:08:21 -0700 Subject: [PATCH 11/17] Formatted --- test/tests.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/tests.js b/test/tests.js index 99d6e95..4ca64c9 100644 --- a/test/tests.js +++ b/test/tests.js @@ -10,10 +10,8 @@ let app describe("View Test Suite", () => { before(() => { app = express() - app.use(bodyParser.json()) app.use(engine) - app.set("views", `${__dirname}/views`) app.get("/hello", (_, res) => From aa7952d4c55f6e1cea41a789851344b314501787 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 08:15:15 -0700 Subject: [PATCH 12/17] Added /dist/ to .gitignore --- .gitignore | 1 + README.md | 4 ++++ dist/index.js | 58 --------------------------------------------------- 3 files changed, 5 insertions(+), 58 deletions(-) delete mode 100644 dist/index.js diff --git a/.gitignore b/.gitignore index 6276d83..5dbed20 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .idea .vscode /node_modules/ +/dist/ package-lock.json yarn.lock pnpm-lock.yaml diff --git a/README.md b/README.md index 687d135..842263a 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,7 @@ app.listen(PORT, () => { app.enable("view cache") // app.diable('view cache'); ``` + +## Development + +Run `npm transpile` to build the `./dist` folder. diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 33f50fb..0000000 --- a/dist/index.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -var fs = require('fs'); - -var _require = require('edge.js'), - Edge = _require.Edge; - -var engine = function engine(req, res, next) { - /* - |------------------------------------------------------------------------------------------------- - | Override the app.render function so that we can use dot notation - |------------------------------------------------------------------------------------------------- - */ - - var render = res.render; - - - res.render = function _render(view, options, callback) { - var self = this; - - render.call(self, view.replace(/\./gi, '/'), options, callback); - }; - - /* - |------------------------------------------------------------------------------------------------- - | Register the edge view engine - |------------------------------------------------------------------------------------------------- - */ - - req.app.engine('edge', function (filePath, options, callback) { - var cache = req.app.settings['view cache'] || false; - req.app.settings['view cache'] = cache; - - var edge = new Edge({ cache: cache }); - edge.mount('default', req.app.settings.views); - var template = edge.getRenderer(); - - fs.readFile(filePath, 'utf-8', function (err, content) { - if (err) { - return callback(err); - } - - return callback(null, template.renderRawSync(content, options)); - }); - }); - - /* - |------------------------------------------------------------------------------------------------- - | Set the app view engine - |------------------------------------------------------------------------------------------------- - */ - - req.app.set('view engine', 'edge'); - - next(); -}; - -module.exports = engine; \ No newline at end of file From 2183d01510a6067fd7ee2efda99f1720bbc97441 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 08:46:08 -0700 Subject: [PATCH 13/17] More readable code :) --- .github/workflows/node.js.yml | 2 +- CHANGELOG.md | 5 +++++ README.md | 2 +- src/index.js | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 CHANGELOG.md diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 2846ea8..1f633f1 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: ["18", "16", "14"] + node-version: ["18", "16"] steps: - name: Checkout code diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ccece31 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# CHANGELOG + +## v3.0.0+ + +- Dropped Node v14 support. diff --git a/README.md b/README.md index 842263a..6f845e2 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ npm i express-edge See the [Edge documentation](https://docs.adonisjs.com/guides/views/introduction) for how to structure your templates. -You'll need at least [Node](https://github.com/nodejs/node) v14 or higher to use Express Edge v3. +You'll need at least [Node](https://github.com/nodejs/node) v15 or higher to use Express Edge v3. ```js const express = require("express") diff --git a/src/index.js b/src/index.js index d836325..038f8bd 100644 --- a/src/index.js +++ b/src/index.js @@ -13,7 +13,7 @@ const engine = (req, res, next) => { res.render = function _render(view, options, callback) { const self = this - render.call(self, view.replace(/\./gi, "/"), options, callback) + render.call(self, view.replaceAll(".", "/"), options, callback) } /* From 2bb5f67c7378168989b7f732038f3b965de785ae Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 08:48:13 -0700 Subject: [PATCH 14/17] Formatted --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccece31..2840e6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,4 +2,4 @@ ## v3.0.0+ -- Dropped Node v14 support. +- Dropped Node v14 support. From 421c7db564a952ff5bd725ca5e65e988a119a2ac Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 08:54:43 -0700 Subject: [PATCH 15/17] Updated old dot syntax of view files to new slash syntax in tests --- test/tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/tests.js b/test/tests.js index 4ca64c9..8588296 100644 --- a/test/tests.js +++ b/test/tests.js @@ -15,9 +15,9 @@ describe("View Test Suite", () => { app.set("views", `${__dirname}/views`) app.get("/hello", (_, res) => - res.render("sub.hello", { name: "John Doe" }), + res.render("sub/hello", { name: "John Doe" }), ) - app.get("/nested", (_, res) => res.render("sub.nested.hello")) + app.get("/nested", (_, res) => res.render("sub/nested/hello")) app.get("/conditionals", (req, res) => res.render("conditionals", req.body), ) From 4c5e56261c96f848ab598c6221f0918302482a32 Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 09:01:32 -0700 Subject: [PATCH 16/17] Added min supported node version (v15) to package.json --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index ccf14e9..c83b755 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,9 @@ "prettier": "^3.0.1", "supertest": "^6.3.3" }, + "engines": { + "node": ">=15" + }, "repository": { "type": "git", "url": "https://github.com/ecrmnn/express-edge" From ef4f2096b984baafb1aacf8563b329cc626055fa Mon Sep 17 00:00:00 2001 From: babakfp Date: Mon, 14 Aug 2023 14:35:47 -0700 Subject: [PATCH 17/17] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f845e2..4889a8b 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ app.listen(PORT, () => { ```js app.enable("view cache") -// app.diable('view cache'); +// app.disable('view cache'); ``` ## Development