mirror of
https://github.com/flarum/core.git
synced 2025-08-29 19:09:58 +02:00
Compare commits
52 Commits
dw/drop-bo
...
as/monorep
Author | SHA1 | Date | |
---|---|---|---|
|
82b9b7e866 | ||
|
bdf9ddf33a | ||
|
9b302a1029 | ||
|
97dfb50f17 | ||
|
6a940cd34f | ||
|
edd93dad77 | ||
|
2d18d37ba9 | ||
|
b58b3e2224 | ||
|
2c902c6563 | ||
|
a38dc889e9 | ||
|
851907b88c | ||
|
dfa3b47cf3 | ||
|
289ea49cc7 | ||
|
d769ee2b7b | ||
|
6e3051b36a | ||
|
c622070366 | ||
|
21d3e33613 | ||
|
b0d9f10280 | ||
|
d192185d13 | ||
|
6dba5c8e67 | ||
|
34c753040c | ||
|
7c4992c401 | ||
|
a7254773dd | ||
|
1217b11896 | ||
|
7a22527b72 | ||
|
bd4d53323c | ||
|
ad69cf84fe | ||
|
aa77df46ee | ||
|
19e48617f0 | ||
|
d8b83cc372 | ||
|
a04b420295 | ||
|
5f4b5c0841 | ||
|
beae75dab3 | ||
|
e304cf7cb5 | ||
|
9f87674626 | ||
|
54329d0827 | ||
|
a7aad46068 | ||
|
7551a14ae5 | ||
|
f4c29db182 | ||
|
a291134da1 | ||
|
c702f5e228 | ||
|
749e7e34f7 | ||
|
67821d95bd | ||
|
aa44677df3 | ||
|
3978efa533 | ||
|
687e1e2789 | ||
|
7cec4d1f42 | ||
|
fbe1a48bec | ||
|
17a8d2c9d8 | ||
|
85ee80659d | ||
|
af77214967 | ||
|
7c3b51fec0 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -14,5 +14,6 @@ js/dist/* -diff
|
||||
js/dist/* linguist-generated
|
||||
js/dist-typings/* linguist-generated
|
||||
js/yarn.lock -diff
|
||||
js/package-lock.json -diff
|
||||
|
||||
* text=auto eol=lf
|
||||
|
15
.github/workflows/backend.yml
vendored
Normal file
15
.github/workflows/backend.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
name: Core PHP
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||
# This will break your current script.
|
||||
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||
|
||||
jobs:
|
||||
run:
|
||||
uses: flarum/.github/.github/workflows/REUSABLE_backend.yml@main
|
||||
with:
|
||||
enable_backend_testing: true
|
||||
|
||||
backend_directory: .
|
23
.github/workflows/frontend.yml
vendored
Normal file
23
.github/workflows/frontend.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
name: Core JS
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||
# This will break your current script.
|
||||
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||
|
||||
jobs:
|
||||
run:
|
||||
uses: flarum/.github/.github/workflows/REUSABLE_frontend.yml@main
|
||||
with:
|
||||
enable_bundlewatch: true
|
||||
enable_prettier: true
|
||||
enable_typescript: true
|
||||
|
||||
frontend_directory: ./js
|
||||
backend_directory: .
|
||||
js_package_manager: yarn
|
||||
main_git_branch: master
|
||||
|
||||
secrets:
|
||||
bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}
|
137
.github/workflows/js.yml
vendored
137
.github/workflows/js.yml
vendored
@@ -1,137 +0,0 @@
|
||||
name: JS
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
env:
|
||||
NODE_VERSION: 16
|
||||
|
||||
jobs:
|
||||
prettier:
|
||||
name: Prettier
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: "yarn"
|
||||
cache-dependency-path: js/yarn.lock
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn install --immutable
|
||||
working-directory: ./js
|
||||
|
||||
- name: Check JS formatting
|
||||
run: yarn run format-check
|
||||
working-directory: ./js
|
||||
|
||||
typecheck:
|
||||
name: Typecheck
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: "yarn"
|
||||
cache-dependency-path: js/yarn.lock
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn --frozen-lockfile
|
||||
working-directory: ./js
|
||||
|
||||
- name: Typecheck
|
||||
run: yarn run check-typings
|
||||
working-directory: ./js
|
||||
|
||||
type-coverage:
|
||||
name: Type Coverage
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: "yarn"
|
||||
cache-dependency-path: js/yarn.lock
|
||||
|
||||
- name: Install JS dependencies
|
||||
run: yarn --frozen-lockfile
|
||||
working-directory: ./js
|
||||
|
||||
- name: Check type coverage
|
||||
run: yarn run check-typings-coverage
|
||||
working-directory: ./js
|
||||
|
||||
build-prod:
|
||||
name: Build and commit
|
||||
runs-on: ubuntu-latest
|
||||
needs: [prettier, typecheck, type-coverage]
|
||||
|
||||
# Only commit JS on push to master branch
|
||||
# Remember to change in `build-test` job too
|
||||
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: "yarn"
|
||||
cache-dependency-path: js/yarn.lock
|
||||
|
||||
# Our action will install npm, cd into `./js`, run `npm run build` and
|
||||
# `npm run build-typings`, then commit and upload any changes
|
||||
- name: Build production JS
|
||||
uses: flarum/action-build@2
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
build_script: build
|
||||
package_manager: yarn
|
||||
typings_script: build-typings
|
||||
|
||||
build-test:
|
||||
name: Test build
|
||||
runs-on: ubuntu-latest
|
||||
needs: [prettier, typecheck, type-coverage]
|
||||
|
||||
# Inverse check of `build-prod`
|
||||
# Remember to change in `build-prod` job too
|
||||
if: github.ref != 'refs/heads/master' || github.event_name != 'push'
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Node
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: "yarn"
|
||||
cache-dependency-path: js/yarn.lock
|
||||
|
||||
# Our action will install npm, cd into `./js`, run `npm run build` and
|
||||
# `npm run build-typings`, then commit and upload any changes
|
||||
- name: Build production JS
|
||||
uses: flarum/action-build@2
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
build_script: build
|
||||
package_manager: yarn
|
||||
typings_script: build-typings
|
||||
do_not_commit: true
|
45
.github/workflows/pr_size_change.yml
vendored
45
.github/workflows/pr_size_change.yml
vendored
@@ -1,45 +0,0 @@
|
||||
name: Bundle size checker
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
push:
|
||||
paths:
|
||||
- "js/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "js/**"
|
||||
|
||||
jobs:
|
||||
bundlewatch:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
name: Bundlewatch
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: "14"
|
||||
|
||||
- name: Use npm v7
|
||||
run: sudo npm install -g npm@7.x.x
|
||||
|
||||
- name: Install JS dependencies
|
||||
# We need to use `npm install` here. If we don't, the workflow will fail.
|
||||
run: npm install
|
||||
working-directory: ./js
|
||||
|
||||
- name: Build production assets
|
||||
run: npm run build
|
||||
working-directory: ./js
|
||||
|
||||
- name: Check bundle size change
|
||||
run: node_modules/.bin/bundlewatch --config .bundlewatch.config.json
|
||||
working-directory: ./js
|
||||
env:
|
||||
BUNDLEWATCH_GITHUB_TOKEN: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}
|
||||
CI_COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
|
79
.github/workflows/test.yml
vendored
79
.github/workflows/test.yml
vendored
@@ -1,79 +0,0 @@
|
||||
name: Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php: [7.3, 7.4, '8.0', '8.1']
|
||||
service: ['mysql:5.7', mariadb]
|
||||
prefix: ['', flarum_]
|
||||
|
||||
include:
|
||||
- service: 'mysql:5.7'
|
||||
db: MySQL
|
||||
- service: mariadb
|
||||
db: MariaDB
|
||||
- prefix: flarum_
|
||||
prefixStr: (prefix)
|
||||
|
||||
exclude:
|
||||
- php: 7.3
|
||||
service: 'mysql:5.7'
|
||||
prefix: flarum_
|
||||
- php: 7.3
|
||||
service: mariadb
|
||||
prefix: flarum_
|
||||
- php: 8.0
|
||||
service: 'mysql:5.7'
|
||||
prefix: flarum_
|
||||
- php: 8.0
|
||||
service: mariadb
|
||||
prefix: flarum_
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: ${{ matrix.service }}
|
||||
ports:
|
||||
- 13306:3306
|
||||
|
||||
name: 'PHP ${{ matrix.php }} / ${{ matrix.db }} ${{ matrix.prefixStr }}'
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@0b9d33cd0782337377999751fc10ea079fdd7104 # pin@v2
|
||||
with:
|
||||
php-version: ${{ matrix.php }}
|
||||
coverage: xdebug
|
||||
extensions: curl, dom, gd, json, mbstring, openssl, pdo_mysql, tokenizer, zip
|
||||
tools: phpunit, composer:v2
|
||||
|
||||
# The authentication alter is necessary because newer mysql versions use the `caching_sha2_password` driver,
|
||||
# which isn't supported prior to PHP7.4
|
||||
# When we drop support for PHP7.3, we should remove this from the setup.
|
||||
- name: Create MySQL Database
|
||||
run: |
|
||||
sudo systemctl start mysql
|
||||
mysql -uroot -proot -e 'CREATE DATABASE flarum_test;' --port 13306
|
||||
mysql -uroot -proot -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';" --port 13306
|
||||
|
||||
- name: Install Composer dependencies
|
||||
run: composer install
|
||||
|
||||
- name: Setup Composer tests
|
||||
run: composer test:setup
|
||||
env:
|
||||
DB_PORT: 13306
|
||||
DB_PASSWORD: root
|
||||
DB_PREFIX: ${{ matrix.prefix }}
|
||||
|
||||
- name: Run Composer tests
|
||||
run: composer test
|
||||
env:
|
||||
COMPOSER_PROCESS_TIMEOUT: 600
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
/vendor
|
||||
composer.lock
|
||||
composer.phar
|
||||
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
tests/.phpunit.result.cache
|
||||
|
110
CHANGELOG.md
110
CHANGELOG.md
@@ -1,5 +1,115 @@
|
||||
# Changelog
|
||||
|
||||
## [1.2.0](https://github.com/flarum/core/compare/v1.1.1...v1.2.0)
|
||||
|
||||
### Added
|
||||
- View `README` documentation in extension pages (https://github.com/flarum/core/pull/3094).
|
||||
- Declare & Use CSS Custom Properties (https://github.com/flarum/core/pull/3146).
|
||||
- Lazy draw dropdowns to improve performance (https://github.com/flarum/core/pull/2925).
|
||||
- Default Settings Extender (https://github.com/flarum/core/pull/3127).
|
||||
- Add `textarea` setting type to admin pages (https://github.com/flarum/core/pull/3141).
|
||||
- Allow registering settings as `Less` config vars through Settings Extender (https://github.com/flarum/core/pull/3011).
|
||||
- Allow replacing of blade template namespaces via extender (https://github.com/flarum/core/pull/3167).
|
||||
- Update to Webpack 5 (https://github.com/flarum/core/pull/3135).
|
||||
- Introduce `Less` custom function extender with a `is-extension-enabled` function (https://github.com/flarum/core/pull/3190).
|
||||
- Support for `few` in ICU Message syntax (https://github.com/flarum/core/pull/3122).
|
||||
- ES6 local support for number formatting (https://github.com/flarum/core/pull/3099).
|
||||
- Added dedicated endpoint for retrieving single groups (https://github.com/flarum/core/pull/3084).
|
||||
- Callback `loadWhere` relation eager loading extender (https://github.com/flarum/core/pull/3116).
|
||||
- Extensible document title driver implementation (https://github.com/flarum/core/pull/3109).
|
||||
- Type checks, typescript coverage GH action (https://github.com/flarum/core/pull/3136).
|
||||
- Add color indicator in appearance admin page instead of validating colors (https://github.com/flarum/core/pull/3140).
|
||||
- Add typing files for our translator libraries (https://github.com/flarum/core/pull/3175).
|
||||
- `StatusWidget` tools extensibility (https://github.com/flarum/core/pull/3189).
|
||||
- Allow switching the `ImageManager` driver (https://github.com/flarum/core/pull/3195).
|
||||
- Events for notification read/all read actions (https://github.com/flarum/core/pull/3203).
|
||||
|
||||
### Changed
|
||||
- Testing with php8.1 (https://github.com/flarum/core/pull/3102).
|
||||
- Migrate fully to Yarn (https://github.com/flarum/core/pull/3155).
|
||||
- Handle post rendering errors to avoid crashes (https://github.com/flarum/core/pull/3061).
|
||||
- Added basic filtering, sorting, and pagination to groups endpoint (https://github.com/flarum/core/pull/3084).
|
||||
- Pass IP address to API Client pipeline (https://github.com/flarum/core/pull/3124).
|
||||
- Rename Extension Page "Uninstall" to "Purge" (https://github.com/flarum/core/pull/3123).
|
||||
- [A11Y] Improve accessibility for discussion reply count on post stream (https://github.com/flarum/core/pull/3090).
|
||||
- Improved post loading support (https://github.com/flarum/core/pull/3100).
|
||||
- Rewrite SubtreeRetainer into Typescript (https://github.com/flarum/core/pull/3137).
|
||||
- Rewrite ModalManager and state to Typescript (https://github.com/flarum/core/pull/3007).
|
||||
- Rewrite frontend application files to Typescript (https://github.com/flarum/core/pull/3006).
|
||||
- Allow extensions to modify the minimum search length in the Search component (https://github.com/flarum/core/pull/3130).
|
||||
- Allow use of any tag in `listItems` helper (https://github.com/flarum/core/pull/3147).
|
||||
- Replace `for ... in` with `Array.reduce` (https://github.com/flarum/core/pull/3149).
|
||||
- Page title format is now implemented through translations (https://github.com/flarum/core/pull/3077, https://github.com/flarum/core/pull/3228)
|
||||
- Add `aria-label` attribute to the navigation drawer button (https://github.com/flarum/core/pull/3157).
|
||||
- Convert extend util to TypeScript (https://github.com/flarum/core/pull/2928).
|
||||
- Better typings for DiscussionListState (https://github.com/flarum/core/pull/3132).
|
||||
- Rewrite ItemList, update `ItemList` typings (https://github.com/flarum/core/pull/3005).
|
||||
- Add priority order to discussion page controls (https://github.com/flarum/core/pull/3165).
|
||||
- Use `@php` in Blade templates (https://github.com/flarum/core/pull/3172).
|
||||
- Convert some common classes/utils to TS (https://github.com/flarum/core/pull/2929).
|
||||
- Convert routes to Typescript (https://github.com/flarum/core/pull/3177).
|
||||
- Move admin `colorItems` to an `ItemList` (https://github.com/flarum/core/pull/3186).
|
||||
- Centralize pagination/canonical meta URL generation in Document (https://github.com/flarum/core/pull/3077).
|
||||
- Use revision versioner to allow custom asset versioning (https://github.com/flarum/core/pull/3183).
|
||||
- Split up application error handling (https://github.com/flarum/core/pull/3184).
|
||||
- Make SlugManager available to blade template (https://github.com/flarum/core/pull/3194).
|
||||
- Convert models to TS (https://github.com/flarum/core/pull/3174).
|
||||
- Allow loading relations in other discussion endpoints (https://github.com/flarum/core/pull/3191).
|
||||
- Improve selected text stylization (https://github.com/flarum/core/pull/2961).
|
||||
- Extract notification `primaryControl` items to an ItemList (https://github.com/flarum/core/pull/3204).
|
||||
- Frontend code housekeeping (#3214, #3213).
|
||||
- Only retain scroll position if coming from discussion (https://github.com/flarum/core/pull/3229).
|
||||
- Use `aria-live` regions to focus screenreader attention on alerts as they appear (https://github.com/flarum/core/pull/3237).
|
||||
- Prevent unwarranted `a11y` warnings on custom Button subclasses (https://github.com/flarum/core/pull/3238).
|
||||
|
||||
### Fixed
|
||||
- Missing locale text in the user editing modal (https://github.com/flarum/core/pull/3093).
|
||||
- Dashes in table prefix prevent installation (https://github.com/flarum/core/pull/3089).
|
||||
- Missing autocomplete attributes to input fields (https://github.com/flarum/core/pull/3088).
|
||||
- Missing route parameters throwing an error (https://github.com/flarum/core/pull/3118).
|
||||
- Mail settings select component never used (https://github.com/flarum/core/pull/3120).
|
||||
- White avatar image throws javascript errors on the profile page (https://github.com/flarum/core/pull/3119).
|
||||
- Unformatted avatar upload validation errors (https://github.com/flarum/core/pull/2946).
|
||||
- Webkit input clear button shows up with the custom one (https://github.com/flarum/core/pull/3128).
|
||||
- Media query breakpoints conflict with Windows display scaling (https://github.com/flarum/core/pull/3139).
|
||||
- `typeof this` not recognized by some IDEs (https://github.com/flarum/core/pull/3142).
|
||||
- `Model.save()` cannot save `null` `hasOne` relationship (https://github.com/flarum/core/pull/3131).
|
||||
- Edit post `until reply` policy broken on PHP 8 (https://github.com/flarum/core/pull/3145).
|
||||
- Inaccurate `Component.component` argument typings (https://github.com/flarum/core/pull/3148).
|
||||
- Scrolling notification list infinitely repeats (https://github.com/flarum/core/pull/3159).
|
||||
- Argument for INFO constant was assigned to `maxfiles` argument incorrectly (bfd81a83cfd0fa8125395a147ff0c9ce622f38e3).
|
||||
- `Activated` event is sent every time an email is confirmed instead of just once (https://github.com/flarum/core/pull/3163).
|
||||
- [A11Y] Modal close button missing accessible label (https://github.com/flarum/core/pull/3161).
|
||||
- [A11Y] Auth modal inputs missing accessible labels (https://github.com/flarum/core/pull/3207).
|
||||
- [A11Y] Triggering click on drawer button can cause layered backdrops (https://github.com/flarum/core/pull/3018).
|
||||
- [A11Y] Focus can leave open nav drawer on mobile (https://github.com/flarum/core/pull/3018).
|
||||
- [A11Y] Post action items not showing when focus is within the post (https://github.com/flarum/core/pull/3173).
|
||||
- [A11Y] Missing accessible label for alert dismiss button (https://github.com/flarum/core/pull/3237).
|
||||
- Error accessing the forum after saving a setting with more than 65k characters (https://github.com/flarum/core/pull/3162).
|
||||
- Cannot restart queue from within (https://github.com/flarum/core/pull/3166).
|
||||
- `Post--by-actor` not showing when comparing user instances (https://github.com/flarum/core/pull/3170).
|
||||
- Incorrect typings for Modal `hide()` method (https://github.com/flarum/core/pull/3180).
|
||||
- Avatar Upload throws errors with correct mimetype and incorrect extension (https://github.com/flarum/core/pull/3181).
|
||||
- Clicking the dropdown button on a post opens all dropdowns in `Post-actions` (https://github.com/flarum/core/pull/3185).
|
||||
- `getPlainContent()` causes external content to be fetched (https://github.com/flarum/core/pull/3193).
|
||||
- `listItems` not accepting all `Mithril.Children` (https://github.com/flarum/core/pull/3176).
|
||||
- Notifications mark as read option updates all notifications including the read ones (https://github.com/flarum/core/pull/3202).
|
||||
- Post meta permalink not properly generated (https://github.com/flarum/core/pull/3216).
|
||||
- Broken contribution link in README (https://github.com/flarum/core/pull/3211).
|
||||
- `WelcomeHero` is displayed when content is empty (https://github.com/flarum/core/pull/3219).
|
||||
- `last_activity_at, last_seen_at` updated on all API requests (https://github.com/flarum/core/pull/3231).
|
||||
- `RememberMe` access token updated twice in API requests (https://github.com/flarum/core/pull/3233).
|
||||
- Error in `funding` item in `composer.json` bricks the frontend (https://github.com/flarum/core/pull/3239).
|
||||
- Escaped quotes in window title (https://github.com/flarum/core/pull/3264)
|
||||
- `schedule:list` command fails due to missing timezone configuration.
|
||||
|
||||
### Deprecated
|
||||
- Unused `evented` utility (https://github.com/flarum/core/pull/3125).
|
||||
|
||||
## [1.1.1](https://github.com/flarum/core/compare/v1.1.0...v1.1.1)
|
||||
|
||||
### Fixed
|
||||
- Performance issue with very large communities.
|
||||
|
||||
## [1.1.0](https://github.com/flarum/core/compare/v1.0.4...v1.1.0)
|
||||
|
||||
|
@@ -86,7 +86,7 @@
|
||||
"wikimedia/less.php": "^3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"flarum/testing": "1.0@dev"
|
||||
"flarum/testing": "^1.0.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
@@ -107,6 +107,28 @@
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.x-dev"
|
||||
},
|
||||
"flarum-cli": {
|
||||
"excludeScaffolding": [
|
||||
"LICENSE.md",
|
||||
"js/tsconfig.json",
|
||||
"js/webpack.config.js"
|
||||
],
|
||||
"modules": {
|
||||
"backendTesting": true,
|
||||
"js": true,
|
||||
"gitConf": true,
|
||||
"githubActions": true,
|
||||
"prettier": true,
|
||||
"typescript": true,
|
||||
"bundlewatch": true,
|
||||
"editorConfig": true,
|
||||
"styleci": true,
|
||||
"admin": true,
|
||||
"forum": true,
|
||||
"jsCommon": true,
|
||||
"css": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
|
@@ -1,2 +1,2 @@
|
||||
export * from './src/common';
|
||||
export * from './src/forum';
|
||||
export * from './src/admin';
|
517
js/dist-typings/@types/mithril/index.d.ts
vendored
Normal file
517
js/dist-typings/@types/mithril/index.d.ts
vendored
Normal file
@@ -0,0 +1,517 @@
|
||||
// Type definitions for Mithril 2.0
|
||||
// Project: https://mithril.js.org/, https://github.com/mithriljs/mithril.js
|
||||
// Definitions by: Mike Linkovich <https://github.com/spacejack>, András Parditka <https://github.com/andraaspar>, Isiah Meadows <https://github.com/isiahmeadows>
|
||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||
// TypeScript Version: 3.2
|
||||
/** Renders a vnode structure into a DOM element. */
|
||||
declare function render(el: Element, vnodes: Mithril.Children): void;
|
||||
|
||||
/** Mounts a component to a DOM element, enabling it to autoredraw on user events. */
|
||||
declare function mount(element: Element, component: Mithril.ComponentTypes<any, any>): void;
|
||||
/** Unmounts a component from a DOM element. */
|
||||
declare function mount(element: Element, component: null): void; // tslint:disable-line unified-signatures
|
||||
|
||||
/** Makes an XHR request and returns a promise. */
|
||||
declare function request<T>(options: Mithril.RequestOptions<T> & { url: string }): Promise<T>;
|
||||
/** Makes an XHR request and returns a promise. */
|
||||
declare function request<T>(url: string, options?: Mithril.RequestOptions<T>): Promise<T>;
|
||||
|
||||
/** Makes a JSON-P request and returns a promise. */
|
||||
declare function jsonp<T>(options: Mithril.JsonpOptions & { url: string }): Promise<T>; // tslint:disable-line:no-unnecessary-generics
|
||||
/** Makes a JSON-P request and returns a promise. */
|
||||
declare function jsonp<T>(url: string, options?: Mithril.JsonpOptions): Promise<T>; // tslint:disable-line:no-unnecessary-generics
|
||||
|
||||
declare namespace Mithril {
|
||||
interface CommonAttributes<Attrs, State> {
|
||||
/** The oninit hook is called before a vnode is touched by the virtual DOM engine. */
|
||||
oninit?(this: State, vnode: Vnode<Attrs, State>): any;
|
||||
/** The oncreate hook is called after a DOM element is created and attached to the document. */
|
||||
oncreate?(this: State, vnode: VnodeDOM<Attrs, State>): any;
|
||||
/** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */
|
||||
onbeforeremove?(this: State, vnode: VnodeDOM<Attrs, State>): Promise<any> | void;
|
||||
/** The onremove hook is called before a DOM element is removed from the document. */
|
||||
onremove?(this: State, vnode: VnodeDOM<Attrs, State>): any;
|
||||
/** The onbeforeupdate hook is called before a vnode is diffed in a update. */
|
||||
onbeforeupdate?(this: State, vnode: Vnode<Attrs, State>, old: VnodeDOM<Attrs, State>): boolean | void;
|
||||
/** The onupdate hook is called after a DOM element is updated, while attached to the document. */
|
||||
onupdate?(this: State, vnode: VnodeDOM<Attrs, State>): any;
|
||||
/** A key to optionally associate with this element. */
|
||||
key?: string | number | undefined;
|
||||
}
|
||||
|
||||
interface Hyperscript {
|
||||
/** Creates a virtual element (Vnode). */
|
||||
(selector: string, ...children: Children[]): Vnode<any, any>;
|
||||
/** Creates a virtual element (Vnode). */
|
||||
(selector: string, attributes: Attributes, ...children: Children[]): Vnode<any, any>;
|
||||
/** Creates a virtual element (Vnode). */
|
||||
<Attrs, State>(component: ComponentTypes<Attrs, State>, ...args: Children[]): Vnode<Attrs, State>;
|
||||
/** Creates a virtual element (Vnode). */
|
||||
<Attrs, State>(
|
||||
component: ComponentTypes<Attrs, State>,
|
||||
attributes: Attrs & CommonAttributes<Attrs, State>,
|
||||
...args: Children[]
|
||||
): Vnode<Attrs, State>;
|
||||
/** Creates a fragment virtual element (Vnode). */
|
||||
fragment(attrs: CommonAttributes<any, any> & { [key: string]: any }, children: ChildArrayOrPrimitive): Vnode<any, any>;
|
||||
/** Turns an HTML string into a virtual element (Vnode). Do not use trust on unsanitized user input. */
|
||||
trust(html: string): Vnode<any, any>;
|
||||
}
|
||||
|
||||
interface RouteResolver<Attrs = {}, State = {}> {
|
||||
/** The onmatch hook is called when the router needs to find a component to render. */
|
||||
onmatch?(
|
||||
this: this,
|
||||
args: Attrs,
|
||||
requestedPath: string,
|
||||
route: string,
|
||||
): ComponentTypes<any, any> | Promise<any> | void;
|
||||
/** The render method is called on every redraw for a matching route. */
|
||||
render?(this: this, vnode: Vnode<Attrs, State>): Children;
|
||||
}
|
||||
|
||||
/** This represents a key-value mapping linking routes to components. */
|
||||
interface RouteDefs {
|
||||
/** The key represents the route. The value represents the corresponding component. */
|
||||
[url: string]: ComponentTypes<any, any> | RouteResolver<any, any>;
|
||||
}
|
||||
|
||||
interface RouteOptions {
|
||||
/** Routing parameters. If path has routing parameter slots, the properties of this object are interpolated into the path string. */
|
||||
replace?: boolean | undefined;
|
||||
/** The state object to pass to the underlying history.pushState / history.replaceState call. */
|
||||
state?: any;
|
||||
/** The title string to pass to the underlying history.pushState / history.replaceState call. */
|
||||
title?: string | undefined;
|
||||
}
|
||||
|
||||
interface RouteLinkAttrs extends Attributes {
|
||||
href: string;
|
||||
selector?: string | ComponentTypes<any> | undefined;
|
||||
options?: RouteOptions | undefined;
|
||||
}
|
||||
|
||||
interface Route {
|
||||
/** Creates application routes and mounts Components and/or RouteResolvers to a DOM element. */
|
||||
(element: Element, defaultRoute: string, routes: RouteDefs): void;
|
||||
/** Returns the last fully resolved routing path, without the prefix. */
|
||||
get(): string;
|
||||
/** Redirects to a matching route or to the default route if no matching routes can be found. */
|
||||
set(route: string, data?: any, options?: RouteOptions): void;
|
||||
/** Defines a router prefix which is a fragment of the URL that dictates the underlying strategy used by the router. */
|
||||
prefix: string;
|
||||
/** This Component renders a link <a href> that will use the current routing strategy */
|
||||
Link: Component<RouteLinkAttrs>;
|
||||
/** Returns the named parameter value from the current route. */
|
||||
param(name: string): string;
|
||||
/** Gets all route parameters. */
|
||||
param(): any;
|
||||
}
|
||||
|
||||
interface RequestOptions<T> {
|
||||
/** The HTTP method to use. */
|
||||
method?: string | undefined;
|
||||
/** The data to be interpolated into the URL and serialized into the querystring. */
|
||||
params?: { [key: string]: any } | undefined;
|
||||
/** The data to be serialized into the request body. */
|
||||
body?: (XMLHttpRequest['send'] extends (x: infer R) => any ? R : never) | (object & { [id: string]: any }) | undefined;
|
||||
/** Whether the request should be asynchronous. Defaults to true. */
|
||||
async?: boolean | undefined;
|
||||
/** A username for HTTP authorization. */
|
||||
user?: string | undefined;
|
||||
/** A password for HTTP authorization. */
|
||||
password?: string | undefined;
|
||||
/** Whether to send cookies to 3rd party domains. */
|
||||
withCredentials?: boolean | undefined;
|
||||
/** Exposes the underlying XMLHttpRequest object for low-level configuration. */
|
||||
config?(xhr: XMLHttpRequest, options: this): XMLHttpRequest | void;
|
||||
/** Headers to append to the request before sending it. */
|
||||
headers?: { [key: string]: string } | undefined;
|
||||
/** A constructor to be applied to each object in the response. */
|
||||
type?: new (o: any) => any;
|
||||
/** A serialization method to be applied to data. Defaults to JSON.stringify, or if options.data is an instance of FormData, defaults to the identity function. */
|
||||
serialize?(data: any): any;
|
||||
/** A deserialization method to be applied to the response. Defaults to a small wrapper around JSON.parse that returns null for empty responses. */
|
||||
deserialize?(data: string): T;
|
||||
/** A hook to specify how the XMLHttpRequest response should be read. Useful for reading response headers and cookies. Defaults to a function that returns xhr.responseText */
|
||||
extract?(xhr: XMLHttpRequest, options: this): T;
|
||||
/**
|
||||
* Force the use of the HTTP body section for data in GET requests when set to true,
|
||||
* or the use of querystring for other HTTP methods when set to false.
|
||||
* Defaults to false for GET requests and true for other methods.
|
||||
*/
|
||||
useBody?: boolean | undefined;
|
||||
/** If false, redraws mounted components upon completion of the request. If true, it does not. */
|
||||
background?: boolean | undefined;
|
||||
/** Milliseconds a request can take before automatically being terminated. */
|
||||
timeout?: number | undefined;
|
||||
/** The expected type of the response, as a legal value of XMLHttpRequest.responseType. */
|
||||
responseType?: '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | undefined;
|
||||
}
|
||||
|
||||
interface JsonpOptions {
|
||||
/** The data to be interpolated into the URL and serialized into the querystring. */
|
||||
params?: { [id: string]: any } | undefined;
|
||||
/** The data to be serialized into the request body. */
|
||||
body?: any;
|
||||
/** A constructor to be applied to each object in the response. */
|
||||
type?: new (o: any) => any;
|
||||
/** The name of the function that will be called as the callback. */
|
||||
callbackName?: string | undefined;
|
||||
/** The name of the querystring parameter name that specifies the callback name. */
|
||||
callbackKey?: string | undefined;
|
||||
/** If false, redraws mounted components upon completion of the request. If true, it does not. */
|
||||
background?: boolean | undefined;
|
||||
}
|
||||
|
||||
interface Redraw {
|
||||
/** Manually triggers an asynchronous redraw of mounted components. */
|
||||
(): void;
|
||||
/** Manually triggers a synchronous redraw of mounted components. */
|
||||
sync(): void;
|
||||
}
|
||||
|
||||
type Params = object & ParamsRec;
|
||||
|
||||
interface ParamsRec {
|
||||
// Ideally, it'd be this:
|
||||
// `[key: string | number]: Params | !symbol & !object`
|
||||
[key: string]: string | number | boolean | null | undefined | Params;
|
||||
}
|
||||
|
||||
interface Static extends Hyperscript {
|
||||
route: Route;
|
||||
mount: typeof mount;
|
||||
render: typeof render;
|
||||
redraw: Redraw;
|
||||
request: typeof request;
|
||||
jsonp: typeof jsonp;
|
||||
/** Returns an object with key/value pairs parsed from a string of the form: ?a=1&b=2 */
|
||||
parseQueryString(queryString: string): Params;
|
||||
/** Turns the key/value pairs of an object into a string of the form: a=1&b=2 */
|
||||
buildQueryString(values: Params): string;
|
||||
/** Parse path name */
|
||||
parsePathname(url: string): { path: string; params: Params };
|
||||
/** Build path name */
|
||||
buildPathname(template: string, params?: Params): string;
|
||||
}
|
||||
|
||||
// Vnode children types
|
||||
type Child = Vnode<any, any> | string | number | boolean | null | undefined;
|
||||
interface ChildArray extends Array<Children> {}
|
||||
type Children = Child | ChildArray;
|
||||
type ChildArrayOrPrimitive = ChildArray | string | number | boolean;
|
||||
|
||||
/** Virtual DOM nodes, or vnodes, are Javascript objects that represent an element (or parts of the DOM). */
|
||||
interface Vnode<Attrs = {}, State = {}> {
|
||||
/** The nodeName of a DOM element. It may also be the string [ if a vnode is a fragment, # if it's a text vnode, or < if it's a trusted HTML vnode. Additionally, it may be a component. */
|
||||
tag: string | ComponentTypes<Attrs, State>;
|
||||
/** A hashmap of DOM attributes, events, properties and lifecycle methods. */
|
||||
attrs: Attrs;
|
||||
/** An object that is persisted between redraws. In component vnodes, state is a shallow clone of the component object. */
|
||||
state: State;
|
||||
/** The value used to map a DOM element to its respective item in an array of data. */
|
||||
key?: string | number | undefined;
|
||||
/** In most vnode types, the children property is an array of vnodes. For text and trusted HTML vnodes, The children property is either a string, a number or a boolean. */
|
||||
children?: ChildArrayOrPrimitive | undefined;
|
||||
/**
|
||||
* This is used instead of children if a vnode contains a text node as its only child.
|
||||
* This is done for performance reasons.
|
||||
* Component vnodes never use the text property even if they have a text node as their only child.
|
||||
*/
|
||||
text?: string | number | boolean | undefined;
|
||||
}
|
||||
|
||||
// In some lifecycle methods, Vnode will have a dom property
|
||||
// and possibly a domSize property.
|
||||
interface VnodeDOM<Attrs = {}, State = {}> extends Vnode<Attrs, State> {
|
||||
/** Points to the element that corresponds to the vnode. */
|
||||
dom: Element;
|
||||
/** This defines the number of DOM elements that the vnode represents (starting from the element referenced by the dom property). */
|
||||
domSize?: number | undefined;
|
||||
}
|
||||
|
||||
type _NoLifecycle<T> = Omit<T, keyof Component>;
|
||||
|
||||
interface CVnode<A = {}> extends Vnode<A, ClassComponent<A>> {}
|
||||
|
||||
interface CVnodeDOM<A = {}> extends VnodeDOM<A, ClassComponent<A>> {}
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any Javascript object that has a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
interface Component<Attrs = {}, State = {}> {
|
||||
/** The oninit hook is called before a vnode is touched by the virtual DOM engine. */
|
||||
oninit?(this: _NoLifecycle<this & State>, vnode: Vnode<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** The oncreate hook is called after a DOM element is created and attached to the document. */
|
||||
oncreate?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */
|
||||
onbeforeremove?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): Promise<any> | void;
|
||||
/** The onremove hook is called before a DOM element is removed from the document. */
|
||||
onremove?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** The onbeforeupdate hook is called before a vnode is diffed in a update. */
|
||||
onbeforeupdate?(this: _NoLifecycle<this & State>, vnode: Vnode<Attrs, _NoLifecycle<this & State>>, old: VnodeDOM<Attrs, _NoLifecycle<this & State>>): boolean | void;
|
||||
/** The onupdate hook is called after a DOM element is updated, while attached to the document. */
|
||||
onupdate?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** Creates a view out of virtual elements. */
|
||||
view(this: _NoLifecycle<this & State>, vnode: Vnode<Attrs, _NoLifecycle<this & State>>): Children | null | void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any class that implements a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
interface ClassComponent<A = {}> {
|
||||
/** The oninit hook is called before a vnode is touched by the virtual DOM engine. */
|
||||
oninit?(vnode: Vnode<A, this>): any;
|
||||
/** The oncreate hook is called after a DOM element is created and attached to the document. */
|
||||
oncreate?(vnode: VnodeDOM<A, this>): any;
|
||||
/** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */
|
||||
onbeforeremove?(vnode: VnodeDOM<A, this>): Promise<any> | void;
|
||||
/** The onremove hook is called before a DOM element is removed from the document. */
|
||||
onremove?(vnode: VnodeDOM<A, this>): any;
|
||||
/** The onbeforeupdate hook is called before a vnode is diffed in a update. */
|
||||
onbeforeupdate?(vnode: Vnode<A, this>, old: VnodeDOM<A, this>): boolean | void;
|
||||
/** The onupdate hook is called after a DOM element is updated, while attached to the document. */
|
||||
onupdate?(vnode: VnodeDOM<A, this>): any;
|
||||
/** Creates a view out of virtual elements. */
|
||||
view(vnode: Vnode<A, this>): Children | null | void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any function that returns an object with a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
type FactoryComponent<A = {}> = (vnode: Vnode<A>) => Component<A>;
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any function that returns an object with a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
type ClosureComponent<A = {}> = FactoryComponent<A>;
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any Javascript object that has a view method is a Mithril component. Components can be consumed via the m() utility.
|
||||
*/
|
||||
type Comp<Attrs = {}, State = {}> = _NoLifecycle<State> & Component<Attrs, _NoLifecycle<State>>;
|
||||
|
||||
/** Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse. Components can be consumed via the m() utility. */
|
||||
type ComponentTypes<A = {}, S = {}> =
|
||||
| Component<A, S>
|
||||
| { new (vnode: CVnode<A>): ClassComponent<A> }
|
||||
| FactoryComponent<A>;
|
||||
|
||||
/** This represents the attributes available for configuring virtual elements, beyond the applicable DOM attributes. */
|
||||
interface Attributes extends CommonAttributes<any, any> {
|
||||
/** The class name(s) for this virtual element, as a space-separated list. */
|
||||
className?: string | undefined;
|
||||
/** The class name(s) for this virtual element, as a space-separated list. */
|
||||
class?: string | undefined;
|
||||
/** Any other virtual element properties, including attributes and event handlers. */
|
||||
[property: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
namespace JSX {
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface Element extends Mithril.Vnode {}
|
||||
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface IntrinsicAttributes extends Mithril.Attributes {}
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface IntrinsicClassAttributes extends Mithril.Attributes {}
|
||||
|
||||
interface IntrinsicElements {
|
||||
// HTML
|
||||
a: Mithril.Attributes;
|
||||
abbr: Mithril.Attributes;
|
||||
address: Mithril.Attributes;
|
||||
area: Mithril.Attributes;
|
||||
article: Mithril.Attributes;
|
||||
aside: Mithril.Attributes;
|
||||
audio: Mithril.Attributes;
|
||||
b: Mithril.Attributes;
|
||||
base: Mithril.Attributes;
|
||||
bdi: Mithril.Attributes;
|
||||
bdo: Mithril.Attributes;
|
||||
big: Mithril.Attributes;
|
||||
blockquote: Mithril.Attributes;
|
||||
body: Mithril.Attributes;
|
||||
br: Mithril.Attributes;
|
||||
button: Mithril.Attributes;
|
||||
canvas: Mithril.Attributes;
|
||||
caption: Mithril.Attributes;
|
||||
cite: Mithril.Attributes;
|
||||
code: Mithril.Attributes;
|
||||
col: Mithril.Attributes;
|
||||
colgroup: Mithril.Attributes;
|
||||
data: Mithril.Attributes;
|
||||
datalist: Mithril.Attributes;
|
||||
dd: Mithril.Attributes;
|
||||
del: Mithril.Attributes;
|
||||
details: Mithril.Attributes;
|
||||
dfn: Mithril.Attributes;
|
||||
dialog: Mithril.Attributes;
|
||||
div: Mithril.Attributes;
|
||||
dl: Mithril.Attributes;
|
||||
dt: Mithril.Attributes;
|
||||
em: Mithril.Attributes;
|
||||
embed: Mithril.Attributes;
|
||||
fieldset: Mithril.Attributes;
|
||||
figcaption: Mithril.Attributes;
|
||||
figure: Mithril.Attributes;
|
||||
footer: Mithril.Attributes;
|
||||
form: Mithril.Attributes;
|
||||
h1: Mithril.Attributes;
|
||||
h2: Mithril.Attributes;
|
||||
h3: Mithril.Attributes;
|
||||
h4: Mithril.Attributes;
|
||||
h5: Mithril.Attributes;
|
||||
h6: Mithril.Attributes;
|
||||
head: Mithril.Attributes;
|
||||
header: Mithril.Attributes;
|
||||
hgroup: Mithril.Attributes;
|
||||
hr: Mithril.Attributes;
|
||||
html: Mithril.Attributes;
|
||||
i: Mithril.Attributes;
|
||||
iframe: Mithril.Attributes;
|
||||
img: Mithril.Attributes;
|
||||
input: Mithril.Attributes;
|
||||
ins: Mithril.Attributes;
|
||||
kbd: Mithril.Attributes;
|
||||
keygen: Mithril.Attributes;
|
||||
label: Mithril.Attributes;
|
||||
legend: Mithril.Attributes;
|
||||
li: Mithril.Attributes;
|
||||
link: Mithril.Attributes;
|
||||
main: Mithril.Attributes;
|
||||
map: Mithril.Attributes;
|
||||
mark: Mithril.Attributes;
|
||||
menu: Mithril.Attributes;
|
||||
menuitem: Mithril.Attributes;
|
||||
meta: Mithril.Attributes;
|
||||
meter: Mithril.Attributes;
|
||||
nav: Mithril.Attributes;
|
||||
noindex: Mithril.Attributes;
|
||||
noscript: Mithril.Attributes;
|
||||
object: Mithril.Attributes;
|
||||
ol: Mithril.Attributes;
|
||||
optgroup: Mithril.Attributes;
|
||||
option: Mithril.Attributes;
|
||||
output: Mithril.Attributes;
|
||||
p: Mithril.Attributes;
|
||||
param: Mithril.Attributes;
|
||||
picture: Mithril.Attributes;
|
||||
pre: Mithril.Attributes;
|
||||
progress: Mithril.Attributes;
|
||||
q: Mithril.Attributes;
|
||||
rp: Mithril.Attributes;
|
||||
rt: Mithril.Attributes;
|
||||
ruby: Mithril.Attributes;
|
||||
s: Mithril.Attributes;
|
||||
samp: Mithril.Attributes;
|
||||
script: Mithril.Attributes;
|
||||
section: Mithril.Attributes;
|
||||
select: Mithril.Attributes;
|
||||
small: Mithril.Attributes;
|
||||
source: Mithril.Attributes;
|
||||
span: Mithril.Attributes;
|
||||
strong: Mithril.Attributes;
|
||||
style: Mithril.Attributes;
|
||||
sub: Mithril.Attributes;
|
||||
summary: Mithril.Attributes;
|
||||
sup: Mithril.Attributes;
|
||||
table: Mithril.Attributes;
|
||||
template: Mithril.Attributes;
|
||||
tbody: Mithril.Attributes;
|
||||
td: Mithril.Attributes;
|
||||
textarea: Mithril.Attributes;
|
||||
tfoot: Mithril.Attributes;
|
||||
th: Mithril.Attributes;
|
||||
thead: Mithril.Attributes;
|
||||
time: Mithril.Attributes;
|
||||
title: Mithril.Attributes;
|
||||
tr: Mithril.Attributes;
|
||||
track: Mithril.Attributes;
|
||||
u: Mithril.Attributes;
|
||||
ul: Mithril.Attributes;
|
||||
var: Mithril.Attributes;
|
||||
video: Mithril.Attributes;
|
||||
wbr: Mithril.Attributes;
|
||||
webview: Mithril.Attributes;
|
||||
|
||||
// SVG
|
||||
svg: Mithril.Attributes;
|
||||
animate: Mithril.Attributes;
|
||||
animateMotion: Mithril.Attributes;
|
||||
animateTransform: Mithril.Attributes;
|
||||
circle: Mithril.Attributes;
|
||||
clipPath: Mithril.Attributes;
|
||||
defs: Mithril.Attributes;
|
||||
desc: Mithril.Attributes;
|
||||
ellipse: Mithril.Attributes;
|
||||
feBlend: Mithril.Attributes;
|
||||
feColorMatrix: Mithril.Attributes;
|
||||
feComponentTransfer: Mithril.Attributes;
|
||||
feComposite: Mithril.Attributes;
|
||||
feConvolveMatrix: Mithril.Attributes;
|
||||
feDiffuseLighting: Mithril.Attributes;
|
||||
feDisplacementMap: Mithril.Attributes;
|
||||
feDistantLight: Mithril.Attributes;
|
||||
feDropShadow: Mithril.Attributes;
|
||||
feFlood: Mithril.Attributes;
|
||||
feFuncA: Mithril.Attributes;
|
||||
feFuncB: Mithril.Attributes;
|
||||
feFuncG: Mithril.Attributes;
|
||||
feFuncR: Mithril.Attributes;
|
||||
feGaussianBlur: Mithril.Attributes;
|
||||
feImage: Mithril.Attributes;
|
||||
feMerge: Mithril.Attributes;
|
||||
feMergeNode: Mithril.Attributes;
|
||||
feMorphology: Mithril.Attributes;
|
||||
feOffset: Mithril.Attributes;
|
||||
fePointLight: Mithril.Attributes;
|
||||
feSpecularLighting: Mithril.Attributes;
|
||||
feSpotLight: Mithril.Attributes;
|
||||
feTile: Mithril.Attributes;
|
||||
feTurbulence: Mithril.Attributes;
|
||||
filter: Mithril.Attributes;
|
||||
foreignObject: Mithril.Attributes;
|
||||
g: Mithril.Attributes;
|
||||
image: Mithril.Attributes;
|
||||
line: Mithril.Attributes;
|
||||
linearGradient: Mithril.Attributes;
|
||||
marker: Mithril.Attributes;
|
||||
mask: Mithril.Attributes;
|
||||
metadata: Mithril.Attributes;
|
||||
mpath: Mithril.Attributes;
|
||||
path: Mithril.Attributes;
|
||||
pattern: Mithril.Attributes;
|
||||
polygon: Mithril.Attributes;
|
||||
polyline: Mithril.Attributes;
|
||||
radialGradient: Mithril.Attributes;
|
||||
rect: Mithril.Attributes;
|
||||
stop: Mithril.Attributes;
|
||||
switch: Mithril.Attributes;
|
||||
symbol: Mithril.Attributes;
|
||||
text: Mithril.Attributes;
|
||||
textPath: Mithril.Attributes;
|
||||
tspan: Mithril.Attributes;
|
||||
use: Mithril.Attributes;
|
||||
view: Mithril.Attributes;
|
||||
|
||||
// Special Mithril types
|
||||
'[': Mithril.Attributes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
declare const Mithril: Mithril.Static;
|
||||
export = Mithril;
|
43
js/dist-typings/@types/mithril/stream/index.d.ts
vendored
Normal file
43
js/dist-typings/@types/mithril/stream/index.d.ts
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
// tslint:disable:rulename strict-export-declare-modifiers
|
||||
/** Creates an empty stream. */
|
||||
declare function Stream<T>(): Stream<T>; // tslint:disable-line no-unnecessary-generics
|
||||
/** Creates a stream with an initial value. */
|
||||
declare function Stream<T>(value: T): Stream<T>; // tslint:disable-line unified-signatures
|
||||
|
||||
declare interface Stream<T> {
|
||||
/** Returns the value of the stream. */
|
||||
(): T;
|
||||
/** Sets the value of the stream. */
|
||||
(value: T): this;
|
||||
/** Creates a dependent stream whose value is set to the result of the callback function. */
|
||||
map<U>(f: (current: T) => U | typeof Stream.SKIP): Stream<U>;
|
||||
/** This method is functionally identical to stream. It exists to conform to Fantasy Land's Applicative specification. */
|
||||
of(val: T): Stream<T>;
|
||||
/** Apply. */
|
||||
ap<U>(f: Stream<(value: T) => U>): Stream<U>;
|
||||
/** A co-dependent stream that unregisters dependent streams when set to true. */
|
||||
end: Stream<boolean>;
|
||||
/** When a stream is passed as the argument to JSON.stringify(), the value of the stream is serialized. */
|
||||
toJSON(): string;
|
||||
/** Returns the value of the stream. */
|
||||
valueOf(): T;
|
||||
}
|
||||
|
||||
declare namespace Stream {
|
||||
/** Creates a computed stream that reactively updates if any of its upstreams are updated. */
|
||||
export function combine<T>(combiner: (...streams: any[]) => T, streams: Array<Stream<any>>): Stream<T>;
|
||||
/** Combines the values of one or more streams into a single stream that is updated whenever one or more of the sources are updated */
|
||||
export function lift<S extends any[], T>(fn: (...values: S) => T, ...streams: {[I in keyof S]: Stream<S[I]>}): Stream<T>;
|
||||
/** Creates a stream whose value is the array of values from an array of streams. */
|
||||
export function merge<S extends any[]>(streams: {[I in keyof S]: Stream<S[I]>}): Stream<{[I in keyof S]: S[I]}>;
|
||||
/** Creates a new stream with the results of calling the function on every incoming stream with and accumulator and the incoming value. */
|
||||
export function scan<T, U>(fn: (acc: U, value: T) => U, acc: U, stream: Stream<T>): Stream<U>;
|
||||
/** Takes an array of pairs of streams and scan functions and merges all those streams using the given functions into a single stream. */
|
||||
export function scanMerge<T, U>(pairs: Array<[Stream<T>, (acc: U, value: T) => U]>, acc: U): Stream<U>;
|
||||
/** Takes an array of pairs of streams and scan functions and merges all those streams using the given functions into a single stream. */
|
||||
export function scanMerge<U>(pairs: Array<[Stream<any>, (acc: U, value: any) => U]>, acc: U): Stream<U>;
|
||||
/** A special value that can be returned to stream callbacks to skip execution of downstreams. */
|
||||
export const SKIP: unique symbol;
|
||||
}
|
||||
|
||||
export = Stream;
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||
export interface ILoadingModalAttrs extends IInternalModalAttrs {
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||
import ExtensionReadme from '../models/ExtensionReadme';
|
||||
import type Mithril from 'mithril';
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import type Mithril from 'mithril';
|
||||
import type User from '../../common/models/User';
|
||||
import ItemList from '../../common/utils/ItemList';
|
||||
|
2
js/dist-typings/common/Translator.d.ts
vendored
2
js/dist-typings/common/Translator.d.ts
vendored
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../@types/translator-icu-rich.d.ts" />
|
||||
import { RichMessageFormatter } from '@askvortsov/rich-icu-message-formatter';
|
||||
import { pluralTypeHandler, selectTypeHandler } from '@ultraq/icu-message-formatter';
|
||||
declare type Translations = Record<string, string>;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import Modal, { IInternalModalAttrs } from './Modal';
|
||||
import ItemList from '../utils/ItemList';
|
||||
import Stream from '../utils/Stream';
|
||||
|
@@ -1,4 +1,3 @@
|
||||
/// <reference types="mithril" />
|
||||
import Component, { ComponentAttrs } from '../Component';
|
||||
export interface LoadingIndicatorAttrs extends ComponentAttrs {
|
||||
/**
|
||||
|
@@ -1,4 +1,3 @@
|
||||
/// <reference types="mithril" />
|
||||
import type RequestError from '../utils/RequestError';
|
||||
import Modal, { IInternalModalAttrs } from './Modal';
|
||||
export interface IRequestErrorModalAttrs extends IInternalModalAttrs {
|
||||
|
14
js/dist-typings/common/index.d.ts
vendored
14
js/dist-typings/common/index.d.ts
vendored
@@ -1,3 +1,13 @@
|
||||
import * as Extend from "./extend/index";
|
||||
import app from "./app";
|
||||
import 'expose-loader?exposes=$,jQuery!jquery';
|
||||
import 'expose-loader?exposes=m!mithril';
|
||||
import 'expose-loader?exposes=dayjs!dayjs';
|
||||
import 'bootstrap/js/affix';
|
||||
import 'bootstrap/js/dropdown';
|
||||
import 'bootstrap/js/modal';
|
||||
import 'bootstrap/js/tooltip';
|
||||
import 'bootstrap/js/transition';
|
||||
import 'jquery.hotkeys/jquery.hotkeys';
|
||||
import * as Extend from './extend/index';
|
||||
import app from './app';
|
||||
export { Extend, app };
|
||||
import './utils/arrayFlatPolyfill';
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||
import Stream from '../../common/utils/Stream';
|
||||
import Mithril from 'mithril';
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||
import ItemList from '../../common/utils/ItemList';
|
||||
import Stream from '../../common/utils/Stream';
|
||||
|
1
js/dist-typings/forum/components/Search.d.ts
vendored
1
js/dist-typings/forum/components/Search.d.ts
vendored
@@ -104,6 +104,7 @@ export default class Search<T extends SearchAttrs = SearchAttrs> extends Compone
|
||||
selectableItems(): JQuery;
|
||||
/**
|
||||
* Get the position of the currently selected search result item.
|
||||
* Returns zero if not found.
|
||||
*/
|
||||
getCurrentNumericIndex(): number;
|
||||
/**
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/// <reference path="../../../src/common/translator-icu-rich.d.ts" />
|
||||
/// <reference path="../../@types/translator-icu-rich.d.ts" />
|
||||
import Modal, { IInternalModalAttrs } from '../../common/components/Modal';
|
||||
import ItemList from '../../common/utils/ItemList';
|
||||
import Stream from '../../common/utils/Stream';
|
||||
|
2
js/dist-typings/forum/routes.d.ts
vendored
2
js/dist-typings/forum/routes.d.ts
vendored
@@ -10,7 +10,7 @@ export declare function makeRouteHelpers(app: ForumApplication): {
|
||||
/**
|
||||
* Generate a URL to a discussion.
|
||||
*/
|
||||
discussion: (discussion: Discussion, near: number) => string;
|
||||
discussion: (discussion: Discussion, near?: number | undefined) => string;
|
||||
/**
|
||||
* Generate a URL to a post.
|
||||
*/
|
||||
|
2
js/dist/admin.js
generated
vendored
2
js/dist/admin.js
generated
vendored
File diff suppressed because one or more lines are too long
2
js/dist/admin.js.LICENSE.txt
generated
vendored
2
js/dist/admin.js.LICENSE.txt
generated
vendored
@@ -48,7 +48,7 @@
|
||||
*/
|
||||
|
||||
/*!
|
||||
* focus-trap 6.7.1
|
||||
* focus-trap 6.7.2
|
||||
* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
|
2
js/dist/admin.js.map
generated
vendored
2
js/dist/admin.js.map
generated
vendored
File diff suppressed because one or more lines are too long
2
js/dist/forum.js
generated
vendored
2
js/dist/forum.js
generated
vendored
File diff suppressed because one or more lines are too long
2
js/dist/forum.js.LICENSE.txt
generated
vendored
2
js/dist/forum.js.LICENSE.txt
generated
vendored
@@ -48,7 +48,7 @@
|
||||
*/
|
||||
|
||||
/*!
|
||||
* focus-trap 6.7.1
|
||||
* focus-trap 6.7.2
|
||||
* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
|
2
js/dist/forum.js.map
generated
vendored
2
js/dist/forum.js.map
generated
vendored
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
|
||||
export * from './src/common';
|
||||
export * from './src/admin';
|
||||
export * from './src/forum';
|
@@ -3,7 +3,7 @@
|
||||
"name": "@flarum/core",
|
||||
"prettier": "@flarum/prettier-config",
|
||||
"dependencies": {
|
||||
"@askvortsov/rich-icu-message-formatter": "^0.2.1",
|
||||
"@askvortsov/rich-icu-message-formatter": "^0.2.4",
|
||||
"@ultraq/icu-message-formatter": "^0.12.0",
|
||||
"bootstrap": "^3.4.1",
|
||||
"clsx": "^1.1.1",
|
||||
@@ -21,7 +21,6 @@
|
||||
"devDependencies": {
|
||||
"@flarum/prettier-config": "^1.0.0",
|
||||
"@types/jquery": "^3.5.10",
|
||||
"@types/mithril": "^2.0.8",
|
||||
"@types/punycode": "^2.1.0",
|
||||
"@types/textarea-caret": "^3.0.1",
|
||||
"bundlewatch": "^0.3.2",
|
||||
@@ -39,11 +38,12 @@
|
||||
"scripts": {
|
||||
"dev": "webpack --mode development --watch",
|
||||
"build": "webpack --mode production",
|
||||
"analyze": "cross-env ANALYZER=true npm run build",
|
||||
"analyze": "cross-env ANALYZER=true yarn run build",
|
||||
"format": "prettier --write src",
|
||||
"format-check": "prettier --check src",
|
||||
"clean-typings": "npx rimraf dist-typings && mkdir dist-typings",
|
||||
"build-typings": "npm run clean-typings && cp -r src/@types dist-typings/@types && tsc",
|
||||
"build-typings": "yarn run clean-typings && [ -e src/@types ] && cp -r src/@types dist-typings/@types && tsc && yarn run post-build-typings",
|
||||
"post-build-typings": "find dist-typings -type f -name '*.d.ts' -print0 | xargs -0 sed -i 's,../src/@types,@types,g'",
|
||||
"check-typings": "tsc --noEmit --emitDeclarationOnly false",
|
||||
"check-typings-coverage": "typescript-coverage-report"
|
||||
},
|
||||
|
517
js/src/@types/mithril/index.d.ts
vendored
Normal file
517
js/src/@types/mithril/index.d.ts
vendored
Normal file
@@ -0,0 +1,517 @@
|
||||
// Type definitions for Mithril 2.0
|
||||
// Project: https://mithril.js.org/, https://github.com/mithriljs/mithril.js
|
||||
// Definitions by: Mike Linkovich <https://github.com/spacejack>, András Parditka <https://github.com/andraaspar>, Isiah Meadows <https://github.com/isiahmeadows>
|
||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||
// TypeScript Version: 3.2
|
||||
/** Renders a vnode structure into a DOM element. */
|
||||
declare function render(el: Element, vnodes: Mithril.Children): void;
|
||||
|
||||
/** Mounts a component to a DOM element, enabling it to autoredraw on user events. */
|
||||
declare function mount(element: Element, component: Mithril.ComponentTypes<any, any>): void;
|
||||
/** Unmounts a component from a DOM element. */
|
||||
declare function mount(element: Element, component: null): void; // tslint:disable-line unified-signatures
|
||||
|
||||
/** Makes an XHR request and returns a promise. */
|
||||
declare function request<T>(options: Mithril.RequestOptions<T> & { url: string }): Promise<T>;
|
||||
/** Makes an XHR request and returns a promise. */
|
||||
declare function request<T>(url: string, options?: Mithril.RequestOptions<T>): Promise<T>;
|
||||
|
||||
/** Makes a JSON-P request and returns a promise. */
|
||||
declare function jsonp<T>(options: Mithril.JsonpOptions & { url: string }): Promise<T>; // tslint:disable-line:no-unnecessary-generics
|
||||
/** Makes a JSON-P request and returns a promise. */
|
||||
declare function jsonp<T>(url: string, options?: Mithril.JsonpOptions): Promise<T>; // tslint:disable-line:no-unnecessary-generics
|
||||
|
||||
declare namespace Mithril {
|
||||
interface CommonAttributes<Attrs, State> {
|
||||
/** The oninit hook is called before a vnode is touched by the virtual DOM engine. */
|
||||
oninit?(this: State, vnode: Vnode<Attrs, State>): any;
|
||||
/** The oncreate hook is called after a DOM element is created and attached to the document. */
|
||||
oncreate?(this: State, vnode: VnodeDOM<Attrs, State>): any;
|
||||
/** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */
|
||||
onbeforeremove?(this: State, vnode: VnodeDOM<Attrs, State>): Promise<any> | void;
|
||||
/** The onremove hook is called before a DOM element is removed from the document. */
|
||||
onremove?(this: State, vnode: VnodeDOM<Attrs, State>): any;
|
||||
/** The onbeforeupdate hook is called before a vnode is diffed in a update. */
|
||||
onbeforeupdate?(this: State, vnode: Vnode<Attrs, State>, old: VnodeDOM<Attrs, State>): boolean | void;
|
||||
/** The onupdate hook is called after a DOM element is updated, while attached to the document. */
|
||||
onupdate?(this: State, vnode: VnodeDOM<Attrs, State>): any;
|
||||
/** A key to optionally associate with this element. */
|
||||
key?: string | number | undefined;
|
||||
}
|
||||
|
||||
interface Hyperscript {
|
||||
/** Creates a virtual element (Vnode). */
|
||||
(selector: string, ...children: Children[]): Vnode<any, any>;
|
||||
/** Creates a virtual element (Vnode). */
|
||||
(selector: string, attributes: Attributes, ...children: Children[]): Vnode<any, any>;
|
||||
/** Creates a virtual element (Vnode). */
|
||||
<Attrs, State>(component: ComponentTypes<Attrs, State>, ...args: Children[]): Vnode<Attrs, State>;
|
||||
/** Creates a virtual element (Vnode). */
|
||||
<Attrs, State>(
|
||||
component: ComponentTypes<Attrs, State>,
|
||||
attributes: Attrs & CommonAttributes<Attrs, State>,
|
||||
...args: Children[]
|
||||
): Vnode<Attrs, State>;
|
||||
/** Creates a fragment virtual element (Vnode). */
|
||||
fragment(attrs: CommonAttributes<any, any> & { [key: string]: any }, children: ChildArrayOrPrimitive): Vnode<any, any>;
|
||||
/** Turns an HTML string into a virtual element (Vnode). Do not use trust on unsanitized user input. */
|
||||
trust(html: string): Vnode<any, any>;
|
||||
}
|
||||
|
||||
interface RouteResolver<Attrs = {}, State = {}> {
|
||||
/** The onmatch hook is called when the router needs to find a component to render. */
|
||||
onmatch?(
|
||||
this: this,
|
||||
args: Attrs,
|
||||
requestedPath: string,
|
||||
route: string,
|
||||
): ComponentTypes<any, any> | Promise<any> | void;
|
||||
/** The render method is called on every redraw for a matching route. */
|
||||
render?(this: this, vnode: Vnode<Attrs, State>): Children;
|
||||
}
|
||||
|
||||
/** This represents a key-value mapping linking routes to components. */
|
||||
interface RouteDefs {
|
||||
/** The key represents the route. The value represents the corresponding component. */
|
||||
[url: string]: ComponentTypes<any, any> | RouteResolver<any, any>;
|
||||
}
|
||||
|
||||
interface RouteOptions {
|
||||
/** Routing parameters. If path has routing parameter slots, the properties of this object are interpolated into the path string. */
|
||||
replace?: boolean | undefined;
|
||||
/** The state object to pass to the underlying history.pushState / history.replaceState call. */
|
||||
state?: any;
|
||||
/** The title string to pass to the underlying history.pushState / history.replaceState call. */
|
||||
title?: string | undefined;
|
||||
}
|
||||
|
||||
interface RouteLinkAttrs extends Attributes {
|
||||
href: string;
|
||||
selector?: string | ComponentTypes<any> | undefined;
|
||||
options?: RouteOptions | undefined;
|
||||
}
|
||||
|
||||
interface Route {
|
||||
/** Creates application routes and mounts Components and/or RouteResolvers to a DOM element. */
|
||||
(element: Element, defaultRoute: string, routes: RouteDefs): void;
|
||||
/** Returns the last fully resolved routing path, without the prefix. */
|
||||
get(): string;
|
||||
/** Redirects to a matching route or to the default route if no matching routes can be found. */
|
||||
set(route: string, data?: any, options?: RouteOptions): void;
|
||||
/** Defines a router prefix which is a fragment of the URL that dictates the underlying strategy used by the router. */
|
||||
prefix: string;
|
||||
/** This Component renders a link <a href> that will use the current routing strategy */
|
||||
Link: Component<RouteLinkAttrs>;
|
||||
/** Returns the named parameter value from the current route. */
|
||||
param(name: string): string;
|
||||
/** Gets all route parameters. */
|
||||
param(): any;
|
||||
}
|
||||
|
||||
interface RequestOptions<T> {
|
||||
/** The HTTP method to use. */
|
||||
method?: string | undefined;
|
||||
/** The data to be interpolated into the URL and serialized into the querystring. */
|
||||
params?: { [key: string]: any } | undefined;
|
||||
/** The data to be serialized into the request body. */
|
||||
body?: (XMLHttpRequest['send'] extends (x: infer R) => any ? R : never) | (object & { [id: string]: any }) | undefined;
|
||||
/** Whether the request should be asynchronous. Defaults to true. */
|
||||
async?: boolean | undefined;
|
||||
/** A username for HTTP authorization. */
|
||||
user?: string | undefined;
|
||||
/** A password for HTTP authorization. */
|
||||
password?: string | undefined;
|
||||
/** Whether to send cookies to 3rd party domains. */
|
||||
withCredentials?: boolean | undefined;
|
||||
/** Exposes the underlying XMLHttpRequest object for low-level configuration. */
|
||||
config?(xhr: XMLHttpRequest, options: this): XMLHttpRequest | void;
|
||||
/** Headers to append to the request before sending it. */
|
||||
headers?: { [key: string]: string } | undefined;
|
||||
/** A constructor to be applied to each object in the response. */
|
||||
type?: new (o: any) => any;
|
||||
/** A serialization method to be applied to data. Defaults to JSON.stringify, or if options.data is an instance of FormData, defaults to the identity function. */
|
||||
serialize?(data: any): any;
|
||||
/** A deserialization method to be applied to the response. Defaults to a small wrapper around JSON.parse that returns null for empty responses. */
|
||||
deserialize?(data: string): T;
|
||||
/** A hook to specify how the XMLHttpRequest response should be read. Useful for reading response headers and cookies. Defaults to a function that returns xhr.responseText */
|
||||
extract?(xhr: XMLHttpRequest, options: this): T;
|
||||
/**
|
||||
* Force the use of the HTTP body section for data in GET requests when set to true,
|
||||
* or the use of querystring for other HTTP methods when set to false.
|
||||
* Defaults to false for GET requests and true for other methods.
|
||||
*/
|
||||
useBody?: boolean | undefined;
|
||||
/** If false, redraws mounted components upon completion of the request. If true, it does not. */
|
||||
background?: boolean | undefined;
|
||||
/** Milliseconds a request can take before automatically being terminated. */
|
||||
timeout?: number | undefined;
|
||||
/** The expected type of the response, as a legal value of XMLHttpRequest.responseType. */
|
||||
responseType?: '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | undefined;
|
||||
}
|
||||
|
||||
interface JsonpOptions {
|
||||
/** The data to be interpolated into the URL and serialized into the querystring. */
|
||||
params?: { [id: string]: any } | undefined;
|
||||
/** The data to be serialized into the request body. */
|
||||
body?: any;
|
||||
/** A constructor to be applied to each object in the response. */
|
||||
type?: new (o: any) => any;
|
||||
/** The name of the function that will be called as the callback. */
|
||||
callbackName?: string | undefined;
|
||||
/** The name of the querystring parameter name that specifies the callback name. */
|
||||
callbackKey?: string | undefined;
|
||||
/** If false, redraws mounted components upon completion of the request. If true, it does not. */
|
||||
background?: boolean | undefined;
|
||||
}
|
||||
|
||||
interface Redraw {
|
||||
/** Manually triggers an asynchronous redraw of mounted components. */
|
||||
(): void;
|
||||
/** Manually triggers a synchronous redraw of mounted components. */
|
||||
sync(): void;
|
||||
}
|
||||
|
||||
type Params = object & ParamsRec;
|
||||
|
||||
interface ParamsRec {
|
||||
// Ideally, it'd be this:
|
||||
// `[key: string | number]: Params | !symbol & !object`
|
||||
[key: string]: string | number | boolean | null | undefined | Params;
|
||||
}
|
||||
|
||||
interface Static extends Hyperscript {
|
||||
route: Route;
|
||||
mount: typeof mount;
|
||||
render: typeof render;
|
||||
redraw: Redraw;
|
||||
request: typeof request;
|
||||
jsonp: typeof jsonp;
|
||||
/** Returns an object with key/value pairs parsed from a string of the form: ?a=1&b=2 */
|
||||
parseQueryString(queryString: string): Params;
|
||||
/** Turns the key/value pairs of an object into a string of the form: a=1&b=2 */
|
||||
buildQueryString(values: Params): string;
|
||||
/** Parse path name */
|
||||
parsePathname(url: string): { path: string; params: Params };
|
||||
/** Build path name */
|
||||
buildPathname(template: string, params?: Params): string;
|
||||
}
|
||||
|
||||
// Vnode children types
|
||||
type Child = Vnode<any, any> | string | number | boolean | null | undefined;
|
||||
interface ChildArray extends Array<Children> {}
|
||||
type Children = Child | ChildArray;
|
||||
type ChildArrayOrPrimitive = ChildArray | string | number | boolean;
|
||||
|
||||
/** Virtual DOM nodes, or vnodes, are Javascript objects that represent an element (or parts of the DOM). */
|
||||
interface Vnode<Attrs = {}, State = {}> {
|
||||
/** The nodeName of a DOM element. It may also be the string [ if a vnode is a fragment, # if it's a text vnode, or < if it's a trusted HTML vnode. Additionally, it may be a component. */
|
||||
tag: string | ComponentTypes<Attrs, State>;
|
||||
/** A hashmap of DOM attributes, events, properties and lifecycle methods. */
|
||||
attrs: Attrs;
|
||||
/** An object that is persisted between redraws. In component vnodes, state is a shallow clone of the component object. */
|
||||
state: State;
|
||||
/** The value used to map a DOM element to its respective item in an array of data. */
|
||||
key?: string | number | undefined;
|
||||
/** In most vnode types, the children property is an array of vnodes. For text and trusted HTML vnodes, The children property is either a string, a number or a boolean. */
|
||||
children?: ChildArrayOrPrimitive | undefined;
|
||||
/**
|
||||
* This is used instead of children if a vnode contains a text node as its only child.
|
||||
* This is done for performance reasons.
|
||||
* Component vnodes never use the text property even if they have a text node as their only child.
|
||||
*/
|
||||
text?: string | number | boolean | undefined;
|
||||
}
|
||||
|
||||
// In some lifecycle methods, Vnode will have a dom property
|
||||
// and possibly a domSize property.
|
||||
interface VnodeDOM<Attrs = {}, State = {}> extends Vnode<Attrs, State> {
|
||||
/** Points to the element that corresponds to the vnode. */
|
||||
dom: Element;
|
||||
/** This defines the number of DOM elements that the vnode represents (starting from the element referenced by the dom property). */
|
||||
domSize?: number | undefined;
|
||||
}
|
||||
|
||||
type _NoLifecycle<T> = Omit<T, keyof Component>;
|
||||
|
||||
interface CVnode<A = {}> extends Vnode<A, ClassComponent<A>> {}
|
||||
|
||||
interface CVnodeDOM<A = {}> extends VnodeDOM<A, ClassComponent<A>> {}
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any Javascript object that has a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
interface Component<Attrs = {}, State = {}> {
|
||||
/** The oninit hook is called before a vnode is touched by the virtual DOM engine. */
|
||||
oninit?(this: _NoLifecycle<this & State>, vnode: Vnode<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** The oncreate hook is called after a DOM element is created and attached to the document. */
|
||||
oncreate?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */
|
||||
onbeforeremove?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): Promise<any> | void;
|
||||
/** The onremove hook is called before a DOM element is removed from the document. */
|
||||
onremove?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** The onbeforeupdate hook is called before a vnode is diffed in a update. */
|
||||
onbeforeupdate?(this: _NoLifecycle<this & State>, vnode: Vnode<Attrs, _NoLifecycle<this & State>>, old: VnodeDOM<Attrs, _NoLifecycle<this & State>>): boolean | void;
|
||||
/** The onupdate hook is called after a DOM element is updated, while attached to the document. */
|
||||
onupdate?(this: _NoLifecycle<this & State>, vnode: VnodeDOM<Attrs, _NoLifecycle<this & State>>): any;
|
||||
/** Creates a view out of virtual elements. */
|
||||
view(this: _NoLifecycle<this & State>, vnode: Vnode<Attrs, _NoLifecycle<this & State>>): Children | null | void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any class that implements a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
interface ClassComponent<A = {}> {
|
||||
/** The oninit hook is called before a vnode is touched by the virtual DOM engine. */
|
||||
oninit?(vnode: Vnode<A, this>): any;
|
||||
/** The oncreate hook is called after a DOM element is created and attached to the document. */
|
||||
oncreate?(vnode: VnodeDOM<A, this>): any;
|
||||
/** The onbeforeremove hook is called before a DOM element is detached from the document. If a Promise is returned, Mithril only detaches the DOM element after the promise completes. */
|
||||
onbeforeremove?(vnode: VnodeDOM<A, this>): Promise<any> | void;
|
||||
/** The onremove hook is called before a DOM element is removed from the document. */
|
||||
onremove?(vnode: VnodeDOM<A, this>): any;
|
||||
/** The onbeforeupdate hook is called before a vnode is diffed in a update. */
|
||||
onbeforeupdate?(vnode: Vnode<A, this>, old: VnodeDOM<A, this>): boolean | void;
|
||||
/** The onupdate hook is called after a DOM element is updated, while attached to the document. */
|
||||
onupdate?(vnode: VnodeDOM<A, this>): any;
|
||||
/** Creates a view out of virtual elements. */
|
||||
view(vnode: Vnode<A, this>): Children | null | void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any function that returns an object with a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
type FactoryComponent<A = {}> = (vnode: Vnode<A>) => Component<A>;
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any function that returns an object with a view method can be used as a Mithril component.
|
||||
* Components can be consumed via the m() utility.
|
||||
*/
|
||||
type ClosureComponent<A = {}> = FactoryComponent<A>;
|
||||
|
||||
/**
|
||||
* Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse.
|
||||
* Any Javascript object that has a view method is a Mithril component. Components can be consumed via the m() utility.
|
||||
*/
|
||||
type Comp<Attrs = {}, State = {}> = _NoLifecycle<State> & Component<Attrs, _NoLifecycle<State>>;
|
||||
|
||||
/** Components are a mechanism to encapsulate parts of a view to make code easier to organize and/or reuse. Components can be consumed via the m() utility. */
|
||||
type ComponentTypes<A = {}, S = {}> =
|
||||
| Component<A, S>
|
||||
| { new (vnode: CVnode<A>): ClassComponent<A> }
|
||||
| FactoryComponent<A>;
|
||||
|
||||
/** This represents the attributes available for configuring virtual elements, beyond the applicable DOM attributes. */
|
||||
interface Attributes extends CommonAttributes<any, any> {
|
||||
/** The class name(s) for this virtual element, as a space-separated list. */
|
||||
className?: string | undefined;
|
||||
/** The class name(s) for this virtual element, as a space-separated list. */
|
||||
class?: string | undefined;
|
||||
/** Any other virtual element properties, including attributes and event handlers. */
|
||||
[property: string]: any;
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
namespace JSX {
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface Element extends Mithril.Vnode {}
|
||||
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface IntrinsicAttributes extends Mithril.Attributes {}
|
||||
// tslint:disable-next-line:no-empty-interface
|
||||
interface IntrinsicClassAttributes extends Mithril.Attributes {}
|
||||
|
||||
interface IntrinsicElements {
|
||||
// HTML
|
||||
a: Mithril.Attributes;
|
||||
abbr: Mithril.Attributes;
|
||||
address: Mithril.Attributes;
|
||||
area: Mithril.Attributes;
|
||||
article: Mithril.Attributes;
|
||||
aside: Mithril.Attributes;
|
||||
audio: Mithril.Attributes;
|
||||
b: Mithril.Attributes;
|
||||
base: Mithril.Attributes;
|
||||
bdi: Mithril.Attributes;
|
||||
bdo: Mithril.Attributes;
|
||||
big: Mithril.Attributes;
|
||||
blockquote: Mithril.Attributes;
|
||||
body: Mithril.Attributes;
|
||||
br: Mithril.Attributes;
|
||||
button: Mithril.Attributes;
|
||||
canvas: Mithril.Attributes;
|
||||
caption: Mithril.Attributes;
|
||||
cite: Mithril.Attributes;
|
||||
code: Mithril.Attributes;
|
||||
col: Mithril.Attributes;
|
||||
colgroup: Mithril.Attributes;
|
||||
data: Mithril.Attributes;
|
||||
datalist: Mithril.Attributes;
|
||||
dd: Mithril.Attributes;
|
||||
del: Mithril.Attributes;
|
||||
details: Mithril.Attributes;
|
||||
dfn: Mithril.Attributes;
|
||||
dialog: Mithril.Attributes;
|
||||
div: Mithril.Attributes;
|
||||
dl: Mithril.Attributes;
|
||||
dt: Mithril.Attributes;
|
||||
em: Mithril.Attributes;
|
||||
embed: Mithril.Attributes;
|
||||
fieldset: Mithril.Attributes;
|
||||
figcaption: Mithril.Attributes;
|
||||
figure: Mithril.Attributes;
|
||||
footer: Mithril.Attributes;
|
||||
form: Mithril.Attributes;
|
||||
h1: Mithril.Attributes;
|
||||
h2: Mithril.Attributes;
|
||||
h3: Mithril.Attributes;
|
||||
h4: Mithril.Attributes;
|
||||
h5: Mithril.Attributes;
|
||||
h6: Mithril.Attributes;
|
||||
head: Mithril.Attributes;
|
||||
header: Mithril.Attributes;
|
||||
hgroup: Mithril.Attributes;
|
||||
hr: Mithril.Attributes;
|
||||
html: Mithril.Attributes;
|
||||
i: Mithril.Attributes;
|
||||
iframe: Mithril.Attributes;
|
||||
img: Mithril.Attributes;
|
||||
input: Mithril.Attributes;
|
||||
ins: Mithril.Attributes;
|
||||
kbd: Mithril.Attributes;
|
||||
keygen: Mithril.Attributes;
|
||||
label: Mithril.Attributes;
|
||||
legend: Mithril.Attributes;
|
||||
li: Mithril.Attributes;
|
||||
link: Mithril.Attributes;
|
||||
main: Mithril.Attributes;
|
||||
map: Mithril.Attributes;
|
||||
mark: Mithril.Attributes;
|
||||
menu: Mithril.Attributes;
|
||||
menuitem: Mithril.Attributes;
|
||||
meta: Mithril.Attributes;
|
||||
meter: Mithril.Attributes;
|
||||
nav: Mithril.Attributes;
|
||||
noindex: Mithril.Attributes;
|
||||
noscript: Mithril.Attributes;
|
||||
object: Mithril.Attributes;
|
||||
ol: Mithril.Attributes;
|
||||
optgroup: Mithril.Attributes;
|
||||
option: Mithril.Attributes;
|
||||
output: Mithril.Attributes;
|
||||
p: Mithril.Attributes;
|
||||
param: Mithril.Attributes;
|
||||
picture: Mithril.Attributes;
|
||||
pre: Mithril.Attributes;
|
||||
progress: Mithril.Attributes;
|
||||
q: Mithril.Attributes;
|
||||
rp: Mithril.Attributes;
|
||||
rt: Mithril.Attributes;
|
||||
ruby: Mithril.Attributes;
|
||||
s: Mithril.Attributes;
|
||||
samp: Mithril.Attributes;
|
||||
script: Mithril.Attributes;
|
||||
section: Mithril.Attributes;
|
||||
select: Mithril.Attributes;
|
||||
small: Mithril.Attributes;
|
||||
source: Mithril.Attributes;
|
||||
span: Mithril.Attributes;
|
||||
strong: Mithril.Attributes;
|
||||
style: Mithril.Attributes;
|
||||
sub: Mithril.Attributes;
|
||||
summary: Mithril.Attributes;
|
||||
sup: Mithril.Attributes;
|
||||
table: Mithril.Attributes;
|
||||
template: Mithril.Attributes;
|
||||
tbody: Mithril.Attributes;
|
||||
td: Mithril.Attributes;
|
||||
textarea: Mithril.Attributes;
|
||||
tfoot: Mithril.Attributes;
|
||||
th: Mithril.Attributes;
|
||||
thead: Mithril.Attributes;
|
||||
time: Mithril.Attributes;
|
||||
title: Mithril.Attributes;
|
||||
tr: Mithril.Attributes;
|
||||
track: Mithril.Attributes;
|
||||
u: Mithril.Attributes;
|
||||
ul: Mithril.Attributes;
|
||||
var: Mithril.Attributes;
|
||||
video: Mithril.Attributes;
|
||||
wbr: Mithril.Attributes;
|
||||
webview: Mithril.Attributes;
|
||||
|
||||
// SVG
|
||||
svg: Mithril.Attributes;
|
||||
animate: Mithril.Attributes;
|
||||
animateMotion: Mithril.Attributes;
|
||||
animateTransform: Mithril.Attributes;
|
||||
circle: Mithril.Attributes;
|
||||
clipPath: Mithril.Attributes;
|
||||
defs: Mithril.Attributes;
|
||||
desc: Mithril.Attributes;
|
||||
ellipse: Mithril.Attributes;
|
||||
feBlend: Mithril.Attributes;
|
||||
feColorMatrix: Mithril.Attributes;
|
||||
feComponentTransfer: Mithril.Attributes;
|
||||
feComposite: Mithril.Attributes;
|
||||
feConvolveMatrix: Mithril.Attributes;
|
||||
feDiffuseLighting: Mithril.Attributes;
|
||||
feDisplacementMap: Mithril.Attributes;
|
||||
feDistantLight: Mithril.Attributes;
|
||||
feDropShadow: Mithril.Attributes;
|
||||
feFlood: Mithril.Attributes;
|
||||
feFuncA: Mithril.Attributes;
|
||||
feFuncB: Mithril.Attributes;
|
||||
feFuncG: Mithril.Attributes;
|
||||
feFuncR: Mithril.Attributes;
|
||||
feGaussianBlur: Mithril.Attributes;
|
||||
feImage: Mithril.Attributes;
|
||||
feMerge: Mithril.Attributes;
|
||||
feMergeNode: Mithril.Attributes;
|
||||
feMorphology: Mithril.Attributes;
|
||||
feOffset: Mithril.Attributes;
|
||||
fePointLight: Mithril.Attributes;
|
||||
feSpecularLighting: Mithril.Attributes;
|
||||
feSpotLight: Mithril.Attributes;
|
||||
feTile: Mithril.Attributes;
|
||||
feTurbulence: Mithril.Attributes;
|
||||
filter: Mithril.Attributes;
|
||||
foreignObject: Mithril.Attributes;
|
||||
g: Mithril.Attributes;
|
||||
image: Mithril.Attributes;
|
||||
line: Mithril.Attributes;
|
||||
linearGradient: Mithril.Attributes;
|
||||
marker: Mithril.Attributes;
|
||||
mask: Mithril.Attributes;
|
||||
metadata: Mithril.Attributes;
|
||||
mpath: Mithril.Attributes;
|
||||
path: Mithril.Attributes;
|
||||
pattern: Mithril.Attributes;
|
||||
polygon: Mithril.Attributes;
|
||||
polyline: Mithril.Attributes;
|
||||
radialGradient: Mithril.Attributes;
|
||||
rect: Mithril.Attributes;
|
||||
stop: Mithril.Attributes;
|
||||
switch: Mithril.Attributes;
|
||||
symbol: Mithril.Attributes;
|
||||
text: Mithril.Attributes;
|
||||
textPath: Mithril.Attributes;
|
||||
tspan: Mithril.Attributes;
|
||||
use: Mithril.Attributes;
|
||||
view: Mithril.Attributes;
|
||||
|
||||
// Special Mithril types
|
||||
'[': Mithril.Attributes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
declare const Mithril: Mithril.Static;
|
||||
export = Mithril;
|
43
js/src/@types/mithril/stream/index.d.ts
vendored
Normal file
43
js/src/@types/mithril/stream/index.d.ts
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
// tslint:disable:rulename strict-export-declare-modifiers
|
||||
/** Creates an empty stream. */
|
||||
declare function Stream<T>(): Stream<T>; // tslint:disable-line no-unnecessary-generics
|
||||
/** Creates a stream with an initial value. */
|
||||
declare function Stream<T>(value: T): Stream<T>; // tslint:disable-line unified-signatures
|
||||
|
||||
declare interface Stream<T> {
|
||||
/** Returns the value of the stream. */
|
||||
(): T;
|
||||
/** Sets the value of the stream. */
|
||||
(value: T): this;
|
||||
/** Creates a dependent stream whose value is set to the result of the callback function. */
|
||||
map<U>(f: (current: T) => U | typeof Stream.SKIP): Stream<U>;
|
||||
/** This method is functionally identical to stream. It exists to conform to Fantasy Land's Applicative specification. */
|
||||
of(val: T): Stream<T>;
|
||||
/** Apply. */
|
||||
ap<U>(f: Stream<(value: T) => U>): Stream<U>;
|
||||
/** A co-dependent stream that unregisters dependent streams when set to true. */
|
||||
end: Stream<boolean>;
|
||||
/** When a stream is passed as the argument to JSON.stringify(), the value of the stream is serialized. */
|
||||
toJSON(): string;
|
||||
/** Returns the value of the stream. */
|
||||
valueOf(): T;
|
||||
}
|
||||
|
||||
declare namespace Stream {
|
||||
/** Creates a computed stream that reactively updates if any of its upstreams are updated. */
|
||||
export function combine<T>(combiner: (...streams: any[]) => T, streams: Array<Stream<any>>): Stream<T>;
|
||||
/** Combines the values of one or more streams into a single stream that is updated whenever one or more of the sources are updated */
|
||||
export function lift<S extends any[], T>(fn: (...values: S) => T, ...streams: {[I in keyof S]: Stream<S[I]>}): Stream<T>;
|
||||
/** Creates a stream whose value is the array of values from an array of streams. */
|
||||
export function merge<S extends any[]>(streams: {[I in keyof S]: Stream<S[I]>}): Stream<{[I in keyof S]: S[I]}>;
|
||||
/** Creates a new stream with the results of calling the function on every incoming stream with and accumulator and the incoming value. */
|
||||
export function scan<T, U>(fn: (acc: U, value: T) => U, acc: U, stream: Stream<T>): Stream<U>;
|
||||
/** Takes an array of pairs of streams and scan functions and merges all those streams using the given functions into a single stream. */
|
||||
export function scanMerge<T, U>(pairs: Array<[Stream<T>, (acc: U, value: T) => U]>, acc: U): Stream<U>;
|
||||
/** Takes an array of pairs of streams and scan functions and merges all those streams using the given functions into a single stream. */
|
||||
export function scanMerge<U>(pairs: Array<[Stream<any>, (acc: U, value: any) => U]>, acc: U): Stream<U>;
|
||||
/** A special value that can be returned to stream callbacks to skip execution of downstreams. */
|
||||
export const SKIP: unique symbol;
|
||||
}
|
||||
|
||||
export = Stream;
|
26
js/src/@types/translator-icu-rich.d.ts
vendored
Normal file
26
js/src/@types/translator-icu-rich.d.ts
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
declare module '@askvortsov/rich-icu-message-formatter' {
|
||||
type IValues = Record<string, any>;
|
||||
|
||||
type ITypeHandler = (
|
||||
value: string,
|
||||
matches: string,
|
||||
locale: string,
|
||||
values: IValues,
|
||||
format: (message: string, values: IValues) => string
|
||||
) => string;
|
||||
type IRichHandler = (tag: any, values: IValues, contents: string) => any;
|
||||
|
||||
type ValueOrArray<T> = T | ValueOrArray<T>[];
|
||||
type NestedStringArray = ValueOrArray<string>;
|
||||
|
||||
export class RichMessageFormatter {
|
||||
locale: string | null;
|
||||
constructor(locale: string | null, typeHandlers: Record<string, ITypeHandler>, richHandler: IRichHandler);
|
||||
|
||||
format(message: string, values: IValues): string;
|
||||
process(message: string, values: IValues): NestedStringArray;
|
||||
rich(message: string, values: IValues): NestedStringArray;
|
||||
}
|
||||
|
||||
export function mithrilRichHandler(tag: any, values: IValues, contents: string): any;
|
||||
}
|
17
js/src/@types/translator-icu.d.ts
vendored
Normal file
17
js/src/@types/translator-icu.d.ts
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
declare module '@ultraq/icu-message-formatter' {
|
||||
export function pluralTypeHandler(
|
||||
value: string,
|
||||
matches: string,
|
||||
locale: string,
|
||||
values: Record<string, any>,
|
||||
format: (text: string, values: Record<string, any>) => string
|
||||
): string;
|
||||
|
||||
export function selectTypeHandler(
|
||||
value: string,
|
||||
matches: string,
|
||||
locale: string,
|
||||
values: Record<string, any>,
|
||||
format: (text: string, values: Record<string, any>) => string
|
||||
): string;
|
||||
}
|
@@ -18,7 +18,7 @@ export default class EditCustomCssModal extends SettingsModal {
|
||||
})}
|
||||
</p>,
|
||||
<div className="Form-group">
|
||||
<textarea className="FormControl" rows="30" bidi={this.setting('custom_less')} />
|
||||
<textarea className="FormControl" rows="30" bidi={this.setting('custom_less')} spellcheck={false} />
|
||||
</div>,
|
||||
];
|
||||
}
|
||||
|
@@ -547,7 +547,11 @@ export default class Application {
|
||||
|
||||
console.group(`${method} ${url} ${status}`);
|
||||
|
||||
console.error(...(formattedErrors || [e]));
|
||||
if (formattedErrors.length) {
|
||||
console.error(...formattedErrors);
|
||||
} else {
|
||||
console.error(e);
|
||||
}
|
||||
|
||||
console.groupEnd();
|
||||
}
|
||||
|
@@ -1,5 +1,6 @@
|
||||
import app from '../common/app';
|
||||
import { FlarumRequestOptions } from './Application';
|
||||
import { fireDeprecationWarning } from './helpers/fireDebugWarning';
|
||||
import Store, { ApiPayloadSingle, ApiResponseSingle, MetaInformation } from './Store';
|
||||
|
||||
export interface ModelIdentifier {
|
||||
@@ -111,6 +112,19 @@ export default abstract class Model {
|
||||
|
||||
if ('attributes' in data) {
|
||||
this.data.attributes ||= {};
|
||||
|
||||
// @deprecated
|
||||
// Filter out relationships that got in by accident.
|
||||
for (const key in data.attributes) {
|
||||
const val = data.attributes[key];
|
||||
if (val && val instanceof Model) {
|
||||
fireDeprecationWarning('Providing models as attributes to `Model.pushData()` or `Model.pushAttributes()` is deprecated.', '3249');
|
||||
delete data.attributes[key];
|
||||
data.relationships ||= {};
|
||||
data.relationships[key] = { data: Model.getIdentifier(val) };
|
||||
}
|
||||
}
|
||||
|
||||
Object.assign(this.data.attributes, data.attributes);
|
||||
}
|
||||
|
||||
|
@@ -61,7 +61,7 @@ export default class EditUserModal<CustomAttrs extends IEditUserModalAttrs = IEd
|
||||
fields() {
|
||||
const items = new ItemList();
|
||||
|
||||
if (app.session.user?.canEditCredentials()) {
|
||||
if (this.attrs.user.canEditCredentials()) {
|
||||
items.add(
|
||||
'username',
|
||||
<div className="Form-group">
|
||||
@@ -145,7 +145,7 @@ export default class EditUserModal<CustomAttrs extends IEditUserModalAttrs = IEd
|
||||
}
|
||||
}
|
||||
|
||||
if (app.session.user?.canEditGroups()) {
|
||||
if (this.attrs.user.canEditGroups()) {
|
||||
items.add(
|
||||
'groups',
|
||||
<div className="Form-group EditUserModal-groups">
|
||||
|
@@ -49,7 +49,7 @@ export default class ModalManager extends Component<IModalManagerAttrs> {
|
||||
// e.g. via ESC key or a click on the modal backdrop.
|
||||
this.$().on('hidden.bs.modal', this.attrs.state.close.bind(this.attrs.state));
|
||||
|
||||
this.focusTrap = createFocusTrap(this.element as HTMLElement);
|
||||
this.focusTrap = createFocusTrap(this.element as HTMLElement, { allowOutsideClick: true });
|
||||
}
|
||||
|
||||
onupdate(vnode: Mithril.VnodeDOM<IModalManagerAttrs, this>): void {
|
||||
|
@@ -22,7 +22,7 @@ export default class RequestErrorModal<CustomAttrs extends IRequestErrorModalAtt
|
||||
|
||||
// If the error is already formatted, just add line endings;
|
||||
// else try to parse it as JSON and stringify it with indentation
|
||||
if (formattedError) {
|
||||
if (formattedError.length) {
|
||||
responseText = formattedError.join('\n\n');
|
||||
} else if (error.response) {
|
||||
responseText = JSON.stringify(error.response, null, 2);
|
||||
|
@@ -30,6 +30,7 @@ import './utils/arrayFlatPolyfill';
|
||||
const tooltipGen = $.fn.tooltip;
|
||||
|
||||
// Remove in a future version of Flarum.
|
||||
// @ts-ignore
|
||||
$.fn.tooltip = function (options, caller) {
|
||||
// Show a warning when `$.tooltip` is used outside of the Tooltip component.
|
||||
// This functionality is deprecated and should not be used.
|
@@ -49,7 +49,6 @@ export default class Drawer {
|
||||
* @internal
|
||||
*/
|
||||
resizeHandler = ((e) => {
|
||||
console.log(this, e);
|
||||
if (!e.matches && this.isOpen()) {
|
||||
// Drawer is open but we've made window bigger, so hide it.
|
||||
this.hide();
|
||||
|
@@ -101,7 +101,7 @@ export default class DiscussionComposer extends ComposerBody {
|
||||
.save(data)
|
||||
.then((discussion) => {
|
||||
this.composer.hide();
|
||||
app.discussions.refresh({ deferClear: true });
|
||||
app.discussions.refresh();
|
||||
m.route.set(app.route.discussion(discussion));
|
||||
}, this.loaded.bind(this));
|
||||
}
|
||||
|
@@ -53,7 +53,9 @@ export default class DiscussionPage<CustomAttrs extends IDiscussionPageAttrs = I
|
||||
// page, then we don't want Mithril to redraw the whole page – if it did,
|
||||
// then the pane would redraw which would be slow and would cause problems with
|
||||
// event handlers.
|
||||
if (app.discussions.hasItems()) {
|
||||
// We will also enable the pane if the discussion list is empty but loading,
|
||||
// because the DiscussionComposer refreshes the list and redirects to the new discussion at the same time.
|
||||
if (app.discussions.hasItems() || app.discussions.isLoading()) {
|
||||
app.pane?.enable();
|
||||
app.pane?.hide();
|
||||
}
|
||||
@@ -210,7 +212,7 @@ export default class DiscussionPage<CustomAttrs extends IDiscussionPageAttrs = I
|
||||
record.relationships.discussion.data.id === discussionId
|
||||
)
|
||||
.map((record) => app.store.getById<Post>('posts', record.id))
|
||||
.sort((a?: Post, b?: Post) => (a?.createdAt()?.getTime() ?? 0) - (b?.createdAt()?.getTime() ?? 0))
|
||||
.sort((a?: Post, b?: Post) => (a?.number() ?? 0) - (b?.number() ?? 0))
|
||||
.slice(0, 20);
|
||||
}
|
||||
|
||||
|
@@ -138,7 +138,7 @@ export default class Post extends Component {
|
||||
classes.push('Post--by-actor');
|
||||
}
|
||||
|
||||
if (user?.id() === discussion.attribute('startUserId')) {
|
||||
if (user && user?.id() === discussion.attribute('startUserId')) {
|
||||
classes.push('Post--by-start-user');
|
||||
}
|
||||
|
||||
|
@@ -161,6 +161,7 @@ export default class Search<T extends SearchAttrs = SearchAttrs> extends Compone
|
||||
className="Search-clear Button Button--icon Button--link"
|
||||
onclick={this.clear.bind(this)}
|
||||
aria-label={app.translator.trans('core.forum.header.search_clear_button_accessible_label')}
|
||||
type="button"
|
||||
>
|
||||
{icon('fas fa-times-circle')}
|
||||
</button>
|
||||
@@ -324,9 +325,10 @@ export default class Search<T extends SearchAttrs = SearchAttrs> extends Compone
|
||||
|
||||
/**
|
||||
* Get the position of the currently selected search result item.
|
||||
* Returns zero if not found.
|
||||
*/
|
||||
getCurrentNumericIndex(): number {
|
||||
return this.selectableItems().index(this.getItem(this.index));
|
||||
return Math.max(0, this.selectableItems().index(this.getItem(this.index)));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -34,7 +34,7 @@ export function makeRouteHelpers(app: ForumApplication) {
|
||||
/**
|
||||
* Generate a URL to a discussion.
|
||||
*/
|
||||
discussion: (discussion: Discussion, near: number) => {
|
||||
discussion: (discussion: Discussion, near?: number) => {
|
||||
return app.route(near && near !== 1 ? 'discussion.near' : 'discussion', {
|
||||
id: discussion.slug(),
|
||||
near: near && near !== 1 ? near : undefined,
|
||||
|
@@ -289,7 +289,7 @@ class PostStreamState {
|
||||
|
||||
if (loadIds.length) {
|
||||
return app.store.find('posts', loadIds).then((newPosts) => {
|
||||
return loaded.concat(newPosts).sort((a, b) => a.createdAt() - b.createdAt());
|
||||
return loaded.concat(newPosts).sort((a, b) => a.number() - b.number());
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -213,7 +213,7 @@ export default {
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
hideAction() {
|
||||
this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });
|
||||
this.pushData({ attributes: { hiddenAt: new Date() }, relationships: { hiddenUser: app.session.user } });
|
||||
|
||||
return this.save({ isHidden: true });
|
||||
},
|
||||
@@ -224,7 +224,7 @@ export default {
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
restoreAction() {
|
||||
this.pushAttributes({ hiddenAt: null, hiddenUser: null });
|
||||
this.pushData({ attributes: { hiddenAt: null }, relationships: { hiddenUser: null } });
|
||||
|
||||
return this.save({ isHidden: false });
|
||||
},
|
||||
|
@@ -151,7 +151,7 @@ export default {
|
||||
*/
|
||||
hideAction() {
|
||||
if (!confirm(extractText(app.translator.trans('core.forum.post_controls.hide_confirmation')))) return;
|
||||
this.pushAttributes({ hiddenAt: new Date(), hiddenUser: app.session.user });
|
||||
this.pushData({ attributes: { hiddenAt: new Date() }, relationships: { hiddenUser: app.session.user } });
|
||||
|
||||
return this.save({ isHidden: true }).then(() => m.redraw());
|
||||
},
|
||||
@@ -162,7 +162,7 @@ export default {
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
restoreAction() {
|
||||
this.pushAttributes({ hiddenAt: null, hiddenUser: null });
|
||||
this.pushData({ attributes: { hiddenAt: null }, relationships: { hiddenUser: null } });
|
||||
|
||||
return this.save({ isHidden: false }).then(() => m.redraw());
|
||||
},
|
||||
|
1843
js/yarn.lock
1843
js/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -41,18 +41,23 @@
|
||||
line-height: 1.5em;
|
||||
color: var(--secondary-color);
|
||||
|
||||
&, input, a {
|
||||
&,
|
||||
input,
|
||||
a {
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
}
|
||||
input, a {
|
||||
input,
|
||||
a {
|
||||
color: inherit;
|
||||
}
|
||||
input {
|
||||
font-size: 16px;
|
||||
width: 500px;
|
||||
|
||||
&, &[disabled], &:focus {
|
||||
&,
|
||||
&[disabled],
|
||||
&:focus {
|
||||
background: none;
|
||||
border: 0;
|
||||
padding: 0 20px 0 0;
|
||||
@@ -230,7 +235,8 @@
|
||||
height: 300px;
|
||||
transition: background 0.2s, box-shadow 0.2s;
|
||||
|
||||
&.active, &.fullScreen {
|
||||
&.active,
|
||||
&.fullScreen {
|
||||
background: var(--body-bg);
|
||||
}
|
||||
&.active:not(.fullScreen) {
|
||||
@@ -258,9 +264,16 @@
|
||||
}
|
||||
}
|
||||
.ComposerBody-header {
|
||||
margin-right: 120px;
|
||||
|
||||
.fullScreen & {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.minimized & {
|
||||
overflow: hidden;
|
||||
margin-right: 32px;
|
||||
}
|
||||
}
|
||||
.Composer-content {
|
||||
padding: 20px 20px 0;
|
||||
@@ -279,7 +292,8 @@
|
||||
margin-bottom: -17px;
|
||||
position: relative;
|
||||
|
||||
.minimized &, .fullScreen & {
|
||||
.minimized &,
|
||||
.fullScreen & {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@@ -287,14 +301,16 @@
|
||||
float: left;
|
||||
.Avatar--size(64px);
|
||||
|
||||
.minimized &, .fullScreen & {
|
||||
.minimized &,
|
||||
.fullScreen & {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.ComposerBody-content {
|
||||
margin-left: 85px;
|
||||
|
||||
.minimized &, .fullScreen & {
|
||||
.minimized &,
|
||||
.fullScreen & {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
12
node_modules/.yarn-integrity
generated
vendored
Normal file
12
node_modules/.yarn-integrity
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"systemParams": "linux-x64-93",
|
||||
"modulesFolders": [
|
||||
"node_modules"
|
||||
],
|
||||
"flags": [],
|
||||
"linkedModules": [],
|
||||
"topLevelPatterns": [],
|
||||
"lockfileEntries": {},
|
||||
"files": [],
|
||||
"artifacts": {}
|
||||
}
|
@@ -41,7 +41,7 @@ class ListPostsController extends AbstractListController
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public $sortFields = ['createdAt'];
|
||||
public $sortFields = ['number', 'createdAt'];
|
||||
|
||||
/**
|
||||
* @var PostFilterer
|
||||
|
@@ -132,7 +132,7 @@ class ShowDiscussionController extends AbstractShowController
|
||||
*/
|
||||
private function loadPostIds(Discussion $discussion, User $actor)
|
||||
{
|
||||
return $discussion->posts()->whereVisibleTo($actor)->orderBy('created_at')->pluck('id')->all();
|
||||
return $discussion->posts()->whereVisibleTo($actor)->orderBy('number')->pluck('id')->all();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -186,7 +186,7 @@ class ShowDiscussionController extends AbstractShowController
|
||||
{
|
||||
$query = $discussion->posts()->whereVisibleTo($actor);
|
||||
|
||||
$query->orderBy('created_at')->skip($offset)->take($limit)->with($include);
|
||||
$query->orderBy('number')->skip($offset)->take($limit)->with($include);
|
||||
|
||||
$posts = $query->get();
|
||||
|
||||
|
@@ -21,7 +21,7 @@ class Application
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const VERSION = '1.2.0-dev';
|
||||
const VERSION = '1.3.0-dev';
|
||||
|
||||
/**
|
||||
* The IoC container for the Flarum application.
|
||||
|
@@ -159,6 +159,9 @@ class InstalledSite implements SiteInterface
|
||||
protected function getIlluminateConfig()
|
||||
{
|
||||
return new ConfigRepository([
|
||||
'app' => [
|
||||
'timezone' => 'UTC'
|
||||
],
|
||||
'view' => [
|
||||
'paths' => [],
|
||||
'compiled' => $this->paths->storage.'/views',
|
||||
@@ -174,7 +177,8 @@ class InstalledSite implements SiteInterface
|
||||
protected function registerLogger(Container $container)
|
||||
{
|
||||
$logPath = $this->paths->storage.'/logs/flarum.log';
|
||||
$handler = new RotatingFileHandler($logPath, 0, Logger::INFO);
|
||||
$logLevel = $this->config->inDebugMode() ? Logger::DEBUG : Logger::INFO;
|
||||
$handler = new RotatingFileHandler($logPath, 0, $logLevel);
|
||||
$handler->setFormatter(new LineFormatter(null, null, true, true));
|
||||
|
||||
$container->instance('log', new Logger('flarum', [$handler]));
|
||||
|
33
src/Mail/FlarumLogTransport.php
Normal file
33
src/Mail/FlarumLogTransport.php
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Mail;
|
||||
|
||||
use Illuminate\Mail\Transport\LogTransport;
|
||||
use Swift_Mime_SimpleMessage;
|
||||
|
||||
class FlarumLogTransport extends LogTransport
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function send(Swift_Mime_SimpleMessage $message, &$failedRecipients = null)
|
||||
{
|
||||
$this->beforeSendPerformed($message);
|
||||
|
||||
// Overriden to use info, so the log driver works in non-debug mode.
|
||||
$this->logger->info($this->getMimeEntityString($message));
|
||||
|
||||
$this->sendPerformed($message);
|
||||
|
||||
return $this->numberOfRecipients($message);
|
||||
}
|
||||
}
|
@@ -11,7 +11,6 @@ namespace Flarum\Mail;
|
||||
|
||||
use Flarum\Settings\SettingsRepositoryInterface;
|
||||
use Illuminate\Contracts\Validation\Factory;
|
||||
use Illuminate\Mail\Transport\LogTransport;
|
||||
use Illuminate\Support\MessageBag;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Swift_Transport;
|
||||
@@ -45,6 +44,6 @@ class LogDriver implements DriverInterface
|
||||
|
||||
public function buildTransport(SettingsRepositoryInterface $settings): Swift_Transport
|
||||
{
|
||||
return new LogTransport($this->logger);
|
||||
return new FlarumLogTransport($this->logger);
|
||||
}
|
||||
}
|
||||
|
0
tests/fixtures/.gitkeep
vendored
Normal file
0
tests/fixtures/.gitkeep
vendored
Normal file
@@ -19,6 +19,7 @@
|
||||
<testsuites>
|
||||
<testsuite name="Flarum Integration Tests">
|
||||
<directory suffix="Test.php">./integration</directory>
|
||||
<exclude>./integration/tmp</exclude>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
||||
|
0
tests/unit/.gitkeep
Normal file
0
tests/unit/.gitkeep
Normal file
Reference in New Issue
Block a user