-
Notifications
You must be signed in to change notification settings - Fork 8
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
Expose all types #40
Open
Derugon
wants to merge
24
commits into
wikimedia-gadgets:main
Choose a base branch
from
Derugon:expose
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Expose all types #40
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Only keep type renaming changes, remove all other type changes. There are more type improvements we can do easily with the API params, so these changes will instead be proposed in another PR.
some interfaces were added to the JSdoc shipped with MW 1.42, so use the "official" names if they differ from the ones used in this PR
moved `mw.Notification` to `mw.notification.Notification` in the previous commit (so all things provided by the `mw.notification` RL module are in the `mw.notification` namespace)
Move some things from the `mw` namespace to sub-namespaces - move `mw.CacheReport/LimitReport/LimitReportValue` to `mw.PageParseReport.Cache/Limit/LimitValue` - move `mw.SearchIndexEntry` to `mw.SearchIndex.Entry` - move `mw.TitleLike` to `mw.Title.Like` - rename `mw.cookie.CookieOptions` to `mw.cookie.Options`
PR wikimedia-gadgets#41 also changes API parameter type names, to fix various name conflicts and parameter prefix issues, so I move it from this PR to PR wikimedia-gadgets#41.
We may add API response types later. In the same way as with `mw.Api.Params` and `mw.Api.UnknownParams`, we may want to use `mw.Api.Response` as an interface with common response parameters (e.g. `warnings`, `continue`).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Expose all local types used in all declaration files, inside the
mw
namespace or nested namespaces injquery
andmw
.To review these changes, I highly suggest to hide whitespace differences, since most of the lines have whitespace differences, and diff editors seem to mostly not align anything with these on.
Context
Custom types and interfaces are used by functions or namespace constants, either to simplify declarations or for extensibility/maintenance reasons. Most of these types are not declared in the JSDoc from the MediaWiki source code, and are specific to this package, so they are implemented as local types within modules. When they need to be accessible to other nested modules of this package or to npm users, types are exported within their module.
Motivations
There are two main motivations for these changes.
1. Sub-module dependency
Remove dependencies to nested modules of
types-mediawiki
, so declaration files can be merged, split and moved from one file to another without affecting users.This is related to proposal #35, where nested modules would match (and be used to import) ResourceLoader modules.
2. End-user usage
Allow to use JSDoc or TypeScript types to specify the type of variables, and not only rely on type inference.
For example, the first argument of
mw.experiments.getBucket
is an instance of theExperiment
interface. Suppose we want to call this function with a new object that satisfies theExperiment
interface. If we create the object directly when calling the function, the first argument is type-checked properly.But if we want to declare the experiment separately in an
experiment
variable, there is no easy way to specify its type directly.We could use
typeof
in some situations to get the type of already existing object properties ormw
namespace constants, but there is not always a constant or property somewhere in themw
namespace with the type we're looking for. This becomes even harder when trying to extend existing interfaces when writing custom ResourceLoader modules, since a lot of interfaces are not accessible at all.With the type changes proposed in this PR, the previous example would be written:
Proposed changes
Move local types (whether exported or not) to
mw
orjquery
namespaces, by using existing (or creating new) nested namespaces.Remove redundant type name prefixes/suffixes, when the namespace provides the same information.
To simplify the migration process and prevent breaking existing code:
Add type synonyms to keep existing exports from nested modules, and
@deprecate
these exports in favor of global declarations (e.g./** @deprecated */ export type X = mw.X
).Set
mw
as default export of the root module, so import syntax can still be used if desired, such as to prevent naming conflicts with other JQuery libraries.Alternatives
Below are alternative solutions, that still meet the motivations mentioned above, and may be preferred from the previous implementation.
export
to all local types and useexport * from X
instead ofimport X
in allindex.d.ts
files.mw
nested namespaces with types, and some basic types can be kept private (e.g.TypeOrArray<T>
,Title.Like
)import
with types in JSdocJQuery
namespace.Proposed type names
Below is an exhaustive list of proposed type changes.
MediaWiki API parameters (
api_params
)Types are unchanged.
Because of PHP file changes in the source code of MediaWiki 1.43 and name collision issues, migration would require more work than just changing a few lines in the type generation script, so this is left out of this proposal (see #41).
JQuery modules (
jquery
)client
Client
JQuery.Client
ClientNavigator
JQuery.Client.Navigator
ClientProfileLayout
JQuery.Client.Profile.Layout
ClientProfileName
JQuery.Client.Profile.Name
ClientProfilePlatform
JQuery.Client.Profile.Platform
ComparisonOperator
JQuery.Client.ComparisonOperator
ClientSupportCondition
JQuery.Client.SupportMap.Condition
UndirectedClientSupportMap
JQuery.Client.SupportMap.Undirected
ClientSupportMap
JQuery.Client.SupportMap
ClientProfile
JQuery.Client.Profile
collapsibleTabs
CollapsibleTabsOptions
JQuery.CollapsibleTabs.Options
CollapsibleTabsStatic
JQuery.CollapsibleTabs.Static
CollapsibleTabs
JQuery.CollapsibleTabs
colorUtil
Color
JQuery.ColorUtil.Color
ColorUtil
JQuery.ColorUtil
confirmable
RequiredOrUndefined
mw.RequiredOrUndefined
Confirmable
JQuery.Confirmable
Options
JQuery.Confirmable.Options
RequiredOptions
JQuery.Confirmable.RequiredOptions
I18N
JQuery.Confirmable.I18N
footHovzer
FootHovzer
JQuery.FootHovzer
highlightText
Method
JQuery.HighlightText.Method
HighlightText
JQuery.HighlightText
Options
JQuery.HighlightText.Options
lengthLimit
FilterFunction
JQuery.LengthLimit.FilterFunction
TrimResult
JQuery.LengthLimit.TrimResult
makeCollapsible
Options
JQuery.MakeCollapsible.Options
spinner
Size
JQuery.Spinner.Size
Type
JQuery.Spinner.Type
Options
JQuery.Spinner.Options
suggestions
Device
JQuery.Suggestions.Device
Direction
JQuery.Suggestions.Direction
Context
JQuery.Suggestions.Context
Options
JQuery.Suggestions.Options
ResultOptions
JQuery.Suggestions.Options.Result
SpecialOptions
JQuery.Suggestions.Options.Special
UpdateOptions
JQuery.Suggestions.Options.Update
tablesorter
ParserTypeMap
JQuery.TableSorter.ParserTypeMap
ParserMap
JQuery.TableSorter.ParserMap
MultiSortKey
JQuery.TableSorter.MultiSortKey
ParserFromType
JQuery.TableSorter.ParserFromType
ParserFromKey
JQuery.TableSorter.ParserFromKey
Parser
JQuery.TableSorter.Parser
TableSorter
JQuery.TableSorter
Options
JQuery.TableSorter.Options
textSelection
TextSelectionEncapsulateOptions
JQuery.TextSelection.EncapsulateSelectionOptions
GetCaretPositionOptions
JQuery.TextSelection.GetCaretPositionOptions
SetSelectionOptions
JQuery.TextSelection.SetSelectionOptions
ScrollToCaretPositionOptions
JQuery.TextSelection.ScrollToCaretPositionOptions
tipsy
StringProvider
JQuery.Tipsy.StringProvider
MethodsOf
mw.MethodsOf
NSDirection
JQuery.Tipsy.NSDirection
EWDirection
JQuery.Tipsy.EWDirection
Direction
JQuery.Tipsy.Direction
JQueryTipsy
JQuery.Tipsy
Options
JQuery.Tipsy.Options
Tipsy
JQuery.Tipsy.Tipsy
updateTooltipAccessKeys
KeyModifier
JQuery.TooltipAccessKeys.KeyModifier
TooltipAccessKeys
JQuery.TooltipAccessKeys
MediaWiki modules (
mw
)Api
Tail
mw.Tail
TypeOrArray
mw.TypeOrUnionArray
ReplaceValue
mw.ReplaceValue
UnknownApiParams
mw.Api.UnknownParams
ApiResponse
mw.Api.UnknownResponse
Revision
mw.Api.Revision
EditResult
mw.Api.Response.Edit
EditFailureResult
mw.Api.Response.Edit.Failure
EditSuccessResult
mw.Api.Response.Edit.Success
EditNoChangeResult
mw.Api.Response.Edit.NoChange
EditChangedResult
mw.Api.Response.Edit.Changed
AssertUser
mw.Api.AssertUser
RollbackInfo
mw.Api.Response.Rollback
FinishUpload
mw.Api.FinishUpload
config
PageParseReport
mw.PageParseReport
CacheReport
mw.PageParseReport.Cache
LimitReport
mw.PageParseReport.Limit
LimitReportValue
mw.PageParseReport.LimitValue
confirmCloseWindow
Options
mw.ConfirmCloseWindow.Options
ConfirmCloseWindow
mw.ConfirmCloseWindow
cookie
SameSite
mw.cookie.SameSite
mw.cookie.CookieOptions
mw.cookie.Options
debug
LogEntryType
mw.Debug.LogEntryType
Data
mw.Debug.Data
File
mw.Debug.File
LogEntry
mw.Debug.LogEntry
Query
mw.Debug.Query
experiments
Experiment
mw.experiments.Experiment
hook
Hook
mw.Hook
PostEditData
mw.PostEditData
SearchIndex
mw.SearchIndex
SearchIndexEntry
mw.SearchIndex.Entry
EditRecovery
mw.EditRecovery
index
IdleCallbackOptions
mw.IdleCallbackOptions
ObjectAnalyticEventData
mw.AnalyticEvent.ObjectData
AnalyticEventData
mw.AnalyticEvent.Data
ErrorAnalyticEventData
mw.AnalyticEvent.ErrorData
AnalyticEvent
mw.AnalyticEvent
AnalyticEventCallback
mw.AnalyticEvent.Callback
inspect
SelectorCounts
mw.inspect.SelectorCounts
ResourceLoaderCSSReport
mw.inspect.ResourceLoaderReport.CSS
ResourceLoaderSizeReport
mw.inspect.ResourceLoaderReport.Size
ResourceLoaderStoreReport
mw.inspect.ResourceLoaderReport.Store
ResourceLoaderTimeReport
mw.inspect.ResourceLoaderReport.Time
ResourceLoaderTimeReport
mw.inspect.ResourceLoaderReport.Time
ResourceLoaderReport
mw.inspect.ResourceLoaderReport
ResourceLoaderReportMap
mw.inspect.ResourceLoaderReportMap
Dependency
mw.inspect.Dependency
loader
Module
mw.loader.Module
ModuleKey
mw.loader.Module.Key
ModuleState
mw.loader.Module.State
ModuleMessage
mw.loader.Module.Message
ModuleStyle
mw.loader.Module.Style
ModuleTemplates
mw.loader.Module.Templates
ModuleDeclarator
mw.loader.Module.Declarator
ModuleRequire
mw.loader.Module.Require
ModuleScript
mw.loader.Module.Script
ModuleRegistryEntry
mw.loader.Module.RegistryEntry
JsonModuleStore
mw.loader.store.Json
ResourceLoaderStoreStats
mw.loader.store.Stats
Map
TypeOrArray
mw.TypeOrArray
GetOrDefault
mw.GetOrDefault
PickOrDefault
mw.PickOrDefault
ExtensibleMap
mw.Map.Extensible
notification
Notification
mw.notification.Notification
mw.notification.NotificationOptions
mw.notification.Notification.Options
Rest
RestResponse
mw.Rest.Response
searchSuggest
ResponseFunction
mw.searchSuggest.ResponseFunction
ResponseMetaData
mw.searchSuggest.ResponseMetaData
storage
SafeStorage
mw.SafeStorage
MwStorage
mw.Storage
template
TemplateRenderer
mw.template.Renderer
TemplateCompiler
mw.template.Compiler
Title
TitleLike
mw.Title.Like
TitleExistenceStore
mw.Title.ExistenceStore
UserInputOptions
mw.Title.UserInputOptions
Uri
QueryParams
mw.QueryParams
UriParser
mw.Uri.Parser
mw.Uri.UriOptions
mw.Uri.Options
User
UserTokens
mw.user.Tokens
User
mw.user.User
util
NoReturn
mw.NoReturn
ResizeableThumbnailUrl
mw.util.ResizeableThumbnailUrl