@jesscss/plugin-scss 2.0.0-alpha.7 → 2.0.0-alpha.9
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 +34 -2
- package/lib/index.cjs +14 -88
- package/lib/index.d.ts +34 -0
- package/lib/index.js +15 -66
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @jesscss/plugin-scss
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**The SCSS language engine for Jess — the experimental base that seeds
|
|
4
|
+
"Sass+".**
|
|
5
|
+
|
|
6
|
+
This plugin layers an SCSS grammar (`@jesscss/scss-parser`) onto the Jess
|
|
7
|
+
compiler, the same way [`@jesscss/plugin-less`](../jess-plugin-less) provides the
|
|
8
|
+
Less engine. It parses `.scss` into the Jess AST for the engine to evaluate and
|
|
9
|
+
emit.
|
|
10
|
+
|
|
11
|
+
## Roadmap status — experimental, not the alpha focus
|
|
12
|
+
|
|
13
|
+
Jess's language is an **ordered progression: Now Less.js → Next "Sass+" →
|
|
14
|
+
Final `.jess`.** Only Less.js is shipping today.
|
|
15
|
+
|
|
16
|
+
`plugin-scss` sits at the **"Next"** milestone. It is the experimental base for
|
|
17
|
+
**Sass+** — the intended Sass successor, a dialect that fixes and extends
|
|
18
|
+
Sass-style ergonomics — but Sass+ itself is **not shipped**, and SCSS support is
|
|
19
|
+
**not a goal of the current Less-focused alpha.** Expect gaps and breaking
|
|
20
|
+
changes. If you need production Sass today, use Sass.
|
|
21
|
+
|
|
22
|
+
What exists now is the SCSS parser plus this plugin wiring; the Sass+ dialect,
|
|
23
|
+
semantics, and defaults are still being designed. Treat anything here as a
|
|
24
|
+
preview, not a promise.
|
|
25
|
+
|
|
26
|
+
## Status
|
|
27
|
+
|
|
28
|
+
**Alpha / experimental.** Part of [Jess](https://github.com/jesscss/jess). The
|
|
29
|
+
programmatic plugin/compiler API is **not yet stabilized** — the `jess` CLI is
|
|
30
|
+
the documented public surface for the alpha, and it targets Less today.
|
|
31
|
+
|
|
32
|
+
- Project overview & positioning: <https://github.com/jesscss/jess#readme>
|
|
33
|
+
- Docs: <https://jesscss.github.io/> (currently pre-alpha content)
|
|
34
|
+
- Issues: <https://github.com/jesscss/jess/issues>
|
|
35
|
+
- License: MIT
|
package/lib/index.cjs
CHANGED
|
@@ -2,38 +2,13 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
//#region \0rolldown/runtime.js
|
|
6
|
-
var __create = Object.create;
|
|
7
|
-
var __defProp = Object.defineProperty;
|
|
8
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
9
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
10
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
11
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
14
|
-
key = keys[i];
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
16
|
-
get: ((k) => from[k]).bind(null, key),
|
|
17
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
return to;
|
|
21
|
-
};
|
|
22
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
-
value: mod,
|
|
24
|
-
enumerable: true
|
|
25
|
-
}) : target, mod));
|
|
26
|
-
//#endregion
|
|
27
5
|
let _jesscss_core = require("@jesscss/core");
|
|
28
|
-
let
|
|
29
|
-
let node_path = require("node:path");
|
|
30
|
-
node_path = __toESM(node_path);
|
|
6
|
+
let _jesscss_scss_parser = require("@jesscss/scss-parser");
|
|
31
7
|
let _jesscss_style_resolver = require("@jesscss/style-resolver");
|
|
32
8
|
//#region src/index.ts
|
|
33
9
|
var ScssPlugin = class extends _jesscss_core.AbstractPlugin {
|
|
34
10
|
name = "scss";
|
|
35
11
|
supportedExtensions = [".scss"];
|
|
36
|
-
parser;
|
|
37
12
|
unitMode;
|
|
38
13
|
equalityMode;
|
|
39
14
|
constructor(opts = {}) {
|
|
@@ -41,77 +16,28 @@ var ScssPlugin = class extends _jesscss_core.AbstractPlugin {
|
|
|
41
16
|
this.opts = opts;
|
|
42
17
|
this.unitMode = opts.unitMode ?? "preserve";
|
|
43
18
|
this.equalityMode = opts.equalityMode ?? "sass";
|
|
44
|
-
this.parser = new _jesscss_scss_parser_jess.Parser();
|
|
45
19
|
}
|
|
46
20
|
expandImport(importPath) {
|
|
47
21
|
return (0, _jesscss_style_resolver.expandScssImportCandidates)(importPath);
|
|
48
22
|
}
|
|
49
|
-
safeParse(filePath, source
|
|
50
|
-
const allowExtendSelectors = this.opts.allowExtendSelectors ?? parseOptions?.compilerOptions?.allowExtendSelectors ?? ["simple"];
|
|
51
|
-
const context = new _jesscss_core.TreeContext({
|
|
52
|
-
file: {
|
|
53
|
-
name: node_path.default.basename(filePath),
|
|
54
|
-
path: node_path.default.dirname(filePath),
|
|
55
|
-
fullPath: filePath,
|
|
56
|
-
source
|
|
57
|
-
},
|
|
58
|
-
plugin: this,
|
|
59
|
-
allowExtendSelectors,
|
|
60
|
-
unitMode: this.unitMode,
|
|
61
|
-
equalityMode: this.equalityMode,
|
|
62
|
-
collapseNesting: this.opts.collapseNesting ?? false
|
|
63
|
-
});
|
|
64
|
-
const errors = [];
|
|
65
|
-
const warnings = [];
|
|
66
|
-
let tree;
|
|
23
|
+
safeParse(filePath, source) {
|
|
67
24
|
try {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (!diagnostic.lines) diagnostic.lines = (0, _jesscss_core.extractRelevantLines)(source, line);
|
|
74
|
-
if ("errors" in diagnostic) errors.push(diagnostic);
|
|
75
|
-
else warnings.push(diagnostic);
|
|
76
|
-
}
|
|
77
|
-
const lexErrors = parseResult.lexerResult?.errors ?? [];
|
|
78
|
-
if (lexErrors.length) for (const lexError of lexErrors) {
|
|
79
|
-
const line = typeof lexError.line === "number" ? lexError.line : 1;
|
|
80
|
-
const diagnostic = (0, _jesscss_core.toDiagnostic)((0, _jesscss_core.getErrorFromParser)([], [lexError], filePath, source, { file: context.file }));
|
|
81
|
-
if (!diagnostic.lines) diagnostic.lines = (0, _jesscss_core.extractRelevantLines)(source, line);
|
|
82
|
-
if ("errors" in diagnostic) errors.push(diagnostic);
|
|
83
|
-
else warnings.push(diagnostic);
|
|
84
|
-
}
|
|
25
|
+
return {
|
|
26
|
+
document: (0, _jesscss_scss_parser.parse)(source),
|
|
27
|
+
errors: [],
|
|
28
|
+
warnings: []
|
|
29
|
+
};
|
|
85
30
|
} catch (error) {
|
|
86
|
-
if (error instanceof _jesscss_core.JessError) {
|
|
87
|
-
const diagnostic = (0, _jesscss_core.toDiagnostic)(error);
|
|
88
|
-
if ("errors" in diagnostic) errors.push(diagnostic);
|
|
89
|
-
else warnings.push(diagnostic);
|
|
90
|
-
} else {
|
|
91
|
-
const message = error instanceof Error ? error.message : "Unknown parsing error";
|
|
92
|
-
errors.push({
|
|
93
|
-
code: "internal/unknown",
|
|
94
|
-
phase: "parse",
|
|
95
|
-
message,
|
|
96
|
-
reason: message,
|
|
97
|
-
fix: "Check the file syntax and ensure it is valid.",
|
|
98
|
-
file: context.file,
|
|
99
|
-
filePath,
|
|
100
|
-
line: 1,
|
|
101
|
-
column: 1,
|
|
102
|
-
lines: (0, _jesscss_core.extractRelevantLines)(source, 1)
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
31
|
return {
|
|
106
|
-
errors,
|
|
107
|
-
|
|
32
|
+
errors: [(0, _jesscss_core.parserDiagnostic)({
|
|
33
|
+
dialect: "SCSS",
|
|
34
|
+
error,
|
|
35
|
+
filePath,
|
|
36
|
+
source
|
|
37
|
+
})],
|
|
38
|
+
warnings: []
|
|
108
39
|
};
|
|
109
40
|
}
|
|
110
|
-
return {
|
|
111
|
-
tree,
|
|
112
|
-
errors,
|
|
113
|
-
warnings
|
|
114
|
-
};
|
|
115
41
|
}
|
|
116
42
|
};
|
|
117
43
|
const scssPlugin = ((opts) => new ScssPlugin(opts));
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AbstractPlugin, type ISafeParseResult, type EqualityMode, type UnitMode } from '@jesscss/core';
|
|
2
|
+
export type ScssPluginOptions = {
|
|
3
|
+
allowExtendSelectors?: ExtendSelectorKind[];
|
|
4
|
+
/**
|
|
5
|
+
* Compatibility input retained on this frontend's option object. The shared
|
|
6
|
+
* evaluator reads the resolved Context compile/input option; configuring a
|
|
7
|
+
* Compiler should use `compile.unitMode` or matched input options.
|
|
8
|
+
*/
|
|
9
|
+
unitMode?: UnitMode;
|
|
10
|
+
/**
|
|
11
|
+
* Compatibility input retained on this frontend's option object. It does not
|
|
12
|
+
* select a separate SCSS evaluator; configure the shared evaluator through
|
|
13
|
+
* Context compile/input options.
|
|
14
|
+
*/
|
|
15
|
+
equalityMode?: EqualityMode;
|
|
16
|
+
/**
|
|
17
|
+
* Whether to collapse nested selectors (flatten nesting during print).
|
|
18
|
+
* This is a Jess output option, not a Sass option.
|
|
19
|
+
*/
|
|
20
|
+
collapseNesting?: boolean;
|
|
21
|
+
};
|
|
22
|
+
type ExtendSelectorKind = 'simple' | 'basic' | 'pseudo' | 'complex' | 'compound';
|
|
23
|
+
export declare class ScssPlugin extends AbstractPlugin {
|
|
24
|
+
opts: ScssPluginOptions;
|
|
25
|
+
name: string;
|
|
26
|
+
supportedExtensions: string[];
|
|
27
|
+
unitMode: UnitMode;
|
|
28
|
+
equalityMode: EqualityMode;
|
|
29
|
+
constructor(opts?: ScssPluginOptions);
|
|
30
|
+
expandImport(importPath: string): string[];
|
|
31
|
+
safeParse(filePath: string, source: string): ISafeParseResult;
|
|
32
|
+
}
|
|
33
|
+
declare const scssPlugin: (opts?: ScssPluginOptions) => ScssPlugin;
|
|
34
|
+
export default scssPlugin;
|
package/lib/index.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { AbstractPlugin,
|
|
2
|
-
import {
|
|
3
|
-
import path from "node:path";
|
|
1
|
+
import { AbstractPlugin, parserDiagnostic } from "@jesscss/core";
|
|
2
|
+
import { parse } from "@jesscss/scss-parser";
|
|
4
3
|
import { expandScssImportCandidates } from "@jesscss/style-resolver";
|
|
5
4
|
//#region src/index.ts
|
|
6
5
|
var ScssPlugin = class extends AbstractPlugin {
|
|
7
6
|
name = "scss";
|
|
8
7
|
supportedExtensions = [".scss"];
|
|
9
|
-
parser;
|
|
10
8
|
unitMode;
|
|
11
9
|
equalityMode;
|
|
12
10
|
constructor(opts = {}) {
|
|
@@ -14,77 +12,28 @@ var ScssPlugin = class extends AbstractPlugin {
|
|
|
14
12
|
this.opts = opts;
|
|
15
13
|
this.unitMode = opts.unitMode ?? "preserve";
|
|
16
14
|
this.equalityMode = opts.equalityMode ?? "sass";
|
|
17
|
-
this.parser = new Parser();
|
|
18
15
|
}
|
|
19
16
|
expandImport(importPath) {
|
|
20
17
|
return expandScssImportCandidates(importPath);
|
|
21
18
|
}
|
|
22
|
-
safeParse(filePath, source
|
|
23
|
-
const allowExtendSelectors = this.opts.allowExtendSelectors ?? parseOptions?.compilerOptions?.allowExtendSelectors ?? ["simple"];
|
|
24
|
-
const context = new TreeContext({
|
|
25
|
-
file: {
|
|
26
|
-
name: path.basename(filePath),
|
|
27
|
-
path: path.dirname(filePath),
|
|
28
|
-
fullPath: filePath,
|
|
29
|
-
source
|
|
30
|
-
},
|
|
31
|
-
plugin: this,
|
|
32
|
-
allowExtendSelectors,
|
|
33
|
-
unitMode: this.unitMode,
|
|
34
|
-
equalityMode: this.equalityMode,
|
|
35
|
-
collapseNesting: this.opts.collapseNesting ?? false
|
|
36
|
-
});
|
|
37
|
-
const errors = [];
|
|
38
|
-
const warnings = [];
|
|
39
|
-
let tree;
|
|
19
|
+
safeParse(filePath, source) {
|
|
40
20
|
try {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (!diagnostic.lines) diagnostic.lines = extractRelevantLines(source, line);
|
|
47
|
-
if ("errors" in diagnostic) errors.push(diagnostic);
|
|
48
|
-
else warnings.push(diagnostic);
|
|
49
|
-
}
|
|
50
|
-
const lexErrors = parseResult.lexerResult?.errors ?? [];
|
|
51
|
-
if (lexErrors.length) for (const lexError of lexErrors) {
|
|
52
|
-
const line = typeof lexError.line === "number" ? lexError.line : 1;
|
|
53
|
-
const diagnostic = toDiagnostic(getErrorFromParser([], [lexError], filePath, source, { file: context.file }));
|
|
54
|
-
if (!diagnostic.lines) diagnostic.lines = extractRelevantLines(source, line);
|
|
55
|
-
if ("errors" in diagnostic) errors.push(diagnostic);
|
|
56
|
-
else warnings.push(diagnostic);
|
|
57
|
-
}
|
|
21
|
+
return {
|
|
22
|
+
document: parse(source),
|
|
23
|
+
errors: [],
|
|
24
|
+
warnings: []
|
|
25
|
+
};
|
|
58
26
|
} catch (error) {
|
|
59
|
-
if (error instanceof JessError) {
|
|
60
|
-
const diagnostic = toDiagnostic(error);
|
|
61
|
-
if ("errors" in diagnostic) errors.push(diagnostic);
|
|
62
|
-
else warnings.push(diagnostic);
|
|
63
|
-
} else {
|
|
64
|
-
const message = error instanceof Error ? error.message : "Unknown parsing error";
|
|
65
|
-
errors.push({
|
|
66
|
-
code: "internal/unknown",
|
|
67
|
-
phase: "parse",
|
|
68
|
-
message,
|
|
69
|
-
reason: message,
|
|
70
|
-
fix: "Check the file syntax and ensure it is valid.",
|
|
71
|
-
file: context.file,
|
|
72
|
-
filePath,
|
|
73
|
-
line: 1,
|
|
74
|
-
column: 1,
|
|
75
|
-
lines: extractRelevantLines(source, 1)
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
27
|
return {
|
|
79
|
-
errors
|
|
80
|
-
|
|
28
|
+
errors: [parserDiagnostic({
|
|
29
|
+
dialect: "SCSS",
|
|
30
|
+
error,
|
|
31
|
+
filePath,
|
|
32
|
+
source
|
|
33
|
+
})],
|
|
34
|
+
warnings: []
|
|
81
35
|
};
|
|
82
36
|
}
|
|
83
|
-
return {
|
|
84
|
-
tree,
|
|
85
|
-
errors,
|
|
86
|
-
warnings
|
|
87
|
-
};
|
|
88
37
|
}
|
|
89
38
|
};
|
|
90
39
|
const scssPlugin = ((opts) => new ScssPlugin(opts));
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
6
|
"description": "An SCSS stylesheet engine for Jess",
|
|
7
|
-
"version": "2.0.0-alpha.
|
|
7
|
+
"version": "2.0.0-alpha.9",
|
|
8
8
|
"main": "lib/index.cjs",
|
|
9
9
|
"types": "lib/index.d.ts",
|
|
10
10
|
"exports": {
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"lib"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@jesscss/core": "2.0.0-alpha.
|
|
23
|
-
"@jesscss/scss-parser": "2.0.0-alpha.
|
|
24
|
-
"@jesscss/style-resolver": "2.0.0-alpha.
|
|
22
|
+
"@jesscss/core": "2.0.0-alpha.9",
|
|
23
|
+
"@jesscss/scss-parser": "2.0.0-alpha.9",
|
|
24
|
+
"@jesscss/style-resolver": "2.0.0-alpha.9"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {},
|
|
27
27
|
"author": "Matthew Dean <matthew-dean@users.noreply.github.com>",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"scripts": {
|
|
36
36
|
"ci": "pnpm build && pnpm test",
|
|
37
37
|
"build": "pnpm compile",
|
|
38
|
-
"compile": "tsdown --tsconfig tsconfig.build.json --no-dts && tsc -p tsconfig.build.json --emitDeclarationOnly
|
|
38
|
+
"compile": "tsdown --tsconfig tsconfig.build.json --no-dts && tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
39
39
|
"test": "vitest --run --passWithNoTests",
|
|
40
40
|
"lint:fix": "eslint --fix '**/*.{js,ts}'",
|
|
41
41
|
"lint": "eslint '**/*.{js,ts}'"
|