@sasjs/lint 1.12.0 → 1.14.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.
File without changes
package/.gitpod.yml ADDED
@@ -0,0 +1,8 @@
1
+ # This configuration file was automatically generated by Gitpod.
2
+ # Please adjust to your needs (see https://www.gitpod.io/docs/config-gitpod-file)
3
+ # and commit this file to your remote git repository to share the goodness with others.
4
+
5
+ tasks:
6
+ - init: npm install && npm run build
7
+
8
+
package/README.md CHANGED
@@ -23,18 +23,43 @@ Configuration is via a `.sasjslint` file with the following structure (these are
23
23
  "hasDoxygenHeader": true,
24
24
  "hasMacroNameInMend": true,
25
25
  "hasMacroParentheses": true,
26
+ "ignoreList": [
27
+ "sajsbuild/",
28
+ "sasjsresults/"
29
+ ],
26
30
  "indentationMultiple": 2,
27
31
  "lowerCaseFileNames": true,
28
32
  "maxLineLength": 80,
29
33
  "noNestedMacros": true,
30
34
  "noSpacesInFileNames": true,
31
35
  "noTabIndentation": true,
32
- "noTrailingSpaces": true
36
+ "noTrailingSpaces": true,
37
+ "defaultHeader": "/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/"
33
38
  }
