Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TypeScript type definitions #5582

Merged
merged 4 commits into from Oct 11, 2021
Merged

Add TypeScript type definitions #5582

merged 4 commits into from Oct 11, 2021

Commits on Oct 9, 2021

  1. refactor: Resolve types inconsistencies, add test

    Fixes #5580
    
    - Types are refactored to be exportable and are now provided in the
      package:
    
      - `Stylelint` prefix removed where appropriate, types namespaced under
        `stylelint`.
    
      - Module export definition changed to point to namespace and public
        API, which allows `require('stylelint')` to be typed correctly.
    
      - Types renamed to match those in the `@types/stylelint` package to
        reduce incompatibilities/breakages downstream.
    
      - As a result of these changes, the separate types package can be
        deprecated in favour of the built-in type definitions.
    
    - Internal API endpoints marked with `@internal` where appropriate.
    
    - PostCSS types in types definition file scoped under `PostCSS` (e.g.
      `PostCSS.Root`) to make it clearer which types are imported.
    
    - API types (`stylelint.lint`, `stylelint.createPlugin`, etc.) changed
      from `Function` to more specific types that actually reflect each
      function's signature.
    
    - Refactored export types in public-facing exports (e.g. `lib/index.js`,
      `lib/createPlugin.js`) to reference API types in type definition file.
      This ensures that Typescript will report errors if the implementation/
      internal type annotations are changed to an incompatible signature.
      Any types that were only defined in those files as `@typedef` JSDoc
      comments have been moved to the `.d.ts` definition file.
    
    - Fixed problem with `Rule` types that resulted in Typescript errors
      when using `createPlugin`. Required properties were added in #5418,
      which broke usage of `createPlugin` as the `rule` parameter would
      require functions to have the newly added properties, even though this
      doesn't reflect the implementation accurately. To fix this:
    
      - `Rule` type split into `RuleBase` and `Rule`. Added the `Plugin`
        type as an alias for `RuleBase` to achieve parity with former types
        at `@types/stylelint`. `RuleBase` represents the rule without any
        properties attached. `Rule` is a union of `RuleBase` and an object
        with the properties.
    
      - `createPlugin` updated to use `RuleBase`.
    
    - Fixed Typescript errors being thrown when the configs passed to the
      `overrides` option would contain supported properties that were
      missing from the types definition:
    
      - `ConfigOverride` type updated to use `Omit` instead of `Pick`,
        removing the `overrides` property instead of allow-listing
        properties. This fix means the `ConfigOverride` type shouldn't need
        to be manually updated whenever a new configuration property is
        added.
    
    - `RuleMessages` and related types fixed to avoid Typescript errors. The
      return type of `stylelint.utils.ruleMessages` was incorrectly set to
      the type of the `messages` parameter, which resulted in type errors in
      `lib/ruleMessages.js`. This change:
    
      - Changes the `ruleMessages` return type to `{ [K in keyof T]: T[K] }`
        which is correct. There is a distinction between returning the same
        type as being passed to the function and returning a type with the
        same keys and value types for those keys.
    
      - `RuleMessages` type changed to a mapped type to facilitate the
        change to `stylelint.utils.ruleMessages`. This allows Typescript to
        narrow types for the object returned by `ruleMessages`:
    
        ```js
        const messages = stylelint.utils.ruleMessages(ruleName, {
          violation: 'This a rule violation message',
          warning: (reason: string) => `This is not allowed because ${reason}`,
        });
        // If a `Record<...>` was used instead, the following lines would
        // result in Typescript error 2322.
        const violationMessage: string = messages.violation;
        const violationFunc: Function = messages.warning;
        ```
    
      - Type annotations in `lib/ruleMessages.js` updated to refect these
        changes and to avoid Typescript errors and allow type-checking.
    
    - Type test file added to `types/stylelint/type-test.ts`. This file
      contains code that references the public API as a consuming package
      would use it. It is not executed, but is used so that if the API or
      types are changed in a breaking way, the change will be caught by
      Typescript. If this existed before, the breaking change to the
      `StylelintRule` type (now `stylelint.Rule`) would have been caught.
    
    - Documentation comments added to public API endpoints (`stylelint.*`).
    
    - Removed leftover duplicate `Options` type that had no references
      anywhere in the project.
    adalinesimonian committed Oct 9, 2021
    Copy the full SHA
    b8ae84b View commit details
    Browse the repository at this point in the history

Commits on Oct 11, 2021

  1. Copy the full SHA
    aa98de1 View commit details
    Browse the repository at this point in the history
  2. Copy the full SHA
    831d9e1 View commit details
    Browse the repository at this point in the history
  3. Copy the full SHA
    993b5a1 View commit details
    Browse the repository at this point in the history