@platformatic/sql-json-schema-mapper 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nyc_output/a0385d3d-c62c-4056-92a6-48cf62f05a7f.json +1 -0
- package/.nyc_output/{76b1971d-7952-4989-937a-bbcfb97dbb15.json → b625cf51-4079-4c0f-99b8-51a25ab89546.json} +0 -0
- package/.nyc_output/processinfo/{55d1bd19-dcb4-4d28-b56a-deb3f6a0292e.json → a0385d3d-c62c-4056-92a6-48cf62f05a7f.json} +1 -1
- package/.nyc_output/processinfo/b625cf51-4079-4c0f-99b8-51a25ab89546.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/index.js +4 -1
- package/package.json +4 -4
- package/test/helper.js +5 -0
- package/test/simple.test.js +60 -0
- package/.nyc_output/55d1bd19-dcb4-4d28-b56a-deb3f6a0292e.json +0 -1
- package/.nyc_output/processinfo/76b1971d-7952-4989-937a-bbcfb97dbb15.json +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js":{"path":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js","statementMap":{"0":{"start":{"line":61,"column":17},"end":{"line":61,"column":30}},"1":{"start":{"line":62,"column":21},"end":{"line":62,"column":23}},"2":{"start":{"line":63,"column":19},"end":{"line":63,"column":21}},"3":{"start":{"line":64,"column":2},"end":{"line":93,"column":3}},"4":{"start":{"line":65,"column":18},"end":{"line":65,"column":30}},"5":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"6":{"start":{"line":67,"column":6},"end":{"line":67,"column":14}},"7":{"start":{"line":69,"column":17},"end":{"line":69,"column":55}},"8":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"9":{"start":{"line":80,"column":6},"end":{"line":80,"column":49}},"10":{"start":{"line":82,"column":4},"end":{"line":85,"column":5}},"11":{"start":{"line":84,"column":6},"end":{"line":84,"column":36}},"12":{"start":{"line":86,"column":4},"end":{"line":88,"column":5}},"13":{"start":{"line":87,"column":6},"end":{"line":87,"column":49}},"14":{"start":{"line":94,"column":2},"end":{"line":101,"column":3}},"15":{"start":{"line":104,"column":0},"end":{"line":104,"column":70}}},"fnMap":{"0":{"name":"mapSQLTypeToOpenAPIType","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":43},"end":{"line":58,"column":1}},"line":3},"1":{"name":"mapSQLEntityToJSONSchema","decl":{"start":{"line":60,"column":9},"end":{"line":60,"column":33}},"loc":{"start":{"line":60,"column":56},"end":{"line":102,"column":1}},"line":60}},"branchMap":{"0":{"loc":{"start":{"line":60,"column":43},"end":{"line":60,"column":54}},"type":"default-arg","locations":[{"start":{"line":60,"column":52},"end":{"line":60,"column":54}}],"line":60},"1":{"loc":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},{"start":{"line":66,"column":4},"end":{"line":68,"column":5}}],"line":66},"2":{"loc":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},{"start":{"line":79,"column":4},"end":{"line":81,"column":5}}],"line":79},"3":{"loc":{"start":{"line":82,"column":4},"end":{"line":85,"column":5}},"type":"if","locations":[{"start":{"line":82,"column":4},"end":{"line":85,"column":5}},{"start":{"line":82,"column":4},"end":{"line":85,"column":5}}],"line":82},"4":{"loc":{"start":{"line":82,"column":8},"end":{"line":82,"column":46}},"type":"binary-expr","locations":[{"start":{"line":82,"column":8},"end":{"line":82,"column":25}},{"start":{"line":82,"column":29},"end":{"line":82,"column":46}}],"line":82},"5":{"loc":{"start":{"line":86,"column":4},"end":{"line":88,"column":5}},"type":"if","locations":[{"start":{"line":86,"column":4},"end":{"line":88,"column":5}},{"start":{"line":86,"column":4},"end":{"line":88,"column":5}}],"line":86}},"s":{"0":3,"1":3,"2":3,"3":3,"4":14,"5":14,"6":1,"7":13,"8":13,"9":9,"10":13,"11":1,"12":13,"13":2,"14":3,"15":1},"f":{"0":13,"1":3},"b":{"0":[2],"1":[1,13],"2":[9,4],"3":[1,12],"4":[13,4],"5":[2,11]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"284e546175bd83507ccd71fa0ea93a70ff90609e","contentHash":"b7d924a408dfc48b6904e3509efac7c9085b8a656692f90ffcc8c3680fc2e2f9"}}
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"parent":"
|
|
1
|
+
{"parent":"b625cf51-4079-4c0f-99b8-51a25ab89546","pid":75316,"argv":["/Users/matteo/.nvm/versions/node/v16.17.0/bin/node","/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/test/simple.test.js"],"execArgv":[],"cwd":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper","time":1671749768662,"ppid":75315,"coverageFilename":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/.nyc_output/a0385d3d-c62c-4056-92a6-48cf62f05a7f.json","externalId":"test/simple.test.js","uuid":"a0385d3d-c62c-4056-92a6-48cf62f05a7f","files":["/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"parent":null,"pid":75315,"argv":["/Users/matteo/.nvm/versions/node/v16.17.0/bin/node","/Users/matteo/Repositories/platformatic/node_modules/.pnpm/tap@16.3.2/node_modules/tap/bin/run.js","test/simple.test.js"],"execArgv":[],"cwd":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper","time":1671749768257,"ppid":75308,"coverageFilename":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/.nyc_output/b625cf51-4079-4c0f-99b8-51a25ab89546.json","externalId":"","uuid":"b625cf51-4079-4c0f-99b8-51a25ab89546","files":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"processes":{"
|
|
1
|
+
{"processes":{"a0385d3d-c62c-4056-92a6-48cf62f05a7f":{"parent":"b625cf51-4079-4c0f-99b8-51a25ab89546","externalId":"test/simple.test.js","children":[]},"b625cf51-4079-4c0f-99b8-51a25ab89546":{"parent":null,"children":["a0385d3d-c62c-4056-92a6-48cf62f05a7f"]}},"files":{"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js":["a0385d3d-c62c-4056-92a6-48cf62f05a7f"]},"externalIds":{"test/simple.test.js":{"root":"a0385d3d-c62c-4056-92a6-48cf62f05a7f","children":[]}}}
|
package/index.js
CHANGED
|
@@ -13,7 +13,7 @@ function mapSQLTypeToOpenAPIType (sqlType) {
|
|
|
13
13
|
case 'smallint':
|
|
14
14
|
return 'integer'
|
|
15
15
|
case 'decimal':
|
|
16
|
-
return '
|
|
16
|
+
return 'number'
|
|
17
17
|
case 'bigint':
|
|
18
18
|
return 'string'
|
|
19
19
|
case 'int2':
|
|
@@ -83,6 +83,9 @@ function mapSQLEntityToJSONSchema (entity, ignore = {}) {
|
|
|
83
83
|
// we skip the primary key for creation
|
|
84
84
|
required.push(field.camelcase)
|
|
85
85
|
}
|
|
86
|
+
if (field.isGenerated) {
|
|
87
|
+
properties[field.camelcase].readOnly = true
|
|
88
|
+
}
|
|
86
89
|
/* istanbul ignore next */
|
|
87
90
|
if (field.enum) {
|
|
88
91
|
properties[field.camelcase].enum = field.enum
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platformatic/sql-json-schema-mapper",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Map SQL entity to JSON schema",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": {
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
},
|
|
15
15
|
"homepage": "https://github.com/platformatic/platformatic#readme",
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"fastify": "^4.
|
|
17
|
+
"fastify": "^4.10.2",
|
|
18
18
|
"snazzy": "^9.0.0",
|
|
19
19
|
"standard": "^17.0.0",
|
|
20
|
-
"tap": "^16.
|
|
21
|
-
"@platformatic/sql-mapper": "0.
|
|
20
|
+
"tap": "^16.3.2",
|
|
21
|
+
"@platformatic/sql-mapper": "0.12.0"
|
|
22
22
|
},
|
|
23
23
|
"scripts": {
|
|
24
24
|
"lint": "standard",
|
package/test/helper.js
CHANGED
package/test/simple.test.js
CHANGED
|
@@ -13,6 +13,7 @@ async function createBasicPages (db, sql) {
|
|
|
13
13
|
id INTEGER PRIMARY KEY,
|
|
14
14
|
title VARCHAR(42) NOT NULL,
|
|
15
15
|
metadata JSON,
|
|
16
|
+
section NUMERIC,
|
|
16
17
|
description TEXT
|
|
17
18
|
);`)
|
|
18
19
|
} else if (isPg) {
|
|
@@ -21,6 +22,7 @@ async function createBasicPages (db, sql) {
|
|
|
21
22
|
id SERIAL PRIMARY KEY,
|
|
22
23
|
title VARCHAR(42) NOT NULL,
|
|
23
24
|
metadata JSON,
|
|
25
|
+
section NUMERIC,
|
|
24
26
|
description TEXT,
|
|
25
27
|
type pagetype
|
|
26
28
|
);`)
|
|
@@ -29,12 +31,38 @@ async function createBasicPages (db, sql) {
|
|
|
29
31
|
id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
30
32
|
title VARCHAR(42) NOT NULL,
|
|
31
33
|
metadata JSON,
|
|
34
|
+
section NUMERIC,
|
|
32
35
|
description TEXT,
|
|
33
36
|
type ENUM ('blank', 'non-blank')
|
|
34
37
|
);`)
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
|
|
41
|
+
async function createBasicGeneratedTests (db, sql) {
|
|
42
|
+
if (isSQLite) {
|
|
43
|
+
await db.query(sql`CREATE TABLE generated_test (
|
|
44
|
+
id INTEGER PRIMARY KEY,
|
|
45
|
+
test INTEGER,
|
|
46
|
+
test_stored INTEGER GENERATED ALWAYS AS (test*2) STORED,
|
|
47
|
+
test_virtual INTEGER GENERATED ALWAYS AS (test*4) VIRTUAL
|
|
48
|
+
);`)
|
|
49
|
+
} else if (isPg) {
|
|
50
|
+
await db.query(sql`CREATE TABLE generated_test (
|
|
51
|
+
id SERIAL PRIMARY KEY,
|
|
52
|
+
test INTEGER,
|
|
53
|
+
test_stored INTEGER GENERATED ALWAYS AS (test*2) STORED
|
|
54
|
+
);`)
|
|
55
|
+
} else {
|
|
56
|
+
await db.query(sql`CREATE TABLE generated_test (
|
|
57
|
+
id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
58
|
+
test INTEGER,
|
|
59
|
+
test_stored INTEGER GENERATED ALWAYS AS (test*2) STORED,
|
|
60
|
+
test_virtual INTEGER GENERATED ALWAYS AS (test*4) VIRTUAL
|
|
61
|
+
);`)
|
|
62
|
+
await db.query(sql`INSERT INTO generated_test (test) VALUES(1);`)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
38
66
|
test('simple db, simple rest API', async (t) => {
|
|
39
67
|
const { pass, teardown } = t
|
|
40
68
|
|
|
@@ -63,6 +91,7 @@ test('simple db, simple rest API', async (t) => {
|
|
|
63
91
|
t.same(pageJsonSchema.properties.id, { type: 'integer' })
|
|
64
92
|
t.same(pageJsonSchema.properties.title, { type: 'string' })
|
|
65
93
|
t.same(pageJsonSchema.properties.description, { type: 'string', nullable: true })
|
|
94
|
+
t.same(pageJsonSchema.properties.section, { type: 'number', nullable: true })
|
|
66
95
|
if (isMariaDB) {
|
|
67
96
|
t.same(pageJsonSchema.properties.metadata, { type: 'string', nullable: true })
|
|
68
97
|
} else {
|
|
@@ -116,3 +145,34 @@ test('ignore one field', async (t) => {
|
|
|
116
145
|
}
|
|
117
146
|
}
|
|
118
147
|
})
|
|
148
|
+
|
|
149
|
+
test('stored and virtual generated columns should be read only', async (t) => {
|
|
150
|
+
const { pass, teardown } = t
|
|
151
|
+
|
|
152
|
+
const app = fastify()
|
|
153
|
+
app.register(sqlMapper, {
|
|
154
|
+
...connInfo,
|
|
155
|
+
async onDatabaseLoad (db, sql) {
|
|
156
|
+
pass('onDatabaseLoad called')
|
|
157
|
+
|
|
158
|
+
await clear(db, sql)
|
|
159
|
+
await createBasicGeneratedTests(db, sql)
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
teardown(app.close.bind(app))
|
|
163
|
+
|
|
164
|
+
await app.ready()
|
|
165
|
+
|
|
166
|
+
{
|
|
167
|
+
const generatedTest = app.platformatic.entities.generatedTest
|
|
168
|
+
const generatedTestJsonSchema = mapSQLEntityToJSONSchema(generatedTest)
|
|
169
|
+
|
|
170
|
+
// as of postgresql 15 virtual generated column is not supported
|
|
171
|
+
if (isPg) {
|
|
172
|
+
t.same(generatedTestJsonSchema.properties.testStored, { type: 'integer', nullable: true, readOnly: true })
|
|
173
|
+
} else {
|
|
174
|
+
t.same(generatedTestJsonSchema.properties.testStored, { type: 'integer', nullable: true, readOnly: true })
|
|
175
|
+
t.same(generatedTestJsonSchema.properties.testVirtual, { type: 'integer', nullable: true, readOnly: true })
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
})
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js":{"path":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js","statementMap":{"0":{"start":{"line":61,"column":17},"end":{"line":61,"column":30}},"1":{"start":{"line":62,"column":21},"end":{"line":62,"column":23}},"2":{"start":{"line":63,"column":19},"end":{"line":63,"column":21}},"3":{"start":{"line":64,"column":2},"end":{"line":90,"column":3}},"4":{"start":{"line":65,"column":18},"end":{"line":65,"column":30}},"5":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"6":{"start":{"line":67,"column":6},"end":{"line":67,"column":14}},"7":{"start":{"line":69,"column":17},"end":{"line":69,"column":55}},"8":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"9":{"start":{"line":80,"column":6},"end":{"line":80,"column":49}},"10":{"start":{"line":82,"column":4},"end":{"line":85,"column":5}},"11":{"start":{"line":84,"column":6},"end":{"line":84,"column":36}},"12":{"start":{"line":91,"column":2},"end":{"line":98,"column":3}},"13":{"start":{"line":101,"column":0},"end":{"line":101,"column":70}}},"fnMap":{"0":{"name":"mapSQLTypeToOpenAPIType","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":32}},"loc":{"start":{"line":3,"column":43},"end":{"line":58,"column":1}},"line":3},"1":{"name":"mapSQLEntityToJSONSchema","decl":{"start":{"line":60,"column":9},"end":{"line":60,"column":33}},"loc":{"start":{"line":60,"column":56},"end":{"line":99,"column":1}},"line":60}},"branchMap":{"0":{"loc":{"start":{"line":60,"column":43},"end":{"line":60,"column":54}},"type":"default-arg","locations":[{"start":{"line":60,"column":52},"end":{"line":60,"column":54}}],"line":60},"1":{"loc":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},{"start":{"line":66,"column":4},"end":{"line":68,"column":5}}],"line":66},"2":{"loc":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},{"start":{"line":79,"column":4},"end":{"line":81,"column":5}}],"line":79},"3":{"loc":{"start":{"line":82,"column":4},"end":{"line":85,"column":5}},"type":"if","locations":[{"start":{"line":82,"column":4},"end":{"line":85,"column":5}},{"start":{"line":82,"column":4},"end":{"line":85,"column":5}}],"line":82},"4":{"loc":{"start":{"line":82,"column":8},"end":{"line":82,"column":46}},"type":"binary-expr","locations":[{"start":{"line":82,"column":8},"end":{"line":82,"column":25}},{"start":{"line":82,"column":29},"end":{"line":82,"column":46}}],"line":82}},"s":{"0":2,"1":2,"2":2,"3":2,"4":8,"5":8,"6":1,"7":7,"8":7,"9":4,"10":7,"11":1,"12":2,"13":1},"f":{"0":7,"1":2},"b":{"0":[1],"1":[1,7],"2":[4,3],"3":[1,6],"4":[7,3]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"351684b0b5ca7c79de94068641c525632b1f2441","contentHash":"3e7109c773d8eb4836be176593381fbb88726c7a8818f6aeb2d937cb7ec2077b"}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"parent":null,"pid":82830,"argv":["/Users/matteo/.nvm/versions/node/v16.17.0/bin/node","/Users/matteo/Repositories/platformatic/node_modules/.pnpm/tap@16.3.2/node_modules/tap/bin/run.js","test/simple.test.js"],"execArgv":[],"cwd":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper","time":1670280705557,"ppid":82823,"coverageFilename":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/.nyc_output/76b1971d-7952-4989-937a-bbcfb97dbb15.json","externalId":"","uuid":"76b1971d-7952-4989-937a-bbcfb97dbb15","files":[]}
|