@sum.cumo/nuxt-custom-route-folder
Advanced tools
| import { expectWatch, reset } from 'chokidar' | ||
| import { EventEmitter } from 'events' | ||
| import createCustomRoutesFromFolder from '../src' | ||
| import getRoutes from '../src/getRoutes' | ||
| function wait(s) { | ||
| return new Promise((resolve) => { | ||
| setTimeout(resolve, s) | ||
| }) | ||
| } | ||
| describe('createCustomRoutesFromFolder', () => { | ||
| let fakeNuxt = null | ||
| const srcDir = '<virtual>' | ||
| let extendRoutes = null | ||
| let emitter = null | ||
| let watchMock = null | ||
| let builder = null | ||
| beforeEach(() => { | ||
| emitter = new EventEmitter() | ||
| emitter.close = jest.fn() | ||
| watchMock = jest.fn(() => emitter) | ||
| builder = { | ||
| generateRoutesAndFiles: jest.fn(), | ||
| } | ||
| extendRoutes = null | ||
| fakeNuxt = { | ||
| hook(name, cb) { | ||
| if (name === 'build:extendRoutes') { | ||
| extendRoutes = cb | ||
| } else if (name === 'build:done') { | ||
| cb(builder) | ||
| } | ||
| }, | ||
| options: { | ||
| srcDir, | ||
| dev: false, | ||
| }, | ||
| } | ||
| }) | ||
| afterEach(() => { | ||
| delete getRoutes.cache | ||
| reset() | ||
| }) | ||
| it('adds routes to nuxt, based on files in folder', async () => { | ||
| expectWatch(`${srcDir}/**`, watchMock) | ||
| const promise = createCustomRoutesFromFolder({ | ||
| nuxt: fakeNuxt, | ||
| glob: `${srcDir}/*.js`, | ||
| }) | ||
| emitter.emit('add', `${srcDir}/foo.js`) | ||
| emitter.emit('ready') | ||
| await promise | ||
| const routes = [] | ||
| extendRoutes(routes) | ||
| expect(routes.length).toBe(1) | ||
| expect(routes[0]).toEqual({ | ||
| path: '/foo', | ||
| priority: 0, | ||
| component: '<virtual>/foo.js', | ||
| meta: {}, | ||
| chunkName: '_crf/foo', | ||
| name: 'foo', | ||
| }) | ||
| }) | ||
| it('removes routes when file is unlinked', async () => { | ||
| expectWatch(`${srcDir}/**`, watchMock) | ||
| const { ready$ } = createCustomRoutesFromFolder({ | ||
| nuxt: { | ||
| ...fakeNuxt, | ||
| options: { | ||
| ...fakeNuxt.options, | ||
| dev: true, | ||
| }, | ||
| }, | ||
| glob: `${srcDir}/*.js`, | ||
| }) | ||
| const ready = new Promise((resolve, reject) => { | ||
| ready$.subscribe({ next: resolve, error: reject }) | ||
| }) | ||
| emitter.emit('add', `${srcDir}/foo.js`) | ||
| emitter.emit('ready') | ||
| await ready | ||
| await wait(1) | ||
| const routes = [] | ||
| extendRoutes(routes) | ||
| expect(routes.length).toBe(1) | ||
| emitter.emit('unlink', `${srcDir}/foo.js`) | ||
| await wait(100) | ||
| extendRoutes(routes) | ||
| expect(routes.length).toBe(0) | ||
| }) | ||
| }) |
+11
-0
| # Changelog @sum.cumo/nuxt-custom-route-folder | ||
| ## Version 2.1.1 | ||
| ### 🐞 Bug Fixes | ||
| → **ensure fs events called after ready are not buffered forever** | ||
| ### 🔨 Refactorings | ||
| → **resolve initial promise on complete** | ||
| ## Version 2.1.0 | ||
@@ -4,0 +15,0 @@ |
@@ -203,5 +203,7 @@ 'use strict'; | ||
| var ready$ = watch$.pipe(readyFilter, (0, _operators.delay)(1)); | ||
| var rdy = false; | ||
| var ready$$ = _rxjs.Observable.create(function (obs) { | ||
| var sub = ready$.subscribe({ | ||
| next: function next() { | ||
| rdy = true; | ||
| obs.complete(); | ||
@@ -212,5 +214,6 @@ sub.unsubscribe(); | ||
| }); | ||
| var throttle = (0, _rxjs.interval)(100); | ||
| var fs$ = watch$.pipe((0, _operators.bufferWhen)(function () { | ||
| return ready$$; | ||
| return !rdy ? ready$$ : throttle; | ||
| }), (0, _operators.take)(Infinity), (0, _operators.concatMap)(function (messages) { | ||
@@ -238,5 +241,5 @@ return Promise.all(messages.map(processFileMsg)); | ||
| return new Promise(function (resolve, reject) { | ||
| var promise = new Promise(function (resolve, reject) { | ||
| var sub = fs$.pipe(readyFilter, (0, _operators.delay)(2)).subscribe({ | ||
| next: function next() { | ||
| complete: function complete() { | ||
| resolve(); | ||
@@ -249,2 +252,6 @@ sub.unsubscribe(); | ||
| }); | ||
| promise.ready$ = ready$; | ||
| return promise; | ||
| } | ||
@@ -251,0 +258,0 @@ |
+2
-1
@@ -6,2 +6,3 @@ 'use strict'; | ||
| }); | ||
| exports.cache = undefined; | ||
| exports.default = observe; | ||
@@ -23,3 +24,3 @@ | ||
| var cache = {}; | ||
| var cache = exports.cache = {}; | ||
@@ -26,0 +27,0 @@ function observe(srcDir, watch) { |
+1
-1
| { | ||
| "name": "@sum.cumo/nuxt-custom-route-folder", | ||
| "version": "2.1.0", | ||
| "version": "2.1.1", | ||
| "main": "index.js", | ||
@@ -5,0 +5,0 @@ "scripts": { |
| import path from 'path' | ||
| import kebabCase from 'lodash.kebabcase' | ||
| import { Observable } from 'rxjs' | ||
| import { Observable, interval } from 'rxjs' | ||
| import minimatch from 'minimatch' | ||
@@ -84,5 +84,7 @@ import { | ||
| const ready$ = watch$.pipe(readyFilter, delay(1)) | ||
| let rdy = false | ||
| const ready$$ = Observable.create((obs) => { | ||
| const sub = ready$.subscribe({ | ||
| next() { | ||
| rdy = true | ||
| obs.complete() | ||
@@ -93,5 +95,6 @@ sub.unsubscribe() | ||
| }) | ||
| const throttle = interval(100) | ||
| const fs$ = watch$.pipe( | ||
| bufferWhen(() => ready$$), | ||
| bufferWhen(() => (!rdy ? ready$$ : throttle)), | ||
| take(Infinity), | ||
@@ -113,5 +116,5 @@ concatMap((messages) => Promise.all(messages.map(processFileMsg))), | ||
| return new Promise((resolve, reject) => { | ||
| const promise = new Promise((resolve, reject) => { | ||
| const sub = fs$.pipe(readyFilter, delay(2)).subscribe({ | ||
| next() { | ||
| complete() { | ||
| resolve() | ||
@@ -123,2 +126,6 @@ sub.unsubscribe() | ||
| }) | ||
| promise.ready$ = ready$ | ||
| return promise | ||
| } | ||
@@ -125,0 +132,0 @@ |
+1
-1
@@ -5,3 +5,3 @@ import * as path from 'path' | ||
| const cache = {} | ||
| export const cache = {} | ||
@@ -8,0 +8,0 @@ export default function observe(srcDir, watch) { |
| 'use strict'; | ||
| Object.defineProperty(exports, "__esModule", { | ||
| value: true | ||
| }); | ||
| exports.tmpDir = exports.CHUNK_PREFIX = undefined; | ||
| exports.readFile = readFile; | ||
| exports.writeFile = writeFile; | ||
| var _path = require('path'); | ||
| var path = _interopRequireWildcard(_path); | ||
| var _fs = require('fs'); | ||
| var fs = _interopRequireWildcard(_fs); | ||
| function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } | ||
| var CHUNK_PREFIX = exports.CHUNK_PREFIX = '_crf'; | ||
| var tmpDir = exports.tmpDir = path.resolve(__dirname, '..', '.tmp'); | ||
| try { | ||
| fs.mkdirSync(tmpDir); | ||
| } catch (e) { | ||
| /* noop */ | ||
| } | ||
| function readFile(file) { | ||
| return new Promise(function (resolve, reject) { | ||
| fs.readFile(file, function (err, contents) { | ||
| return err ? reject(err) : resolve(contents); | ||
| }); | ||
| }); | ||
| } | ||
| function writeFile(file, contents) { | ||
| return new Promise(function (resolve, reject) { | ||
| fs.writeFile(file, contents, function (err) { | ||
| return err ? reject(err) : resolve(file); | ||
| }); | ||
| }); | ||
| } |
Sorry, the diff of this file is too big to display
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
685
11.38%1
-50%28407
-91.62%15
-6.25%