34
39
  ```
35
40
 
36
41
  ### SAS Lint Settings
37
42
 
43
+ #### defaultHeader
44
+
45
+ This sets the default program header - applies when a SAS program does NOT begin with `/**`. The default header is as follows:
46
+
47
+ ```sas
48
+ /**
49
+ @file
50
+ @brief <Your brief here>
51
+ <h4> SAS Macros </h4>
52
+ **/
53
+ ```
54
+
55
+ The default header is automatically applied when running `sasjs lint fix` in the SASjs CLI, or by hitting "save" when using the SASjs VS Code extension. If creating a new value, use `{lineEnding}` instead of `\n`, eg as follows:
56
+
57
+ ```json
58
+ {
59
+ "defaultHeader": "/**{lineEnding} @file{lineEnding} @brief Our Company Brief{lineEnding}**/"
60
+ }
61
+ ```
62
+
38
63
  #### noEncodedPasswords
39
64
 
40
65
  This will highlight any rows that contain a `{sas00X}` type password, or `{sasenc}`. These passwords (especially 001 and 002) are NOT secure, and should NEVER be pushed to source control or saved to the filesystem without special permissions applied.
@@ -60,6 +85,9 @@ As per the example [here](https://github.com/sasjs/lint/issues/20), macros defin
60
85
  * Default: true
61
86
  * Severity: WARNING
62
87
 
88
+ #### ignoreList
89
+ There may be specific files (or folders) that are not good candidates for linting. Simply list them in this array and they will be ignored. In addition, any files in the project `.gitignore` file will also be ignored.
90
+
63
91
  #### indentationMultiple
64
92
  This will check each line to ensure that the count of leading spaces can be divided cleanly by this multiple.
65
93
 
@@ -75,7 +103,7 @@ On *nix systems, it is imperative that autocall macros are in lowercase. When s
75
103
  #### maxLineLength
76
104
  Code becomes far more readable when line lengths are short. The most compelling reason for short line lengths is to avoid the need to scroll when performing a side-by-side 'compare' between two files (eg as part of a GIT feature branch review). A longer discussion on optimal code line length can be found [here](https://stackoverflow.com/questions/578059/studies-on-optimal-code-width)
77
105
 
78
- In batch mode, long SAS code lines may also be truncated, causing hard-to-detect errors.
106
+ In batch mode, long SAS code lines may also be truncated, causing hard-to-detect errors.
79
107
 
80
108
  We strongly recommend a line length limit, and set the bar at 80. To turn this feature off, set the value to 0.
81
109
 
@@ -83,7 +111,7 @@ We strongly recommend a line length limit, and set the bar at 80. To turn this
83
111
  * Severity: WARNING
84
112
 
85
113
  #### noNestedMacros
86
- Where macros are defined inside other macros, they are recompiled every time the outer macro is invoked. Hence, it is widely considered inefficient, and bad practice, to nest macro definitions.
114
+ Where macros are defined inside other macros, they are recompiled every time the outer macro is invoked. Hence, it is widely considered inefficient, and bad practice, to nest macro definitions.
87
115
 
88
116
  * Default: true
89
117
  * Severity: WARNING
@@ -113,7 +141,7 @@ This will highlight lines with trailing spaces. Trailing spaces serve no useful
113
141
 
114
142
  ### Upcoming Linting Rules:
115
143
 
116
- * `noTabs` -> does what it says on the tin
144
+ * `noTabs` -> does what it says on the tin
117
145
  * `noGremlins` -> identifies all invisible characters, other than spaces / tabs / line endings. If you really need that bell character, use a hex literal!
118
146
  * `lineEndings` -> set a standard line ending, such as LF or CRLF
119
147
 
@@ -123,13 +151,13 @@ A formatter will automatically apply rules when you hit SAVE, which can save a L
123
151
 
124
152
  We've already implemented the following rules:
125
153
 
126
- * Add the macro name to the %mend statement
127
- * Add a doxygen header template if none exists
154
+ * Add the macro name to the %mend statement
155
+ * Add a doxygen header template if none exists
128
156
  * Remove trailing spaces
129
157
 
130
158
  We're looking to implement the following rules:
131
159
 
132
- * Change tabs to spaces
160
+ * Change tabs to spaces
133
161
  * zap gremlins
134
162
  * fix line endings
135
163
 
@@ -1 +1,2 @@
1
- export declare const formatText: (text: string) => Promise<string>;
1
+ import { LintConfig } from '../types';
2
+ export declare const formatText: (text: string, configuration?: LintConfig | undefined) => Promise<string>;
@@ -39,13 +39,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.formatText = void 0;
40
40
  var utils_1 = require("../utils");
41
41
  var shared_1 = require("./shared");
42
- var formatText = function (text) { return __awaiter(void 0, void 0, void 0, function () {
43
- var config;
44
- return __generator(this, function (_a) {
45
- switch (_a.label) {
46
- case 0: return [4 /*yield*/, utils_1.getLintConfig()];
42
+ var formatText = function (text, configuration) { return __awaiter(void 0, void 0, void 0, function () {
43
+ var config, _a;
44
+ return __generator(this, function (_b) {
45
+ switch (_b.label) {
46
+ case 0:
47
+ _a = configuration;
48
+ if (_a) return [3 /*break*/, 2];
49
+ return [4 /*yield*/, utils_1.getLintConfig()];
47
50
  case 1:
48
- config = _a.sent();
51
+ _a = (_b.sent());
52
+ _b.label = 2;
53
+ case 2:
54
+ config = _a;
49
55
  return [2 /*return*/, shared_1.processText(text, config)];
50
56
  }
51
57
  });
@@ -1 +1 @@
1
- {"version":3,"file":"formatText.js","sourceRoot":"","sources":["../../src/format/formatText.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kCAAwC;AACxC,mCAAsC;AAE/B,IAAM,UAAU,GAAG,UAAO,IAAY;;;;oBAC5B,qBAAM,qBAAa,EAAE,EAAA;;gBAA9B,MAAM,GAAG,SAAqB;gBACpC,sBAAO,oBAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAA;;;KACjC,CAAA;AAHY,QAAA,UAAU,cAGtB"}
1
+ {"version":3,"file":"formatText.js","sourceRoot":"","sources":["../../src/format/formatText.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kCAAwC;AACxC,mCAAsC;AAE/B,IAAM,UAAU,GAAG,UAAO,IAAY,EAAE,aAA0B;;;;;gBACxD,KAAA,aAAa,CAAA;wBAAb,wBAAa;gBAAK,qBAAM,qBAAa,EAAE,EAAA;;gBAAtB,KAAA,CAAC,SAAqB,CAAC,CAAA;;;gBAAjD,MAAM,KAA2C;gBACvD,sBAAO,oBAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAA;;;KACjC,CAAA;AAHY,QAAA,UAAU,cAGtB"}
package/format/shared.js CHANGED
@@ -18,7 +18,7 @@ var processContent = function (config, content) {
18
18
  config.fileLintRules
19
19
  .filter(function (r) { return !!r.fix; })
20
20
  .forEach(function (rule) {
21
- processedContent = rule.fix(processedContent);
21
+ processedContent = rule.fix(processedContent, config);
22
22
  });
23
23
  return processedContent;
24
24
  };
@@ -27,7 +27,7 @@ var processLine = function (config, line) {
27
27
  config.lineLintRules
28
28
  .filter(function (r) { return !!r.fix; })
29
29
  .forEach(function (rule) {
30
- processedLine = rule.fix(line);
30
+ processedLine = rule.fix(line, config);
31
31
  });
32
32
  return processedLine;
33
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/format/shared.ts"],"names":[],"mappings":";;;AACA,oDAAkD;AAClD,gDAA8C;AAEvC,IAAM,WAAW,GAAG,UAAC,IAAY,EAAE,MAAkB;IAC1D,IAAM,aAAa,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClD,IAAM,KAAK,GAAG,qBAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IAC9C,IAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI;QACpC,OAAO,mBAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAM,oBAAoB,GACxB,MAAM,CAAC,WAAW,KAAK,yBAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IACvD,OAAO,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;AAClD,CAAC,CAAA;AAVY,QAAA,WAAW,eAUvB;AAED,IAAM,cAAc,GAAG,UAAC,MAAkB,EAAE,OAAe;IACzD,IAAI,gBAAgB,GAAG,OAAO,CAAA;IAC9B,MAAM,CAAC,aAAa;SACjB,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAP,CAAO,CAAC;SACtB,OAAO,CAAC,UAAC,IAAI;QACZ,gBAAgB,GAAG,IAAI,CAAC,GAAI,CAAC,gBAAgB,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEJ,OAAO,gBAAgB,CAAA;AACzB,CAAC,CAAA;AAEM,IAAM,WAAW,GAAG,UAAC,MAAkB,EAAE,IAAY;IAC1D,IAAI,aAAa,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,aAAa;SACjB,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAP,CAAO,CAAC;SACtB,OAAO,CAAC,UAAC,IAAI;QACZ,aAAa,GAAG,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEJ,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AATY,QAAA,WAAW,eASvB"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/format/shared.ts"],"names":[],"mappings":";;;AACA,oDAAkD;AAClD,gDAA8C;AAEvC,IAAM,WAAW,GAAG,UAAC,IAAY,EAAE,MAAkB;IAC1D,IAAM,aAAa,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClD,IAAM,KAAK,GAAG,qBAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IAC9C,IAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI;QACpC,OAAO,mBAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAM,oBAAoB,GACxB,MAAM,CAAC,WAAW,KAAK,yBAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IACvD,OAAO,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;AAClD,CAAC,CAAA;AAVY,QAAA,WAAW,eAUvB;AAED,IAAM,cAAc,GAAG,UAAC,MAAkB,EAAE,OAAe;IACzD,IAAI,gBAAgB,GAAG,OAAO,CAAA;IAC9B,MAAM,CAAC,aAAa;SACjB,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAP,CAAO,CAAC;SACtB,OAAO,CAAC,UAAC,IAAI;QACZ,gBAAgB,GAAG,IAAI,CAAC,GAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEJ,OAAO,gBAAgB,CAAA;AACzB,CAAC,CAAA;AAEM,IAAM,WAAW,GAAG,UAAC,MAAkB,EAAE,IAAY;IAC1D,IAAI,aAAa,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,aAAa;SACjB,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,CAAC,CAAC,GAAG,EAAP,CAAO,CAAC;SACtB,OAAO,CAAC,UAAC,IAAI;QACZ,aAAa,GAAG,IAAI,CAAC,GAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEJ,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AATY,QAAA,WAAW,eASvB"}
package/package.json CHANGED
@@ -51,5 +51,5 @@
51
51
  "@sasjs/utils": "^2.19.0",
52
52
  "ignore": "^5.2.0"
53
53
  },
54
- "version": "1.12.0"
54
+ "version": "1.14.0"
55
55
  }
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.hasDoxygenHeader = void 0;
4
+ var types_1 = require("../../types");
4
5
  var LineEndings_1 = require("../../types/LineEndings");
5
6
  var LintRuleType_1 = require("../../types/LintRuleType");
6
7
  var Severity_1 = require("../../types/Severity");
7
- var DoxygenHeader = "/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/";
8
+ var getLintConfig_1 = require("../../utils/getLintConfig");
8
9
  var name = 'hasDoxygenHeader';
9
10
  var description = 'Enforce the presence of a Doxygen header at the start of each file.';
10
11
  var message = 'File missing Doxygen header';
@@ -57,9 +58,10 @@ var fix = function (value, config) {
57
58
  }
58
59
  else if (result[0].message == messageForSingleAsterisk)
59
60
  return value.replace('/*', '/**');
61
+ config = config || new types_1.LintConfig(getLintConfig_1.DefaultLintConfiguration);
60
62
  var lineEndingConfig = (config === null || config === void 0 ? void 0 : config.lineEndings) || LineEndings_1.LineEndings.LF;
61
63
  var lineEnding = lineEndingConfig === LineEndings_1.LineEndings.LF ? '\n' : '\r\n';
62
- return "" + DoxygenHeader.replace(/{lineEnding}/g, lineEnding) + lineEnding + value;
64
+ return "" + (config === null || config === void 0 ? void 0 : config.defaultHeader.replace(/{lineEnding}/g, lineEnding)) + lineEnding + value;
63
65
  };
64
66
  /**
65
67
  * Lint rule that checks for the presence of a Doxygen header in a given file.
@@ -1 +1 @@
1
- {"version":3,"file":"hasDoxygenHeader.js","sourceRoot":"","sources":["../../../src/rules/file/hasDoxygenHeader.ts"],"names":[],"mappings":";;;AACA,uDAAqD;AAErD,yDAAuD;AACvD,iDAA+C;AAE/C,IAAM,aAAa,GAAG,gHAAgH,CAAA;AAEtI,IAAM,IAAI,GAAG,kBAAkB,CAAA;AAC/B,IAAM,WAAW,GACf,qEAAqE,CAAA;AACvE,IAAM,OAAO,GAAG,6BAA6B,CAAA;AAC7C,IAAM,wBAAwB,GAC5B,+DAA+D,CAAA;AACjE,IAAM,IAAI,GAAG,UAAC,KAAa,EAAE,MAAmB;;IAC9C,IAAM,UAAU,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,MAAK,yBAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IAC3E,IAAI;QACF,IAAM,aAAa,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACzD,IAAI,aAAa;YAAE,OAAO,EAAE,CAAA;QAE5B,IAAM,+BAA+B,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC1E,IAAI,+BAA+B;YACjC,OAAO;gBACL;oBACE,OAAO,EAAE,wBAAwB;oBACjC,UAAU,EACR,CAAC,MAAA,KAAK,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,mCAAI,EAAE,CAAC;yBAC9D,MAAM,GAAG,CAAC;oBACf,iBAAiB,EAAE,CAAC;oBACpB,eAAe,EAAE,CAAC;oBAClB,QAAQ,EAAE,mBAAQ,CAAC,OAAO;iBAC3B;aACF,CAAA;QAEH,OAAO;YACL;gBACE,OAAO,SAAA;gBACP,UAAU,EAAE,CAAC;gBACb,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,QAAQ,EAAE,mBAAQ,CAAC,OAAO;aAC3B;SACF,CAAA;KACF;IAAC,OAAO,CAAC,EAAE;QACV,OAAO;YACL;gBACE,OAAO,SAAA;gBACP,UAAU,EAAE,CAAC;gBACb,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,QAAQ,EAAE,mBAAQ,CAAC,OAAO;aAC3B;SACF,CAAA;KACF;AACH,CAAC,CAAA;AAED,IAAM,GAAG,GAAG,UAAC,KAAa,EAAE,MAAmB;IAC7C,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO,KAAK,CAAA;KACb;SAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,wBAAwB;QACtD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAEnC,IAAM,gBAAgB,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,KAAI,yBAAW,CAAC,EAAE,CAAA;IAC9D,IAAM,UAAU,GAAG,gBAAgB,KAAK,yBAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;IAEtE,OAAO,KAAG,aAAa,CAAC,OAAO,CAC7B,eAAe,EACf,UAAU,CACX,GAAG,UAAU,GAAG,KAAO,CAAA;AAC1B,CAAC,CAAA;AAED;;GAEG;AACU,QAAA,gBAAgB,GAAiB;IAC5C,IAAI,EAAE,2BAAY,CAAC,IAAI;IACvB,IAAI,MAAA;IACJ,WAAW,aAAA;IACX,OAAO,SAAA;IACP,IAAI,MAAA;IACJ,GAAG,KAAA;CACJ,CAAA"}
1
+ {"version":3,"file":"hasDoxygenHeader.js","sourceRoot":"","sources":["../../../src/rules/file/hasDoxygenHeader.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@
7
7
  "default": {
8
8
  "noEncodedPasswords": true,
9
9
  "hasDoxygenHeader": true,
10
+ "defaultHeader": "/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/",
10
11
  "hasMacroNameInMend": false,
11
12
  "hasMacroParentheses": true,
12
13
  "indentationMultiple": 2,
@@ -17,7 +18,8 @@
17
18
  "noTabIndentation": true,
18
19
  "noTrailingSpaces": true,
19
20
  "lineEndings": "lf",
20
- "strictMacroDefinition": true
21
+ "strictMacroDefinition": true,
22
+ "ignoreList": ["sajsbuild", "sasjsresults"]
21
23
  },
22
24
  "examples": [
23
25
  {
@@ -33,7 +35,8 @@
33
35
  "noNestedMacros": true,
34
36
  "hasMacroParentheses": true,
35
37
  "lineEndings": "crlf",
36
- "strictMacroDefinition": true
38
+ "strictMacroDefinition": true,
39
+ "ignoreList": ["sajsbuild", "sasjsresults"]
37
40
  }
38
41
  ],
39
42
  "properties": {
@@ -53,6 +56,14 @@
53
56
  "default": true,
54
57
  "examples": [true, false]
55
58
  },
59
+ "defaultHeader": {
60
+ "$id": "#/properties/defaultHeader",
61
+ "type": "boolean",
62
+ "title": "defaultHeader",
63
+ "description": "This sets the default program header - applies when a SAS program does NOT begin with `/**`.",
64
+ "default": "/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/",
65
+ "examples": []
66
+ },
56
67
  "hasMacroNameInMend": {
57
68
  "$id": "#/properties/hasMacroNameInMend",
58
69
  "type": "boolean",
@@ -143,11 +154,11 @@
143
154
  },
144
155
  "ignoreList": {
145
156
  "$id": "#/properties/ignoreList",
146
- "type": "object",
157
+ "type": "array",
147
158
  "title": "ignoreList",
148
- "description": "An array of paths or path patterns to ignore matching resources from linting. Files or folders matching patterns in .gitignore will always be ignored.",
159
+ "description": "An array of paths or path patterns to ignore when linting. Any files or matching patterns in the .gitignore file will also be ignored.",
149
160
  "default": ["sasjsbuild/", "sasjsresults/"],
150
- "examples": ["sasjs/services", "appinit.sas"]
161
+ "examples": ["sasjs/tests", "tmp/scratch.sas"]
151
162
  }
152
163
  }
153
164
  }
@@ -15,5 +15,6 @@ export declare class LintConfig {
15
15
  readonly maxLineLength: number;
16
16
  readonly indentationMultiple: number;
17
17
  readonly lineEndings: LineEndings;
18
+ readonly defaultHeader: string;
18
19
  constructor(json?: any);
19
20
  }
@@ -5,6 +5,7 @@ var file_1 = require("../rules/file");
5
5
  var line_1 = require("../rules/line");
6
6
  var path_1 = require("../rules/path");
7
7
  var LineEndings_1 = require("./LineEndings");
8
+ var utils_1 = require("../utils");
8
9
  /**
9
10
  * LintConfig is the logical representation of the .sasjslint file.
10
11
  * It exposes two sets of rules - one to be run against each line in a file,
@@ -22,6 +23,7 @@ var LintConfig = /** @class */ (function () {
22
23
  this.maxLineLength = 80;
23
24
  this.indentationMultiple = 2;
24
25
  this.lineEndings = LineEndings_1.LineEndings.LF;
26
+ this.defaultHeader = utils_1.getDefaultHeader();
25
27
  if (json === null || json === void 0 ? void 0 : json.ignoreList) {
26
28
  if (Array.isArray(json.ignoreList)) {
27
29
  json.ignoreList.forEach(function (item) {
@@ -63,6 +65,9 @@ var LintConfig = /** @class */ (function () {
63
65
  if (json === null || json === void 0 ? void 0 : json.hasDoxygenHeader) {
64
66
  this.fileLintRules.push(file_1.hasDoxygenHeader);
65
67
  }
68
+ if (json === null || json === void 0 ? void 0 : json.defaultHeader) {
69
+ this.defaultHeader = json.defaultHeader;
70
+ }
66
71
  if (json === null || json === void 0 ? void 0 : json.noSpacesInFileNames) {
67
72
  this.pathLintRules.push(path_1.noSpacesInFileNames);
68
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LintConfig.js","sourceRoot":"","sources":["../../src/types/LintConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LintConfig.js","sourceRoot":"","sources":["../../src/types/LintConfig.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { LintConfig } from '../types/LintConfig';
2
+ export declare const getDefaultHeader: () => string;
2
3
  /**
3
4
  * Default configuration that is used when a .sasjslint file is not found
4
5
  */
@@ -15,6 +16,7 @@ export declare const DefaultLintConfiguration: {
15
16
  noNestedMacros: boolean;
16
17
  hasMacroParentheses: boolean;
17
18
  strictMacroDefinition: boolean;
19
+ defaultHeader: string;
18
20
  };
19
21
  /**
20
22
  * Fetches the config from the .sasjslint file and creates a LintConfig object.
@@ -39,11 +39,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
39
39
  return (mod && mod.__esModule) ? mod : { "default": mod };
40
40
  };
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.getLintConfig = exports.DefaultLintConfiguration = void 0;
42
+ exports.getLintConfig = exports.DefaultLintConfiguration = exports.getDefaultHeader = void 0;
43
43
  var path_1 = __importDefault(require("path"));
44
44
  var LintConfig_1 = require("../types/LintConfig");
45
45
  var file_1 = require("@sasjs/utils/file");
46
46
  var getProjectRoot_1 = require("./getProjectRoot");
47
+ var getDefaultHeader = function () {
48
+ return "/**{lineEnding} @file{lineEnding} @brief <Your brief here>{lineEnding} <h4> SAS Macros </h4>{lineEnding}**/";
49
+ };
50
+ exports.getDefaultHeader = getDefaultHeader;
47
51
  /**
48
52
  * Default configuration that is used when a .sasjslint file is not found
49
53
  */
@@ -59,7 +63,8 @@ exports.DefaultLintConfiguration = {
59
63
  hasMacroNameInMend: true,
60
64
  noNestedMacros: true,
61
65
  hasMacroParentheses: true,
62
- strictMacroDefinition: true
66
+ strictMacroDefinition: true,
67
+ defaultHeader: exports.getDefaultHeader()
63
68
  };
64
69
  /**
65
70
  * Fetches the config from the .sasjslint file and creates a LintConfig object.
@@ -1 +1 @@
1
- {"version":3,"file":"getLintConfig.js","sourceRoot":"","sources":["../../src/utils/getLintConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAuB;AACvB,kDAAgD;AAChD,0CAA4C;AAC5C,mDAAiD;AAEjD;;GAEG;AACU,QAAA,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,qBAAqB,EAAE,IAAI;CAC5B,CAAA;AAED;;;;GAIG;AACH,SAAsB,aAAa;;;;;wBACb,qBAAM,+BAAc,EAAE,EAAA;;oBAApC,WAAW,GAAG,SAAsB;oBACpB,qBAAM,eAAQ,CAClC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CACrC,CAAC,KAAK,CAAC,UAAC,CAAC;4BACR,OAAO,IAAI,CAAC,SAAS,CAAC,gCAAwB,CAAC,CAAA;wBACjD,CAAC,CAAC,EAAA;;oBAJI,aAAa,GAAG,SAIpB;oBACF,sBAAO,IAAI,uBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAA;;;;CACjD;AARD,sCAQC"}
1
+ {"version":3,"file":"getLintConfig.js","sourceRoot":"","sources":["../../src/utils/getLintConfig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAuB;AACvB,kDAAgD;AAChD,0CAA4C;AAC5C,mDAAiD;AAE1C,IAAM,gBAAgB,GAAG;IAC9B,OAAA,gHAAgH;AAAhH,CAAgH,CAAA;AADrG,QAAA,gBAAgB,oBACqF;AAElH;;GAEG;AACU,QAAA,wBAAwB,GAAG;IACtC,gBAAgB,EAAE,IAAI;IACtB,kBAAkB,EAAE,IAAI;IACxB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,IAAI;IACzB,kBAAkB,EAAE,IAAI;IACxB,aAAa,EAAE,EAAE;IACjB,gBAAgB,EAAE,IAAI;IACtB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,IAAI;IACxB,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,wBAAgB,EAAE;CAClC,CAAA;AAED;;;;GAIG;AACH,SAAsB,aAAa;;;;;wBACb,qBAAM,+BAAc,EAAE,EAAA;;oBAApC,WAAW,GAAG,SAAsB;oBACpB,qBAAM,eAAQ,CAClC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CACrC,CAAC,KAAK,CAAC,UAAC,CAAC;4BACR,OAAO,IAAI,CAAC,SAAS,CAAC,gCAAwB,CAAC,CAAA;wBACjD,CAAC,CAAC,EAAA;;oBAJI,aAAa,GAAG,SAIpB;oBACF,sBAAO,IAAI,uBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAA;;;;CACjD;AARD,sCAQC"}