From 7b906f2a33e59ca55ba479250dc1a562cf1ff914 Mon Sep 17 00:00:00 2001 From: Remco Haszing Date: Wed, 1 Apr 2020 01:04:49 +0200 Subject: [PATCH] Add types for postcss-import (#43085) * Add types for postcss-import * Use require instead of import statements * Fix return type fo resolve and load `resolve` may return an array of paths as well, and both functions may return a promise. --- types/postcss-import/index.d.ts | 81 ++++++++++++++++++++ types/postcss-import/package.json | 6 ++ types/postcss-import/postcss-import-tests.ts | 23 ++++++ types/postcss-import/tsconfig.json | 23 ++++++ types/postcss-import/tslint.json | 1 + 5 files changed, 134 insertions(+) create mode 100644 types/postcss-import/index.d.ts create mode 100644 types/postcss-import/package.json create mode 100644 types/postcss-import/postcss-import-tests.ts create mode 100644 types/postcss-import/tsconfig.json create mode 100644 types/postcss-import/tslint.json diff --git a/types/postcss-import/index.d.ts b/types/postcss-import/index.d.ts new file mode 100644 index 0000000000..a626b19209 --- /dev/null +++ b/types/postcss-import/index.d.ts @@ -0,0 +1,81 @@ +// Type definitions for postcss-import 12.0 +// Project: https://github.com/postcss/postcss-import#readme +// Definitions by: Remco Haszing +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +import { AcceptedPlugin, Transformer } from 'postcss'; + +export = atImport; + +/** + * This plugin can consume local files, node modules or web_modules. To resolve path of an `@import` rule, it can look into root directory (by default `process.cwd()`), `web_modules`, `node_modules` + * or local modules. _When importing a module, it will look for `index.css` or file referenced in `package.json` in the `style` or `main` fields._ You can also provide manually multiples paths where + * to look at. + * + * **Notes:** + * + * - **This plugin should probably be used as the first plugin of your list. This way, other plugins will work on the AST as if there were only a single file to process, and will probably work as you + * can expect**. + * - This plugin works great with [postcss-url](https://github.com/postcss/postcss-url) plugin, which will allow you to adjust assets `url()` (or even inline them) after inlining imported files. + * - In order to optimize output, **this plugin will only import a file once** on a given scope (root, media query…). Tests are made from the path & the content of imported files (using a hash table). + * If this behavior is not what you want, look at `skipDuplicates` option + * - **If you are looking for glob, or sass like imports (prefixed partials)**, please look at [postcss-easy-import](https://github.com/trysound/postcss-easy-import) (which use this plugin under the + * hood). + * - Imports which are not modified (by `options.filter` or because they are remote imports) are moved to the top of the output. + * - **This plugin attempts to follow the CSS `@import` spec**; `@import` statements must precede all other statements (besides `@charset`). + */ +declare function atImport(options?: atImport.AtImportOptions): Transformer; + +declare namespace atImport { + interface AtImportOptions { + /** + * Define the root where to resolve path (eg: place where `node_modules` are). Should not be used that much. + * + * _Note: nested @import will additionally benefit of the relative dirname of imported files._ + * + * Default: `process.cwd()` or dirname of [the postcss from](https://github.com/postcss/postcss#node-source) + */ + root?: string; + + /** + * A string or an array of paths in where to look for files. + */ + path?: string | string[]; + + /** + * An array of plugins to be applied on each imported files. + */ + plugins?: AcceptedPlugin[]; + + /** + * You can provide a custom path resolver with this option. This function gets `(id, basedir, importOptions)` arguments and should return a path, an array of paths or a promise resolving to + * the path(s). If you do not return an absolute path, your path will be resolved to an absolute path using the default resolver. You can use + * [resolve](https://github.com/substack/node-resolve) for this. + */ + resolve?: ( + id: string, + basedir: string, + importOptions: AtImportOptions, + ) => string | string[] | PromiseLike; + + /** + * You can overwrite the default loading way by setting this option. This function gets `(filename, importOptions)` arguments and returns content or promised content. + */ + load?: (filename: string, importOptions: AtImportOptions) => string | Promise; + + /** + * By default, similar files (based on the same content) are being skipped. It's to optimize output and skip similar files like `normalize.css` for example. If this behavior is not what you + * want, just set this option to false to disable it. + * + * @default true + */ + skipDuplicates?: boolean; + + /** + * An array of folder names to add to Node's resolver. Values will be appended to the default resolve directories: `["node_modules", "web_modules"]`. + * + * This option is only for adding additional directories to default resolver. If you provide your own resolver via the `resolve` configuration option above, then this value will be ignored. + */ + addModulesDirectories?: string[]; + } +} diff --git a/types/postcss-import/package.json b/types/postcss-import/package.json new file mode 100644 index 0000000000..73f1a60b11 --- /dev/null +++ b/types/postcss-import/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "dependencies": { + "postcss": "^7.0.27" + } +} diff --git a/types/postcss-import/postcss-import-tests.ts b/types/postcss-import/postcss-import-tests.ts new file mode 100644 index 0000000000..13a28749e4 --- /dev/null +++ b/types/postcss-import/postcss-import-tests.ts @@ -0,0 +1,23 @@ +import postcss = require('postcss'); +import atImport = require('postcss-import'); + +postcss().use(atImport()); +postcss().use(atImport({ root: '' })); +postcss().use(atImport({ path: '' })); +postcss().use(atImport({ path: [''] })); +postcss().use(atImport({ plugins: [atImport()] })); +postcss().use(atImport({ resolve: (id, basedir, importOptions) => id + basedir + importOptions.root })); +postcss().use(atImport({ load: (filename, importOptions) => filename + importOptions.root })); +postcss().use(atImport({ skipDuplicates: false })); +postcss().use(atImport({ addModulesDirectories: [''] })); +postcss().use( + atImport({ + root: '', + path: '', + plugins: [atImport()], + resolve: (id, basedir, importOptions) => id + basedir + importOptions.root, + load: (filename, importOptions) => filename + importOptions.root, + skipDuplicates: false, + addModulesDirectories: [''], + }), +); diff --git a/types/postcss-import/tsconfig.json b/types/postcss-import/tsconfig.json new file mode 100644 index 0000000000..8e64af1b4f --- /dev/null +++ b/types/postcss-import/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "postcss-import-tests.ts" + ] +} diff --git a/types/postcss-import/tslint.json b/types/postcss-import/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/postcss-import/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }