@nictool/dns-resource-record 1.2.0 → 1.2.2

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.
Files changed (81) hide show
  1. package/.codeclimate.yml +25 -0
  2. package/.github/FUNDING.yml +3 -0
  3. package/.github/workflows/ci.yml +43 -0
  4. package/.github/workflows/codeql.yml +14 -0
  5. package/.github/workflows/publish.yml +16 -0
  6. package/.gitmodules +3 -0
  7. package/CHANGELOG.md +18 -0
  8. package/DEVELOP.md +9 -0
  9. package/README.md +6 -2
  10. package/eslint.config.mjs +41 -0
  11. package/index.js +6 -0
  12. package/package.json +12 -3
  13. package/rr/a.js +13 -3
  14. package/rr/aaaa.js +14 -4
  15. package/rr/caa.js +25 -13
  16. package/rr/cname.js +3 -3
  17. package/rr/dname.js +4 -4
  18. package/rr/dnskey.js +6 -11
  19. package/rr/ds.js +6 -8
  20. package/rr/hinfo.js +8 -6
  21. package/rr/https.js +62 -0
  22. package/rr/ipseckey.js +20 -9
  23. package/rr/key.js +2 -2
  24. package/rr/loc.js +4 -4
  25. package/rr/mx.js +15 -3
  26. package/rr/naptr.js +2 -2
  27. package/rr/ns.js +1 -1
  28. package/rr/nsec.js +2 -4
  29. package/rr/nsec3.js +6 -12
  30. package/rr/nsec3param.js +4 -9
  31. package/rr/nxt.js +2 -4
  32. package/rr/openpgpkey.js +7 -3
  33. package/rr/rrsig.js +3 -4
  34. package/rr/sig.js +1 -1
  35. package/rr/smimea.js +3 -5
  36. package/rr/soa.js +1 -2
  37. package/rr/spf.js +1 -1
  38. package/rr/srv.js +4 -4
  39. package/rr/sshfp.js +1 -1
  40. package/rr/svcb.js +64 -0
  41. package/rr/tlsa.js +10 -10
  42. package/rr/tsig.js +10 -2
  43. package/rr/txt.js +5 -5
  44. package/rr/uri.js +2 -2
  45. package/rr/wks.js +4 -3
  46. package/rr.js +32 -20
  47. package/test/a.js +75 -0
  48. package/test/aaaa.js +86 -0
  49. package/test/base.js +148 -0
  50. package/test/caa.js +111 -0
  51. package/test/cert.js +48 -0
  52. package/test/cname.js +40 -0
  53. package/test/dname.js +57 -0
  54. package/test/dnskey.js +45 -0
  55. package/test/ds.js +45 -0
  56. package/test/fake.js +34 -0
  57. package/test/hinfo.js +80 -0
  58. package/test/https.js +56 -0
  59. package/test/ipseckey.js +141 -0
  60. package/test/key.js +36 -0
  61. package/test/loc.js +75 -0
  62. package/test/mx.js +78 -0
  63. package/test/naptr.js +47 -0
  64. package/test/ns.js +56 -0
  65. package/test/nsec.js +37 -0
  66. package/test/nsec3.js +47 -0
  67. package/test/nsec3param.js +23 -0
  68. package/test/nxt.js +37 -0
  69. package/test/openpgpkey.js +85 -0
  70. package/test/ptr.js +56 -0
  71. package/test/rr.js +212 -0
  72. package/test/smimea.js +51 -0
  73. package/test/soa.js +99 -0
  74. package/test/spf.js +51 -0
  75. package/test/srv.js +101 -0
  76. package/test/sshfp.js +69 -0
  77. package/test/svcb.js +56 -0
  78. package/test/tinydns.js +163 -0
  79. package/test/tlsa.js +63 -0
  80. package/test/txt.js +82 -0
  81. package/test/uri.js +65 -0
