├── .gitignore ├── LICENSE ├── README.md ├── ambient.d.ts ├── index.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | /index.js 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright 2017 Timothy Kang 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # css-module-types 2 | 3 | [TypeScript Language Service Plugin](https://github.com/Microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin) for [CSS modules](https://github.com/css-modules/css-modules). 4 | 5 | Real-time autocompletion and validation of exports. Use alongside your build tool, such as [webpack + css-loader](https://github.com/css-modules/webpack-demo) or [browserify + css-modulesify](https://github.com/css-modules/browserify-demo). 6 | 7 | ![screenshot](https://timothykang.github.io/css-module-types.gif) 8 | 9 | ## Install 10 | 11 | ```sh 12 | npm install --save-dev css-module-types 13 | ``` 14 | 15 | ## Usage 16 | 17 | Add declaration to `global.d.ts`: 18 | 19 | ```ts 20 | declare module '*.css' { 21 | const exports: { [exportName: string]: string }; 22 | export = exports; 23 | } 24 | ``` 25 | 26 | Add plugin to `tsconfig.json`: 27 | 28 | ``` 29 | { 30 | "compilerOptions": { 31 | "plugins": [ { "name": "css-module-types" } ], 32 | ... 33 | }, 34 | "include": [ 35 | "global.d.ts", 36 | ... 37 | ] 38 | } 39 | ``` 40 | -------------------------------------------------------------------------------- /ambient.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'icss-utils' { 2 | import { Root } from 'postcss'; 3 | interface Extracted { 4 | icssExports: { [exportName: string]: string; } 5 | } 6 | export const extractICSS: (css: Root, removeRules?: boolean) => Extracted; 7 | } 8 | 9 | declare module 'postcss-icss-selectors' { 10 | import { Plugin } from 'postcss'; 11 | const plugin: Plugin<{mode: 'local' | 'global'}>; 12 | export = plugin; 13 | } 14 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import { extractICSS } from 'icss-utils'; 2 | import * as ts_module from 'typescript/lib/tsserverlibrary'; 3 | import * as path from 'path'; 4 | import * as postcss from 'postcss'; 5 | import * as postcssIcssSelectors from 'postcss-icss-selectors'; 6 | 7 | export = function init({ typescript: ts }: { typescript: typeof ts_module }) { 8 | function isCSS(fileName: string): boolean { 9 | return /\.css$/.test(fileName); 10 | } 11 | 12 | function isRelativeCSS(fileName: string): boolean { 13 | return isCSS(fileName) && /^\.\.?($|[\\/])/.test(fileName); 14 | } 15 | 16 | function create(info: ts.server.PluginCreateInfo) { 17 | const processor = postcss(postcssIcssSelectors({ mode: 'local' })) 18 | 19 | function getDtsSnapshot(scriptSnapshot: ts.IScriptSnapshot) { 20 | const css = scriptSnapshot.getText(0, scriptSnapshot.getLength()); 21 | const dts = Object.keys(extractICSS(processor.process(css).root).icssExports) 22 | .map(exportName => `export const ${exportName}: string;`) 23 | .join(''); 24 | return ts.ScriptSnapshot.fromString(dts); 25 | } 26 | 27 | const clssf = ts.createLanguageServiceSourceFile; 28 | 29 | ts.createLanguageServiceSourceFile = (fileName: string, scriptSnapshot: ts.IScriptSnapshot, scriptTarget: ts.ScriptTarget, version: string, setNodeParents: boolean, scriptKind?: ts.ScriptKind, cheat?: string): ts.SourceFile => { 30 | if (isCSS(fileName)) { 31 | scriptSnapshot = getDtsSnapshot(scriptSnapshot); 32 | } 33 | var sourceFile = clssf(fileName, scriptSnapshot, scriptTarget, version, setNodeParents, scriptKind); 34 | if (isCSS(fileName)) { 35 | sourceFile.isDeclarationFile = true; 36 | } 37 | return sourceFile; 38 | } 39 | 40 | const ulssf = ts.updateLanguageServiceSourceFile; 41 | 42 | ts.updateLanguageServiceSourceFile = (sourceFile: ts.SourceFile, scriptSnapshot: ts.IScriptSnapshot, version: string, textChangeRange: ts.TextChangeRange, aggressiveChecks?: boolean, cheat?: string): ts.SourceFile => { 43 | if (isCSS(sourceFile.fileName)) { 44 | scriptSnapshot = getDtsSnapshot(scriptSnapshot); 45 | } 46 | var sourceFile = ulssf(sourceFile, scriptSnapshot, version, textChangeRange, aggressiveChecks); 47 | if (isCSS(sourceFile.fileName)) { 48 | sourceFile.isDeclarationFile = true; 49 | } 50 | return sourceFile; 51 | } 52 | 53 | if (info.languageServiceHost.resolveModuleNames) { 54 | const rmn = info.languageServiceHost.resolveModuleNames.bind(info.languageServiceHost); 55 | 56 | info.languageServiceHost.resolveModuleNames = (moduleNames, containingFile, reusedNames) => { 57 | const resolvedCSS: ts.ResolvedModuleFull[] = []; 58 | 59 | return rmn(moduleNames.filter(moduleName => { 60 | if (isRelativeCSS(moduleName)) { 61 | resolvedCSS.push({ 62 | resolvedFileName: path.resolve(path.dirname(containingFile), moduleName), 63 | extension: ts_module.Extension.Dts, 64 | }); 65 | return false; 66 | } 67 | return true; 68 | }), containingFile, reusedNames).concat(resolvedCSS); 69 | }; 70 | } 71 | 72 | return info.languageService; 73 | } 74 | 75 | function getExternalFiles(project: ts_module.server.ConfiguredProject) { 76 | return project.getFileNames().filter(isCSS); 77 | } 78 | 79 | return { create, getExternalFiles }; 80 | }; 81 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-module-types", 3 | "version": "0.2.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "6.0.90", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.90.tgz", 10 | "integrity": "sha512-tXoGRVdi7wZX7P1VWoV9Wfk0uYDOAHdEYXAttuWgSrN76Q32wQlSrMX0Rgyv3RTEaQY2ZLQrzYHVM2e8rfo8sA==", 11 | "dev": true 12 | }, 13 | "ansi-styles": { 14 | "version": "3.2.0", 15 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", 16 | "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", 17 | "requires": { 18 | "color-convert": "1.9.1" 19 | } 20 | }, 21 | "big.js": { 22 | "version": "3.2.0", 23 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", 24 | "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", 25 | "dev": true 26 | }, 27 | "chalk": { 28 | "version": "2.3.0", 29 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", 30 | "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", 31 | "requires": { 32 | "ansi-styles": "3.2.0", 33 | "escape-string-regexp": "1.0.5", 34 | "supports-color": "4.5.0" 35 | } 36 | }, 37 | "color-convert": { 38 | "version": "1.9.1", 39 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 40 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 41 | "requires": { 42 | "color-name": "1.1.3" 43 | } 44 | }, 45 | "color-name": { 46 | "version": "1.1.3", 47 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 48 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 49 | }, 50 | "css-selector-tokenizer": { 51 | "version": "0.7.0", 52 | "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", 53 | "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", 54 | "dev": true, 55 | "requires": { 56 | "cssesc": "0.1.0", 57 | "fastparse": "1.1.1", 58 | "regexpu-core": "1.0.0" 59 | } 60 | }, 61 | "cssesc": { 62 | "version": "0.1.0", 63 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", 64 | "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", 65 | "dev": true 66 | }, 67 | "emojis-list": { 68 | "version": "2.1.0", 69 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 70 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", 71 | "dev": true 72 | }, 73 | "escape-string-regexp": { 74 | "version": "1.0.5", 75 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 76 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 77 | }, 78 | "fastparse": { 79 | "version": "1.1.1", 80 | "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", 81 | "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", 82 | "dev": true 83 | }, 84 | "generic-names": { 85 | "version": "1.0.3", 86 | "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", 87 | "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", 88 | "dev": true, 89 | "requires": { 90 | "loader-utils": "0.2.17" 91 | } 92 | }, 93 | "has-flag": { 94 | "version": "2.0.0", 95 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 96 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" 97 | }, 98 | "icss-utils": { 99 | "version": "3.0.1", 100 | "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-3.0.1.tgz", 101 | "integrity": "sha1-7nDTroysOMa+XtkehRsn7tNDrQ8=", 102 | "requires": { 103 | "postcss": "6.0.14" 104 | } 105 | }, 106 | "jsesc": { 107 | "version": "0.5.0", 108 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 109 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 110 | "dev": true 111 | }, 112 | "json5": { 113 | "version": "0.5.1", 114 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 115 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", 116 | "dev": true 117 | }, 118 | "loader-utils": { 119 | "version": "0.2.17", 120 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", 121 | "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", 122 | "dev": true, 123 | "requires": { 124 | "big.js": "3.2.0", 125 | "emojis-list": "2.1.0", 126 | "json5": "0.5.1", 127 | "object-assign": "4.1.1" 128 | } 129 | }, 130 | "lodash": { 131 | "version": "4.17.4", 132 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 133 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 134 | "dev": true 135 | }, 136 | "object-assign": { 137 | "version": "4.1.1", 138 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 139 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 140 | "dev": true 141 | }, 142 | "postcss": { 143 | "version": "6.0.14", 144 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", 145 | "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", 146 | "requires": { 147 | "chalk": "2.3.0", 148 | "source-map": "0.6.1", 149 | "supports-color": "4.5.0" 150 | } 151 | }, 152 | "postcss-icss-selectors": { 153 | "version": "2.0.3", 154 | "resolved": "https://registry.npmjs.org/postcss-icss-selectors/-/postcss-icss-selectors-2.0.3.tgz", 155 | "integrity": "sha1-J/oa/Kq2xgLIZsuymPMhjpvBybM=", 156 | "dev": true, 157 | "requires": { 158 | "css-selector-tokenizer": "0.7.0", 159 | "generic-names": "1.0.3", 160 | "icss-utils": "3.0.1", 161 | "lodash": "4.17.4", 162 | "postcss": "6.0.14" 163 | } 164 | }, 165 | "regenerate": { 166 | "version": "1.3.3", 167 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", 168 | "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", 169 | "dev": true 170 | }, 171 | "regexpu-core": { 172 | "version": "1.0.0", 173 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", 174 | "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", 175 | "dev": true, 176 | "requires": { 177 | "regenerate": "1.3.3", 178 | "regjsgen": "0.2.0", 179 | "regjsparser": "0.1.5" 180 | } 181 | }, 182 | "regjsgen": { 183 | "version": "0.2.0", 184 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", 185 | "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", 186 | "dev": true 187 | }, 188 | "regjsparser": { 189 | "version": "0.1.5", 190 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", 191 | "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", 192 | "dev": true, 193 | "requires": { 194 | "jsesc": "0.5.0" 195 | } 196 | }, 197 | "source-map": { 198 | "version": "0.6.1", 199 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 200 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 201 | }, 202 | "supports-color": { 203 | "version": "4.5.0", 204 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", 205 | "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", 206 | "requires": { 207 | "has-flag": "2.0.0" 208 | } 209 | }, 210 | "typescript": { 211 | "version": "2.6.1", 212 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.1.tgz", 213 | "integrity": "sha1-7znN6ierrAtQAkLWcmq5DgyEZjE=", 214 | "dev": true 215 | } 216 | } 217 | } 218 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-module-types", 3 | "version": "0.2.2", 4 | "description": "TypeScript Language Service Plugin for CSS modules.", 5 | "author": "Tim Kang", 6 | "license": "Apache-2.0", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/timothykang/css-module-types.git" 10 | }, 11 | "keywords": [ 12 | "CSS", 13 | "modules", 14 | "TypeScript", 15 | "plugin" 16 | ], 17 | "scripts": { 18 | "publishOnly": "tsc" 19 | }, 20 | "main": "index.js", 21 | "files": [ 22 | "index.js" 23 | ], 24 | "engines": { 25 | "node": ">=4.2.0" 26 | }, 27 | "dependencies": { 28 | "icss-utils": "^3.0.1", 29 | "postcss": "^6.0.14", 30 | "postcss-icss-selectors": "^2.0.3" 31 | }, 32 | "peerDependencies": { 33 | "typescript": "^2.2.1" 34 | }, 35 | "devDependencies": { 36 | "@types/node": "^6.0.90", 37 | "typescript": "^2.6.1" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ES5"], 4 | "strict": true, 5 | "target": "ES5" 6 | }, 7 | "include": [ 8 | "ambient.d.ts", 9 | "index.ts" 10 | ] 11 | } 12 | --------------------------------------------------------------------------------