@jsonresume/schema 1.3.1 → 1.4.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/README.md +41 -16
- package/examples/career-changer.resume.json +1 -1
- package/examples/new-grad.resume.json +1 -1
- package/examples/senior-engineer.resume.json +1 -1
- package/job-schema.json +1 -0
- package/package.json +1 -1
- package/sample.resume.json +22 -7
- package/schema.json +82 -3
- package/validator.js +13 -0
package/README.md
CHANGED
|
@@ -18,30 +18,33 @@ npm install --save @jsonresume/schema
|
|
|
18
18
|
|
|
19
19
|
To use
|
|
20
20
|
|
|
21
|
+
`validate(resume, callback)` calls back with `(errors, valid)`:
|
|
22
|
+
|
|
21
23
|
```js
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
console.log("Resume validated successfully:", report);
|
|
31
|
-
},
|
|
32
|
-
function (err) {
|
|
33
|
-
console.error("The resume was invalid:", err);
|
|
24
|
+
const { validate } = require('@jsonresume/schema');
|
|
25
|
+
|
|
26
|
+
validate({ basics: { name: 'Thomas' } }, (errors, valid) => {
|
|
27
|
+
if (!valid) {
|
|
28
|
+
console.error('The resume was invalid:', errors);
|
|
29
|
+
return;
|
|
34
30
|
}
|
|
35
|
-
);
|
|
31
|
+
console.log('Resume validated successfully');
|
|
32
|
+
});
|
|
36
33
|
```
|
|
37
34
|
|
|
38
35
|
Or against a full `resume.json`
|
|
39
36
|
|
|
40
37
|
```js
|
|
41
38
|
const fs = require('fs');
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
const { validate } = require('@jsonresume/schema');
|
|
40
|
+
|
|
41
|
+
const resume = JSON.parse(fs.readFileSync('./resume.json', 'utf8'));
|
|
42
|
+
validate(resume, (errors, valid) => {
|
|
43
|
+
if (!valid) {
|
|
44
|
+
console.error(errors);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
45
48
|
```
|
|
46
49
|
|
|
47
50
|
The JSON Resume schema is available from:
|
|
@@ -50,6 +53,28 @@ The JSON Resume schema is available from:
|
|
|
50
53
|
require('@jsonresume/schema').schema;
|
|
51
54
|
```
|
|
52
55
|
|
|
56
|
+
### Extending with `custom`
|
|
57
|
+
|
|
58
|
+
Data with no standard field can go in an optional `custom` object, allowed at
|
|
59
|
+
the root, in `basics`, and on every entry of every section. Its contents are
|
|
60
|
+
free-form; namespace keys by tool to avoid collisions:
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"work": [
|
|
65
|
+
{
|
|
66
|
+
"name": "Tech Corp",
|
|
67
|
+
"position": "Senior Developer",
|
|
68
|
+
"custom": { "myAts": { "teamSize": 12, "directReports": 5 } }
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Themes don't render `custom`, and tools that read and write resumes should
|
|
75
|
+
preserve it unchanged. Unknown top-level properties are also still allowed
|
|
76
|
+
(`additionalProperties: true`); `custom` gives that data a predictable home.
|
|
77
|
+
|
|
53
78
|
### Contribute
|
|
54
79
|
|
|
55
80
|
We encourage anyone who's interested in participating in the formation of this standard to join the discussions [here on GitHub](https://github.com/jsonresume/jsonresume.org/issues). Also feel free to fork this project and submit new ideas to add to the JSON Resume Schema standard. To make sure all formatting is kept in check, please install the [EditorConfig plugin](http://editorconfig.org/) for your editor of choice.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/jsonresume/
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/jsonresume/jsonresume.org/master/packages/schema/schema.json",
|
|
3
3
|
"basics": {
|
|
4
4
|
"name": "Daniel Reyes",
|
|
5
5
|
"label": "Junior Data Analyst (former Restaurant Manager)",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/jsonresume/
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/jsonresume/jsonresume.org/master/packages/schema/schema.json",
|
|
3
3
|
"basics": {
|
|
4
4
|
"name": "Maya Okonkwo",
|
|
5
5
|
"label": "Computer Science Graduate",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/jsonresume/
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/jsonresume/jsonresume.org/master/packages/schema/schema.json",
|
|
3
3
|
"basics": {
|
|
4
4
|
"name": "Dr. Lena Vasquez",
|
|
5
5
|
"label": "Staff Software Engineer, Distributed Systems",
|
package/job-schema.json
CHANGED
package/package.json
CHANGED
package/sample.resume.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://raw.githubusercontent.com/jsonresume/
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/jsonresume/jsonresume.org/master/packages/schema/schema.json",
|
|
3
3
|
"basics": {
|
|
4
4
|
"name": "Richard Hendriks",
|
|
5
5
|
"label": "Programmer",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
}
|
|
29
29
|
]
|
|
30
30
|
},
|
|
31
|
+
"objective": "Lead engineering for a compression-first storage platform.",
|
|
31
32
|
"work": [
|
|
32
33
|
{
|
|
33
34
|
"name": "Pied Piper",
|
|
@@ -42,7 +43,8 @@
|
|
|
42
43
|
"Build an algorithm for artist to detect if their music was violating copy right infringement laws",
|
|
43
44
|
"Successfully won Techcrunch Disrupt",
|
|
44
45
|
"Optimized an algorithm that holds the current world record for Weisman Scores"
|
|
45
|
-
]
|
|
46
|
+
],
|
|
47
|
+
"keywords": ["Compression", "C++", "Distributed Systems"]
|
|
46
48
|
}
|
|
47
49
|
],
|
|
48
50
|
"volunteer": [
|
|
@@ -65,7 +67,8 @@
|
|
|
65
67
|
"startDate": "2011-06-01",
|
|
66
68
|
"endDate": "2014-01-01",
|
|
67
69
|
"score": "4.0",
|
|
68
|
-
"courses": ["DB1101 - Basic SQL", "CS2011 - Java Introduction"]
|
|
70
|
+
"courses": ["DB1101 - Basic SQL", "CS2011 - Java Introduction"],
|
|
71
|
+
"summary": "Senior project on lossless compression for streaming media."
|
|
69
72
|
}
|
|
70
73
|
],
|
|
71
74
|
"awards": [
|
|
@@ -76,13 +79,25 @@
|
|
|
76
79
|
"summary": "There is no spoon."
|
|
77
80
|
}
|
|
78
81
|
],
|
|
82
|
+
"certificates": [
|
|
83
|
+
{
|
|
84
|
+
"name": "AWS Certified Solutions Architect – Associate",
|
|
85
|
+
"date": "2014-06-01",
|
|
86
|
+
"expiryDate": "2017-06-01",
|
|
87
|
+
"issuer": "Amazon Web Services",
|
|
88
|
+
"url": "https://certificates.example.com/aws/rhendriks",
|
|
89
|
+
"credentialId": "AWS-ASA-12345",
|
|
90
|
+
"summary": "Designing distributed systems on AWS."
|
|
91
|
+
}
|
|
92
|
+
],
|
|
79
93
|
"publications": [
|
|
80
94
|
{
|
|
81
95
|
"name": "Video compression for 3d media",
|
|
82
96
|
"publisher": "Hooli",
|
|
83
97
|
"releaseDate": "2014-10-01",
|
|
84
98
|
"url": "http://en.wikipedia.org/wiki/Silicon_Valley_(TV_series)",
|
|
85
|
-
"summary": "Innovative middle-out compression algorithm that changes the way we store data."
|
|
99
|
+
"summary": "Innovative middle-out compression algorithm that changes the way we store data.",
|
|
100
|
+
"type": "article"
|
|
86
101
|
}
|
|
87
102
|
],
|
|
88
103
|
"skills": [
|
|
@@ -134,8 +149,8 @@
|
|
|
134
149
|
}
|
|
135
150
|
],
|
|
136
151
|
"meta": {
|
|
137
|
-
"canonical": "https://raw.githubusercontent.com/jsonresume/
|
|
138
|
-
"version": "v1.
|
|
139
|
-
"lastModified": "
|
|
152
|
+
"canonical": "https://raw.githubusercontent.com/jsonresume/jsonresume.org/master/packages/schema/sample.resume.json",
|
|
153
|
+
"version": "v1.3.1",
|
|
154
|
+
"lastModified": "2026-10-22T00:00:00"
|
|
140
155
|
}
|
|
141
156
|
}
|
package/schema.json
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"$id": "
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/jsonresume/jsonresume.org/master/packages/schema/schema.json",
|
|
4
4
|
"additionalProperties": true,
|
|
5
5
|
"definitions": {
|
|
6
6
|
"iso8601": {
|
|
7
7
|
"type": "string",
|
|
8
|
-
"description": "Similar to the standard date type, but each section after the year is optional. e.g. 2014-06-29 or 2023-04",
|
|
9
|
-
"pattern": "^([1-2][0-9]{3}-[
|
|
8
|
+
"description": "Similar to the standard date type, but each section after the year is optional. e.g. 2014-06-29 or 2023-04. Every date is optional; omit endDate for a current position or ongoing entry (#309).",
|
|
9
|
+
"pattern": "^([1-2][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])|[1-2][0-9]{3}-(0[1-9]|1[0-2])|[1-2][0-9]{3})$"
|
|
10
|
+
},
|
|
11
|
+
"custom": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"description": "Tool- or author-specific data that has no standard field yet (#316). Keys are free-form; namespace them by tool (e.g. \"myTool\": { ... }) to avoid collisions. Themes are not expected to render it, and tools should preserve it unchanged when reading and writing resumes.",
|
|
14
|
+
"additionalProperties": true
|
|
10
15
|
}
|
|
11
16
|
},
|
|
12
17
|
"properties": {
|
|
@@ -26,6 +31,10 @@
|
|
|
26
31
|
"type": "string",
|
|
27
32
|
"description": "e.g. Web Developer"
|
|
28
33
|
},
|
|
34
|
+
"pronouns": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "e.g. she/her, they/them (#312)"
|
|
37
|
+
},
|
|
29
38
|
"image": {
|
|
30
39
|
"type": "string",
|
|
31
40
|
"description": "URL (as per RFC 3986) to a image in JPEG or PNG format"
|
|
@@ -94,9 +103,16 @@
|
|
|
94
103
|
}
|
|
95
104
|
}
|
|
96
105
|
}
|
|
106
|
+
},
|
|
107
|
+
"custom": {
|
|
108
|
+
"$ref": "#/definitions/custom"
|
|
97
109
|
}
|
|
98
110
|
}
|
|
99
111
|
},
|
|
112
|
+
"objective": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"description": "Forward-looking career goal, e.g. 'Seeking a senior backend role in climate tech'. Distinct from basics.summary, which describes background (#317)"
|
|
115
|
+
},
|
|
100
116
|
"work": {
|
|
101
117
|
"type": "array",
|
|
102
118
|
"items": {
|
|
@@ -141,6 +157,17 @@
|
|
|
141
157
|
"type": "string",
|
|
142
158
|
"description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising"
|
|
143
159
|
}
|
|
160
|
+
},
|
|
161
|
+
"keywords": {
|
|
162
|
+
"type": "array",
|
|
163
|
+
"description": "Skills, tools or technologies used in this role (#293)",
|
|
164
|
+
"items": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"description": "e.g. React"
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"custom": {
|
|
170
|
+
"$ref": "#/definitions/custom"
|
|
144
171
|
}
|
|
145
172
|
}
|
|
146
173
|
}
|
|
@@ -181,6 +208,9 @@
|
|
|
181
208
|
"type": "string",
|
|
182
209
|
"description": "e.g. Increased profits by 20% from 2011-2012 through viral advertising"
|
|
183
210
|
}
|
|
211
|
+
},
|
|
212
|
+
"custom": {
|
|
213
|
+
"$ref": "#/definitions/custom"
|
|
184
214
|
}
|
|
185
215
|
}
|
|
186
216
|
}
|
|
@@ -225,6 +255,13 @@
|
|
|
225
255
|
"type": "string",
|
|
226
256
|
"description": "e.g. H1302 - Introduction to American history"
|
|
227
257
|
}
|
|
258
|
+
},
|
|
259
|
+
"summary": {
|
|
260
|
+
"type": "string",
|
|
261
|
+
"description": "Thesis topic, honours, notable projects or other context (#292)"
|
|
262
|
+
},
|
|
263
|
+
"custom": {
|
|
264
|
+
"$ref": "#/definitions/custom"
|
|
228
265
|
}
|
|
229
266
|
}
|
|
230
267
|
}
|
|
@@ -250,6 +287,9 @@
|
|
|
250
287
|
"summary": {
|
|
251
288
|
"type": "string",
|
|
252
289
|
"description": "e.g. Received for my work with Quantum Physics"
|
|
290
|
+
},
|
|
291
|
+
"custom": {
|
|
292
|
+
"$ref": "#/definitions/custom"
|
|
253
293
|
}
|
|
254
294
|
}
|
|
255
295
|
}
|
|
@@ -273,9 +313,23 @@
|
|
|
273
313
|
"description": "e.g. http://example.com",
|
|
274
314
|
"format": "uri"
|
|
275
315
|
},
|
|
316
|
+
"credentialId": {
|
|
317
|
+
"type": "string",
|
|
318
|
+
"description": "Credential or licence number used to verify the certificate, e.g. a licence number or a certification ID (#590)"
|
|
319
|
+
},
|
|
276
320
|
"issuer": {
|
|
277
321
|
"type": "string",
|
|
278
322
|
"description": "e.g. CNCF"
|
|
323
|
+
},
|
|
324
|
+
"expiryDate": {
|
|
325
|
+
"$ref": "#/definitions/iso8601"
|
|
326
|
+
},
|
|
327
|
+
"summary": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"description": "What the certificate covers (#590)"
|
|
330
|
+
},
|
|
331
|
+
"custom": {
|
|
332
|
+
"$ref": "#/definitions/custom"
|
|
279
333
|
}
|
|
280
334
|
}
|
|
281
335
|
}
|
|
@@ -306,6 +360,13 @@
|
|
|
306
360
|
"summary": {
|
|
307
361
|
"type": "string",
|
|
308
362
|
"description": "Short summary of publication. e.g. Discussion of the World Wide Web, HTTP, HTML."
|
|
363
|
+
},
|
|
364
|
+
"type": {
|
|
365
|
+
"type": "string",
|
|
366
|
+
"description": "e.g. 'article', 'book', 'patent', 'thesis', 'talk' (#295)"
|
|
367
|
+
},
|
|
368
|
+
"custom": {
|
|
369
|
+
"$ref": "#/definitions/custom"
|
|
309
370
|
}
|
|
310
371
|
}
|
|
311
372
|
}
|
|
@@ -332,6 +393,9 @@
|
|
|
332
393
|
"type": "string",
|
|
333
394
|
"description": "e.g. HTML"
|
|
334
395
|
}
|
|
396
|
+
},
|
|
397
|
+
"custom": {
|
|
398
|
+
"$ref": "#/definitions/custom"
|
|
335
399
|
}
|
|
336
400
|
}
|
|
337
401
|
}
|
|
@@ -350,6 +414,9 @@
|
|
|
350
414
|
"fluency": {
|
|
351
415
|
"type": "string",
|
|
352
416
|
"description": "e.g. Fluent, Beginner"
|
|
417
|
+
},
|
|
418
|
+
"custom": {
|
|
419
|
+
"$ref": "#/definitions/custom"
|
|
353
420
|
}
|
|
354
421
|
}
|
|
355
422
|
}
|
|
@@ -370,6 +437,9 @@
|
|
|
370
437
|
"type": "string",
|
|
371
438
|
"description": "e.g. Friedrich Nietzsche"
|
|
372
439
|
}
|
|
440
|
+
},
|
|
441
|
+
"custom": {
|
|
442
|
+
"$ref": "#/definitions/custom"
|
|
373
443
|
}
|
|
374
444
|
}
|
|
375
445
|
}
|
|
@@ -388,6 +458,9 @@
|
|
|
388
458
|
"reference": {
|
|
389
459
|
"type": "string",
|
|
390
460
|
"description": "e.g. Joe blogs was a great employee, who turned up to work at least once a week. He exceeded my expectations when it came to doing nothing."
|
|
461
|
+
},
|
|
462
|
+
"custom": {
|
|
463
|
+
"$ref": "#/definitions/custom"
|
|
391
464
|
}
|
|
392
465
|
}
|
|
393
466
|
}
|
|
@@ -449,6 +522,9 @@
|
|
|
449
522
|
"type": {
|
|
450
523
|
"type": "string",
|
|
451
524
|
"description": " e.g. 'volunteering', 'presentation', 'talk', 'application', 'conference'"
|
|
525
|
+
},
|
|
526
|
+
"custom": {
|
|
527
|
+
"$ref": "#/definitions/custom"
|
|
452
528
|
}
|
|
453
529
|
}
|
|
454
530
|
}
|
|
@@ -472,6 +548,9 @@
|
|
|
472
548
|
"description": "Using ISO 8601 with YYYY-MM-DDThh:mm:ss"
|
|
473
549
|
}
|
|
474
550
|
}
|
|
551
|
+
},
|
|
552
|
+
"custom": {
|
|
553
|
+
"$ref": "#/definitions/custom"
|
|
475
554
|
}
|
|
476
555
|
},
|
|
477
556
|
"title": "Resume Schema",
|
package/validator.js
CHANGED
|
@@ -4,6 +4,19 @@ const jobSchema = require('./job-schema');
|
|
|
4
4
|
const Validator = require('jsonschema').Validator;
|
|
5
5
|
|
|
6
6
|
function validate(resumeJson, callback) {
|
|
7
|
+
// jsonschema treats an absent instance as valid, which hides failed reads
|
|
8
|
+
// and parses upstream
|
|
9
|
+
if (
|
|
10
|
+
resumeJson === null ||
|
|
11
|
+
typeof resumeJson !== 'object' ||
|
|
12
|
+
Array.isArray(resumeJson)
|
|
13
|
+
) {
|
|
14
|
+
return callback(
|
|
15
|
+
[{ property: 'instance', message: 'resume must be a JSON object' }],
|
|
16
|
+
false
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
const v = new Validator();
|
|
8
21
|
|
|
9
22
|
const validation = v.validate(resumeJson, schema);
|