Skip to content

Commit 25d9abb

Browse files
authoredJan 20, 2021
fix: restore customFileHandlers provider (#3624)
The removal of `customFileHandlers` turned out to be more disruptive change than anticipated as this provider is still used by several popular plugins: #3619, codymikol/karma-webpack#462, angular/angular-cli#19815. Hence we restore the provider and print a deprecation warning to make upgrading easier. This should give more time for the plugin authors to release new versions and users to adopt these versions.
1 parent 07edde4 commit 25d9abb

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed
 

‎lib/server.js

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class Server extends KarmaEventEmitter {
8282
filesPromise: ['factory', createFilesPromise],
8383
socketServer: ['factory', createSocketIoServer],
8484
executor: ['factory', Executor.factory],
85+
// TODO: Deprecated. Remove in the next major
86+
customFileHandlers: ['value', []],
8587
reporter: ['factory', reporter.createReporters],
8688
capturedBrowsers: ['factory', BrowserCollection.factory],
8789
args: ['value', {}],

‎lib/web-server.js

+21
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,25 @@ const proxyMiddleware = require('./middleware/proxy')
1616

1717
const log = require('./logger').create('web-server')
1818

19+
function createCustomHandler (customFileHandlers, config) {
20+
let warningDone = false
21+
22+
return function (request, response, next) {
23+
const handler = customFileHandlers.find((handler) => handler.urlRegex.test(request.url))
24+
25+
if (customFileHandlers.length > 0 && !warningDone) {
26+
warningDone = true
27+
log.warn('The `customFileHandlers` is deprecated and will be removed in Karma 7. Please upgrade plugins relying on this provider.')
28+
}
29+
30+
return handler
31+
? handler.handler(request, response, 'fake/static', 'fake/adapter', config.basePath, 'fake/root')
32+
: next()
33+
}
34+
}
35+
36+
createCustomHandler.$inject = ['customFileHandlers', 'config']
37+
1938
function createFilesPromise (emitter, fileList) {
2039
// Set an empty list of files to avoid race issues with
2140
// file_list_modified not having been emitted yet
@@ -58,6 +77,8 @@ function createWebServer (injector, config) {
5877
handler.use(injector.invoke(sourceFilesMiddleware.create))
5978
// TODO(vojta): extract the proxy into a plugin
6079
handler.use(proxyMiddlewareInstance)
80+
// TODO: Deprecated. Remove in the next major
81+
handler.use(injector.invoke(createCustomHandler))
6182

6283
if (config.middleware) {
6384
config.middleware.forEach((middleware) => handler.use(injector.get('middleware:' + middleware)))

‎test/unit/web-server.spec.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe('web-server', () => {
3131
// NOTE(vojta): only loading once, to speed things up
3232
// this relies on the fact that none of these tests mutate fs
3333
const m = mocks.loadFile(path.join(__dirname, '/../../lib/web-server.js'), _mocks, _globals)
34-
server = emitter = null
34+
let customFileHandlers = server = emitter = null
3535
let beforeMiddlewareActive = false
3636
let middlewareActive = false
3737
const servedFiles = (files) => {
@@ -40,6 +40,7 @@ describe('web-server', () => {
4040

4141
describe('request', () => {
4242
beforeEach(() => {
43+
customFileHandlers = []
4344
emitter = new EventEmitter()
4445
const config = {
4546
basePath: '/base/path',
@@ -56,6 +57,7 @@ describe('web-server', () => {
5657

5758
const injector = new di.Injector([{
5859
config: ['value', config],
60+
customFileHandlers: ['value', customFileHandlers],
5961
emitter: ['value', emitter],
6062
fileList: ['value', { files: { served: [], included: [] } }],
6163
filesPromise: ['factory', m.createFilesPromise],
@@ -180,6 +182,22 @@ describe('web-server', () => {
180182
})
181183
})
182184

185+
it('should load custom handlers', () => {
186+
servedFiles(new Set())
187+
188+
customFileHandlers.push({
189+
urlRegex: /\/some\/weird/,
190+
handler (request, response, staticFolder, adapterFolder, baseFolder, urlRoot) {
191+
response.writeHead(222)
192+
response.end('CONTENT')
193+
}
194+
})
195+
196+
return request(server)
197+
.get('/some/weird/url')
198+
.expect(222, 'CONTENT')
199+
})
200+
183201
it('should serve 404 for non-existing files', () => {
184202
servedFiles(new Set())
185203

@@ -196,6 +214,7 @@ describe('web-server', () => {
196214
cert: fs.readFileSync(path.join(__dirname, '/certificates/server.crt'))
197215
}
198216

217+
customFileHandlers = []
199218
emitter = new EventEmitter()
200219

201220
const injector = new di.Injector([{
@@ -206,6 +225,7 @@ describe('web-server', () => {
206225
httpsServerOptions: credentials,
207226
client: { useIframe: true, useSingleWindow: false }
208227
}],
228+
customFileHandlers: ['value', customFileHandlers],
209229
emitter: ['value', emitter],
210230
fileList: ['value', { files: { served: [], included: [] } }],
211231
filesPromise: ['factory', m.createFilesPromise],
@@ -244,10 +264,12 @@ describe('web-server', () => {
244264
cert: fs.readFileSync(path.join(__dirname, '/certificates/server.crt'))
245265
}
246266

267+
customFileHandlers = []
247268
emitter = new EventEmitter()
248269

249270
const injector = new di.Injector([{
250271
config: ['value', { basePath: '/base/path', urlRoot: '/', httpModule: http2, protocol: 'https:', httpsServerOptions: credentials }],
272+
customFileHandlers: ['value', customFileHandlers],
251273
emitter: ['value', emitter],
252274
fileList: ['value', { files: { served: [], included: [] } }],
253275
filesPromise: ['factory', m.createFilesPromise],

0 commit comments

Comments
 (0)
Please sign in to comment.