Skip to content

Commit

Permalink
feat(infra): Split the TypeScript type declaration (mdn#3004)
Browse files Browse the repository at this point in the history
* feat(infra): Split the TypeScript type declaration

* Fix `tsc` errors
  • Loading branch information
ExE-Boss authored and ddbeck committed Mar 7, 2019
1 parent 705cc8e commit d6de8af
Show file tree
Hide file tree
Showing 2 changed files with 374 additions and 340 deletions.
344 changes: 4 additions & 340 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,345 +1,9 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */

/**
* The names of the known browsers.
*/
type BrowserNames =
'chrome' |
'chrome_android' |
'edge' |
'edge_mobile' |
'firefox' |
'firefox_android' |
'ie' |
'nodejs' |
'opera' |
'opera_android' |
'qq_android' |
'safari' |
'safari_ios' |
'samsunginternet_android' |
'uc_android' |
'uc_chinese_android' |
'webview_android';

/**
* The browser namespace.
*/
interface Browsers extends Record<BrowserNames,BrowserStatement> {
}

/**
* A browser statement.
*/
interface BrowserStatement {
/**
* The browser brand name, for example:
* `"Firefox"`, `"Firefox Android"`, `"Safari"`, `"iOS Safari"`, etc.
*/
name: string;

/**
* The known versions of this browser.
*/
releases: {
[version: string]: ReleaseStatement;
};
}

/**
* The data about this version.
*/
interface ReleaseStatement {
/**
* The date on which this version was released.
*
* Formatted as `YYYY-MM-DD`.
*/
release_date?: string;

/**
* The URL of the release notes.
*/
release_notes?: string;

/**
* A property indicating where in the lifetime cycle this release is in.
*
* It's an enum accepting these values:
* - `retired`: This release is no longer supported (EOL).
* - `current`: This release is the official latest release.
* - `exclusive`: This is an exclusive release (for example on a flagship device),
* not generally available.
* - `beta`: This release will the next official release.
* - `nightly`: This release is the current alpha / experimental release
* (like Firefox Nightly, Chrome Canary).
* - `esr`: This release is an Extended Support Release.
* - `planned`: This release is planned in the future.
*/
status: 'retired' | 'current' | 'limited' | 'beta' | 'nightly' | 'esr' | 'planned';
}

/**
* The `support_statement` object describes the support provided
* by a single browser type for the given sub-feature.
*
* It is an array of `simple_support_statement` objects, but if there
* is only one of them, the array must be omitted.
*/
type SupportStatement = SimpleSupportStatement | SimpleSupportStatement[];
type VersionValue = string | boolean | null;

/**
* The `simple_support_statement` object is the core object containing the compatibility information for a browser.
*/
interface SimpleSupportStatement {
/** The version indicating when a sub-feature has been added (and is therefore supported).
*
* The `boolean` values indicate that a sub-feature is supported
* (`true`, with the additional meaning that it is unknown in which version support was added)
* or not supported (`false`).
*
* A value of `null` indicates that support information is entirely unknown.
*/
version_added: VersionValue;

/**
* Contains a string with the version number the sub-feature was
* removed in. It may also be a `boolean` value of (`true` or `false`),
* or the `null` value.
*
* Default values:
* - If `version_added` is set to `true`, `false`, or a string,
* `version_removed` defaults to `false`.
* - if `version_added` is set to `null`, the default value
* of `version_removed` is also `null`.
*/
version_removed?: VersionValue;

/**
* A prefix to add to the sub-feature name (defaults to empty string).
*
* Only non-standard vendor prefixes are permitted.
*
* Note that leading and trailing `-` must be included.
*/
prefix?: string;

/**
* In some cases features are named entirely differently and not just prefixed,
* or the prefix is an official non-vendor prefix.
*
* (eg. the official `grid-` prefixed aliases for the CSS `*-gap` properties).
*/
alternative_name?: string;

/**
* An optional array of objects indicating what kind of flags must be set for this feature to work.
* Usually this array will have one item, but there are cases where two or more flags can be required to activate a feature.
*/
flags?: {
/**
* An enum that indicates the flag type:
* - `preference` a flag the user can set (like in `about:config` in Firefox).
* - `compile_flag` a flag to be set before compiling the browser.
* - `runtime_flag` a flag to be set before starting the browser.
*/
type: 'preference' | 'compile_flag' | 'runtime_flag';

/**
* A `string` representing the flag or preference to modify.
*/
name: string;

/**
* Property representing the actual value to set the flag to.
*
* It is a string, that may be converted to the right type
* (that is `true` or `false` for a `boolean` value, or `4` for a `number` value).
*
* It doesn't need to be enclosed in `<code>` tags.
*/
value_to_set?: string;
}[];
/**
* A `boolean` value indicating whether or not the implementation of the sub-feature follows
* the current specification closely enough to not create major interoperability problems.
*
* It defaults to `false` (no interoperability problem expected).
*
* If set to `true`, it is recommended to add a note indicating how it diverges from
* the standard (implements an old version of the standard, for example).
*/
partial_implementation?: boolean;

/**
* An `array` of zero or more strings containing
* additional information. If there is only one entry in the array,
* the array can be a just a string.
*
* The `<code>` and `<a>` HTML elements can be used.
*/
notes?: string | string[];
}

interface Identifier extends Partial<Record<Exclude<string, '__compat'>, Identifier>> {
/**
* A feature is described by an identifier containing the `__compat` property.
*
* In other words, identifiers without `__compat` aren't necessarily features,
* but help to nest the features properly.
*
* When an identifier has a `__compat` block, it represents its basic support,
* indicating that a minimal implementation of a functionality is included.
*
* What it represents exactly depends of the evolution of the feature over time,
* both in terms of specifications and of browser support.
*/
__compat?: CompatStatement;
}

interface CompatStatement {
/**
* A string containing a human-readable description of the feature.
*
* It is intended to be used as a caption or title and should be kept short.
*
* The `<code>` and `<a>` HTML elements can be used.
*/
description?: string;

/**
* URL which points to a MDN reference page documenting the feature.
*
* It needs to be a valid URL, and should be the language-⁠neutral URL
* (e.g. use `https⁠://developer.mozilla.org/docs/Web/CSS/text-⁠align`
* instead of `https⁠://developer.mozilla.org/en-⁠US/docs/Web/CSS/text-⁠align`).
*/
mdn_url?: string;

/**
* Each `__compat` object contains support information.
*
* For each browser identifier, it contains a `support_statement` object with
* information about versions, prefixes, or alternate names, as well as notes.
*/
support: SupportBlock;

/**
* An object containing information about the stability of the feature:
*
* Is it a functionality that is standard? Is it stable?
* Has it been deprecated and shouldn't be used anymore?
*/
status?: StatusBlock;
}

interface SupportBlock extends Partial<Record<BrowserNames, SupportStatement>> {
}

/**
* The status property contains information about stability of the feature.
*/
interface StatusBlock {
/**
* `boolean` value that indicates this functionality is
* intended to be an addition to the Web platform. Some features are added to
* conduct tests.
*
* Set to `false`, it means the functionality is mature, and no
* significant incompatible changes are expected in the future.
*/
experimental: boolean;

/**
* `boolean` value indicating if the feature is part
* of an active specification or specification process.
*/
standard_track: boolean;

/**
* `boolean` value that indicates if the feature is no longer recommended.
*
* It might be removed in the future or might only be kept for compatibility purposes.
* Avoid using this functionality.
*/
deprecated: boolean;
}

interface CompatData extends Record<Exclude<string, 'browsers'>, Identifier> {
/**
* Contains data for each known browser.
*/
browsers: Browsers;

/**
* Contains data for each [Web API](https://developer.mozilla.org/docs/Web/API)
* interface.
*/
api: Identifier;

/**
* Contains data for [CSS](https://developer.mozilla.org/docs/Web/CSS)
* properties, selectors, and at-rules.
*/
css: Identifier;

/**
* Contains data for [HTML](https://developer.mozilla.org/docs/Web/HTML)
* elements, attributes, and global attributes.
*/
html: Identifier;

/**
* Contains data for [HTTP](https://developer.mozilla.org/docs/Web/HTTP)
* headers, statuses, and methods.
*/
http: Identifier;

/**
* Contains data for [JavaScript](https://developer.mozilla.org/docs/Web/JavaScript)
* built-in Objects, statement, operators, and other ECMAScript language features.
*/
javascript: Identifier;

/**
* Contains data for [MathML](https://developer.mozilla.org/docs/Web/MathML)
* elements, attributes, and global attributes.
*/
mathml: Identifier;

/**
* Contains data for [SVG](https://developer.mozilla.org/docs/Web/SVG)
* elements, attributes, and global attributes.
*/
svg: Identifier;

/**
* Contains data for [WebDriver](https://developer.mozilla.org/docs/Web/WebDriver)
* commands.
*/
webdriver: Identifier;

/**
* Contains data for [WebExtensions](https://developer.mozilla.org/Add-ons/WebExtensions)
* JavaScript APIs and manifest keys.
*/
webextensions: Identifier;

/**
* Contains data for [XPath](https://developer.mozilla.org/docs/Web/XPath)
* axes, and functions.
*/
xpath: Identifier;

/**
* Contains data for [XSLT](https://developer.mozilla.org/docs/Web/XSLT)
* elements, attributes, and global attributes.
*/
xslt: Identifier;
}
/// <reference path="./types.d.ts"/>
import { CompatData } from './types';

// This is necessary to have intellisense in projects which
// import data from this package.
export = ({} as CompatData);
declare const compatData: CompatData;
export = compatData;
Loading

0 comments on commit d6de8af

Please sign in to comment.