@platformatic/sql-json-schema-mapper 0.11.0 → 0.12.1

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.
@@ -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"}}
@@ -1 +1 @@
1
- {"parent":"76b1971d-7952-4989-937a-bbcfb97dbb15","pid":82831,"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":1670280705931,"ppid":82830,"coverageFilename":"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/.nyc_output/55d1bd19-dcb4-4d28-b56a-deb3f6a0292e.json","externalId":"test/simple.test.js","uuid":"55d1bd19-dcb4-4d28-b56a-deb3f6a0292e","files":["/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js"]}
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":{"55d1bd19-dcb4-4d28-b56a-deb3f6a0292e":{"parent":"76b1971d-7952-4989-937a-bbcfb97dbb15","externalId":"test/simple.test.js","children":[]},"76b1971d-7952-4989-937a-bbcfb97dbb15":{"parent":null,"children":["55d1bd19-dcb4-4d28-b56a-deb3f6a0292e"]}},"files":{"/Users/matteo/Repositories/platformatic/packages/sql-json-schema-mapper/index.js":["55d1bd19-dcb4-4d28-b56a-deb3f6a0292e"]},"externalIds":{"test/simple.test.js":{"root":"55d1bd19-dcb4-4d28-b56a-deb3f6a0292e","children":[]}}}
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 'integer'
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.11.0",
3
+ "version": "0.12.1",
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.6.0",
17
+ "fastify": "^4.10.2",
18
18
  "snazzy": "^9.0.0",
19
19
  "standard": "^17.0.0",
20
- "tap": "^16.0.0",
21
- "@platformatic/sql-mapper": "0.11.0"
20
+ "tap": "^16.3.2",
21
+ "@platformatic/sql-mapper": "0.12.1"
22
22
  },
23
23
  "scripts": {
24
24
  "lint": "standard",
package/test/helper.js CHANGED
@@ -74,4 +74,9 @@ module.exports.clear = async function (db, sql) {
74
74
  await db.query(sql`DROP Type pagetype`)
75
75
  } catch {
76
76
  }
77
+
78
+ try {
79
+ await db.query(sql`DROP TABLE generated_test`)
80
+ } catch {
81
+ }
77
82
  }
@@ -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":[]}