kist 0.1.38 → 0.1.40
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/js/actions/TemplateRenderAction/TemplateRenderAction.d.ts +1 -0
- package/js/actions/TemplateRenderAction/TemplateRenderAction.js +23 -7
- package/js/cli/ArgumentParser.js +1 -0
- package/js/core/config/ConfigLoader.js +33 -0
- package/js/core/config/ConfigStore.js +7 -3
- package/package.json +1 -2
- package/ts/actions/TemplateRenderAction/TemplateRenderAction.ts +31 -8
- package/ts/cli/ArgumentParser.ts +2 -1
- package/ts/core/config/ConfigLoader.ts +41 -0
- package/ts/core/config/ConfigStore.ts +23 -6
- package/ts/index.ts +0 -2
- package/ts/actions/SassDocAction/SassDocAction.ts +0 -66
- package/ts/actions/SassDocAction/index.ts +0 -11
|
@@ -3,6 +3,7 @@ import { ActionOptionsType } from "../../types/ActionOptionsType";
|
|
|
3
3
|
export declare class TemplateRenderAction extends Action {
|
|
4
4
|
execute(options: ActionOptionsType): Promise<void>;
|
|
5
5
|
private renderTemplate;
|
|
6
|
+
private mergeContextFiles;
|
|
6
7
|
describe(): string;
|
|
7
8
|
}
|
|
8
9
|
export default TemplateRenderAction;
|
|
@@ -28,9 +28,11 @@ const nunjucks_config_js_1 = __importDefault(require("./nunjucks.config.js"));
|
|
|
28
28
|
class TemplateRenderAction extends Action_1.Action {
|
|
29
29
|
execute(options) {
|
|
30
30
|
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
const { templatesDir = "./templates", outputDir = "./dist", templates = [], context = {}, renderAllFromDir = false, customConfig = {}, } = options;
|
|
31
|
+
const { templatesDir = "./templates", outputDir = "./dist", templates = [], context = {}, contextFiles = [], renderAllFromDir = false, customConfig = {}, } = options;
|
|
32
32
|
const config = Object.assign(Object.assign({}, nunjucks_config_js_1.default), customConfig);
|
|
33
33
|
nunjucks_1.default.configure(templatesDir, config);
|
|
34
|
+
// Load and merge all JSON context files
|
|
35
|
+
const mergedContext = yield this.mergeContextFiles(context, contextFiles);
|
|
34
36
|
try {
|
|
35
37
|
if (renderAllFromDir) {
|
|
36
38
|
this.logInfo(`Auto-rendering all templates from ${templatesDir}...`);
|
|
@@ -39,7 +41,7 @@ class TemplateRenderAction extends Action_1.Action {
|
|
|
39
41
|
});
|
|
40
42
|
for (const templateRelPath of templateFiles) {
|
|
41
43
|
const outputFile = path_1.default.join(outputDir, templateRelPath.replace(/\.jinja$/, ""));
|
|
42
|
-
yield this.renderTemplate(templateRelPath, outputFile,
|
|
44
|
+
yield this.renderTemplate(templateRelPath, outputFile, mergedContext, templatesDir);
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
47
|
else {
|
|
@@ -47,7 +49,7 @@ class TemplateRenderAction extends Action_1.Action {
|
|
|
47
49
|
throw new Error("Option 'templates' must be provided if 'renderAllFromDir' is false.");
|
|
48
50
|
}
|
|
49
51
|
for (const { template, outputFile } of templates) {
|
|
50
|
-
yield this.renderTemplate(template, outputFile,
|
|
52
|
+
yield this.renderTemplate(template, outputFile, mergedContext, templatesDir);
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
55
|
this.logInfo("✓ All templates rendered successfully.");
|
|
@@ -68,12 +70,26 @@ class TemplateRenderAction extends Action_1.Action {
|
|
|
68
70
|
this.logInfo(`✓ Rendered: ${outputFile}`);
|
|
69
71
|
});
|
|
70
72
|
}
|
|
73
|
+
mergeContextFiles(baseContext, files) {
|
|
74
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
75
|
+
let merged = Object.assign({}, baseContext);
|
|
76
|
+
for (const file of files) {
|
|
77
|
+
try {
|
|
78
|
+
const content = yield (0, promises_1.readFile)(file, "utf-8");
|
|
79
|
+
const parsed = JSON.parse(content);
|
|
80
|
+
merged = Object.assign(Object.assign({}, merged), parsed);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.logWarn(`Skipping context file due to error: ${file}`);
|
|
84
|
+
this.logError("Context file parsing failed", error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return merged;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
71
90
|
describe() {
|
|
72
|
-
return "Renders one or many Nunjucks templates using a shared context. Supports folder-wide auto-rendering.";
|
|
91
|
+
return "Renders one or many Nunjucks templates using a shared context or context files. Supports folder-wide auto-rendering.";
|
|
73
92
|
}
|
|
74
93
|
}
|
|
75
94
|
exports.TemplateRenderAction = TemplateRenderAction;
|
|
76
|
-
// ============================================================================
|
|
77
|
-
// Export
|
|
78
|
-
// ============================================================================
|
|
79
95
|
exports.default = TemplateRenderAction;
|
package/js/cli/ArgumentParser.js
CHANGED
|
@@ -24,6 +24,7 @@ class ArgumentParser extends AbstractProcess_1.AbstractProcess {
|
|
|
24
24
|
* @param args - Command-line arguments. Defaults to `process.argv.slice(2)`.
|
|
25
25
|
*/
|
|
26
26
|
constructor() {
|
|
27
|
+
// args: string[] = process.argv.slice(2)
|
|
27
28
|
super();
|
|
28
29
|
// Skip Node.js and script path
|
|
29
30
|
this.args = process.argv.slice(2);
|
|
@@ -70,11 +70,44 @@ class ConfigLoader extends AbstractProcess_1.AbstractProcess {
|
|
|
70
70
|
}
|
|
71
71
|
catch (error) {
|
|
72
72
|
this.logDebug(`File not accessible: ${resolvedPath}`);
|
|
73
|
+
// ❗ If user explicitly provided --config and it fails, stop immediately
|
|
74
|
+
if (cliPath) {
|
|
75
|
+
throw new Error(`Configuration file not found or not accessible: ${resolvedPath}`);
|
|
76
|
+
}
|
|
73
77
|
}
|
|
74
78
|
}
|
|
75
79
|
this.logWarn("No configuration file found. Proceeding with default settings.");
|
|
76
80
|
});
|
|
77
81
|
}
|
|
82
|
+
// public async initialize(): Promise<void> {
|
|
83
|
+
// const parser = new ArgumentParser();
|
|
84
|
+
// const cliFlags = parser.getAllFlags();
|
|
85
|
+
// const cliPath =
|
|
86
|
+
// typeof cliFlags.config === "string" ? cliFlags.config : undefined;
|
|
87
|
+
// const searchPaths = cliPath ? [cliPath] : this.defaultFilenames;
|
|
88
|
+
// this.logDebug(`Current working directory: ${process.cwd()}`);
|
|
89
|
+
// this.logDebug(
|
|
90
|
+
// `Searching for config file${cliPath ? ` from --config=${cliPath}` : ""}...`,
|
|
91
|
+
// );
|
|
92
|
+
// for (const fileName of searchPaths) {
|
|
93
|
+
// const resolvedPath = path.resolve(process.cwd(), fileName);
|
|
94
|
+
// this.logDebug(`Checking: ${resolvedPath}`);
|
|
95
|
+
// try {
|
|
96
|
+
// await fs.promises.access(
|
|
97
|
+
// resolvedPath,
|
|
98
|
+
// fs.constants.F_OK | fs.constants.R_OK,
|
|
99
|
+
// );
|
|
100
|
+
// this.configPath = resolvedPath;
|
|
101
|
+
// this.logDebug(`Configuration file found: ${resolvedPath}`);
|
|
102
|
+
// return;
|
|
103
|
+
// } catch (error) {
|
|
104
|
+
// this.logDebug(`File not accessible: ${resolvedPath}`);
|
|
105
|
+
// }
|
|
106
|
+
// }
|
|
107
|
+
// this.logWarn(
|
|
108
|
+
// "No configuration file found. Proceeding with default settings.",
|
|
109
|
+
// );
|
|
110
|
+
// }
|
|
78
111
|
/**
|
|
79
112
|
* Loads and validates the configuration file.
|
|
80
113
|
*
|
|
@@ -65,7 +65,8 @@ class ConfigStore extends AbstractProcess_1.AbstractProcess {
|
|
|
65
65
|
return;
|
|
66
66
|
}
|
|
67
67
|
// Ensure property exists and is an object
|
|
68
|
-
if (!Object.prototype.hasOwnProperty.call(current, k) ||
|
|
68
|
+
if (!Object.prototype.hasOwnProperty.call(current, k) ||
|
|
69
|
+
typeof current[k] !== "object") {
|
|
69
70
|
current[k] = Object.create(null); // Use a null prototype object
|
|
70
71
|
}
|
|
71
72
|
current = current[k];
|
|
@@ -118,8 +119,11 @@ class ConfigStore extends AbstractProcess_1.AbstractProcess {
|
|
|
118
119
|
this.logWarn(`Skipping unsafe key during merge: "${key}"`);
|
|
119
120
|
continue;
|
|
120
121
|
}
|
|
121
|
-
if (source[key] &&
|
|
122
|
-
|
|
122
|
+
if (source[key] &&
|
|
123
|
+
typeof source[key] === "object" &&
|
|
124
|
+
!Array.isArray(source[key])) {
|
|
125
|
+
if (!Object.prototype.hasOwnProperty.call(target, key) ||
|
|
126
|
+
typeof target[key] !== "object") {
|
|
123
127
|
target[key] = Object.create(null);
|
|
124
128
|
}
|
|
125
129
|
target[key] = this.deepMerge(target[key], source[key]);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kist",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.40",
|
|
4
4
|
"description": "Package Pipeline Processor",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"kist",
|
|
@@ -86,7 +86,6 @@
|
|
|
86
86
|
"postcss-preset-env": "^10.0.0",
|
|
87
87
|
"prettier": "^3.0.3",
|
|
88
88
|
"sass": "^1.69.7",
|
|
89
|
-
"sassdoc": "^2.7.4",
|
|
90
89
|
"semver": "^7.5.4",
|
|
91
90
|
"svg-sprite": "^2.0.2",
|
|
92
91
|
"svgo": "^3.1.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Imports
|
|
3
3
|
// ============================================================================
|
|
4
4
|
|
|
5
|
-
import { mkdir, writeFile } from "fs/promises";
|
|
5
|
+
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
6
6
|
import { glob } from "glob";
|
|
7
7
|
import nunjucks from "nunjucks";
|
|
8
8
|
import path from "path";
|
|
@@ -21,6 +21,7 @@ export class TemplateRenderAction extends Action {
|
|
|
21
21
|
outputDir = "./dist",
|
|
22
22
|
templates = [],
|
|
23
23
|
context = {},
|
|
24
|
+
contextFiles = [],
|
|
24
25
|
renderAllFromDir = false,
|
|
25
26
|
customConfig = {},
|
|
26
27
|
} = options;
|
|
@@ -28,6 +29,12 @@ export class TemplateRenderAction extends Action {
|
|
|
28
29
|
const config = { ...nunjucksConfig, ...customConfig };
|
|
29
30
|
nunjucks.configure(templatesDir, config);
|
|
30
31
|
|
|
32
|
+
// Load and merge all JSON context files
|
|
33
|
+
const mergedContext = await this.mergeContextFiles(
|
|
34
|
+
context,
|
|
35
|
+
contextFiles,
|
|
36
|
+
);
|
|
37
|
+
|
|
31
38
|
try {
|
|
32
39
|
if (renderAllFromDir) {
|
|
33
40
|
this.logInfo(
|
|
@@ -45,7 +52,7 @@ export class TemplateRenderAction extends Action {
|
|
|
45
52
|
await this.renderTemplate(
|
|
46
53
|
templateRelPath,
|
|
47
54
|
outputFile,
|
|
48
|
-
|
|
55
|
+
mergedContext,
|
|
49
56
|
templatesDir,
|
|
50
57
|
);
|
|
51
58
|
}
|
|
@@ -60,7 +67,7 @@ export class TemplateRenderAction extends Action {
|
|
|
60
67
|
await this.renderTemplate(
|
|
61
68
|
template,
|
|
62
69
|
outputFile,
|
|
63
|
-
|
|
70
|
+
mergedContext,
|
|
64
71
|
templatesDir,
|
|
65
72
|
);
|
|
66
73
|
}
|
|
@@ -89,13 +96,29 @@ export class TemplateRenderAction extends Action {
|
|
|
89
96
|
this.logInfo(`✓ Rendered: ${outputFile}`);
|
|
90
97
|
}
|
|
91
98
|
|
|
99
|
+
private async mergeContextFiles(
|
|
100
|
+
baseContext: Record<string, any>,
|
|
101
|
+
files: string[],
|
|
102
|
+
): Promise<Record<string, any>> {
|
|
103
|
+
let merged = { ...baseContext };
|
|
104
|
+
|
|
105
|
+
for (const file of files) {
|
|
106
|
+
try {
|
|
107
|
+
const content = await readFile(file, "utf-8");
|
|
108
|
+
const parsed = JSON.parse(content);
|
|
109
|
+
merged = { ...merged, ...parsed };
|
|
110
|
+
} catch (error) {
|
|
111
|
+
this.logWarn(`Skipping context file due to error: ${file}`);
|
|
112
|
+
this.logError("Context file parsing failed", error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return merged;
|
|
117
|
+
}
|
|
118
|
+
|
|
92
119
|
describe(): string {
|
|
93
|
-
return "Renders one or many Nunjucks templates using a shared context. Supports folder-wide auto-rendering.";
|
|
120
|
+
return "Renders one or many Nunjucks templates using a shared context or context files. Supports folder-wide auto-rendering.";
|
|
94
121
|
}
|
|
95
122
|
}
|
|
96
123
|
|
|
97
|
-
// ============================================================================
|
|
98
|
-
// Export
|
|
99
|
-
// ============================================================================
|
|
100
|
-
|
|
101
124
|
export default TemplateRenderAction;
|
package/ts/cli/ArgumentParser.ts
CHANGED
|
@@ -38,7 +38,8 @@ export class ArgumentParser extends AbstractProcess {
|
|
|
38
38
|
*
|
|
39
39
|
* @param args - Command-line arguments. Defaults to `process.argv.slice(2)`.
|
|
40
40
|
*/
|
|
41
|
-
constructor() {
|
|
41
|
+
constructor() {
|
|
42
|
+
// args: string[] = process.argv.slice(2)
|
|
42
43
|
super();
|
|
43
44
|
// Skip Node.js and script path
|
|
44
45
|
this.args = process.argv.slice(2);
|
|
@@ -73,6 +73,13 @@ export class ConfigLoader extends AbstractProcess {
|
|
|
73
73
|
return;
|
|
74
74
|
} catch (error) {
|
|
75
75
|
this.logDebug(`File not accessible: ${resolvedPath}`);
|
|
76
|
+
|
|
77
|
+
// ❗ If user explicitly provided --config and it fails, stop immediately
|
|
78
|
+
if (cliPath) {
|
|
79
|
+
throw new Error(
|
|
80
|
+
`Configuration file not found or not accessible: ${resolvedPath}`,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
76
83
|
}
|
|
77
84
|
}
|
|
78
85
|
|
|
@@ -80,6 +87,40 @@ export class ConfigLoader extends AbstractProcess {
|
|
|
80
87
|
"No configuration file found. Proceeding with default settings.",
|
|
81
88
|
);
|
|
82
89
|
}
|
|
90
|
+
// public async initialize(): Promise<void> {
|
|
91
|
+
// const parser = new ArgumentParser();
|
|
92
|
+
// const cliFlags = parser.getAllFlags();
|
|
93
|
+
// const cliPath =
|
|
94
|
+
// typeof cliFlags.config === "string" ? cliFlags.config : undefined;
|
|
95
|
+
|
|
96
|
+
// const searchPaths = cliPath ? [cliPath] : this.defaultFilenames;
|
|
97
|
+
|
|
98
|
+
// this.logDebug(`Current working directory: ${process.cwd()}`);
|
|
99
|
+
// this.logDebug(
|
|
100
|
+
// `Searching for config file${cliPath ? ` from --config=${cliPath}` : ""}...`,
|
|
101
|
+
// );
|
|
102
|
+
|
|
103
|
+
// for (const fileName of searchPaths) {
|
|
104
|
+
// const resolvedPath = path.resolve(process.cwd(), fileName);
|
|
105
|
+
// this.logDebug(`Checking: ${resolvedPath}`);
|
|
106
|
+
|
|
107
|
+
// try {
|
|
108
|
+
// await fs.promises.access(
|
|
109
|
+
// resolvedPath,
|
|
110
|
+
// fs.constants.F_OK | fs.constants.R_OK,
|
|
111
|
+
// );
|
|
112
|
+
// this.configPath = resolvedPath;
|
|
113
|
+
// this.logDebug(`Configuration file found: ${resolvedPath}`);
|
|
114
|
+
// return;
|
|
115
|
+
// } catch (error) {
|
|
116
|
+
// this.logDebug(`File not accessible: ${resolvedPath}`);
|
|
117
|
+
// }
|
|
118
|
+
// }
|
|
119
|
+
|
|
120
|
+
// this.logWarn(
|
|
121
|
+
// "No configuration file found. Proceeding with default settings.",
|
|
122
|
+
// );
|
|
123
|
+
// }
|
|
83
124
|
|
|
84
125
|
/**
|
|
85
126
|
* Loads and validates the configuration file.
|
|
@@ -80,7 +80,10 @@ export class ConfigStore extends AbstractProcess {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
// Ensure property exists and is an object
|
|
83
|
-
if (
|
|
83
|
+
if (
|
|
84
|
+
!Object.prototype.hasOwnProperty.call(current, k) ||
|
|
85
|
+
typeof current[k] !== "object"
|
|
86
|
+
) {
|
|
84
87
|
current[k] = Object.create(null); // Use a null prototype object
|
|
85
88
|
}
|
|
86
89
|
current = current[k];
|
|
@@ -90,12 +93,16 @@ export class ConfigStore extends AbstractProcess {
|
|
|
90
93
|
|
|
91
94
|
// Prevent prototype pollution at the final assignment
|
|
92
95
|
if (["__proto__", "constructor", "prototype"].includes(finalKey)) {
|
|
93
|
-
this.logWarn(
|
|
96
|
+
this.logWarn(
|
|
97
|
+
`Attempted prototype pollution detected: "${finalKey}"`,
|
|
98
|
+
);
|
|
94
99
|
return;
|
|
95
100
|
}
|
|
96
101
|
|
|
97
102
|
current[finalKey] = value;
|
|
98
|
-
this.logDebug(
|
|
103
|
+
this.logDebug(
|
|
104
|
+
`Set configuration key "${key}" to: ${JSON.stringify(value)}`,
|
|
105
|
+
);
|
|
99
106
|
}
|
|
100
107
|
|
|
101
108
|
/**
|
|
@@ -120,7 +127,10 @@ export class ConfigStore extends AbstractProcess {
|
|
|
120
127
|
* Prints the current configuration to the console.
|
|
121
128
|
*/
|
|
122
129
|
public print(): void {
|
|
123
|
-
console.log(
|
|
130
|
+
console.log(
|
|
131
|
+
"Current Configuration:",
|
|
132
|
+
JSON.stringify(this.config, null, 2),
|
|
133
|
+
);
|
|
124
134
|
}
|
|
125
135
|
|
|
126
136
|
/**
|
|
@@ -142,8 +152,15 @@ export class ConfigStore extends AbstractProcess {
|
|
|
142
152
|
continue;
|
|
143
153
|
}
|
|
144
154
|
|
|
145
|
-
if (
|
|
146
|
-
|
|
155
|
+
if (
|
|
156
|
+
source[key] &&
|
|
157
|
+
typeof source[key] === "object" &&
|
|
158
|
+
!Array.isArray(source[key])
|
|
159
|
+
) {
|
|
160
|
+
if (
|
|
161
|
+
!Object.prototype.hasOwnProperty.call(target, key) ||
|
|
162
|
+
typeof target[key] !== "object"
|
|
163
|
+
) {
|
|
147
164
|
target[key] = Object.create(null);
|
|
148
165
|
}
|
|
149
166
|
target[key] = this.deepMerge(target[key], source[key]);
|
package/ts/index.ts
CHANGED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
// // ============================================================================
|
|
2
|
-
// // Imports
|
|
3
|
-
// // ============================================================================
|
|
4
|
-
|
|
5
|
-
// // @ts-ignore: Implicit any type for sassdoc module
|
|
6
|
-
// import path from "path";
|
|
7
|
-
// import sassdoc from "sassdoc";
|
|
8
|
-
// import { Action } from "../../core/pipeline/Action";
|
|
9
|
-
// import { ActionOptionsType } from "../../types/ActionOptionsType";
|
|
10
|
-
|
|
11
|
-
// // ============================================================================
|
|
12
|
-
// // Classes
|
|
13
|
-
// // ============================================================================
|
|
14
|
-
|
|
15
|
-
// /**
|
|
16
|
-
// * SassDocAction generates SASS documentation using SassDoc.
|
|
17
|
-
// * This action allows specifying source directories, destination paths, and additional options.
|
|
18
|
-
// */
|
|
19
|
-
// export class SassDocAction extends Action {
|
|
20
|
-
// /**
|
|
21
|
-
// * Executes the SASS documentation generation process.
|
|
22
|
-
// *
|
|
23
|
-
// * @param options - The options specifying source directories, output path, and SassDoc configurations.
|
|
24
|
-
// * @returns A Promise that resolves when the documentation generation is completed successfully.
|
|
25
|
-
// * @throws {Error} Throws an error if the documentation process fails.
|
|
26
|
-
// */
|
|
27
|
-
// async execute(options: ActionOptionsType): Promise<void> {
|
|
28
|
-
// const {
|
|
29
|
-
// sourcePaths = ["src/styles"],
|
|
30
|
-
// outputPath = "docs/sass",
|
|
31
|
-
// sassdocOptions = {},
|
|
32
|
-
// } = options;
|
|
33
|
-
|
|
34
|
-
// if (!Array.isArray(sourcePaths) || sourcePaths.length === 0) {
|
|
35
|
-
// throw new Error("Invalid options: 'sourcePaths' must be a non-empty array.");
|
|
36
|
-
// }
|
|
37
|
-
|
|
38
|
-
// this.logInfo(`Generating SASS documentation in ${outputPath}...`);
|
|
39
|
-
|
|
40
|
-
// try {
|
|
41
|
-
// // Merge custom options with default options
|
|
42
|
-
// const config: sassdoc.Options = {
|
|
43
|
-
// dest: path.resolve(outputPath),
|
|
44
|
-
// verbose: true,
|
|
45
|
-
// ...sassdocOptions,
|
|
46
|
-
// };
|
|
47
|
-
|
|
48
|
-
// // Run SassDoc to generate documentation
|
|
49
|
-
// await sassdoc(sourcePaths, config);
|
|
50
|
-
|
|
51
|
-
// this.logInfo(`SASS documentation successfully generated at: ${config.dest}`);
|
|
52
|
-
// } catch (error) {
|
|
53
|
-
// this.logError("An error occurred while generating SASS documentation.", error);
|
|
54
|
-
// throw error;
|
|
55
|
-
// }
|
|
56
|
-
// }
|
|
57
|
-
|
|
58
|
-
// /**
|
|
59
|
-
// * Provides a description of the action.
|
|
60
|
-
// *
|
|
61
|
-
// * @returns A string description of the action.
|
|
62
|
-
// */
|
|
63
|
-
// describe(): string {
|
|
64
|
-
// return "Generates SASS documentation using SassDoc.";
|
|
65
|
-
// }
|
|
66
|
-
// }
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Import
|
|
3
|
-
// ============================================================================
|
|
4
|
-
|
|
5
|
-
// import { SassDocAction } from "./SassDocAction";
|
|
6
|
-
|
|
7
|
-
// ============================================================================
|
|
8
|
-
// Export
|
|
9
|
-
// ============================================================================
|
|
10
|
-
|
|
11
|
-
// export { SassDocAction };
|