@fastify/fast-json-stringify-compiler
Advanced tools
Comparing version 4.2.0 to 4.3.0
{ | ||
"name": "@fastify/fast-json-stringify-compiler", | ||
"description": "Build and manage the fast-json-stringify instances for the fastify framework", | ||
"version": "4.2.0", | ||
"version": "4.3.0", | ||
"main": "index.js", | ||
@@ -12,3 +12,2 @@ "types": "types/index.d.ts", | ||
"test": "npm run unit && npm run test:typescript", | ||
"posttest": "rimraf test/fjs-generated*.js", | ||
"test:typescript": "tsd" | ||
@@ -28,12 +27,16 @@ }, | ||
"devDependencies": { | ||
"@fastify/pre-commit": "^2.0.2", | ||
"fastify": "^4.0.0", | ||
"rimraf": "^3.0.2", | ||
"sanitize-filename": "^1.6.3", | ||
"standard": "^17.0.0", | ||
"tap": "^16.0.0", | ||
"tsd": "^0.25.0" | ||
"tsd": "^0.28.0" | ||
}, | ||
"pre-commit": [ | ||
"lint", | ||
"test" | ||
], | ||
"dependencies": { | ||
"fast-json-stringify": "^5.0.0" | ||
"fast-json-stringify": "^5.7.0" | ||
} | ||
} |
@@ -11,204 +11,221 @@ 'use strict' | ||
const generatedFileNames = [] | ||
function generateFileName (routeOpts) { | ||
return `/fjs-generated-${sanitize(routeOpts.schema.$id)}-${routeOpts.method}-${routeOpts.httpPart}-${sanitize(routeOpts.url)}.js` | ||
const fileName = `/fjs-generated-${sanitize(routeOpts.schema.$id)}-${routeOpts.method}-${routeOpts.httpPart}-${sanitize(routeOpts.url)}.js` | ||
generatedFileNames.push(fileName) | ||
return fileName | ||
} | ||
t.test('errors', t => { | ||
t.plan(2) | ||
t.throws(() => { | ||
FjsStandaloneCompiler() | ||
}, 'missing restoreFunction') | ||
t.throws(() => { | ||
FjsStandaloneCompiler({ readMode: false }) | ||
}, 'missing storeFunction') | ||
}) | ||
t.test('generate standalone code', t => { | ||
t.test('standalone', t => { | ||
t.plan(5) | ||
const base = { | ||
$id: 'urn:schema:base', | ||
definitions: { | ||
hello: { type: 'string' } | ||
}, | ||
type: 'object', | ||
properties: { | ||
hello: { $ref: '#/definitions/hello' } | ||
t.teardown(async () => { | ||
for (const fileName of generatedFileNames) { | ||
try { | ||
await fs.promises.unlink(path.join(__dirname, fileName)) | ||
} catch (e) {} | ||
} | ||
} | ||
}) | ||
const refSchema = { | ||
$id: 'urn:schema:ref', | ||
type: 'object', | ||
properties: { | ||
hello: { $ref: 'urn:schema:base#/definitions/hello' } | ||
t.test('errors', t => { | ||
t.plan(2) | ||
t.throws(() => { | ||
FjsStandaloneCompiler() | ||
}, 'missing restoreFunction') | ||
t.throws(() => { | ||
FjsStandaloneCompiler({ readMode: false }) | ||
}, 'missing storeFunction') | ||
}) | ||
t.test('generate standalone code', t => { | ||
t.plan(5) | ||
const base = { | ||
$id: 'urn:schema:base', | ||
definitions: { | ||
hello: { type: 'string' } | ||
}, | ||
type: 'object', | ||
properties: { | ||
hello: { $ref: '#/definitions/hello' } | ||
} | ||
} | ||
} | ||
const endpointSchema = { | ||
schema: { | ||
$id: 'urn:schema:endpoint', | ||
$ref: 'urn:schema:ref' | ||
const refSchema = { | ||
$id: 'urn:schema:ref', | ||
type: 'object', | ||
properties: { | ||
hello: { $ref: 'urn:schema:base#/definitions/hello' } | ||
} | ||
} | ||
} | ||
const schemaMap = { | ||
[base.$id]: base, | ||
[refSchema.$id]: refSchema | ||
} | ||
const endpointSchema = { | ||
schema: { | ||
$id: 'urn:schema:endpoint', | ||
$ref: 'urn:schema:ref' | ||
} | ||
} | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: false, | ||
storeFunction (routeOpts, schemaSerializerCode) { | ||
t.same(routeOpts, endpointSchema) | ||
t.type(schemaSerializerCode, 'string') | ||
fs.writeFileSync(path.join(__dirname, '/fjs-generated.js'), schemaSerializerCode) | ||
t.pass('stored the serializer function') | ||
const schemaMap = { | ||
[base.$id]: base, | ||
[refSchema.$id]: refSchema | ||
} | ||
}) | ||
const compiler = factory(schemaMap) | ||
compiler(endpointSchema) | ||
t.pass('compiled the endpoint schema') | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: false, | ||
storeFunction (routeOpts, schemaSerializerCode) { | ||
t.same(routeOpts, endpointSchema) | ||
t.type(schemaSerializerCode, 'string') | ||
fs.writeFileSync(path.join(__dirname, '/fjs-generated.js'), schemaSerializerCode) | ||
generatedFileNames.push('/fjs-generated.js') | ||
t.pass('stored the serializer function') | ||
} | ||
}) | ||
t.test('usage standalone code', t => { | ||
t.plan(3) | ||
const standaloneSerializer = require('./fjs-generated') | ||
t.ok(standaloneSerializer) | ||
const compiler = factory(schemaMap) | ||
compiler(endpointSchema) | ||
t.pass('compiled the endpoint schema') | ||
const valid = standaloneSerializer({ hello: 'world' }) | ||
t.same(valid, JSON.stringify({ hello: 'world' })) | ||
t.test('usage standalone code', t => { | ||
t.plan(3) | ||
const standaloneSerializer = require('./fjs-generated') | ||
t.ok(standaloneSerializer) | ||
const invalid = standaloneSerializer({ hello: [] }) | ||
t.same(invalid, '{"hello":""}') | ||
const valid = standaloneSerializer({ hello: 'world' }) | ||
t.same(valid, JSON.stringify({ hello: 'world' })) | ||
const invalid = standaloneSerializer({ hello: [] }) | ||
t.same(invalid, '{"hello":""}') | ||
}) | ||
}) | ||
}) | ||
t.test('fastify integration - writeMode', async t => { | ||
t.plan(4) | ||
t.test('fastify integration - writeMode', async t => { | ||
t.plan(4) | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: false, | ||
storeFunction (routeOpts, schemaSerializationCode) { | ||
const fileName = generateFileName(routeOpts) | ||
t.ok(routeOpts) | ||
fs.writeFileSync(path.join(__dirname, fileName), schemaSerializationCode) | ||
t.pass(`stored the serializer function ${fileName}`) | ||
}, | ||
restoreFunction () { | ||
t.fail('write mode ON') | ||
} | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: false, | ||
storeFunction (routeOpts, schemaSerializationCode) { | ||
const fileName = generateFileName(routeOpts) | ||
t.ok(routeOpts) | ||
fs.writeFileSync(path.join(__dirname, fileName), schemaSerializationCode) | ||
t.pass(`stored the serializer function ${fileName}`) | ||
}, | ||
restoreFunction () { | ||
t.fail('write mode ON') | ||
} | ||
}) | ||
const app = buildApp(factory) | ||
await app.ready() | ||
}) | ||
const app = buildApp(factory) | ||
await app.ready() | ||
}) | ||
t.test('fastify integration - writeMode forces standalone', async t => { | ||
t.plan(4) | ||
t.test('fastify integration - writeMode forces standalone', async t => { | ||
t.plan(4) | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: false, | ||
storeFunction (routeOpts, schemaSerializationCode) { | ||
const fileName = generateFileName(routeOpts) | ||
t.ok(routeOpts) | ||
fs.writeFileSync(path.join(__dirname, fileName), schemaSerializationCode) | ||
t.pass(`stored the serializer function ${fileName}`) | ||
}, | ||
restoreFunction () { | ||
t.fail('write mode ON') | ||
} | ||
}) | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: false, | ||
storeFunction (routeOpts, schemaSerializationCode) { | ||
const fileName = generateFileName(routeOpts) | ||
t.ok(routeOpts) | ||
fs.writeFileSync(path.join(__dirname, fileName), schemaSerializationCode) | ||
t.pass(`stored the serializer function ${fileName}`) | ||
}, | ||
restoreFunction () { | ||
t.fail('write mode ON') | ||
} | ||
}) | ||
const app = buildApp(factory, { | ||
mode: 'not-standalone', | ||
rounding: 'ceil' | ||
}) | ||
const app = buildApp(factory, { | ||
mode: 'not-standalone', | ||
rounding: 'ceil' | ||
await app.ready() | ||
}) | ||
await app.ready() | ||
}) | ||
t.test('fastify integration - readMode', async t => { | ||
t.plan(6) | ||
t.test('fastify integration - readMode', async t => { | ||
t.plan(6) | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: true, | ||
storeFunction () { | ||
t.fail('read mode ON') | ||
}, | ||
restoreFunction (routeOpts) { | ||
const fileName = generateFileName(routeOpts) | ||
t.pass(`restore the serializer function ${fileName}}`) | ||
return require(path.join(__dirname, fileName)) | ||
} | ||
}) | ||
const factory = FjsStandaloneCompiler({ | ||
readMode: true, | ||
storeFunction () { | ||
t.fail('read mode ON') | ||
}, | ||
restoreFunction (routeOpts) { | ||
const fileName = generateFileName(routeOpts) | ||
t.pass(`restore the serializer function ${fileName}}`) | ||
return require(path.join(__dirname, fileName)) | ||
} | ||
}) | ||
const app = buildApp(factory) | ||
await app.ready() | ||
const app = buildApp(factory) | ||
await app.ready() | ||
let res = await app.inject({ | ||
url: '/foo', | ||
method: 'POST' | ||
}) | ||
t.equal(res.statusCode, 200) | ||
t.equal(res.payload, JSON.stringify({ hello: 'world' })) | ||
let res = await app.inject({ | ||
url: '/foo', | ||
method: 'POST' | ||
res = await app.inject({ | ||
url: '/bar?lang=it', | ||
method: 'GET' | ||
}) | ||
t.equal(res.statusCode, 200) | ||
t.equal(res.payload, JSON.stringify({ lang: 'en' })) | ||
}) | ||
t.equal(res.statusCode, 200) | ||
t.equal(res.payload, JSON.stringify({ hello: 'world' })) | ||
res = await app.inject({ | ||
url: '/bar?lang=it', | ||
method: 'GET' | ||
}) | ||
t.equal(res.statusCode, 200) | ||
t.equal(res.payload, JSON.stringify({ lang: 'en' })) | ||
}) | ||
function buildApp (factory, serializerOpts) { | ||
const app = fastify({ | ||
exposeHeadRoutes: false, | ||
jsonShorthand: false, | ||
schemaController: { | ||
compilersFactory: { | ||
buildSerializer: factory | ||
} | ||
}, | ||
serializerOpts | ||
}) | ||
function buildApp (factory, serializerOpts) { | ||
const app = fastify({ | ||
exposeHeadRoutes: false, | ||
jsonShorthand: false, | ||
schemaController: { | ||
compilersFactory: { | ||
buildSerializer: factory | ||
app.addSchema({ | ||
$id: 'urn:schema:foo', | ||
type: 'object', | ||
properties: { | ||
name: { type: 'string' }, | ||
id: { type: 'integer' } | ||
} | ||
}, | ||
serializerOpts | ||
}) | ||
}) | ||
app.addSchema({ | ||
$id: 'urn:schema:foo', | ||
type: 'object', | ||
properties: { | ||
name: { type: 'string' }, | ||
id: { type: 'integer' } | ||
} | ||
}) | ||
app.post('/foo', { | ||
schema: { | ||
response: { | ||
200: { | ||
$id: 'urn:schema:response', | ||
type: 'object', | ||
properties: { | ||
hello: { $ref: 'urn:schema:foo#/properties/name' } | ||
app.post('/foo', { | ||
schema: { | ||
response: { | ||
200: { | ||
$id: 'urn:schema:response', | ||
type: 'object', | ||
properties: { | ||
hello: { $ref: 'urn:schema:foo#/properties/name' } | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}, () => { return { hello: 'world' } }) | ||
}, () => { return { hello: 'world' } }) | ||
app.get('/bar', { | ||
schema: { | ||
response: { | ||
200: { | ||
$id: 'urn:schema:response:bar', | ||
type: 'object', | ||
properties: { | ||
lang: { type: 'string', enum: ['it', 'en'] } | ||
app.get('/bar', { | ||
schema: { | ||
response: { | ||
200: { | ||
$id: 'urn:schema:response:bar', | ||
type: 'object', | ||
properties: { | ||
lang: { type: 'string', enum: ['it', 'en'] } | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}, () => { return { lang: 'en' } }) | ||
}, () => { return { lang: 'en' } }) | ||
return app | ||
} | ||
return app | ||
} | ||
}) |
22748
491
Updatedfast-json-stringify@^5.7.0