Added logging, changed some directory structure

This commit is contained in:
2018-01-13 21:33:40 -05:00
parent f079a5f067
commit 8e72ffb917
73656 changed files with 35284 additions and 53718 deletions

View File

@@ -0,0 +1,100 @@
# CSS Modules: Scope Locals & Extend
[![Build Status](https://travis-ci.org/css-modules/postcss-modules-scope.svg?branch=master)](https://travis-ci.org/css-modules/postcss-modules-scope)
Transforms:
```css
:local(.continueButton) {
color: green;
}
```
into:
```css
:export {
continueButton: __buttons_continueButton_djd347adcxz9;
}
.__buttons_continueButton_djd347adcxz9 {
color: green;
}
```
so it doesn't pollute CSS global scope and can be simply used in JS like so:
```js
import styles from './buttons.css'
elem.innerHTML = `<button class="${styles.continueButton}">Continue</button>`
```
## Composition
Since we're exporting class names, there's no reason to export only one. This can give us some really useful reuse of styles:
```css
.globalButtonStyle {
background: white;
border: 1px solid;
border-radius: 0.25rem;
}
.globalButtonStyle:hover {
box-shadow: 0 0 4px -2px;
}
:local(.continueButton) {
compose-with: globalButtonStyle;
color: green;
}
```
becomes:
```
.globalButtonStyle {
background: white;
border: 1px solid;
border-radius: 0.25rem;
}
.globalButtonStyle:hover {
box-shadow: 0 0 4px -2px;
}
:local(.continueButton) {
compose-with: globalButtonStyle;
color: green;
}
```
**Note:** you can also use `composes` as a shorthand for `compose-with`
## Local-by-default & reuse across files
You're looking for [CSS Modules](https://github.com/css-modules/css-modules). It uses this plugin as well as a few others, and it's amazing.
## Building
```
npm install
npm test
```
[![Build Status](https://travis-ci.org/css-modules/postcss-modules-scope.svg?branch=master)](https://travis-ci.org/css-modules/postcss-modules-scope)
* Lines: [![Coverage Status](https://coveralls.io/repos/css-modules/postcss-modules-scope/badge.svg?branch=master)](https://coveralls.io/r/css-modules/postcss-modules-scope?branch=master)
* Statements: [![codecov.io](http://codecov.io/github/css-modules/postcss-modules-scope/coverage.svg?branch=master)](http://codecov.io/github/css-modules/postcss-modules-scope?branch=master)
## Development
- `npm autotest` will watch `src` and `test` for changes and run the tests, and transpile the ES6 to ES5 on success
## License
ISC
## With thanks
- Mark Dalgleish
- Tobias Koppers
- Guy Bedford
---
Glen Maddern, 2015.

View File

@@ -0,0 +1,183 @@
'use strict';
Object.defineProperty(exports, '__esModule', {
value: true
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _postcss = require('postcss');
var _postcss2 = _interopRequireDefault(_postcss);
var _cssSelectorTokenizer = require('css-selector-tokenizer');
var _cssSelectorTokenizer2 = _interopRequireDefault(_cssSelectorTokenizer);
var hasOwnProperty = Object.prototype.hasOwnProperty;
function getSingleLocalNamesForComposes(selectors) {
return selectors.nodes.map(function (node) {
if (node.type !== 'selector' || node.nodes.length !== 1) {
throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '"');
}
node = node.nodes[0];
if (node.type !== 'nested-pseudo-class' || node.name !== 'local' || node.nodes.length !== 1) {
throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '", "' + _cssSelectorTokenizer2['default'].stringify(node) + '" is weird');
}
node = node.nodes[0];
if (node.type !== 'selector' || node.nodes.length !== 1) {
throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '", "' + _cssSelectorTokenizer2['default'].stringify(node) + '" is weird');
}
node = node.nodes[0];
if (node.type !== 'class') {
// 'id' is not possible, because you can't compose ids
throw new Error('composition is only allowed when selector is single :local class name not in "' + _cssSelectorTokenizer2['default'].stringify(selectors) + '", "' + _cssSelectorTokenizer2['default'].stringify(node) + '" is weird');
}
return node.name;
});
}
var processor = _postcss2['default'].plugin('postcss-modules-scope', function (options) {
return function (css) {
var generateScopedName = options && options.generateScopedName || processor.generateScopedName;
var exports = {};
function exportScopedName(name) {
var scopedName = generateScopedName(name, css.source.input.from, css.source.input.css);
exports[name] = exports[name] || [];
if (exports[name].indexOf(scopedName) < 0) {
exports[name].push(scopedName);
}
return scopedName;
}
function localizeNode(node) {
var newNode = Object.create(node);
switch (node.type) {
case 'selector':
newNode.nodes = node.nodes.map(localizeNode);
return newNode;
case 'class':
case 'id':
var scopedName = exportScopedName(node.name);
newNode.name = scopedName;
return newNode;
}
throw new Error(node.type + ' ("' + _cssSelectorTokenizer2['default'].stringify(node) + '") is not allowed in a :local block');
}
function traverseNode(node) {
switch (node.type) {
case 'nested-pseudo-class':
if (node.name === 'local') {
if (node.nodes.length !== 1) {
throw new Error('Unexpected comma (",") in :local block');
}
return localizeNode(node.nodes[0]);
}
/* falls through */
case 'selectors':
case 'selector':
var newNode = Object.create(node);
newNode.nodes = node.nodes.map(traverseNode);
return newNode;
}
return node;
}
// Find any :import and remember imported names
var importedNames = {};
css.walkRules(function (rule) {
if (/^:import\(.+\)$/.test(rule.selector)) {
rule.walkDecls(function (decl) {
importedNames[decl.prop] = true;
});
}
});
// Find any :local classes
css.walkRules(function (rule) {
var selector = _cssSelectorTokenizer2['default'].parse(rule.selector);
var newSelector = traverseNode(selector);
rule.selector = _cssSelectorTokenizer2['default'].stringify(newSelector);
rule.walkDecls(/composes|compose-with/, function (decl) {
var localNames = getSingleLocalNamesForComposes(selector);
var classes = decl.value.split(/\s+/);
classes.forEach(function (className) {
var global = /^global\(([^\)]+)\)$/.exec(className);
if (global) {
localNames.forEach(function (exportedName) {
exports[exportedName].push(global[1]);
});
} else if (hasOwnProperty.call(importedNames, className)) {
localNames.forEach(function (exportedName) {
exports[exportedName].push(className);
});
} else if (hasOwnProperty.call(exports, className)) {
localNames.forEach(function (exportedName) {
exports[className].forEach(function (item) {
exports[exportedName].push(item);
});
});
} else {
throw decl.error('referenced class name "' + className + '" in ' + decl.prop + ' not found');
}
});
decl.remove();
});
rule.walkDecls(function (decl) {
var tokens = decl.value.split(/(,|'[^']*'|"[^"]*")/);
tokens = tokens.map(function (token, idx) {
if (idx === 0 || tokens[idx - 1] === ',') {
var localMatch = /^(\s*):local\s*\((.+?)\)/.exec(token);
if (localMatch) {
return localMatch[1] + exportScopedName(localMatch[2]) + token.substr(localMatch[0].length);
} else {
return token;
}
} else {
return token;
}
});
decl.value = tokens.join('');
});
});
// Find any :local keyframes
css.walkAtRules(function (atrule) {
if (/keyframes$/.test(atrule.name)) {
var localMatch = /^\s*:local\s*\((.+?)\)\s*$/.exec(atrule.params);
if (localMatch) {
atrule.params = exportScopedName(localMatch[1]);
}
}
});
// If we found any :locals, insert an :export rule
var exportedNames = Object.keys(exports);
if (exportedNames.length > 0) {
(function () {
var exportRule = _postcss2['default'].rule({ selector: ':export' });
exportedNames.forEach(function (exportedName) {
return exportRule.append({
prop: exportedName,
value: exports[exportedName].join(' '),
raws: { before: '\n ' }
});
});
css.append(exportRule);
})();
}
};
});
processor.generateScopedName = function (exportedName, path) {
var sanitisedPath = path.replace(/\.[^\.\/\\]+$/, '').replace(/[\W_]+/g, '_').replace(/^_|_$/g, '');
return '_' + sanitisedPath + '__' + exportedName;
};
exports['default'] = processor;
module.exports = exports['default'];

View File

@@ -0,0 +1,82 @@
{
"_args": [
[
"postcss-modules-scope@1.1.0",
"C:\\Users\\deranjer\\go\\src\\github.com\\deranjer\\goTorrent\\torrent-project"
]
],
"_from": "postcss-modules-scope@1.1.0",
"_id": "postcss-modules-scope@1.1.0",
"_inBundle": false,
"_integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
"_location": "/react-scripts/postcss-modules-scope",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "postcss-modules-scope@1.1.0",
"name": "postcss-modules-scope",
"escapedName": "postcss-modules-scope",
"rawSpec": "1.1.0",
"saveSpec": null,
"fetchSpec": "1.1.0"
},
"_requiredBy": [
"/react-scripts/css-loader"
],
"_resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
"_spec": "1.1.0",
"_where": "C:\\Users\\deranjer\\go\\src\\github.com\\deranjer\\goTorrent\\torrent-project",
"author": {
"name": "Glen Maddern"
},
"bugs": {
"url": "https://github.com/css-modules/postcss-modules-scope/issues"
},
"dependencies": {
"css-selector-tokenizer": "^0.7.0",
"postcss": "^6.0.1"
},
"description": "A CSS Modules transform to extract export statements from local-scope classes",
"devDependencies": {
"babel": "^5.4.7",
"babel-eslint": "^6.1.2",
"babel-istanbul": "^0.4.0",
"babelify": "^7.1.0",
"chokidar-cli": "^1.0.1",
"codecov.io": "^0.1.2",
"coveralls": "^2.11.2",
"css-selector-parser": "^1.0.4",
"eslint": "^1.5.0",
"mocha": "^3.0.1"
},
"files": [
"lib"
],
"homepage": "https://github.com/css-modules/postcss-modules-scope",
"keywords": [
"css-modules",
"postcss",
"plugin"
],
"license": "ISC",
"main": "lib/index.js",
"name": "postcss-modules-scope",
"repository": {
"type": "git",
"url": "git+https://github.com/css-modules/postcss-modules-scope.git"
},
"scripts": {
"autotest": "chokidar src test -c 'npm test'",
"build": "babel --out-dir lib src",
"cover": "babel-istanbul cover node_modules/.bin/_mocha",
"lint": "eslint src",
"posttest": "npm run lint && npm run build",
"precover": "npm run lint && npm run build",
"prepublish": "npm run build",
"test": "mocha --compilers js:babel/register",
"travis": "npm run cover -- --report lcovonly",
"watch": "chokidar src -c 'npm run build'"
},
"version": "1.1.0"
}