package/test/txt.js ADDED
@@ -0,0 +1,82 @@
1
+ import assert from 'assert'
2
+
3
+ import * as base from './base.js'
4
+
5
+ import TXT from '../rr/txt.js'
6
+
7
+ const validRecords = [
8
+ {
9
+ owner: 'oct2021._domainkey.example.com.',
10
+ ttl: 86400,
11
+ type: 'TXT',
12
+ data: 'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
13
+ testB:
14
+ 'oct2021._domainkey.example.com.\t86400\tIN\tTXT\t"v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob" "4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB"\n',
15
+ testT:
16
+ "'oct2021._domainkey.example.com:v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB:86400::\n",
17
+ },
18
+ {
19
+ owner: 'oct2021._domainkey.example.com.',
20
+ ttl: 86400,
21
+ type: 'TXT',
22
+ data: [
23
+ 'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob',
24
+ '4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
25
+ ],
26
+ testB:
27
+ 'oct2021._domainkey.example.com.\t86400\tIN\tTXT\t"v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob" "4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB"\n',
28
+ testT:
29
+ "'oct2021._domainkey.example.com:v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB:86400::\n",
30
+ },
31
+ {
32
+ owner: 'example.com.',
33
+ ttl: 86400,
34
+ type: 'TXT',
35
+ data: 'v=spf1 mx a include:mx.example.com -all',
36
+ testB:
37
+ 'example.com.\t86400\tIN\tTXT\t"v=spf1 mx a include:mx.example.com -all"\n',
38
+ testT: "'example.com:v=spf1 mx a include\\072mx.example.com -all:86400::\n",
39
+ },
40
+ ]
41
+
42
+ const invalidRecords = []
43
+
44
+ describe('TXT record', function () {
45
+ base.valid(TXT, validRecords)
46
+ base.invalid(TXT, invalidRecords)
47
+
48
+ base.getDescription(TXT)
49
+ base.getRFCs(TXT, validRecords[0])
50
+ base.getFields(TXT, ['data'])
51
+ base.getTypeId(TXT, 16)
52
+
53
+ base.toBind(TXT, validRecords)
54
+ base.toTinydns(TXT, validRecords)
55
+
56
+ base.fromTinydns(TXT, validRecords)
57
+ base.fromBind(TXT, validRecords)
58
+
59
+ it(`imports tinydns TXT (generic) record`, async function () {
60
+ const val = {
61
+ owner: 'nov2021._domainkey.example.com.',
62
+ type: 'TXT',
63
+ data: 'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
64
+ ttl: 86400,
65
+ testB:
66
+ 'nov2021._domainkey.example.com.\t86400\tIN\tTXT\t"v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob" "4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB"\n',
67
+ testT:
68
+ ':nov2021._domainkey.example.com:16:\\622v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB:86400\n',
69
+ }
70
+
71
+ const r = new TXT({ tinyline: val.testT })
72
+ if (process.env.DEBUG) console.dir(r)
73
+ for (const f of r.getFields()) {
74
+ if (f === 'class') continue
75
+ assert.deepStrictEqual(
76
+ r.get(f),
77
+ val[f],
78
+ `${f}: ${r.get(f)} !== ${val[f]}`,
79
+ )
80
+ }
81
+ })
82
+ })
package/test/uri.js ADDED
@@ -0,0 +1,65 @@
1
+ import assert from 'assert'
2
+
3
+ import * as base from './base.js'
4
+
5
+ import URI from '../rr/uri.js'
6
+
7
+ const validRecords = [
8
+ {
9
+ class: 'IN',
10
+ owner: 'www.example.com.',
11
+ type: 'URI',
12
+ target: 'www2.example.com.',
13
+ priority: 1,
14
+ weight: 0,
15
+ ttl: 3600,
16
+ testB: 'www.example.com.\t3600\tIN\tURI\t1\t0\t"www2.example.com."\n',
17
+ testT:
18
+ ':www.example.com:256:\\000\\001\\000\\000www2.example.com.:3600::\n',
19
+ },
20
+ {
21
+ class: 'IN',
22
+ owner: '_http.github.dog.',
23
+ type: 'URI',
24
+ target: 'http://github.com/dog',
25
+ priority: 2,
26
+ weight: 100,
27
+ ttl: 3600,
28
+ testB:
29
+ '_http.github.dog.\t3600\tIN\tURI\t2\t100\t"http://github.com/dog"\n',
30
+ testT:
31
+ ':_http.github.dog:256:\\000\\002\\000\\144http\\072\\057\\057github.com\\057dog:3600::\n',
32
+ },
33
+ ]
34
+
35
+ const invalidRecords = []
36
+
37
+ describe('URI record', function () {
38
+ base.valid(URI, validRecords)
39
+ base.invalid(URI, invalidRecords)
40
+
41
+ base.getDescription(URI)
42
+ base.getRFCs(URI, validRecords[0])
43
+ base.getFields(URI, ['priority', 'weight', 'target'])
44
+ base.getTypeId(URI, 256)
45
+
46
+ base.toBind(URI, validRecords)
47
+ base.toTinydns(URI, validRecords)
48
+
49
+ base.fromBind(URI, validRecords)
50
+ base.fromTinydns(URI, validRecords)
51
+
52
+ for (const val of validRecords) {
53
+ it.skip(`imports tinydns (generic) record`, async function () {
54
+ const r = new URI({ tinyline: val.testT })
55
+ if (process.env.DEBUG) console.dir(r)
56
+ for (const f of ['owner', 'priority', 'weight', 'target', 'ttl']) {
57
+ assert.deepStrictEqual(
58
+ r.get(f),
59
+ val[f],
60
+ `${f}: ${r.get(f)} !== ${val[f]}`,
61
+ )
62
+ }
63
+ })
64
+ }
65
+ })