1 // this is a weird meta test. It verifies that all the instances of
2 // `npm.config.get(...)` are:
3 // a) Simple strings, and not variables
5 // c) Defined in the `npmconf` package.
7 var test = require("tap").test
9 var path = require("path")
10 var root = path.resolve(__dirname, "..", "..")
11 var lib = path.resolve(root, "lib")
12 var nm = path.resolve(root, "node_modules")
13 var doc = path.resolve(root, "doc/misc/npm-config.md")
19 path.resolve(lib, "adduser.js"),
20 path.resolve(lib, "config.js"),
21 path.resolve(lib, "publish.js"),
22 path.resolve(lib, "utils", "lifecycle.js"),
23 path.resolve(lib, "utils", "map-to-registry.js"),
24 path.resolve(nm, "npm-registry-client", "lib", "publish.js"),
25 path.resolve(nm, "npm-registry-client", "lib", "request.js")
28 test("get files", function (t) {
35 var files = fs.readdirSync(lib).map(function (f) {
36 return path.resolve(lib, f)
38 files.forEach(function (f) {
40 var s = fs.lstatSync(f)
46 else if (f.match(/\.js$/))
52 test("get lines", function (t) {
53 FILES.forEach(function (f) {
54 var lines = fs.readFileSync(f, "utf8").split(/\r|\n/)
55 lines.forEach(function (l, i) {
56 var matches = l.split(/conf(?:ig)?\.get\(/g)
58 matches.forEach(function (m) {
59 m = m.split(")").shift()
60 var literal = m.match(/^['"].+?['"]/)
62 m = literal[0].slice(1, -1)
63 if (!m.match(/^\_/) && m !== "argv")
68 } else if (exceptions.indexOf(f) === -1) {
69 t.fail("non-string-literal config used in " + f + ":" + i)
78 test("get docs", function (t) {
79 var d = fs.readFileSync(doc, "utf8").split(/\r|\n/)
80 // walk down until the "## Config Settings" section
81 for (var i = 0; i < d.length && d[i] !== "## Config Settings"; i++);
83 // now gather up all the ^###\s lines until the next ^##\s
84 for (; i < d.length && !d[i].match(/^## /); i++) {
85 if (d[i].match(/^### /))
86 DOC[ d[i].replace(/^### /, "").trim() ] = true
88 t.pass("read the docs")
92 test("check configs", function (t) {
93 var defs = require("../../lib/config/defaults.js")
94 var types = Object.keys(defs.types)
95 var defaults = Object.keys(defs.defaults)
96 for (var c1 in CONFS) {
97 if (CONFS[c1].file.indexOf(lib) === 0) {
98 t.ok(DOC[c1], "should be documented " + c1 + " "
99 + CONFS[c1].file + ":" + CONFS[c1].line)
100 t.ok(types.indexOf(c1) !== -1, "should be defined in npmconf " + c1)
101 t.ok(defaults.indexOf(c1) !== -1, "should have default in npmconf " + c1)
105 for (var c2 in DOC) {
106 if (c2 !== "versions" && c2 !== "version" && c2 !== "init.version") {
107 t.ok(CONFS[c2], "config in doc should be used somewhere " + c2)
108 t.ok(types.indexOf(c2) !== -1, "should be defined in npmconf " + c2)
109 t.ok(defaults.indexOf(c2) !== -1, "should have default in npmconf " + c2)
113 types.forEach(function (c) {
114 if (!c.match(/^\_/) && c !== "argv" && !c.match(/^versions?$/)) {
115 t.ok(DOC[c], "defined type should be documented " + c)
116 t.ok(CONFS[c], "defined type should be used " + c)
120 defaults.forEach(function (c) {
121 if (!c.match(/^\_/) && c !== "argv" && !c.match(/^versions?$/)) {
122 t.ok(DOC[c], "defaulted type should be documented " + c)
123 t.ok(CONFS[c], "defaulted type should be used " + c)