git.iko.soy/typeable/elm-ui
on e458fa4 help sign in
137 files changed+5396−8120
since splitsnapshots
unifiedsplit
.github/ISSUE_TEMPLATE/bug-unexpected-behavior-report.md+1−1 .github/workflows/docs-preview.yml−36 .github/workflows/label-issues-from-body.yml−14 .github/workflows/label-issues-from-comments.yml−59 .github/workflows/tests.yml−43 CONTRIBUTING.md+5 CSS-LOOKUP.md+1−1 LICENSE+1−1 README.md+6−14 benchmarks/elm.json+1−1 benchmarks/src/View/Results.elm+1−1 tests-rendering/cases/Manual/AlignedForm.elm → cases/Manual/AlignedForm.elm tests-rendering/cases/Manual/All.elm → cases/Manual/All.elm tests-rendering/cases/Manual/LazyPerformance.elm → cases/Manual/LazyPerformance.elm tests-rendering/cases/Manual/OtherScrollbars.elm → cases/Manual/OtherScrollbars.elm tests-rendering/cases/Manual/Overflow.elm → cases/Manual/Overflow.elm tests-rendering/cases/Manual/Scrollbars.elm → cases/Manual/Scrollbars.elm tests-rendering/cases/Manual/ScrollbarsPls.elm → cases/Manual/ScrollbarsPls.elm tests-rendering/cases/Manual/TextLayout.elm → cases/Manual/TextLayout.elm cases/elm.json+26 tests-rendering/cases/open/Scrollbar2.elm → cases/open/Scrollbar2.elm+1−1 tests-rendering/cases/open/Scrollbars.elm → cases/open/Scrollbars.elm+1−1 cases/open/WeirdCentering.elm+31 tests-rendering/cases/resolved/Adjusted.elm → cases/resolved/Adjusted.elm tests-rendering/cases/resolved/BehindContent.elm → cases/resolved/BehindContent.elm tests-rendering/cases/resolved/ColumnGrowth.elm → cases/resolved/ColumnGrowth.elm tests-rendering/cases/resolved/FocusStyles.elm → cases/resolved/FocusStyles.elm tests-rendering/cases/resolved/HugePlaceholder.elm → cases/resolved/HugePlaceholder.elm tests-rendering/cases/resolved/MismatchTextInputText.elm → cases/resolved/MismatchTextInputText.elm tests-rendering/cases/resolved/MultilineCollapsed.elm → cases/resolved/MultilineCollapsed.elm tests-rendering/cases/resolved/MultilineInput.elm → cases/resolved/MultilineInput.elm tests-rendering/cases/resolved/MultilineNewline.elm → cases/resolved/MultilineNewline.elm tests-rendering/cases/resolved/NestedColumns.elm → cases/resolved/NestedColumns.elm tests-rendering/cases/resolved/OtherOtherZindex.elm → cases/resolved/OtherOtherZindex.elm tests-rendering/cases/resolved/OtherZIndex.elm → cases/resolved/OtherZIndex.elm tests-rendering/cases/resolved/OverflowingInput.elm → cases/resolved/OverflowingInput.elm tests-rendering/cases/resolved/OverflowingInput2.elm → cases/resolved/OverflowingInput2.elm tests-rendering/cases/resolved/OverflowingInput3.elm → cases/resolved/OverflowingInput3.elm tests-rendering/cases/resolved/ReversedTableOrder.elm → cases/resolved/ReversedTableOrder.elm tests-rendering/cases/resolved/TextAreaMax.elm → cases/resolved/TextAreaMax.elm tests-rendering/cases/resolved/WeirdWrapping.elm → cases/resolved/WeirdWrapping.elm tests-rendering/cases/resolved/ZIndex.elm → cases/resolved/ZIndex.elm tests-rendering/cases/resolved/elm.json → cases/resolved/elm.json elm.json+3−5 examples/Basic.elm+1−1 examples/Form.elm+4−12 examples/Table.elm+1−1 examples/elm.json+22−19 notes/CHANGES-FROM-STYLE-ELEMENTS.md+4−1 notes/RUNNING_TESTS.md+7−17 notes/classifying-issues.md−29 notes/discussion/ColorWithoutAlpha.API.md−135 notes/discussion/ColorWithoutAlpha.md−67 package-lock.json−1235 package.json+29−33 src/Element.elm+39−81 src/Element/Font.elm+2−2 src/Element/Input.elm+40−78 src/Element/Region.elm+1−5 src/Internal/Model.elm+32−30 src/Internal/Style.elm+16−63 tests-rendering/automation/build.js−90 tests-rendering/automation/doc-preview.sh−1 tests-rendering/automation/run.js−304 tests-rendering/automation/templates/Run.elm−14 tests-rendering/automation/templates/gather-styles.html−185 tests-rendering/automation/view.js−73 tests-rendering/cases/elm.json−23 tests-rendering/cases/open/InFrontSize.elm−43 tests-rendering/cases/open/LabelledInputAlignRight.elm−28 tests-rendering/cases/open/NearbyElementBordersOverlap.elm−46 tests-rendering/cases/open/StackedScrollingColumnsHeight.elm−42 tests-rendering/cases/open/WeirdCentering.elm−35 tests-rendering/cases/resolved/ClippedElInFixedWidthColumn.elm−31 tests-rendering/cases/resolved/ElInFixedHeightColumn.elm−41 tests-rendering/cases/resolved/Images/ImageRegression.elm−63 tests-rendering/cases/resolved/Images/ImageRegression2.elm−19 tests-rendering/cases/resolved/Images/ImageSizing.elm−24 tests-rendering/cases/resolved/Input/FocusLinks.elm−37 tests-rendering/cases/resolved/Input/FocusStylePrecedingElements.elm−38 tests-rendering/cases/resolved/Input/InputAlignment.elm−44 tests-rendering/cases/resolved/Input/LabelAlignBaseline.elm−34 tests-rendering/cases/resolved/Input/Placeholder.elm−59 tests-rendering/cases/resolved/Input/Slider.elm−74 tests-rendering/cases/resolved/Layout/BreaksWithinParagraph.elm−17 tests-rendering/cases/resolved/Layout/ColumnLayouts.elm−103 tests-rendering/cases/resolved/Layout/Columns/DistributeHeight.elm−46 tests-rendering/cases/resolved/Layout/Columns/DistributeHeightCorrectly2.elm−86 tests-rendering/cases/resolved/Layout/Columns/DoNotCollapseBelow0.elm−48 tests-rendering/cases/resolved/Layout/Columns/SafariTwo.elm−40 tests-rendering/cases/resolved/Layout/NestedParagraphs.elm−165 tests-rendering/cases/resolved/Layout/Rounded.elm−54 tests-rendering/cases/resolved/Layout/SafariBugIssue147.elm−37 tests-rendering/cases/resolved/Layout/WrapRow.elm−13 tests-rendering/cases/resolved/Misc/Scroll.elm−48 tests-rendering/cases/resolved/Nearby/InFrontIssue.elm−64 tests-rendering/cases/resolved/Nearby/Issue22ZIndex.elm−87 tests-rendering/cases/resolved/Nearby/OtherInFrontIssue.elm−55 tests-rendering/cases/resolved/Nearby/ZIndexRegression.elm−43 tests-rendering/elm.json−25 tests-rendering/src/Testable/Element.elm−1723 tests-rendering/src/Testable/Element/Border.elm−20 tests-rendering/src/Testable/Generator.elm−398 tests-rendering/src/Testable/Runner.elm−607 tests-rendering/src/Tests/Alignment.elm−49 tests-rendering/src/Tests/All.elm−44 tests-rendering/src/Tests/Nearby.elm−179 tests-rendering/src/Tests/Run.elm−14 tests-rendering/src/Tests/Spacing.elm−36 tests-rendering/src/Tests/TextWrapping.elm−51 tests/Tests/Basic.elm+54 tests/Tests/ColumnAlignment.elm+176 tests/Tests/ColumnSpacing.elm+68 tests/Tests/ElementAlignment.elm+111 tests/Tests/Nearby.elm+438 tests-rendering/src/Tests/Palette.elm → tests/Tests/Palette.elm tests/Tests/RowAlignment.elm+212 tests/Tests/RowSpacing.elm+69 tests/Tests/Run.elm+29 tests-rendering/src/Tests/Table.elm.todo → tests/Tests/Table.elm.todo tests-rendering/src/Tests/Transparency.elm → tests/Tests/Transparency.elm tests-rendering/src/Tests/WidthHeight.elm → tests/Tests/WidthHeight.elm tests-rendering/automation/publish-file.sh → tests/automation/publish-file.sh−2 tests/automation/run.js+291 tests/automation/templates/gather-styles.html+105 tests/elm.json+30 tests-rendering/src/Generator.elm → tests/src/Generator.elm tests-rendering/src/Testable.elm → tests/src/Testable.elm+131−337 tests/src/Testable/Element.elm+1107 tests-rendering/src/Testable/Element/Background.elm → tests/src/Testable/Element/Background.elm+4−5 tests-rendering/src/Testable/Element/Font.elm → tests/src/Testable/Element/Font.elm+6−14 tests/src/Testable/FuzzMain.elm.old+632 tests/src/Testable/Runner.elm+470 tests/ClassNames.elm → tests/suite/ClassNames.elm+3−5 tests/Flags.elm → tests/suite/Flags.elm+1 tests/suite/elm-package.json+16 yarn.lock+1167−370
.github/ISSUE_TEMPLATE/bug-unexpected-behavior-report.md+1−1
@@ -8,7 +8,7 @@ about: Capture any unexpected behavior or bugs you've found with this library
88
99If you can, please put together a [Short, Self Contained, Correct, Example](http://sscce.org/) of what you're encountering. It really helps if the example is as succinct as possible.
1010
11−Here's a basic template in [ellie](https://www.ellie-app.com/3fhCyrxjLw3a1) to get you started!
11+Here's a basic template in [ellie](https://ellie-app.com/3fhCyrxjLw3a1) to get you started!
1212
1313**Expected behavior**
1414A clear and concise description of what you expected to happen.
.github/workflows/docs-preview.ymldeleted−36
@@ -1,36 +0,0 @@
1−# This is a basic workflow to help you get started with Actions
2−
3−name: Documentation
4−
5−# Controls when the action will run. Triggers the workflow on push or pull request
6−# events but only for the master branch
7−on:
8− push:
9− branches: [ master ]
10− pull_request:
11− branches: [ master ]
12−
13−# A workflow run is made up of one or more jobs that can run sequentially or in parallel
14−jobs:
15− # This workflow contains a single job called "build"
16− build:
17− # The type of runner that the job will run on
18− runs-on: ubuntu-latest
19−
20−
21− # Steps represent a sequence of tasks that will be executed as part of the job
22− steps:
23− # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
24− - uses: actions/checkout@v2
25−
26− - name: Setup node
27− uses: actions/setup-node@v1
28− with:
29− node-version: 10
30−
31− - name: Install
32− run: npm install
33−
34− # Runs a single command using the runners shell
35− - name: Run a one-line script
36− run: npm run test-doc-preview
.github/workflows/label-issues-from-body.ymldeleted−14
@@ -1,14 +0,0 @@
1−name: "Label issue from body keyword"
2−on:
3− issues:
4− types: [opened, edited]
5−
6−jobs:
7− test:
8− runs-on: ubuntu-latest
9− steps:
10− - uses: Naturalclar/issue-action@v1.0.0
11− with:
12− keywords: '["https://ellie-app.com/"]'
13− labels: '["has-ellie"]'
14− github-token: "${{ secrets.GITHUB_TOKEN }}"
.github/workflows/label-issues-from-comments.ymldeleted−59
@@ -1,59 +0,0 @@
1−name: "Label issue from comment keyword"
2−on:
3− issue_comment:
4− types: [created, edited]
5−
6−jobs:
7− test:
8− runs-on: ubuntu-latest
9− steps:
10− - uses: Amwam/issue-comment-action@v1.3.1
11− with:
12− keywords: '["#bug"]'
13− labels: '["bug"]'
14− github-token: "${{ secrets.GITHUB_TOKEN }}"
15− - uses: Amwam/issue-comment-action@v1.3.1
16− with:
17− keywords: '["#feature-suggestion"]'
18− labels: '["feature-suggestion"]'
19− github-token: "${{ secrets.GITHUB_TOKEN }}"
20− - uses: Amwam/issue-comment-action@v1.3.1
21− with:
22− keywords: '["#has-ellie", "https://ellie-app.com/"]'
23− labels: '["has-ellie"]'
24− github-token: "${{ secrets.GITHUB_TOKEN }}"
25− - uses: Amwam/issue-comment-action@v1.3.1
26− with:
27− keywords: '["#no-ellie"]'
28− labels: '["no-ellie"]'
29− github-token: "${{ secrets.GITHUB_TOKEN }}"
30− - uses: Amwam/issue-comment-action@v1.3.1
31− with:
32− keywords: '["#has-test"]'
33− labels: '["has-test"]'
34− github-token: "${{ secrets.GITHUB_TOKEN }}"
35− - uses: Amwam/issue-comment-action@v1.3.1
36− with:
37− keywords: '["#pain-point"]'
38− labels: '["pain-point"]'
39− github-token: "${{ secrets.GITHUB_TOKEN }}"
40− - uses: Amwam/issue-comment-action@v1.3.1
41− with:
42− keywords: '["#test-incorrectly-passing"]'
43− labels: '["test-incorrectly-passing"]'
44− github-token: "${{ secrets.GITHUB_TOKEN }}"
45− - uses: Amwam/issue-comment-action@v1.3.1
46− with:
47− keywords: '["#test-not-compiling"]'
48− labels: '["test-not-compiling"]'
49− github-token: "${{ secrets.GITHUB_TOKEN }}"
50− - uses: Amwam/issue-comment-action@v1.3.1
51− with:
52− keywords: '["#test-failing"]'
53− labels: '["test-failing"]'
54− github-token: "${{ secrets.GITHUB_TOKEN }}"
55− - uses: Amwam/issue-comment-action@v1.3.1
56− with:
57− keywords: '["#unexpected"]'
58− labels: '["unexpected"]'
59− github-token: "${{ secrets.GITHUB_TOKEN }}"
.github/workflows/tests.ymldeleted−43
@@ -1,43 +0,0 @@
1−name: Test Suite
2−
3−on:
4− push:
5− branches: [ master ]
6− pull_request:
7− branches: [ master ]
8−
9−
10−jobs:
11− testing:
12− runs-on: ubuntu-latest
13−
14− steps:
15− - uses: actions/checkout@v2
16−
17− - name: Setup node
18− uses: actions/setup-node@v1
19− with:
20− node-version: 10
21−
22− - uses: actions/cache@v1
23− with:
24− path: ~/.npm
25− key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
26− restore-keys: |
27− ${{ runner.os }}-node-
28−
29− - name: Install
30− run: npm ci
31−
32− - name: Elm test suite
33− run: npm run test
34−
35− - uses: webfactory/ssh-agent@v0.2.0
36− with:
37− ssh-private-key: ${{ secrets.ELM_UI_TESTING_SSH_PRIVATE_KEY }}
38−
39− - name: Rendering test suite on saucelabs
40− run: npm run test-render-sauce-automated -- --build=2.0.0 --name=development
41− env:
42− SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
43− SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
CONTRIBUTING.md+5
@@ -23,3 +23,8 @@ Here's a basic template in [ellie](https://ellie-app.com/3fhCyrxjLw3a1) to get y
2323One of the more challenging parts of the project like this is gathering information.
2424
2525If you know of good resources about accessibility, internationalization, design, or [any of the topics listed in the research folder](https://github.com/mdgriffith/elm-ui/tree/master/notes/research), send them my way either via PR to those documents or on slack.
26+
27+
28+# Helpful Projects
29+
30+Check out the [projects](https://github.com/mdgriffith/elm-ui/tree/master/notes/projects) folder for project contributions that could be useful for `elm-ui`.
CSS-LOOKUP.md+1−1
@@ -15,4 +15,4 @@ CSS | Style Elements | Description
1515`margin` | __N/A__ Instead, check out `padding` and `spacing` | `margin` in CSS was designed to fight with `padding`. This library was designed to minimize override logic and properties that fight with each other in order to create a layout language that is predictable and easy to think about. The result is that in style elements, there's generally only *one place* where an effect can happen.
1616`:hover`, `:focus`, `:active` | `mouseOver`, `focused`, `mouseDown` | Only certain styles are allowed to be in a pseudo state. They have the type `Attr decorative msg`, which means they can be either an `Attribute` or a `Decoration`.
1717`<form>` | __N/a__ | __Elm__ already has a mechanism for submiting data to a server, namely the `Http` package. There has been some mention that the `form` element might be beneficial accessibility-wise, which I'm definitely open to hearing about!
18−`onSubmit` | __N/A__ | Similar to `<form>`, there is no `onSubmit` behavior. Likely if you're attempting to capture some of the keybaord related behavior of `onSubmit`, you're likely better just crafting a keyboard event handler in the first place!
18+`onSubmit` | __N/A__ | Similar to `<form>`, there is no `onSubmit` behavior. Likely if you're attempting to capture some of the keybaord related behavior of `onSubmit`, you're likely better just crafting a keyboard even handler in the first place!
LICENSE+1−1
@@ -1,4 +1,4 @@
1−Copyright (c) 2020, Matthew Griffith
1+Copyright (c) 2018, Matthew Griffith
22All rights reserved.
33
44Redistribution and use in source and binary forms, with or without
README.md+6−14
@@ -1,7 +1,8 @@
1−![](https://github.com/mdgriffith/elm-ui/workflows/Test%20Suite/badge.svg)
1+# Join the Elm UI Slack!
22
3+First, if you have a question about how to do something with the library, join `#elm-ui` on the [Elm Slack](https://elmlang.herokuapp.com/)! There are usually a number of people who are willing to help out, myself included.
34
4−Check out the talk that goes with the library, [Building a Better Design Toolkit](https://www.youtube.com/watch?v=Ie-gqwSHQr0&t=2s)
5+Also, check out the talk that goes with the library, [Building a Better Design Toolkit](https://www.youtube.com/watch?v=Ie-gqwSHQr0&t=2s)
56
67# A New Language for Layout and Interface
78
@@ -54,24 +55,15 @@ myElement =
5455 (text "stylish!")
5556```
5657
57−# Join the Elm UI Slack!
5858
59−First, if you have a question about how to do something with the library, join `#elm-ui` on the [Elm Slack](https://elmlang.herokuapp.com/)! There are usually a number of people who are willing to help out, myself included.
59+
6060
6161## History
6262
6363The work is based off of a rewrite of the [Style Elements](https://github.com/mdgriffith/style-elements) library. A lot of that work was originally released under the [Stylish Elephants](https://github.com/mdgriffith/stylish-elephants) project.
6464
65−## Community Cookbook
66−
67−The community around `elm-ui` is maintaining a collection of examples called the [elm-ui-cookbook](https://github.com/rofrol/elm-ui-cookbook). If you are just starting out with `elm-ui`, or get stuck on specific things, this can be a great resource.
68−
69−## Notes
70−
71−Make sure to have `<!DOCTYPE html>` on top of your application; otherwise, things might get messed up in some browsers.
65+## Learn from the cookbook
7266
73−## Contributing
67+Visit the [elm-ui-cookbook repository](https://github.com/rofrol/elm-ui-cookbook) which collect more and more examples of elm-ui in action; this is a great resource if you are starting out `elm-ui` and want some practical guidance.
7468
75−Want to help out fixing bugs or reporting issues?
7669
77−Please add issues you find, and if you want to verify code you want to contribute, please read how to run the tests [here](https://github.com/mdgriffith/elm-ui/blob/master/notes/RUNNING_TESTS.md).
benchmarks/elm.json+1−1
@@ -4,7 +4,7 @@
44 "src",
55 "../src"
66 ],
7− "elm-version": "0.19.1",
7+ "elm-version": "0.19.0",
88 "dependencies": {
99 "direct": {
1010 "avh4/elm-color": "1.0.0",
benchmarks/src/View/Results.elm+1−1
@@ -142,7 +142,7 @@ viewLinks data =
142142viewSingleLink result =
143143 Html.a
144144 [ Attr.href result.link
145− , Attr.style "padding-right" "30px"
145+ , Html.style "padding-right" "30px"
146146 ]
147147 [ Html.text result.name ]
148148
tests-rendering/cases/Manual/AlignedForm.elm → cases/Manual/AlignedForm.elmrenamed

The content is the same.

tests-rendering/cases/Manual/All.elm → cases/Manual/All.elmrenamed

The content is the same.

tests-rendering/cases/Manual/LazyPerformance.elm → cases/Manual/LazyPerformance.elmrenamed

The content is the same.

tests-rendering/cases/Manual/OtherScrollbars.elm → cases/Manual/OtherScrollbars.elmrenamed

The content is the same.

tests-rendering/cases/Manual/Overflow.elm → cases/Manual/Overflow.elmrenamed

The content is the same.

tests-rendering/cases/Manual/Scrollbars.elm → cases/Manual/Scrollbars.elmrenamed

The content is the same.

tests-rendering/cases/Manual/ScrollbarsPls.elm → cases/Manual/ScrollbarsPls.elmrenamed

The content is the same.

tests-rendering/cases/Manual/TextLayout.elm → cases/Manual/TextLayout.elmrenamed

The content is the same.

cases/elm.jsonnew file+26
@@ -0,0 +1,26 @@
1+{
2+ "type": "application",
3+ "source-directories": [
4+ "open",
5+ "../src/"
6+ ],
7+ "elm-version": "0.19.0",
8+ "dependencies": {
9+ "direct": {
10+ "elm/browser": "1.0.0",
11+ "elm/core": "1.0.0",
12+ "elm/html": "1.0.0",
13+ "elm/json": "1.0.0",
14+ "elm/virtual-dom": "1.0.0",
15+ "ohanhi/lorem": "1.0.2"
16+ },
17+ "indirect": {
18+ "elm/time": "1.0.0",
19+ "elm/url": "1.0.0"
20+ }
21+ },
22+ "test-dependencies": {
23+ "direct": {},
24+ "indirect": {}
25+ }
26+}
tests-rendering/cases/open/Scrollbar2.elm → cases/open/Scrollbar2.elmrenamed+1−1
@@ -1,4 +1,4 @@
1−module Scrollbar2 exposing (main, myElement, sidebar)
1+module Main exposing (main, myElement, sidebar)
22
33import Element exposing (Element, alignRight, centerY, column, el, fill, height, padding, px, rgb255, row, spacing, text, width)
44import Element.Background as Background
tests-rendering/cases/open/Scrollbars.elm → cases/open/Scrollbars.elmrenamed+1−1
@@ -1,4 +1,4 @@
1−module Scrollbars exposing (main)
1+module Main exposing (main)
22
33import Element exposing (..)
44import Element.Background as Background
cases/open/WeirdCentering.elmnew file+31
@@ -0,0 +1,31 @@
1+module Main exposing (main)
2+
3+import Browser
4+import Element
5+import Element.Background as Background
6+import Element.Input as Input
7+import Html exposing (Html, button, div, text)
8+import Html.Events exposing (onClick)
9+
10+
11+main : Html msg
12+main =
13+ Element.layout [] <|
14+ Element.column []
15+ [ Element.text "Example with centerX:"
16+ , Element.row
17+ [ Element.width Element.fill ]
18+ [ Element.row [ Element.centerX, Background.color <| Element.rgb255 0 200 0 ]
19+ [ Element.paragraph [ Element.width Element.shrink ] [ Element.text "Hello world" ]
20+ , Element.paragraph [ Element.width Element.shrink ] [ Element.text "Hello world" ]
21+ ]
22+ ]
23+ , Element.text "Example without centerX:"
24+ , Element.row
25+ [ Element.width Element.fill ]
26+ [ Element.row [ Background.color <| Element.rgb255 0 200 0 ]
27+ [ Element.paragraph [ Element.width Element.shrink ] [ Element.text "Hello world" ]
28+ , Element.paragraph [ Element.width Element.shrink ] [ Element.text "Hello world" ]
29+ ]
30+ ]
31+ ]
tests-rendering/cases/resolved/Adjusted.elm → cases/resolved/Adjusted.elmrenamed

The content is the same.

tests-rendering/cases/resolved/BehindContent.elm → cases/resolved/BehindContent.elmrenamed

The content is the same.

tests-rendering/cases/resolved/ColumnGrowth.elm → cases/resolved/ColumnGrowth.elmrenamed

The content is the same.

tests-rendering/cases/resolved/FocusStyles.elm → cases/resolved/FocusStyles.elmrenamed

The content is the same.

tests-rendering/cases/resolved/HugePlaceholder.elm → cases/resolved/HugePlaceholder.elmrenamed

The content is the same.

tests-rendering/cases/resolved/MismatchTextInputText.elm → cases/resolved/MismatchTextInputText.elmrenamed

The content is the same.

tests-rendering/cases/resolved/MultilineCollapsed.elm → cases/resolved/MultilineCollapsed.elmrenamed

The content is the same.

tests-rendering/cases/resolved/MultilineInput.elm → cases/resolved/MultilineInput.elmrenamed

The content is the same.

tests-rendering/cases/resolved/MultilineNewline.elm → cases/resolved/MultilineNewline.elmrenamed

The content is the same.

tests-rendering/cases/resolved/NestedColumns.elm → cases/resolved/NestedColumns.elmrenamed

The content is the same.

tests-rendering/cases/resolved/OtherOtherZindex.elm → cases/resolved/OtherOtherZindex.elmrenamed

The content is the same.

tests-rendering/cases/resolved/OtherZIndex.elm → cases/resolved/OtherZIndex.elmrenamed

The content is the same.

tests-rendering/cases/resolved/OverflowingInput.elm → cases/resolved/OverflowingInput.elmrenamed

The content is the same.

tests-rendering/cases/resolved/OverflowingInput2.elm → cases/resolved/OverflowingInput2.elmrenamed

The content is the same.

tests-rendering/cases/resolved/OverflowingInput3.elm → cases/resolved/OverflowingInput3.elmrenamed

The content is the same.

tests-rendering/cases/resolved/ReversedTableOrder.elm → cases/resolved/ReversedTableOrder.elmrenamed

The content is the same.

tests-rendering/cases/resolved/TextAreaMax.elm → cases/resolved/TextAreaMax.elmrenamed

The content is the same.

tests-rendering/cases/resolved/WeirdWrapping.elm → cases/resolved/WeirdWrapping.elmrenamed

The content is the same.

tests-rendering/cases/resolved/ZIndex.elm → cases/resolved/ZIndex.elmrenamed

The content is the same.

tests-rendering/cases/resolved/elm.json → cases/resolved/elm.jsonrenamed

The content is the same.

elm.json+3−5
@@ -3,7 +3,7 @@
33 "name": "mdgriffith/elm-ui",
44 "summary": "Layout and style that's easy to refactor, all without thinking about CSS.",
55 "license": "BSD-3-Clause",
6− "version": "1.1.8",
6+ "version": "1.1.5",
77 "exposed-modules": [
88 "Element",
99 "Element.Input",
@@ -22,7 +22,5 @@
2222 "elm/json": "1.0.0 <= v < 2.0.0",
2323 "elm/virtual-dom": "1.0.0 <= v < 2.0.0"
2424 },
25− "test-dependencies": {
26− "elm-explorations/test": "1.2.2 <= v < 2.0.0"
27− }
28−}
25+ "test-dependencies": {}
26+}
examples/Basic.elm+1−1
@@ -1,4 +1,4 @@
1−module Basic exposing (..)
1+module Main exposing (..)
22
33{-| -}
44
examples/Form.elm+4−12
@@ -1,4 +1,4 @@
1−module Form exposing (..)
1+module Main exposing (..)
22
33{-| -}
44
@@ -80,14 +80,7 @@ view model =
8080 [ Font.size 20
8181 ]
8282 <|
83− Element.column
84− [ width (px 800)
85− , height shrink
86− , centerY
87− , centerX
88− , spacing 36
89− , padding 10
90− ]
83+ Element.column [ width (px 800), height shrink, centerY, centerX, spacing 36, padding 10, explain Debug.todo ]
9184 [ el
9285 [ Region.heading 1
9386 , alignLeft
@@ -124,7 +117,7 @@ view model =
124117 , onChange = \new -> Update { model | username = new }
125118 , label = Input.labelAbove [ Font.size 14 ] (text "Username")
126119 }
127− , Input.currentPassword [ spacing 12 ]
120+ , Input.currentPassword [ spacing 12, width shrink ]
128121 { text = model.password
129122 , placeholder = Nothing
130123 , onChange = \new -> Update { model | password = new }
@@ -200,8 +193,7 @@ view model =
200193 , Border.color darkBlue
201194 , paddingXY 32 16
202195 , Border.rounded 3
203−
204− -- , width fill
196+ , width fill
205197 ]
206198 { onPress = Nothing
207199 , label = Element.text "Place your lunch order!"
examples/Table.elm+1−1
@@ -1,4 +1,4 @@
1−module Table exposing (..)
1+module Main exposing (..)
22
33{-| -}
44
examples/elm.json+22−19
@@ -1,22 +1,25 @@
11{
2− "type": "application",
3− "source-directories": [".", "../src/"],
4− "elm-version": "0.19.1",
5− "dependencies": {
6− "direct": {
7− "elm/browser": "1.0.0",
8− "elm/core": "1.0.0",
9− "elm/html": "1.0.0",
10− "elm/json": "1.0.0",
11− "elm/virtual-dom": "1.0.0"
2+ "type": "application",
3+ "source-directories": [
4+ ".",
5+ "../src/"
6+ ],
7+ "elm-version": "0.19.0",
8+ "dependencies": {
9+ "direct": {
10+ "elm/browser": "1.0.0",
11+ "elm/core": "1.0.0",
12+ "elm/html": "1.0.0",
13+ "elm/json": "1.0.0",
14+ "elm/virtual-dom": "1.0.0"
15+ },
16+ "indirect": {
17+ "elm/time": "1.0.0",
18+ "elm/url": "1.0.0"
19+ }
1220 },
13− "indirect": {
14− "elm/time": "1.0.0",
15− "elm/url": "1.0.0"
21+ "test-dependencies": {
22+ "direct": {},
23+ "indirect": {}
1624 }
17− },
18− "test-dependencies": {
19− "direct": {},
20− "indirect": {}
21− }
22−}
25+}
notes/CHANGES-FROM-STYLE-ELEMENTS.md+4−1
@@ -1,7 +1,10 @@
11# Compared to Style Elements
22
3+
34This was a MAJOR rewrite of Style Elements.
45
6+
7+
58* **Major Performance improvement** - Style Elements v5 is much faster than v4 due to a better rendering strategy and generating very minimal html. The rewritten architecture also allows me to explore a few other optimizations, so things may get even faster than they are now.
69
710* **Lazy is here!** - It works with no weird caveats.
@@ -116,7 +119,7 @@ Also of note, is that if something is `center`, then it will truly be in the cen
116119
117120- `Font.weight` has been removed in favor of `Font.extraBold`, `Font.regular`, `Font.light`, etc. All weights from 100 - 900 are represented.
118121- `Background.image` and `Background.fittedImage` will place a centered background image, instead of anchoring at the top left.
119−- `fill |> minimum 20 |> maximum 200` is now present for `minWidth`, `maxWidth`, `minHeight` and `maxHeight` behavior. It works like fill, but with an optional top and lower bound.
122+- `fillBetween { min : Maybe Int, max : Maybe Int}` is now present for `min/max height/width` behavior. It works like fill, but with an optional top and lower bound.
120123- `transparent` - Set an element as transparent. It will take up space, but otherwise be transparent and unclickable.
121124- `alpha` can now be set for an element.
122125- `attribute` has been renamed `htmlAttribute` to better convey what it's used for.
notes/RUNNING_TESTS.md+7−17
@@ -6,8 +6,8 @@ These can be run using [`elm-test`](https://github.com/elm-explorations/test) an
66
77```bash
88# in the root elm-ui directory
9−yarn install # or npm install
10−yarn run test # or npm run test
9+yarn install
10+yarn run test
1111```
1212
1313**Note** you need to be at the `elm-ui` root dir.
@@ -18,25 +18,15 @@ yarn run test # or npm run test
1818
1919In order to do this, we need a different testing environment.
2020
21−So, the tests in `elm-ui/tests-rendering/src/Tests` will render output, then harvest bounding boxes form the browser, and run the test on the resulting data.
21+So, the tests in `elm-ui/tests/Tests` will render output, then harvest bounding boxes form the browser, and run the test on the resulting data.
2222
2323Run this locally via:
2424
2525```bash
26−npm install
27−npm run test-render
28−```
29−
30−**Note** if you run this, it runs by default in headless chrome, so you won't see a browser actually open. Ideally you'll just see something like this:
26+yarn install
27+yarn test-render
3128
3229```
33−Compiling tests
34−Done compiling
35−Running locally on Chrome...
36−Local Chrome -> All 18029 tests passed
37−```
38−
39−That's right. We have 18,029 tests. Woohoo!
4030
4131# Running on Sauce Labs
4232
@@ -52,7 +42,7 @@ export SAUCE_USERNAME={your username}
5242You can then run.
5343
5444```bash
55−npm run test-render-sauce
45+yarn test-render-sauce
5646```
5747
5848**Note**: The compiled `elm-ui` test needs to be made public somewhere in order for this to work. At the moment it's at my github.io account, though something more permanenet might be set up.
@@ -62,4 +52,4 @@ npm run test-render-sauce
6252
6353https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/
6454https://wiki.saucelabs.com/display/DOCS/Sauce+Labs+Basics
65−https://github.com/saucelabs-sample-test-frameworks/Python-Pytest-Selenium
55+https://github.com/saucelabs-sample-test-frameworks/Python-Pytest-Selenium
notes/classifying-issues.mddeleted−29
@@ -1,29 +0,0 @@
1−# Classifying Issues
2−
3−
4−One of the first things we want to do is to keep our issues categorized.
5−
6−If you add a comment to an issue that references a label, that label will be assigned to that issue! (e.g. `#has-ellie` will add the `has-ellie` label.)
7−
8−[Here's one that I categorized](https://github.com/mdgriffith/elm-ui/issues/201)
9−
10−[Labels are described here](https://github.com/mdgriffith/elm-ui/labels)
11−
12−- **Feature Suggestions** - `#feature-suggestion` - This issue describes a feature suggestion. Tagging it with `#feature-suggestion` is all that needs to happen.
13−
14−- **Pain Point** - `#pain-point` - This is an issue that descrbes a challenge someone is facing, but makes not direct suggestion about how it should be solved. Here's a good example, [unable to applly text overflow ellipses](https://github.com/mdgriffith/elm-ui/issues/112).
15−
16−- **Bug** - `#bug` - The issue that's being described is potentially a bug. It may not be totally obvious what the fix is.
17− - **Has Ellie** - `#has-ellie` - Every bug described should have an ellie showing the problem, even if it's sorta trivial.
18− - **No Ellie** - If it's a bug, but has been checked for ellies and has no ellie, flag it as `#no-ellie`.
19− - **Has Test** - `#has-test` - Once we have an ellie for the problem, we want a version of that code in the codebase so I can easily take a look.
20− - The thing to do is to open a PR that copies that ellie into the [`tests-rendering/cases/open`](https://github.com/mdgriffith/elm-ui/tree/master/tests-rendering/cases/open) directory. Give it a succinct, human name.
21− - Rename the `Element.*` imports as `Testable.Element.*`
22− - Add a link to the issue, the title of the issue, and the body of the issue to the module comment. [Here's an example](https://github.com/mdgriffith/elm-ui/tree/master/tests-rendering/cases/open/InFrontSize.elm)
23− - Test is compiling - Optionally you can see if the test is compiling by first `cd tests-rendering` and then running `elm-live cases/open/{The file}.elm --open --dir=view -- --output=view/elm.js --debug`
24− - If it does not compile, flag the issue as `#test-not-compiling`. Don't worry about fixing it unless it's really obvious what needs to happen.
25− - Check if the test passes. Do that by opening `tests-rendering/cases/view/view.html` after running the above compilation. If it says all passes, likely you should flag the issue as `#test-incorrectly-passing`.
26− - If it's failing, you can flag as `#test-failing`
27−
28−
29−
notes/discussion/ColorWithoutAlpha.API.mddeleted−135
@@ -1,135 +0,0 @@
1−# API sketch for separating out alpha from Color
2−
3−**Motivation**
4−
5−If we separate out alpha from the core color type, we can
6−
7−1. Have a unified `Color` type that works in all contexts, including in webGL situations where transparency may be handled differently, or not at all.
8−
9−2. Encourage people to use actual color mixing functions where possible and to enumerate their colors concretely.
10− - The point here is that color mixing is situation dependent. Why not just mix a color explicitly in a way where you know it looks good?
11−
12−3. With a totally opaque color type, we can calculate contrast for accessibility evaluation easily. An alpha channel means we'd have to emulate browser mixing to do that, which I'm not sure is consistent.
13−
14−Ultimately I want the position of `elm-ui` to be something like the following:
15−
16−1. `rgb`(both value based and hex) is more of an interop format than a color space you'd actually want to modify things in. Think, when have you ever thought "oh, just bump the red channel down a bit and you'll be good"?
17−
18− - As an interop format, it means it's what you're going to be copying from tools or receiving from a designer.
19− - These tools generally have the ability to mix things properly.
20− - By mixing things concretely, designers have more control over their ultimate design.
21−
22−2. Transparency in most of these cases is still necessary or at the least convenient. It's not too difficult to treat that separately than the identity of a color value.
23−
24−3. Ultimately we want to encourage people to use a colorspace like [HSLuv](https://package.elm-lang.org/packages/kuon/elm-hsluv/latest/). Basically any of the colorspaces that are based in [CIEXYZ colorspace](https://en.wikipedia.org/wiki/CIE_1931_color_space). They're much easier to use. - May not really seem related to alpha channels, but the idea is that doing things like `lightening` a color is much easier in these other colorspaces.
25−
26−## Element.Font
27−
28− Font.color : Color -> Attribute msg
29−
30− -- Tempted to drop this one.
31− -- People could still have transparent text using `Element.opacity`
32− -- if they really want it
33− Font.opacity : Float -> Attribute msg
34−
35− Font.shadow :
36− { offset : (Float, Float)
37− , blur : Float
38− , color : Color
39− , opacity : Float
40− } -> Attribute msg
41−
42−## Element.Background
43−
44− Background.color : Color -> Attribute
45−
46− -- background opacity is commonly used when we have some text
47− -- over an image background.
48− Background.opacity : Float -> Attribute
49−
50−For gradients, we can have opacity as a separate set of steps.
51−This actually makes it _easier_ to do something like a rainbow that linearly fades away. We don't have to figure out the exact opacity that the 5th color has.
52−
53− Background.gradient :
54− { angle : Float
55− , colors : List Color
56− , opacity : List Float
57− }
58−
59−Do you ever have a gradient with more than two alpha steps?
60−Maybe you'd actually like to adjust the falloff curve instead of have it be linear?
61−Maybe there's an even better way to represent this?
62−
63− Will eventually want to cover radial gradients, but a similar approach to the above is likely easy.
64−
65−Took a look at [background blend modes](https://developer.mozilla.org/en-US/docs/Web/CSS/background-blend-mode), which can be used to dynamically color images, like the [header image here](https://professional-rentals.com/).
66−
67−The blend modes are influenced by background or element opacity.
68−
69−In that way, we could have something like
70−
71− Background.blend 0.5 color
72−
73−Which would set a color mode and set the background opacity. I'd need to play around with it, but seems kinda cool!
74−
75−## Element.Border
76−
77−Sometimes a transparent border is used as a placeholder, and then we change a color on `mouseOver`. This is to avoid layout movement in the resulting animation.
78−
79− Border.color : Color -> Attribute
80−
81− Border.opacity : Float -> Attribute
82−
83− Border.shadow :
84− { offset : (Float, Float)
85− , size : Float
86− , blur : Float
87− , color : Color
88− , opacity : Float
89− }
90−
91− Border.manyShadows :
92− List
93− { offset : (Float, Float)
94− , blur : Float
95− , color : Color
96− , opacity : Float
97− } -> Attribute msg
98−
99− Border.innerShadow
100− { offset : ( Float, Float )
101− , size : Float
102− , blur : Float
103− , color : Color
104− , opacity : Float
105− }
106−
107−# Discussion and Usecases
108−
109−The main question about binding alpha with color is:
110−
111− Is the identity of this color an identity about the color and it's ability to mix. Knowing that it's ability to mix in this case is not great.
112−
113−Or would you want to set these things explicitly and independently of each other?
114−
115−## Tinting and shading (i.e. lightening and darkening)
116−
117−_Note_ - not sure what package would house these functions.
118−
119−We usually get in the habit of using alpha for an ad-hoc lightener/darkener.
120−This can easily be replicated with functions that actually operate on colors in elm.
121−
122− Color.lighten 0.3 color
123−
124−With the idea that this function should use the luminance from CIELUV instead of lightness from hsl.
125−
126−## Mixing two colors
127−
128−We also use alpha as an ad hoc way to mix two colors (i.e. [turn a font subtley green on a green background](https://medium.com/refactoring-ui/7-practical-tips-for-cheating-at-design-40c736799886#9cdf).
129−
130− el
131− [ Background.color bg
132− -- explicitly mix the two!
133− , Font.color (Color.mix 0.2 white bg)
134− ]
135− (text "Howdy")
notes/discussion/ColorWithoutAlpha.mddeleted−67
@@ -1,67 +0,0 @@
1−# A Design for Color without Alpha
2−
3−Color is hard!
4−
5−I've spent a decade and a half in web development and only now feel like I have some sort of handle on it.
6−
7−What I've learned basically comes down to the fact that the two color spaces we're used to dealing with (`rgb` and `hsl`), are not actually that great for thinking about color. Which is unfortunate.
8−
9−So, what can we use instead?
10−
11−Research on color perception in the 1920's led to the development of the [CIEXYZ colorspace](https://en.wikipedia.org/wiki/CIE_1931_color_space), which describes color in a way that is much closer to how humans perceive color. Essentially they were able to model constants in their equations that literally represent some of the built-in values we have as humans to perceive color.
12−
13−How crazy is that?
14−
15−(Skipping over the fact that there is variation in how people perceive color.)
16−
17−There are a number of color spaces that are based on this initial research, including CIELAB(generally recommended for print), and CIELUV(generally recommended for light). They are essentailly different ways to talk about the same color space. Sorta like polar coordinates(r,θ) and cartesian coordiantes (x,y) can both represent a point.
18−
19−The `L` in the above acronyms represents `Luminance`.
20−
21−This is one of the really cool parts. Two colors that have the same `Luminance`, will be equally "bright" to the human eye.
22−
23−You might be thinking "well, what about the `lightness` channel in `HSL`, huh?". Turns out it's not really based on anything!
24−
25−Here are two hsl colors with the same lightness:
26−![](http://lea.verou.me/wp-content/uploads/2020/04/image-4.png)
27−
28−Do they look like the same "brightness"?
29−
30−Unfortunately the L in HSL stands for Lies and we've been misled all along.
31−
32−[This whole article on color spaces is worth a read if you got the time](http://lea.verou.me/2020/04/lch-colors-in-css-what-why-and-how/)
33−
34−
35−Ok, so, luminance is really cool.
36−
37−With a real `Luminance` factor you can
38− 1. Generate palettes of colors that work together in a consistent manner.
39− 2. Automatically know the difference in luminance between two colors. Guess what that is. It's a contrast calculation! Like for accessibility! How nice would that be if it was X - Y as opposed to some crazy math?
40− 3. Get an intuition for how colors will interact with each other.
41− 4. Generate gradients that aren't unexpectedly broken. (I have some examples of this, I'll dig them up later)
42− 5. Animate colors consistently. Animating in rgb or hsl will cause color animation to look awful in different ways.
43−
44−It really is a better world.
45−
46−Ok, so how do we get there and what does this mean for elm-ui?
47−
48−
49−# Elm UI stuff
50−
51−The above knowledge is hard won. Many people are not aware that there are better colorspaces than rgb and hsl.
52−
53−Color is hard. In many cases, it will remain hard until people get a nice introduction to something based on CIEXYZ.
54−
55−In elm, [we have a package for HSLuv](
56−https://package.elm-lang.org/packages/kuon/elm-hsluv/latest/), which you can use right now. It's great.
57−
58−However! We have one confouding factor, which is that we're used to bundling an `alpha` value with our colors.
59−
60−The same math that makes rgb and hsl less than great is used to blend colors via alpha.
61−
62−By bundling alpha with color, we're encouranging people to blend colors in an ad-hoc way when we could be providing them avenues to easily do it the right way. We have a whole programming language, we're not confined to only CSS anymore.
63−
64−However! Frontend development also involves talking to designers. Designers usually provide rgb, hsl, or a hex version of rgb.
65−
66−I now sorta view these as *interop formats*.
67−
package-lock.jsondeleted−1235
@@ -1,1235 +0,0 @@
1−{
2− "name": "elm-ui-testing",
3− "version": "1.0.0",
4− "lockfileVersion": 1,
5− "requires": true,
6− "dependencies": {
7− "ajv": {
8− "version": "6.12.0",
9− "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
10− "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
11− "requires": {
12− "fast-deep-equal": "^3.1.1",
13− "fast-json-stable-stringify": "^2.0.0",
14− "json-schema-traverse": "^0.4.1",
15− "uri-js": "^4.2.2"
16− }
17− },
18− "ansi-styles": {
19− "version": "3.2.1",
20− "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
21− "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
22− "requires": {
23− "color-convert": "^1.9.0"
24− }
25− },
26− "anymatch": {
27− "version": "3.1.1",
28− "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
29− "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
30− "requires": {
31− "normalize-path": "^3.0.0",
32− "picomatch": "^2.0.4"
33− }
34− },
35− "asn1": {
36− "version": "0.2.4",
37− "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
38− "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
39− "requires": {
40− "safer-buffer": "~2.1.0"
41− }
42− },
43− "assert-plus": {
44− "version": "1.0.0",
45− "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
46− "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
47− },
48− "asynckit": {
49− "version": "0.4.0",
50− "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
51− "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
52− },
53− "aws-sign2": {
54− "version": "0.7.0",
55− "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
56− "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
57− },
58− "aws4": {
59− "version": "1.9.1",
60− "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
61− "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
62− },
63− "balanced-match": {
64− "version": "1.0.0",
65− "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
66− "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
67− },
68− "bcrypt-pbkdf": {
69− "version": "1.0.2",
70− "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
71− "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
72− "requires": {
73− "tweetnacl": "^0.14.3"
74− }
75− },
76− "binary": {
77− "version": "0.3.0",
78− "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
79− "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
80− "requires": {
81− "buffers": "~0.1.1",
82− "chainsaw": "~0.1.0"
83− }
84− },
85− "binary-extensions": {
86− "version": "2.0.0",
87− "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
88− "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
89− },
90− "binwrap": {
91− "version": "0.2.2",
92− "resolved": "https://registry.npmjs.org/binwrap/-/binwrap-0.2.2.tgz",
93− "integrity": "sha512-Y+Wvypk3JhH5GPZAvlwJAWOVH/OsOhQMSj37vySuWHwQivoALplPxfBA8b973rFJI7OS+O+1YmmYXIiEXVMAcw==",
94− "requires": {
95− "mustache": "^3.0.1",
96− "request": "^2.88.0",
97− "request-promise": "^4.2.4",
98− "tar": "^4.4.10",
99− "unzip-stream": "^0.3.0"
100− }
101− },
102− "bluebird": {
103− "version": "3.7.2",
104− "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
105− "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
106− },
107− "brace-expansion": {
108− "version": "1.1.11",
109− "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
110− "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
111− "requires": {
112− "balanced-match": "^1.0.0",
113− "concat-map": "0.0.1"
114− }
115− },
116− "braces": {
117− "version": "3.0.2",
118− "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
119− "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
120− "requires": {
121− "fill-range": "^7.0.1"
122− }
123− },
124− "buffers": {
125− "version": "0.1.1",
126− "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
127− "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s="
128− },
129− "caseless": {
130− "version": "0.12.0",
131− "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
132− "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
133− },
134− "chainsaw": {
135− "version": "0.1.0",
136− "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
137− "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
138− "requires": {
139− "traverse": ">=0.3.0 <0.4"
140− }
141− },
142− "chalk": {
143− "version": "2.4.2",
144− "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
145− "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
146− "requires": {
147− "ansi-styles": "^3.2.1",
148− "escape-string-regexp": "^1.0.5",
149− "supports-color": "^5.3.0"
150− },
151− "dependencies": {
152− "has-flag": {
153− "version": "3.0.0",
154− "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
155− "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
156− },
157− "supports-color": {
158− "version": "5.5.0",
159− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
160− "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
161− "requires": {
162− "has-flag": "^3.0.0"
163− }
164− }
165− }
166− },
167− "chokidar": {
168− "version": "3.3.0",
169− "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
170− "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
171− "requires": {
172− "anymatch": "~3.1.1",
173− "braces": "~3.0.2",
174− "fsevents": "~2.1.1",
175− "glob-parent": "~5.1.0",
176− "is-binary-path": "~2.1.0",
177− "is-glob": "~4.0.1",
178− "normalize-path": "~3.0.0",
179− "readdirp": "~3.2.0"
180− }
181− },
182− "chownr": {
183− "version": "1.1.4",
184− "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
185− "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
186− },
187− "color-convert": {
188− "version": "1.9.3",
189− "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
190− "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
191− "requires": {
192− "color-name": "1.1.3"
193− }
194− },
195− "color-name": {
196− "version": "1.1.3",
197− "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
198− "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
199− },
200− "combined-stream": {
201− "version": "1.0.8",
202− "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
203− "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
204− "requires": {
205− "delayed-stream": "~1.0.0"
206− }
207− },
208− "commander": {
209− "version": "2.20.0",
210− "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
211− "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
212− },
213− "concat-map": {
214− "version": "0.0.1",
215− "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
216− "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
217− },
218− "core-util-is": {
219− "version": "1.0.2",
220− "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
221− "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
222− },
223− "cross-spawn": {
224− "version": "6.0.5",
225− "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
226− "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
227− "requires": {
228− "nice-try": "^1.0.4",
229− "path-key": "^2.0.1",
230− "semver": "^5.5.0",
231− "shebang-command": "^1.2.0",
232− "which": "^1.2.9"
233− }
234− },
235− "dashdash": {
236− "version": "1.14.1",
237− "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
238− "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
239− "requires": {
240− "assert-plus": "^1.0.0"
241− }
242− },
243− "delayed-stream": {
244− "version": "1.0.0",
245− "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
246− "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
247− },
248− "ecc-jsbn": {
249− "version": "0.1.2",
250− "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
251− "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
252− "requires": {
253− "jsbn": "~0.1.0",
254− "safer-buffer": "^2.1.0"
255− }
256− },
257− "elm": {
258− "version": "0.19.1-3",
259− "resolved": "https://registry.npmjs.org/elm/-/elm-0.19.1-3.tgz",
260− "integrity": "sha512-6y36ewCcVmTOx8lj7cKJs3bhI5qMfoVEigePZ9PhEUNKpwjjML/pU2u2YSpHVAznuCcojoF6KIsrS1Ci7GtVaQ==",
261− "requires": {
262− "request": "^2.88.0"
263− }
264− },
265− "elm-test": {
266− "version": "0.19.1-revision2",
267− "resolved": "https://registry.npmjs.org/elm-test/-/elm-test-0.19.1-revision2.tgz",
268− "integrity": "sha512-zVs2mVeyIE+K9y7/8b333h5xRMDWAoqbBDm7ThLDhyTi7ICxeL3t5uOS4KZCrRk9+4sP6+voSbcBlgr46Q+GiQ==",
269− "requires": {
270− "chalk": "3.0.0",
271− "chokidar": "3.3.0",
272− "cross-spawn": "7.0.1",
273− "elmi-to-json": "1.3.0",
274− "find-parent-dir": "^0.3.0",
275− "firstline": "2.0.2",
276− "fs-extra": "8.1.0",
277− "glob": "7.1.6",
278− "lodash": "4.17.15",
279− "minimist": "^1.2.0",
280− "murmur-hash-js": "1.0.0",
281− "node-elm-compiler": "5.0.4",
282− "split": "1.0.1",
283− "supports-color": "7.1.0",
284− "temp": "0.9.1",
285− "which": "2.0.1",
286− "xmlbuilder": "^13.0.2"
287− },
288− "dependencies": {
289− "ansi-styles": {
290− "version": "4.2.1",
291− "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
292− "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
293− "requires": {
294− "@types/color-name": "^1.1.1",
295− "color-convert": "^2.0.1"
296− },
297− "dependencies": {
298− "@types/color-name": {
299− "version": "1.1.1",
300− "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
301− "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
302− }
303− }
304− },
305− "chalk": {
306− "version": "3.0.0",
307− "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
308− "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
309− "requires": {
310− "ansi-styles": "^4.1.0",
311− "supports-color": "^7.1.0"
312− }
313− },
314− "color-convert": {
315− "version": "2.0.1",
316− "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
317− "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
318− "requires": {
319− "color-name": "~1.1.4"
320− }
321− },
322− "color-name": {
323− "version": "1.1.4",
324− "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
325− "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
326− },
327− "cross-spawn": {
328− "version": "7.0.1",
329− "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
330− "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
331− "requires": {
332− "path-key": "^3.1.0",
333− "shebang-command": "^2.0.0",
334− "which": "^2.0.1"
335− },
336− "dependencies": {
337− "path-key": {
338− "version": "3.1.1",
339− "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
340− "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
341− },
342− "shebang-command": {
343− "version": "2.0.0",
344− "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
345− "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
346− "requires": {
347− "shebang-regex": "^3.0.0"
348− }
349− }
350− }
351− },
352− "find-elm-dependencies": {
353− "version": "2.0.2",
354− "resolved": "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz",
355− "integrity": "sha512-nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==",
356− "requires": {
357− "firstline": "1.2.0",
358− "lodash": "4.17.15"
359− },
360− "dependencies": {
361− "firstline": {
362− "version": "1.2.0",
363− "resolved": "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz",
364− "integrity": "sha1-yfSIbn9/vwr8EtcZQdzgaxkq6gU="
365− }
366− }
367− },
368− "firstline": {
369− "version": "2.0.2",
370− "resolved": "https://registry.npmjs.org/firstline/-/firstline-2.0.2.tgz",
371− "integrity": "sha512-8KcmfI0jgSECnzdhucm0i7vrwef3BWwgjimW2YkRC5eSFwjb5DibVoA0YvgkYwwxuJi9c+7M7X3b3lX8o9B6wg=="
372− },
373− "lodash": {
374− "version": "4.17.15",
375− "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
376− "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
377− },
378− "node-elm-compiler": {
379− "version": "5.0.4",
380− "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz",
381− "integrity": "sha512-VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==",
382− "requires": {
383− "cross-spawn": "6.0.5",
384− "find-elm-dependencies": "2.0.2",
385− "lodash": "4.17.15",
386− "temp": "^0.9.0"
387− },
388− "dependencies": {
389− "cross-spawn": {
390− "version": "6.0.5",
391− "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
392− "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
393− "requires": {
394− "nice-try": "^1.0.4",
395− "path-key": "^2.0.1",
396− "semver": "^5.5.0",
397− "shebang-command": "^1.2.0",
398− "which": "^1.2.9"
399− }
400− },
401− "nice-try": {
402− "version": "1.0.5",
403− "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
404− "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
405− },
406− "path-key": {
407− "version": "2.0.1",
408− "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
409− "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
410− },
411− "semver": {
412− "version": "5.7.1",
413− "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
414− "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
415− },
416− "shebang-command": {
417− "version": "1.2.0",
418− "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
419− "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
420− "requires": {
421− "shebang-regex": "^1.0.0"
422− }
423− },
424− "shebang-regex": {
425− "version": "1.0.0",
426− "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
427− "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
428− },
429− "which": {
430− "version": "1.3.1",
431− "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
432− "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
433− "requires": {
434− "isexe": "^2.0.0"
435− }
436− }
437− }
438− },
439− "supports-color": {
440− "version": "7.1.0",
441− "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
442− "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
443− "requires": {
444− "has-flag": "^4.0.0"
445− }
446− },
447− "temp": {
448− "version": "0.9.1",
449− "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz",
450− "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==",
451− "requires": {
452− "rimraf": "~2.6.2"
453− }
454− },
455− "which": {
456− "version": "2.0.1",
457− "resolved": "https://registry.npmjs.org/which/-/which-2.0.1.tgz",
458− "integrity": "sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==",
459− "requires": {
460− "isexe": "^2.0.0"
461− }
462− }
463− }
464− },
465− "elmi-to-json": {
466− "version": "1.3.0",
467− "resolved": "https://registry.npmjs.org/elmi-to-json/-/elmi-to-json-1.3.0.tgz",
468− "integrity": "sha512-6m1D5/Pb5pUrSOOBgRG3fE2mK19nhmLgZ16jj2KWTVIhT+0GIBuDI1iV0Fee27CZH790J7uMcdGWJ7fnVvpsKg==",
469− "requires": {
470− "binwrap": "0.2.2"
471− }
472− },
473− "escape-string-regexp": {
474− "version": "1.0.5",
475− "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
476− "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
477− },
478− "extend": {
479− "version": "3.0.2",
480− "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
481− "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
482− },
483− "extsprintf": {
484− "version": "1.3.0",
485− "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
486− "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
487− },
488− "fast-deep-equal": {
489− "version": "3.1.1",
490− "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
491− "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
492− },
493− "fast-json-stable-stringify": {
494− "version": "2.1.0",
495− "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
496− "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
497− },
498− "fill-range": {
499− "version": "7.0.1",
500− "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
501− "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
502− "requires": {
503− "to-regex-range": "^5.0.1"
504− }
505− },
506− "find-elm-dependencies": {
507− "version": "2.0.2",
508− "resolved": "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz",
509− "integrity": "sha512-nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==",
510− "requires": {
511− "firstline": "1.2.0",
512− "lodash": "4.17.15"
513− }
514− },
515− "find-parent-dir": {
516− "version": "0.3.0",
517− "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz",
518− "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ="
519− },
520− "firstline": {
521− "version": "1.2.0",
522− "resolved": "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz",
523− "integrity": "sha1-yfSIbn9/vwr8EtcZQdzgaxkq6gU="
524− },
525− "forever-agent": {
526− "version": "0.6.1",
527− "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
528− "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
529− },
530− "form-data": {
531− "version": "2.3.3",
532− "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
533− "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
534− "requires": {
535− "asynckit": "^0.4.0",
536− "combined-stream": "^1.0.6",
537− "mime-types": "^2.1.12"
538− }
539− },
540− "fs-extra": {
541− "version": "8.1.0",
542− "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
543− "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
544− "requires": {
545− "graceful-fs": "^4.2.0",
546− "jsonfile": "^4.0.0",
547− "universalify": "^0.1.0"
548− }
549− },
550− "fs-minipass": {
551− "version": "1.2.7",
552− "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
553− "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
554− "requires": {
555− "minipass": "^2.6.0"
556− }
557− },
558− "fs.realpath": {
559− "version": "1.0.0",
560− "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
561− "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
562− },
563− "fsevents": {
564− "version": "2.1.2",
565− "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
566− "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
567− "optional": true
568− },
569− "getpass": {
570− "version": "0.1.7",
571− "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
572− "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
573− "requires": {
574− "assert-plus": "^1.0.0"
575− }
576− },
577− "glob": {
578− "version": "7.1.6",
579− "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
580− "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
581− "requires": {
582− "fs.realpath": "^1.0.0",
583− "inflight": "^1.0.4",
584− "inherits": "2",
585− "minimatch": "^3.0.4",
586− "once": "^1.3.0",
587− "path-is-absolute": "^1.0.0"
588− }
589− },
590− "glob-parent": {
591− "version": "5.1.0",
592− "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
593− "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
594− "requires": {
595− "is-glob": "^4.0.1"
596− }
597− },
598− "graceful-fs": {
599− "version": "4.2.3",
600− "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
601− "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
602− },
603− "har-schema": {
604− "version": "2.0.0",
605− "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
606− "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
607− },
608− "har-validator": {
609− "version": "5.1.3",
610− "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
611− "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
612− "requires": {
613− "ajv": "^6.5.5",
614− "har-schema": "^2.0.0"
615− }
616− },
617− "has-flag": {
618− "version": "4.0.0",
619− "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
620− "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
621− },
622− "http-signature": {
623− "version": "1.2.0",
624− "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
625− "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
626− "requires": {
627− "assert-plus": "^1.0.0",
628− "jsprim": "^1.2.2",
629− "sshpk": "^1.7.0"
630− }
631− },
632− "immediate": {
633− "version": "3.0.6",
634− "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
635− "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
636− },
637− "inflight": {
638− "version": "1.0.6",
639− "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
640− "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
641− "requires": {
642− "once": "^1.3.0",
643− "wrappy": "1"
644− }
645− },
646− "inherits": {
647− "version": "2.0.4",
648− "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
649− "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
650− },
651− "is-binary-path": {
652− "version": "2.1.0",
653− "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
654− "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
655− "requires": {
656− "binary-extensions": "^2.0.0"
657− }
658− },
659− "is-extglob": {
660− "version": "2.1.1",
661− "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
662− "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
663− },
664− "is-glob": {
665− "version": "4.0.1",
666− "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
667− "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
668− "requires": {
669− "is-extglob": "^2.1.1"
670− }
671− },
672− "is-number": {
673− "version": "7.0.0",
674− "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
675− "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
676− },
677− "is-typedarray": {
678− "version": "1.0.0",
679− "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
680− "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
681− },
682− "isarray": {
683− "version": "1.0.0",
684− "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
685− "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
686− },
687− "isexe": {
688− "version": "2.0.0",
689− "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
690− "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
691− },
692− "isstream": {
693− "version": "0.1.2",
694− "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
695− "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
696− },
697− "jsbn": {
698− "version": "0.1.1",
699− "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
700− "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
701− },
702− "json-schema": {
703− "version": "0.2.3",
704− "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
705− "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
706− },
707− "json-schema-traverse": {
708− "version": "0.4.1",
709− "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
710− "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
711− },
712− "json-stringify-safe": {
713− "version": "5.0.1",
714− "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
715− "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
716− },
717− "jsonfile": {
718− "version": "4.0.0",
719− "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
720− "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
721− "requires": {
722− "graceful-fs": "^4.1.6"
723− }
724− },
725− "jsprim": {
726− "version": "1.4.1",
727− "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
728− "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
729− "requires": {
730− "assert-plus": "1.0.0",
731− "extsprintf": "1.3.0",
732− "json-schema": "0.2.3",
733− "verror": "1.10.0"
734− }
735− },
736− "jszip": {
737− "version": "3.4.0",
738− "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz",
739− "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==",
740− "requires": {
741− "lie": "~3.3.0",
742− "pako": "~1.0.2",
743− "readable-stream": "~2.3.6",
744− "set-immediate-shim": "~1.0.1"
745− }
746− },
747− "lie": {
748− "version": "3.3.0",
749− "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
750− "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
751− "requires": {
752− "immediate": "~3.0.5"
753− }
754− },
755− "lodash": {
756− "version": "4.17.15",
757− "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
758− "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
759− },
760− "mime-db": {
761− "version": "1.43.0",
762− "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
763− "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
764− },
765− "mime-types": {
766− "version": "2.1.26",
767− "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
768− "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
769− "requires": {
770− "mime-db": "1.43.0"
771− }
772− },
773− "minimatch": {
774− "version": "3.0.4",
775− "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
776− "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
777− "requires": {
778− "brace-expansion": "^1.1.7"
779− }
780− },
781− "minimist": {
782− "version": "1.2.4",
783− "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.4.tgz",
784− "integrity": "sha512-wTiNDqe4D2rbTJGZk1qcdZgFtY0/r+iuE6GDT7V0/+Gu5MLpIDm4+CssDECR79OJs/OxLPXMzdxy153b5Qy3hg=="
785− },
786− "minipass": {
787− "version": "2.9.0",
788− "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
789− "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
790− "requires": {
791− "safe-buffer": "^5.1.2",
792− "yallist": "^3.0.0"
793− }
794− },
795− "minizlib": {
796− "version": "1.3.3",
797− "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
798− "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
799− "requires": {
800− "minipass": "^2.9.0"
801− }
802− },
803− "mkdirp": {
804− "version": "0.5.5",
805− "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
806− "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
807− "requires": {
808− "minimist": "^1.2.5"
809− },
810− "dependencies": {
811− "minimist": {
812− "version": "1.2.5",
813− "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
814− "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
815− }
816− }
817− },
818− "murmur-hash-js": {
819− "version": "1.0.0",
820− "resolved": "https://registry.npmjs.org/murmur-hash-js/-/murmur-hash-js-1.0.0.tgz",
821− "integrity": "sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA="
822− },
823− "mustache": {
824− "version": "3.2.1",
825− "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.2.1.tgz",
826− "integrity": "sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA=="
827− },
828− "nice-try": {
829− "version": "1.0.5",
830− "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
831− "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
832− },
833− "node-elm-compiler": {
834− "version": "5.0.4",
835− "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz",
836− "integrity": "sha512-VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==",
837− "requires": {
838− "cross-spawn": "6.0.5",
839− "find-elm-dependencies": "2.0.2",
840− "lodash": "4.17.15",
841− "temp": "^0.9.0"
842− }
843− },
844− "normalize-path": {
845− "version": "3.0.0",
846− "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
847− "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
848− },
849− "oauth-sign": {
850− "version": "0.9.0",
851− "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
852− "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
853− },
854− "once": {
855− "version": "1.4.0",
856− "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
857− "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
858− "requires": {
859− "wrappy": "1"
860− }
861− },
862− "os-tmpdir": {
863− "version": "1.0.2",
864− "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
865− "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
866− },
867− "pako": {
868− "version": "1.0.11",
869− "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
870− "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
871− },
872− "path-is-absolute": {
873− "version": "1.0.1",
874− "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
875− "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
876− },
877− "path-key": {
878− "version": "2.0.1",
879− "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
880− "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
881− },
882− "performance-now": {
883− "version": "2.1.0",
884− "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
885− "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
886− },
887− "picomatch": {
888− "version": "2.2.1",
889− "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
890− "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA=="
891− },
892− "process-nextick-args": {
893− "version": "2.0.1",
894− "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
895− "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
896− },
897− "psl": {
898− "version": "1.7.0",
899− "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
900− "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
901− },
902− "punycode": {
903− "version": "2.1.1",
904− "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
905− "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
906− },
907− "qs": {
908− "version": "6.5.2",
909− "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
910− "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
911− },
912− "readable-stream": {
913− "version": "2.3.7",
914− "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
915− "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
916− "requires": {
917− "core-util-is": "~1.0.0",
918− "inherits": "~2.0.3",
919− "isarray": "~1.0.0",
920− "process-nextick-args": "~2.0.0",
921− "safe-buffer": "~5.1.1",
922− "string_decoder": "~1.1.1",
923− "util-deprecate": "~1.0.1"
924− },
925− "dependencies": {
926− "safe-buffer": {
927− "version": "5.1.2",
928− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
929− "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
930− }
931− }
932− },
933− "readdirp": {
934− "version": "3.2.0",
935− "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
936− "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
937− "requires": {
938− "picomatch": "^2.0.4"
939− }
940− },
941− "request": {
942− "version": "2.88.2",
943− "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
944− "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
945− "requires": {
946− "aws-sign2": "~0.7.0",
947− "aws4": "^1.8.0",
948− "caseless": "~0.12.0",
949− "combined-stream": "~1.0.6",
950− "extend": "~3.0.2",
951− "forever-agent": "~0.6.1",
952− "form-data": "~2.3.2",
953− "har-validator": "~5.1.3",
954− "http-signature": "~1.2.0",
955− "is-typedarray": "~1.0.0",
956− "isstream": "~0.1.2",
957− "json-stringify-safe": "~5.0.1",
958− "mime-types": "~2.1.19",
959− "oauth-sign": "~0.9.0",
960− "performance-now": "^2.1.0",
961− "qs": "~6.5.2",
962− "safe-buffer": "^5.1.2",
963− "tough-cookie": "~2.5.0",
964− "tunnel-agent": "^0.6.0",
965− "uuid": "^3.3.2"
966− }
967− },
968− "request-promise": {
969− "version": "4.2.5",
970− "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz",
971− "integrity": "sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==",
972− "requires": {
973− "bluebird": "^3.5.0",
974− "request-promise-core": "1.1.3",
975− "stealthy-require": "^1.1.1",
976− "tough-cookie": "^2.3.3"
977− }
978− },
979− "request-promise-core": {
980− "version": "1.1.3",
981− "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
982− "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
983− "requires": {
984− "lodash": "^4.17.15"
985− }
986− },
987− "rimraf": {
988− "version": "2.6.3",
989− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
990− "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
991− "requires": {
992− "glob": "^7.1.3"
993− }
994− },
995− "safe-buffer": {
996− "version": "5.2.0",
997− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
998− "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
999− },
1000− "safer-buffer": {
1001− "version": "2.1.2",
1002− "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1003− "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1004− },
1005− "selenium-webdriver": {
1006− "version": "4.0.0-alpha.7",
1007− "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz",
1008− "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==",
1009− "requires": {
1010− "jszip": "^3.2.2",
1011− "rimraf": "^2.7.1",
1012− "tmp": "0.0.30"
1013− },
1014− "dependencies": {
1015− "rimraf": {
1016− "version": "2.7.1",
1017− "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1018− "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1019− "requires": {
1020− "glob": "^7.1.3"
1021− }
1022− }
1023− }
1024− },
1025− "semver": {
1026− "version": "5.7.1",
1027− "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1028− "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1029− },
1030− "set-immediate-shim": {
1031− "version": "1.0.1",
1032− "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
1033− "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
1034− },
1035− "shebang-command": {
1036− "version": "1.2.0",
1037− "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1038− "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1039− "requires": {
1040− "shebang-regex": "^1.0.0"
1041− },
1042− "dependencies": {
1043− "shebang-regex": {
1044− "version": "1.0.0",
1045− "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1046− "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
1047− }
1048− }
1049− },
1050− "shebang-regex": {
1051− "version": "3.0.0",
1052− "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1053− "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
1054− },
1055− "split": {
1056− "version": "1.0.1",
1057− "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
1058− "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
1059− "requires": {
1060− "through": "2"
1061− }
1062− },
1063− "sshpk": {
1064− "version": "1.16.1",
1065− "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1066− "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1067− "requires": {
1068− "asn1": "~0.2.3",
1069− "assert-plus": "^1.0.0",
1070− "bcrypt-pbkdf": "^1.0.0",
1071− "dashdash": "^1.12.0",
1072− "ecc-jsbn": "~0.1.1",
1073− "getpass": "^0.1.1",
1074− "jsbn": "~0.1.0",
1075− "safer-buffer": "^2.0.2",
1076− "tweetnacl": "~0.14.0"
1077− }
1078− },
1079− "stealthy-require": {
1080− "version": "1.1.1",
1081− "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
1082− "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
1083− },
1084− "string_decoder": {
1085− "version": "1.1.1",
1086− "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1087− "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1088− "requires": {
1089− "safe-buffer": "~5.1.0"
1090− },
1091− "dependencies": {
1092− "safe-buffer": {
1093− "version": "5.1.2",
1094− "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1095− "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1096− }
1097− }
1098− },
1099− "tar": {
1100− "version": "4.4.13",
1101− "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz",
1102− "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==",
1103− "requires": {
1104− "chownr": "^1.1.1",
1105− "fs-minipass": "^1.2.5",
1106− "minipass": "^2.8.6",
1107− "minizlib": "^1.2.1",
1108− "mkdirp": "^0.5.0",
1109− "safe-buffer": "^5.1.2",
1110− "yallist": "^3.0.3"
1111− }
1112− },
1113− "temp": {
1114− "version": "0.9.1",
1115− "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz",
1116− "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==",
1117− "requires": {
1118− "rimraf": "~2.6.2"
1119− }
1120− },
1121− "through": {
1122− "version": "2.3.8",
1123− "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1124− "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
1125− },
1126− "tmp": {
1127− "version": "0.0.30",
1128− "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz",
1129− "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=",
1130− "requires": {
1131− "os-tmpdir": "~1.0.1"
1132− }
1133− },
1134− "to-regex-range": {
1135− "version": "5.0.1",
1136− "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1137− "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1138− "requires": {
1139− "is-number": "^7.0.0"
1140− }
1141− },
1142− "tough-cookie": {
1143− "version": "2.5.0",
1144− "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1145− "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1146− "requires": {
1147− "psl": "^1.1.28",
1148− "punycode": "^2.1.1"
1149− }
1150− },
1151− "traverse": {
1152− "version": "0.3.9",
1153− "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
1154− "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
1155− },
1156− "tunnel-agent": {
1157− "version": "0.6.0",
1158− "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1159− "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1160− "requires": {
1161− "safe-buffer": "^5.0.1"
1162− }
1163− },
1164− "tweetnacl": {
1165− "version": "0.14.5",
1166− "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1167− "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1168− },
1169− "universalify": {
1170− "version": "0.1.2",
1171− "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1172− "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
1173− },
1174− "unzip-stream": {
1175− "version": "0.3.0",
1176− "resolved": "https://registry.npmjs.org/unzip-stream/-/unzip-stream-0.3.0.tgz",
1177− "integrity": "sha512-NG1h/MdGIX3HzyqMjyj1laBCmlPYhcO4xEy7gEqqzGiSLw7XqDQCnY4nYSn5XSaH8mQ6TFkaujrO8d/PIZN85A==",
1178− "requires": {
1179− "binary": "^0.3.0",
1180− "mkdirp": "^0.5.1"
1181− }
1182− },
1183− "uri-js": {
1184− "version": "4.2.2",
1185− "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
1186− "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
1187− "requires": {
1188− "punycode": "^2.1.0"
1189− }
1190− },
1191− "util-deprecate": {
1192− "version": "1.0.2",
1193− "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1194− "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1195− },
1196− "uuid": {
1197− "version": "3.4.0",
1198− "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1199− "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1200− },
1201− "verror": {
1202− "version": "1.10.0",
1203− "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1204− "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1205− "requires": {
1206− "assert-plus": "^1.0.0",
1207− "core-util-is": "1.0.2",
1208− "extsprintf": "^1.2.0"
1209− }
1210− },
1211− "which": {
1212− "version": "1.3.1",
1213− "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1214− "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1215− "requires": {
1216− "isexe": "^2.0.0"
1217− }
1218− },
1219− "wrappy": {
1220− "version": "1.0.2",
1221− "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1222− "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1223− },
1224− "xmlbuilder": {
1225− "version": "13.0.2",
1226− "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz",
1227− "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ=="
1228− },
1229− "yallist": {
1230− "version": "3.1.1",
1231− "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1232− "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
1233− }
1234− }
1235−}
package.json+29−33
@@ -1,34 +1,30 @@
11{
2− "name": "elm-ui-testing",
3− "version": "1.0.0",
4− "description": "Run the Elm UI benchmarks and render tests",
5− "main": "index.js",
6− "scripts": {
7− "test": "elm-test",
8− "view-test": "node tests-rendering/automation/view.js",
9− "test-render": "node tests-rendering/automation/run.js --chrome",
10− "test-render-sauce": "source sauce.env; node tests-rendering/automation/run.js --sauce --headless",
11− "test-render-sauce-automated": "node tests-rendering/automation/run.js --sauce --headless",
12− "test-doc-preview": "bash tests-rendering/automation/doc-preview.sh",
13− "bench": "node benchmarks/runtime/index.js",
14− "list-issues": "hub issue -f \"%i,%U,%t,'%L'%n\" > issues.csv"
15− },
16− "repository": {
17− "type": "git",
18− "url": "git+https://github.com/mdgriffith/elm-ui.git"
19− },
20− "author": "Matthew Griffith <mdg.griffith@gmail.com> (http://mechanical-elephant.com/)",
21− "license": "ISC",
22− "bugs": {
23− "url": "https://github.com/mdgriffith/elm-ui/issues"
24− },
25− "homepage": "https://github.com/mdgriffith/elm-ui#readme",
26− "dependencies": {
27− "chalk": "^2.4.2",
28− "commander": "^2.20.0",
29− "elm": "^0.19.1-3",
30− "elm-test": "^0.19.1-revision2",
31− "node-elm-compiler": "^5.0.4",
32− "selenium-webdriver": "^4.0.0-alpha.7"
33− }
34−}
2+ "name": "elm-ui-testing",
3+ "version": "1.0.0",
4+ "description": "Run the Elm UI benchmarks and render tests",
5+ "main": "index.js",
6+ "scripts": {
7+ "test": "elm-test",
8+ "test-render": "node tests/automation/run.js --chrome",
9+ "test-render-sauce": "source sauce.env; node tests/automation/run.js --sauce",
10+ "bench": "node benchmarks/runtime/index.js"
11+ },
12+ "repository": {
13+ "type": "git",
14+ "url": "git+https://github.com/mdgriffith/elm-ui.git"
15+ },
16+ "author": "Matthew Griffith <mdg.griffith@gmail.com> (http://mechanical-elephant.com/)",
17+ "license": "ISC",
18+ "bugs": {
19+ "url": "https://github.com/mdgriffith/elm-ui/issues"
20+ },
21+ "homepage": "https://github.com/mdgriffith/elm-ui#readme",
22+ "dependencies": {
23+ "chalk": "^2.4.2",
24+ "commander": "^2.20.0",
25+ "elm-test": "^0.19.0-rev6",
26+ "node-elm-compiler": "^5.0.3",
27+ "puppeteer": "^1.18.0",
28+ "selenium-webdriver": "^4.0.0-alpha.4"
29+ }
30+}
src/Element.elm+39−81
@@ -467,11 +467,11 @@ type alias Option =
467467 Internal.Option
468468
469469
470−{-| Elm UI embeds two StyleSheets, one that is constant, and one that changes dynamically based on styles collected from the elements being rendered.
470+{-| Elm UI embeds two StyleSheets, one that is constant, and one that changes dynamically based on styles collected from the elments being rendered.
471471
472472This option will stop the static/constant stylesheet from rendering.
473473
474−If you're embedding multiple elm-ui `layout` elements, you need to guarantee that only one is rendering the static style sheet and that it's above all the others in the DOM tree.
474+If you're embedding multiple elm-ui `layout` elements, you need to guarantee that only one is rendering the static style sheet and that it's above ll the others in the DOM tree.
475475
476476-}
477477noStaticStyleSheet : Option
@@ -645,34 +645,14 @@ wrappedRow attrs children =
645645 newPadding =
646646 case padded of
647647 Just (Internal.Padding name t r b l) ->
648− if r >= (toFloat x / 2) && b >= (toFloat y / 2) then
649− let
650− newTop =
651− t - (toFloat y / 2)
652−
653− newRight =
654− r - (toFloat x / 2)
655−
656− newBottom =
657− b - (toFloat y / 2)
658−
659− newLeft =
660− l - (toFloat x / 2)
661− in
648+ if r >= (x // 2) && b >= (y // 2) then
662649 Just <|
663− Internal.StyleClass Flag.padding
664− (Internal.PaddingStyle
665− (Internal.paddingNameFloat
666− newTop
667− newRight
668− newBottom
669− newLeft
670− )
671− newTop
672− newRight
673− newBottom
674− newLeft
675− )
650+ paddingEach
651+ { top = t - (y // 2)
652+ , right = r - (x // 2)
653+ , bottom = b - (y // 2)
654+ , left = l - (x // 2)
655+ }
676656
677657 else
678658 Nothing
@@ -1008,15 +988,14 @@ tableHelper attrs config =
1008988
1009989{-| A paragraph will layout all children as wrapped, inline elements.
1010990
1011− import Element exposing (el, paragraph, text)
991+ import Element
1012992 import Element.Font as Font
1013993
1014− view =
1015− paragraph []
1016− [ text "lots of text ...."
1017− , el [ Font.bold ] (text "this is bold")
1018− , text "lots of text ...."
1019− ]
994+ Element.paragraph []
995+ [ text "lots of text ...."
996+ , el [ Font.bold ] (text "this is bold")
997+ , text "lots of text ...."
998+ ]
1020999
10211000This is really useful when you want to markup text by having some parts be bold, or some be links, or whatever you so desire.
10221001
@@ -1024,18 +1003,17 @@ Also, if a child element has `alignLeft` or `alignRight`, then it will be moved
10241003
10251004This makes it particularly easy to do something like a [dropped capital](https://en.wikipedia.org/wiki/Initial).
10261005
1027− import Element exposing (alignLeft, el, padding, paragraph, text)
1006+ import Element
10281007 import Element.Font as Font
10291008
1030− view =
1031− paragraph []
1032− [ el
1033− [ alignLeft
1034− , padding 5
1035− ]
1036− (text "S")
1037− , text "o much text ...."
1009+ Element.paragraph []
1010+ [ el
1011+ [ alignLeft
1012+ , padding 5
10381013 ]
1014+ (text "S")
1015+ , text "o much text ...."
1016+ ]
10391017
10401018Which will look something like
10411019
@@ -1203,6 +1181,11 @@ newTabLink attrs { url, label } =
12031181
12041182
12051183{-| A link to download a file.
1184+
1185+**Note** If you're using `Browser.application`, then this won't be enough to actually trigger a file download due to how `Browser.Navigation` works.
1186+
1187+[Here's a description of what needs to happen](https://github.com/elm/html/issues/175).
1188+
12061189-}
12071190download :
12081191 List (Attribute msg)
@@ -1358,11 +1341,7 @@ moveLeft x =
13581341{-| -}
13591342padding : Int -> Attribute msg
13601343padding x =
1361− let
1362− f =
1363− toFloat x
1364− in
1365− Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt x) f f f f)
1344+ Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt x) x x x x)
13661345
13671346
13681347{-| Set horizontal and vertical padding.
@@ -1370,27 +1349,16 @@ padding x =
13701349paddingXY : Int -> Int -> Attribute msg
13711350paddingXY x y =
13721351 if x == y then
1373− let
1374− f =
1375− toFloat x
1376− in
1377− Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt x) f f f f)
1352+ Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt x) x x x x)
13781353
13791354 else
1380− let
1381− xFloat =
1382− toFloat x
1383−
1384− yFloat =
1385− toFloat y
1386− in
13871355 Internal.StyleClass Flag.padding
13881356 (Internal.PaddingStyle
13891357 ("p-" ++ String.fromInt x ++ "-" ++ String.fromInt y)
1390− yFloat
1391− xFloat
1392− yFloat
1393− xFloat
1358+ y
1359+ x
1360+ y
1361+ x
13941362 )
13951363
13961364
@@ -1411,26 +1379,16 @@ And then just do
14111379paddingEach : { top : Int, right : Int, bottom : Int, left : Int } -> Attribute msg
14121380paddingEach { top, right, bottom, left } =
14131381 if top == right && top == bottom && top == left then
1414− let
1415− topFloat =
1416− toFloat top
1417− in
1418− Internal.StyleClass Flag.padding
1419− (Internal.PaddingStyle ("p-" ++ String.fromInt top)
1420− topFloat
1421− topFloat
1422− topFloat
1423− topFloat
1424− )
1382+ Internal.StyleClass Flag.padding (Internal.PaddingStyle ("p-" ++ String.fromInt top) top top top top)
14251383
14261384 else
14271385 Internal.StyleClass Flag.padding
14281386 (Internal.PaddingStyle
14291387 (Internal.paddingName top right bottom left)
1430− (toFloat top)
1431− (toFloat right)
1432− (toFloat bottom)
1433− (toFloat left)
1388+ top
1389+ right
1390+ bottom
1391+ left
14341392 )
14351393
14361394
src/Element/Font.elm+2−2
@@ -376,9 +376,9 @@ type alias Variant =
376376{-| You can use this to set a single variant on an element itself such as:
377377
378378 el
379− [ Font.variant Font.smallCaps
379+ [ Font.variant Font.smallcaps
380380 ]
381− (text "rendered with smallCaps")
381+ (text "rendered with smallcaps")
382382
383383**Note** These will **not** stack. If you want multiple variants, you should use `Font.variantList`.
384384
src/Element/Input.elm+40−78
@@ -133,11 +133,6 @@ Instead of implicit submission behavior, [try making an `onEnter` event handler
133133And no one has to look up obtuse html documentation to understand the behavior of their code :).
134134
135135
136−# File Inputs
137−
138−Presently, elm-ui does not expose a replacement for `<input type="file">`; in the meantime, an `Input.button` and `elm/file`'s `File.Select` may meet your needs.
139−
140−
141136# Disabling Inputs
142137
143138You also might be wondering how to disable an input.
@@ -330,8 +325,6 @@ The `onPress` handler will be fired either `onClick` or when the element is focu
330325 , label = text "My Button"
331326 }
332327
333−**Note** If you have an icon button but want it to be accessible, consider adding a [`Region.description`](Element-Region#description), which will describe the button to screen readers.
334−
335328-}
336329button :
337330 List (Attribute msg)
@@ -369,17 +362,7 @@ button attrs { onPress, label } =
369362
370363 Just msg ->
371364 Events.onClick msg
372− :: onKeyLookup
373− (\code ->
374− if code == enter then
375− Just msg
376−
377− else if code == space then
378− Just msg
379−
380− else
381− Nothing
382− )
365+ :: onEnter msg
383366 :: attrs
384367 )
385368 )
@@ -457,24 +440,22 @@ checkbox attrs { label, icon, checked, onChange } =
457440 ]
458441 ++ attrs
459442 in
460− applyLabel
461− (Internal.Attr (Html.Attributes.attribute "role" "checkbox")
462− :: Internal.Attr
463− (Html.Attributes.attribute "aria-checked" <|
443+ applyLabel attributes
444+ label
445+ (Internal.element
446+ Internal.asEl
447+ Internal.div
448+ [ Internal.Attr <|
449+ Html.Attributes.attribute "role" "checkbox"
450+ , Internal.Attr <|
451+ Html.Attributes.attribute "aria-checked" <|
464452 if checked then
465453 "true"
466454
467455 else
468456 "false"
469− )
470− :: hiddenLabelAttribute label
471− :: attributes
472− )
473− label
474− (Internal.element
475− Internal.asEl
476− Internal.div
477− [ Element.centerY
457+ , hiddenLabelAttribute label
458+ , Element.centerY
478459 , Element.height Element.fill
479460 , Element.width Element.shrink
480461 ]
@@ -713,7 +694,7 @@ slider attributes input =
713694 ("input[type=\"range\"]." ++ className ++ "::-ms-thumb")
714695 thumbShadowStyle
715696 )
716− , Internal.Attr (Html.Attributes.class (className ++ " ui-slide-bar focusable-parent"))
697+ , Internal.Attr (Html.Attributes.class (className ++ " focusable-parent"))
717698 , Internal.Attr
718699 (Html.Events.onInput
719700 (\str ->
@@ -779,10 +760,10 @@ slider attributes input =
779760 -- This is after `attributes` because the thumb should be in front of everything.
780761 ++ [ Element.behindContent <|
781762 if vertical then
782− viewVerticalThumb factor (Internal.htmlClass "focusable-thumb" :: thumbAttributes) trackWidth
763+ viewVerticalThumb factor thumbAttributes trackWidth
783764
784765 else
785− viewHorizontalThumb factor (Internal.htmlClass "focusable-thumb" :: thumbAttributes) trackHeight
766+ viewHorizontalThumb factor thumbAttributes trackHeight
786767 ]
787768 )
788769 Element.none
@@ -882,10 +863,10 @@ textHelper textInput attrs textOptions =
882863 -- when things are off by a pixel or two.
883864 -- (or at least when the browser *thinks* it's off by a pixel or two)
884865 Just
885− { top = max 0 (floor (t - 3))
886− , right = max 0 (floor (r - 3))
887− , bottom = max 0 (floor (b - 3))
888− , left = max 0 (floor (l - 3))
866+ { top = max 0 (floor (toFloat t - 3))
867+ , right = max 0 (floor (toFloat r - 3))
868+ , bottom = max 0 (floor (toFloat b - 3))
869+ , left = max 0 (floor (toFloat l - 3))
889870 }
890871
891872 _ ->
@@ -1328,36 +1309,23 @@ redistributeOver isMultiline stacked attr els =
13281309 Element.htmlAttribute
13291310 (Html.Attributes.style
13301311 "height"
1331− ("calc(1.0em + " ++ String.fromFloat (2 * min t b) ++ "px)")
1312+ ("calc(1.0em + " ++ String.fromInt (2 * min t b) ++ "px)")
13321313 )
13331314
13341315 newLineHeight =
13351316 Element.htmlAttribute
13361317 (Html.Attributes.style
13371318 "line-height"
1338− ("calc(1.0em + " ++ String.fromFloat (2 * min t b) ++ "px)")
1319+ ("calc(1.0em + " ++ String.fromInt (2 * min t b) ++ "px)")
13391320 )
13401321
1341− newTop =
1342− t - min t b
1343−
1344− newBottom =
1345− b - min t b
1346−
13471322 reducedVerticalPadding =
1348− Internal.StyleClass Flag.padding
1349− (Internal.PaddingStyle
1350− (Internal.paddingNameFloat
1351− newTop
1352− r
1353− newBottom
1354− l
1355− )
1356− newTop
1357− r
1358− newBottom
1359− l
1360− )
1323+ Element.paddingEach
1324+ { top = t - min t b
1325+ , right = r
1326+ , bottom = b - min t b
1327+ , left = l
1328+ }
13611329 in
13621330 { els
13631331 | parent = reducedVerticalPadding :: els.parent
@@ -1565,8 +1533,6 @@ email =
15651533
15661534By default it will have a minimum height of one line and resize based on it's contents.
15671535
1568−Use `Element.spacing` to change its line-height.
1569−
15701536-}
15711537multiline :
15721538 List (Attribute msg)
@@ -1628,28 +1594,28 @@ applyLabel attrs label input =
16281594 Internal.element
16291595 Internal.asColumn
16301596 (Internal.NodeName "label")
1631− (Internal.htmlClass classes.inputLabel :: attrs)
1597+ attrs
16321598 (Internal.Unkeyed [ labelElement, input ])
16331599
16341600 Below ->
16351601 Internal.element
16361602 Internal.asColumn
16371603 (Internal.NodeName "label")
1638− (Internal.htmlClass classes.inputLabel :: attrs)
1604+ attrs
16391605 (Internal.Unkeyed [ input, labelElement ])
16401606
16411607 OnRight ->
16421608 Internal.element
16431609 Internal.asRow
16441610 (Internal.NodeName "label")
1645− (Internal.htmlClass classes.inputLabel :: attrs)
1611+ attrs
16461612 (Internal.Unkeyed [ input, labelElement ])
16471613
16481614 OnLeft ->
16491615 Internal.element
16501616 Internal.asRow
16511617 (Internal.NodeName "label")
1652− (Internal.htmlClass classes.inputLabel :: attrs)
1618+ attrs
16531619 (Internal.Unkeyed [ labelElement, input ])
16541620
16551621
@@ -2105,11 +2071,7 @@ onKeyLookup lookup =
21052071 Json.field "key" Json.string
21062072 |> Json.andThen decode
21072073 in
2108− -- We generally want these attached to the keydown event becaues it allows us to prevent default on things like spacebar scrolling the page.
2109− -- https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/button_role
2110− Internal.Attr <|
2111− Html.Events.preventDefaultOn "keydown"
2112− (Json.map (\fired -> ( fired, True )) isKey)
2074+ Internal.Attr <| Html.Events.on "keyup" isKey
21132075
21142076
21152077{-| -}
@@ -2205,8 +2167,7 @@ defaultCheckbox : Bool -> Element msg
22052167defaultCheckbox checked =
22062168 Element.el
22072169 [ Internal.htmlClass "focusable"
2208− , Element.width
2209− (Element.px 14)
2170+ , Element.width (Element.px 14)
22102171 , Element.height (Element.px 14)
22112172 , Font.color white
22122173 , Element.centerY
@@ -2242,8 +2203,9 @@ defaultCheckbox checked =
22422203
22432204 else
22442205 1
2245− , Element.inFront
2246− (Element.el
2206+ ]
2207+ (if checked then
2208+ Element.el
22472209 [ Border.color white
22482210 , Element.height (Element.px 6)
22492211 , Element.width (Element.px 9)
@@ -2251,7 +2213,6 @@ defaultCheckbox checked =
22512213 , Element.centerX
22522214 , Element.centerY
22532215 , Element.moveUp 1
2254− , Element.transparent (not checked)
22552216 , Border.widthEach
22562217 { top = 0
22572218 , left = 2
@@ -2260,6 +2221,7 @@ defaultCheckbox checked =
22602221 }
22612222 ]
22622223 Element.none
2263− )
2264− ]
2265− Element.none
2224+
2225+ else
2226+ Element.none
2227+ )
src/Element/Region.elm+1−5
@@ -101,11 +101,7 @@ announce =
101101 Internal.Describe LivePolite
102102
103103
104−{-| Adds an `aria-label`, which is used by accessibility software to identity otherwise unlabeled elements.
105−
106−A common use for this would be to label buttons that only have an icon.
107−
108−-}
104+{-| -}
109105description : String -> Attribute msg
110106description =
111107 Internal.Describe << Internal.Label
src/Internal/Model.elm+32−30
@@ -79,7 +79,6 @@ module Internal.Model exposing
7979 , onlyStyles
8080 , optionsToRecord
8181 , paddingName
82− , paddingNameFloat
8382 , pageClass
8483 , paragraphClass
8584 , reduceRecursive
@@ -174,7 +173,7 @@ type Style
174173 | Colored String String Color
175174 | SpacingStyle String Int Int
176175 | BorderWidth String Int Int Int Int
177− | PaddingStyle String Float Float Float Float
176+ | PaddingStyle String Int Int Int Int
178177 | GridTemplateStyle
179178 { spacing : ( Length, Length )
180179 , columns : List Length
@@ -1478,9 +1477,7 @@ renderHeight h =
14781477 Single
14791478 cls
14801479 "min-height"
1481− -- This needs to be !important because we're using `min-height: min-content`
1482− -- to correct for safari's incorrect implementation of flexbox.
1483− (String.fromInt minSize ++ "px !important")
1480+ (String.fromInt minSize ++ "px")
14841481
14851482 ( newFlag, newAttrs, newStyle ) =
14861483 renderHeight len
@@ -1948,7 +1945,7 @@ type Spacing
19481945
19491946
19501947type Padding
1951− = Padding String Float Float Float Float
1948+ = Padding String Int Int Int Int
19521949
19531950
19541951extractSpacingAndPadding : List (Attribute aligned msg) -> ( Maybe Padding, Maybe Spacing )
@@ -2244,11 +2241,7 @@ renderFocusStyle focus =
22442241 , Just <| Property "outline" "none"
22452242 ]
22462243 )
2247− , Style
2248− ((Internal.Style.dot classes.any ++ ":focus .focusable, ")
2249− ++ (Internal.Style.dot classes.any ++ ".focusable:focus, ")
2250− ++ (".ui-slide-bar:focus + " ++ Internal.Style.dot classes.any ++ " .focusable-thumb")
2251− )
2244+ , Style (Internal.Style.dot classes.any ++ ":focus .focusable, " ++ Internal.Style.dot classes.any ++ ".focusable:focus")
22522245 (List.filterMap identity
22532246 [ Maybe.map (\color -> Property "border-color" (formatColor color)) focus.borderColor
22542247 , Maybe.map (\color -> Property "background-color" (formatColor color)) focus.backgroundColor
@@ -2649,14 +2642,34 @@ renderStyle options maybePseudo selector props =
26492642 renderedProps =
26502643 List.foldl (renderProps False) "" props
26512644 in
2652− [ selector ++ "-fs:focus {" ++ renderedProps ++ "\n}"
2653− , ("." ++ classes.any ++ ":focus " ++ selector ++ "-fs {")
2645+ [ selector
2646+ ++ "-fs:focus {"
2647+ ++ renderedProps
2648+ ++ "\n}"
2649+ , "."
2650+ ++ classes.any
2651+ ++ ":focus ~ "
2652+ ++ selector
2653+ ++ "-fs:not(.focus) {"
26542654 ++ renderedProps
26552655 ++ "\n}"
2656− , (selector ++ "-fs:focus-within {")
2656+ , "."
2657+ ++ classes.any
2658+ ++ ":focus "
2659+ ++ selector
2660+ ++ "-fs {"
26572661 ++ renderedProps
26582662 ++ "\n}"
2659− , (".ui-slide-bar:focus + " ++ Internal.Style.dot classes.any ++ " .focusable-thumb" ++ selector ++ "-fs {")
2663+ , selector
2664+ ++ "-fs:focus-within {"
2665+ ++ renderedProps
2666+ ++ "\n}"
2667+ , ".focusable-parent:focus ~ "
2668+ ++ "."
2669+ ++ classes.any
2670+ ++ " "
2671+ ++ selector
2672+ ++ "-fs {"
26602673 ++ renderedProps
26612674 ++ "\n}"
26622675 ]
@@ -2863,13 +2876,13 @@ renderStyleRule options rule maybePseudo =
28632876 maybePseudo
28642877 class
28652878 [ Property "padding"
2866− (String.fromFloat top
2879+ (String.fromInt top
28672880 ++ "px "
2868− ++ String.fromFloat right
2881+ ++ String.fromInt right
28692882 ++ "px "
2870− ++ String.fromFloat bottom
2883+ ++ String.fromInt bottom
28712884 ++ "px "
2872− ++ String.fromFloat left
2885+ ++ String.fromInt left
28732886 ++ "px"
28742887 )
28752888 ]
@@ -3199,17 +3212,6 @@ paddingName top right bottom left =
31993212 ++ String.fromInt left
32003213
32013214
3202−paddingNameFloat top right bottom left =
3203− "pad-"
3204− ++ floatClass top
3205− ++ "-"
3206− ++ floatClass right
3207− ++ "-"
3208− ++ floatClass bottom
3209− ++ "-"
3210− ++ floatClass left
3211−
3212−
32133215getStyleName : Style -> String
32143216getStyleName style =
32153217 case style of
src/Internal/Style.elm+16−63
@@ -10,7 +10,6 @@ type Class
1010type Rule
1111 = Prop String String
1212 | Child String (List Rule)
13− | AllChildren String (List Rule)
1413 | Supports ( String, String ) (List ( String, String ))
1514 | Descriptor String (List Rule)
1615 | Adjacent String (List Rule)
@@ -257,7 +256,6 @@ classes =
257256 , inputMultilineParent = "imlp"
258257 , inputMultilineFiller = "imlf"
259258 , inputMultilineWrapper = "implw"
260− , inputLabel = "lbl"
261259
262260 -- link
263261 , link = "lnk"
@@ -562,15 +560,6 @@ renderRules (Intermediate parent) rulesToRender =
562560 :: rendered.others
563561 }
564562
565− AllChildren child childRules ->
566− { rendered
567− | others =
568− renderRules
569− (emptyIntermediate (parent.selector ++ " " ++ child) "")
570− childRules
571− :: rendered.others
572− }
573−
574563 Descriptor descriptor descriptorRules ->
575564 { rendered
576565 | others =
@@ -961,18 +950,6 @@ baseSheet =
961950 ]
962951 , Class (dot classes.any ++ dot classes.single ++ dot classes.imageContainer)
963952 [ Prop "display" "block"
964− , Descriptor (dot classes.heightFill)
965− [ Child "img"
966− [ Prop "max-height" "100%"
967− , Prop "object-fit" "cover"
968− ]
969− ]
970− , Descriptor (dot classes.widthFill)
971− [ Child "img"
972− [ Prop "max-width" "100%"
973− , Prop "object-fit" "cover"
974− ]
975− ]
976953 ]
977954 , Class (dot classes.any ++ ":focus")
978955 [ Prop "outline" "none"
@@ -995,7 +972,6 @@ baseSheet =
995972 , Child (dot classes.inFront)
996973 [ Descriptor (dot classes.nearby)
997974 [ Prop "position" "fixed"
998− , Prop "z-index" "20"
999975 ]
1000976 ]
1001977 ]
@@ -1244,7 +1220,6 @@ baseSheet =
12441220 -- If it's 1, it bumps up to something like 1.2
12451221 [ Prop "line-height" "1.05"
12461222 , Prop "background" "transparent"
1247− , Prop "text-align" "inherit"
12481223 ]
12491224 , Descriptor (dot classes.single)
12501225 elDescription
@@ -1371,28 +1346,18 @@ baseSheet =
13711346 , Descriptor (dot classes.spaceEvenly)
13721347 [ Prop "justify-content" "space-between"
13731348 ]
1374− , Descriptor (dot classes.inputLabel)
1375− [ Prop "align-items" "baseline"
1376− ]
13771349 ]
13781350 , Descriptor (dot classes.column)
13791351 [ Prop "display" "flex"
13801352 , Prop "flex-direction" "column"
13811353 , Child (dot classes.any)
1382− -- *Note* - While rows have flex-basis 0%,
1383− -- which allows for the children of a row to default to their content size
1384− -- This apparently is a different story for columns.
1385− -- Safari has an issue if this is flex-basis: 0%, as it goes entirely to 0,
1386− -- instead of the expected content size.
1387− -- So we add `min-height: min-content`, which isn't supported by IE, but works for all other browsers!
1388− -- Separately, 0% is different than 0px, but only for columns
1389− -- In columns, 0% will actually be calculated as `auto` for columns
1390− -- So, 0px is the one we want.
1391− [ Prop "flex-basis" "0px"
1392− , Prop "min-height" "min-content"
1354+ [ Prop "flex-basis" "0%"
13931355 , Descriptor (dot classes.heightExact)
13941356 [ Prop "flex-basis" "auto"
13951357 ]
1358+ , Descriptor (dot classes.column)
1359+ [ Prop "flex-basis" "auto"
1360+ ]
13961361 ]
13971362 , Child (dot classes.heightFill)
13981363 [ Prop "flex-grow" "100000"
@@ -1596,7 +1561,7 @@ baseSheet =
15961561 )
15971562 ]
15981563 , Descriptor (dot classes.inputMultiline)
1599− [ Prop "white-space" "pre-wrap !important"
1564+ [ Prop "white-space" "pre-wrap"
16001565 , Prop "height" "100%"
16011566 , Prop "width" "100%"
16021567 , Prop "background-color" "transparent"
@@ -1616,47 +1581,29 @@ baseSheet =
16161581 [ Prop "flex-basis" "auto" ]
16171582 ]
16181583 , Descriptor (dot classes.inputMultilineParent)
1619− [ Prop "white-space" "pre-wrap !important"
1584+ [ Prop "white-space" "pre-wrap"
16201585 , Prop "cursor" "text"
16211586 , Child (dot classes.inputMultilineFiller)
1622− [ Prop "white-space" "pre-wrap !important"
1587+ [ Prop "white-space" "pre-wrap"
16231588 , Prop "color" "transparent"
16241589 ]
16251590 ]
16261591 , Descriptor (dot classes.paragraph)
16271592 [ Prop "display" "block"
16281593 , Prop "white-space" "normal"
1629− , Prop "overflow-wrap" "break-word"
16301594 , Descriptor (dot classes.hasBehind)
16311595 [ Prop "z-index" "0"
16321596 , Child (dot classes.behind)
16331597 [ Prop "z-index" "-1"
16341598 ]
16351599 ]
1636− , AllChildren (dot classes.text)
1600+ , Child (dot classes.text)
16371601 [ Prop "display" "inline"
16381602 , Prop "white-space" "normal"
16391603 ]
1640− , AllChildren (dot classes.paragraph)
1641− [ Prop "display" "inline"
1642− , Descriptor "::after"
1643− [ Prop "content" "none"
1644− ]
1645− , Descriptor "::before"
1646− [ Prop "content" "none"
1647− ]
1648− ]
1649− , AllChildren (dot classes.single)
1604+ , Child (dot classes.single)
16501605 [ Prop "display" "inline"
16511606 , Prop "white-space" "normal"
1652−
1653− -- Inline block allows the width of the item to be set
1654− -- but DOES NOT like wrapping text in a standard, normal, sane way.
1655− -- We're sorta counting that if an exact width has been set,
1656− -- people aren't expecting proper text wrapping for this element
1657− , Descriptor (dot classes.widthExact)
1658− [ Prop "display" "inline-block"
1659− ]
16601607 , Descriptor (dot classes.inFront)
16611608 [ Prop "display" "flex"
16621609 ]
@@ -1679,9 +1626,15 @@ baseSheet =
16791626 [ Prop "display" "inline"
16801627 , Prop "white-space" "normal"
16811628 ]
1629+ , Child (dot classes.single)
1630+ [ Child (dot classes.text)
1631+ [ Prop "display" "inline"
1632+ , Prop "white-space" "normal"
1633+ ]
1634+ ]
16821635 ]
16831636 , Child (dot classes.row)
1684− [ Prop "display" "inline"
1637+ [ Prop "display" "inline-flex"
16851638 ]
16861639 , Child (dot classes.column)
16871640 [ Prop "display" "inline-flex"
tests-rendering/automation/build.jsdeleted−90
@@ -1,90 +0,0 @@
1−const fs = require("fs");
2−const path = require("path");
3−const compileToString = require("node-elm-compiler").compileToString;
4−
5−// {
6−// template: "./tests-rendering/automation/templates/gather-styles.html",
7−// target: "./tmp/test.html",
8−// elm: "src/Tests/Run.elm",
9−// replace:
10−// elmOptions: { cwd: "./tests-rendering" },
11−// }
12−
13−async function compile_and_embed(config) {
14− const elm_entry_module = fs.readFileSync(
15− path.join(config.elmOptions.cwd, config.elm),
16− "utf8"
17− );
18−
19− const module_name = elm_entry_module
20− .split(/[\r\n]+/)[0]
21− .match(/module ([A-Za-z0-9\.]+)/i)[1];
22−
23− // we embed the compiled js to avoid having to start a server to read the app.
24− await compileToString([config.elm], config.elmOptions).then(function (
25− compiled_elm_code
26− ) {
27− // console.log(compiled_elm_code);
28− const compiled = fs
29− .readFileSync(config.template, "utf8")
30− .replace(/~~_compiled_elm_code_~~/, () => compiled_elm_code)
31− .replace(/~~_module_name_~~/, () => module_name);
32−
33− fs.writeFileSync(config.target, compiled);
34− });
35−}
36−
37−async function compile_to_string(config) {
38− const elm_entry_module = fs.readFileSync(
39− path.join(config.elmOptions.cwd, config.elm),
40− "utf8"
41− );
42−
43− const module_name = elm_entry_module
44− .split(/[\r\n]+/)[0]
45− .match(/module ([A-Za-z0-9\.]+)/i)[1];
46−
47− const compiled = await compileToString([config.elm], config.elmOptions).then(
48− function (compiled_elm_code) {
49− return fs
50− .readFileSync(config.template, "utf8")
51− .replace(/~~_module_name_~~/g, () => module_name)
52− .replace(/~~_compiled_elm_code_~~/g, () => compiled_elm_code);
53− }
54− );
55− return compiled;
56−}
57−
58−async function get_module_name(config) {
59− const elm_entry_module = fs.readFileSync(
60− path.join(config.cwd, config.elm),
61− "utf8"
62− );
63−
64− const module_name = elm_entry_module
65− .split(/[\r\n]+/)[0]
66− .match(/module ([A-Za-z0-9\.]+)/i)[1];
67− return module_name;
68−}
69−
70−async function create_runner(config) {
71− const elm_entry_module = fs.readFileSync(config.elm, "utf8");
72−
73− let module_name = elm_entry_module
74− .split(/[\r\n]+/)[0]
75− .match(/module ([A-Za-z0-9\.]+)/i)[1];
76−
77− const module_name_sentence = module_name.replace(/([A-Z])/g, " $1");
78−
79− const runner = fs
80− .readFileSync(config.template, "utf8")
81− .replace(/~~_module_name_~~/g, () => module_name)
82− .replace(/~~_module_name_sentence_~~/g, () => module_name_sentence);
83− fs.writeFileSync(config.target, runner);
84−}
85−
86−exports.compile_and_embed = compile_and_embed;
87−
88−exports.create_runner = create_runner;
89−
90−exports.compile_to_string = compile_to_string;
tests-rendering/automation/doc-preview.shdeleted−1
@@ -1 +0,0 @@
1−elm make --docs docs.json
tests-rendering/automation/run.jsdeleted−304
@@ -1,304 +0,0 @@
1−const { Builder, By, Key, until } = require("selenium-webdriver");
2−const chrome = require("selenium-webdriver/chrome");
3−const firefox = require("selenium-webdriver/firefox");
4−const fs = require("fs");
5−const program = require("commander");
6−const path = require("path");
7−const chalk = require("chalk");
8−const childProcess = require("child_process");
9−const compile_and_embed = require("./build.js").compile_and_embed;
10−
11−program
12− .option("-s, --sauce", "run tests on sauce labs")
13− .option("--chrome", "run chrome tests (default)")
14− .option("--firefox", "run firefox tests")
15− .option("--ie", "run ie tests")
16− .option("--edge", "run edge tests")
17− .option("--build [value]", "Set build number for sauce labs")
18− .option("--name [value]", "Set run name for sauce labs")
19− .option("--verbose", "Print out all test results")
20− .option("--headless", "run tests without showing the browser")
21− .parse(process.argv);
22−
23−// 'Windows 10'
24−
25−const windows = {
26− chrome: {
27− platform: "Windows 10",
28− browser: "chrome",
29− browserVersion: "latest",
30− },
31− firefox: {
32− platform: "Windows 10",
33− browser: "firefox",
34− browserVersion: "latest",
35− },
36− edge: {
37− platform: "Windows 10",
38− browser: "MicrosoftEdge",
39− browserVersion: "latest",
40− },
41− ie: {
42− platform: "Windows 10",
43− browser: "internet explorer",
44− browserVersion: "latest",
45− },
46−};
47−
48−const all_windows = [
49− windows.chrome,
50− windows.firefox,
51− windows.edge,
52− // i.e. takes forever and seems to make selenium timeout :/
53− // not really sure how to extend the timeout.
54− // , windows.ie
55−];
56−
57−// "macOS 10.14"
58−const osx = {
59− chrome: {
60− platform: "macOS 10.14",
61− browser: "chrome",
62− browserVersion: "latest",
63− },
64− firefox: {
65− platform: "macOS 10.14",
66− browser: "firefox",
67− browserVersion: "latest",
68− },
69− safari: {
70− platform: "macOS 10.14",
71− browser: "safari",
72− browserVersion: "latest",
73− },
74−};
75−
76−const all_osx = [osx.safari];
77−
78−const all_browsers = all_windows.concat(all_osx);
79−
80−function prepare_all_envs(config) {
81− var envs = [];
82−
83− for (i = 0; i < all_browsers.length; i++) {
84− envs.push({
85− browser: all_browsers[i].browser,
86− browserVersion: all_browsers[i].browserVersion,
87− platform: all_browsers[i].platform,
88− build: config.build,
89− name: config.name,
90− });
91− }
92−
93− // for (i = 0; i < osx.length; i++) {
94− // envs.push({
95− // browser: osx[i].browser,
96− // browserVersion: osx[i].browserVersion,
97− // platform: "macOS 10.14",
98− // build: config.build,
99− // name: config.name,
100− // });
101− // }
102−
103− return envs;
104−}
105−
106−function prepare_sauce_driver(env) {
107− const username = process.env.SAUCE_USERNAME;
108− const accessKey = process.env.SAUCE_ACCESS_KEY;
109−
110− driver = new Builder()
111− .withCapabilities({
112− browserName: env.browser,
113− platformName: env.platform,
114− browserVersion: env.browserVersion,
115− /* Pass Sauce User Name and Access Key */
116− "sauce:options": {
117− username: username,
118− accessKey: accessKey,
119− build: env.build,
120− name: env.name,
121− },
122− })
123− .usingServer("https://@ondemand.saucelabs.com:443/wd/hub")
124− .build();
125−
126− return driver;
127−}
128−
129−async function prepare_local_driver(env) {
130− const firefoxOptions = new firefox.Options();
131− const chromeOptions = new chrome.Options();
132−
133− if (program.headless) {
134− firefoxOptions.headless();
135− chromeOptions.headless();
136− }
137−
138− let driver = await new Builder()
139− .forBrowser(env.browser)
140− .setChromeOptions(chromeOptions)
141− .setFirefoxOptions(firefoxOptions)
142− .build();
143−
144− return driver;
145−}
146−
147−async function run_test(driver, url) {
148− var results = null;
149− try {
150− await driver
151− .manage()
152− .window()
153− .setRect({ width: 1200, height: 800, x: 0, y: 0 });
154− await driver.get(url);
155− await driver.wait(until.titleIs("tests finished"), 240 * 1000);
156− results = await driver.executeScript("return test_results");
157− } finally {
158− await driver.quit();
159− }
160− return results;
161−}
162−
163−(async () => {
164− var dir = "tmp";
165− if (!fs.existsSync(dir)) {
166− fs.mkdirSync(dir);
167− }
168− console.log("Compiling tests");
169− await compile_and_embed({
170− template: "./tests-rendering/automation/templates/gather-styles.html",
171− target: "./tmp/test.html",
172− elm: "src/Tests/All.elm",
173− elmOptions: { cwd: "./tests-rendering" },
174− });
175− console.log("Done compiling");
176−
177− if (program.sauce) {
178− const build = program.build;
179− const name = program.name;
180−
181− if (build == null || name == null) {
182− throw "A Build and a Name must be specified.";
183− }
184−
185− var results = [];
186−
187− // Publish to netlify
188− childProcess.execSync("sh tests-rendering/automation/publish-file.sh", {
189− env: {
190− FILE: "test.html",
191− BUILD: program.build,
192− NAME: program.name,
193− GIT_EMAIL: "automation@elm-ui.com",
194− GIT_NAME: "Elm UI Automation",
195− HOME: process.env.HOME,
196− SSH_AUTH_SOCK: process.env.SSH_AUTH_SOCK,
197− SSH_AGENT_PID: process.env.SSH_AGENT_PID,
198− },
199− });
200−
201− var url = `http://elm-ui-testing.netlify.com/tests/${program.build}/${program.name}/`;
202− console.log(`Running sauce labs test:`);
203− console.log(` ${url}`);
204−
205− const envs = prepare_all_envs({ build: build, name: name });
206− console.log(envs);
207− var test_runs = [];
208− var test_labels = [];
209− for (i = 0; i < envs.length; i++) {
210− var driver = prepare_sauce_driver(envs[i]);
211− test_runs.push(run_test(driver, url));
212− test_labels.push(envs[i]);
213− }
214− var results = await Promise.all(test_runs);
215− for (i = 0; i < results.length; i++) {
216− print_results(renderEnvName(test_labels[i]), results[i]);
217− }
218− } else {
219− // Run chrome if nothing else is selected
220− if (program.chrome || (!program.chrome && !program.firefox)) {
221− console.log("Running locally on Chrome...");
222− const driver = await prepare_local_driver(osx.chrome);
223− var results = await run_test(
224− driver,
225− "file://" + path.resolve("./tmp/test.html")
226− );
227− print_results("Local Chrome", results);
228− }
229− if (program.firefox) {
230− console.log("Running locally on Firefox...");
231− const driver = await prepare_local_driver(osx.firefox);
232− var results = await run_test(
233− driver,
234− "file://" + path.resolve("./tmp/test.html")
235− );
236− print_results("Local Firefox", results);
237− }
238− if (program.ie) {
239− console.log("Running locally on IE...");
240− const driver = await prepare_local_driver(windows.ie);
241− var results = await run_test(
242− driver,
243− "file://" + path.resolve("./tmp/test.html")
244− );
245− print_results("Local IE", results);
246− }
247− if (program.edge) {
248− console.log("Running locally on Edge...");
249− const driver = await prepare_local_driver(windows.edge);
250− var results = await run_test(
251− driver,
252− "file://" + path.resolve("./tmp/test.html")
253− );
254− print_results("Local Edge", results);
255− }
256− }
257−})();
258−
259−function renderEnvName(env) {
260− return `${env.platform}, ${env.browser} ${env.browserVersion}`;
261−}
262−
263−function print_results(label, tests) {
264− var total_passed = 0;
265− var total_failed = 0;
266− var i;
267− if (program.verbose) {
268− console.log(label);
269− }
270− for (i = 0; i < tests.length; i++) {
271− var passed = 0;
272− var failed = 0;
273− for (j = 0; j < tests[i].results.length; j++) {
274− if (tests[i].results[j].passing) {
275− passed = passed + 1;
276− } else {
277− if (failed == 0) {
278− if (!program.verbose) {
279− console.log(label);
280− }
281− console.log(tests[i].label);
282− }
283− failed = failed + 1;
284− console.log(" " + chalk.red("fail") + " ->");
285− console.log(" " + tests[i].results[j].description);
286− }
287− }
288− total_passed = total_passed + passed;
289− total_failed = total_failed + failed;
290−
291− if (failed != 0) {
292− console.log(chalk.green(` ${passed} tests passed`));
293− console.log(chalk.red(` ${failed} tests failed`));
294− console.log();
295− } else if (program.verbose) {
296− console.log(tests[i].label + chalk.green(` ${passed} tests passed`));
297− }
298− }
299− if (total_failed == 0) {
300− console.log(
301− `${label} -> ` + chalk.green(`All ${total_passed} tests passed`)
302− );
303− }
304−}
tests-rendering/automation/templates/Run.elmdeleted−14
@@ -1,14 +0,0 @@
1−module Tests.Run exposing (main)
2−
3−{-| _NOTE_ this is auto-generated! Notouchy!
4−-}
5−
6−import ~~_module_name_~~
7−import Testable.Runner
8−
9−
10−main : Testable.Runner.TestableProgram
11−main =
12− Testable.Runner.program
13− [ Testable.Runner.rename "~~_module_name_sentence_~~" ~~_module_name_~~.view
14− ]
tests-rendering/automation/templates/gather-styles.htmldeleted−185
@@ -1,185 +0,0 @@
1−<!DOCTYPE html>
2−<html>
3− <head>
4− <meta charset="UTF-8" />
5− <title>Elm UI Rendering Test</title>
6− <script>
7− ~~_compiled_elm_code_~~
8− </script>
9− <script>
10− // Helpers
11− // Calculations for canvas
12− var PIXEL_RATIO = (function () {
13− var ctx = document.createElement("canvas").getContext("2d"),
14− dpr = window.devicePixelRatio || 1,
15− bsr =
16− ctx.webkitBackingStorePixelRatio ||
17− ctx.mozBackingStorePixelRatio ||
18− ctx.msBackingStorePixelRatio ||
19− ctx.oBackingStorePixelRatio ||
20− ctx.backingStorePixelRatio ||
21− 1;
22−
23− return dpr / bsr;
24− })();
25−
26− function createHiDPICanvas(w, h, id, ratio) {
27− if (!ratio) {
28− ratio = PIXEL_RATIO;
29− }
30− let can = document.getElementById(id);
31− can.width = w * ratio;
32− can.height = h * ratio;
33− can.style.width = w + "px";
34− can.style.height = h + "px";
35− can.getContext("2d").setTransform(ratio, 0, 0, ratio, 0, 0);
36− return can;
37− }
38−
39− function isVisible(id, bbox) {
40− var current = document.getElementById(id);
41− var result = 0;
42− if (current == document.elementFromPoint(bbox["left"], bbox["top"])) {
43− result++;
44− }
45− if (
46− current == document.elementFromPoint(bbox["left"], bbox["bottom"] - 1)
47− ) {
48− result++;
49− }
50− if (
51− current == document.elementFromPoint(bbox["right"] - 1, bbox["top"])
52− ) {
53− result++;
54− }
55− if (
56− current ==
57− document.elementFromPoint(bbox["right"] - 1, bbox["bottom"] - 1)
58− ) {
59− result++;
60− }
61−
62− if (result == 4) {
63− return true;
64− } else {
65− return false;
66− }
67− }
68−
69− function getStyle(element) {
70− var props = [];
71− var style = window.getComputedStyle(element);
72− for (var i = style.length; i--; ) {
73− var name = style.item(i);
74− var value = style.getPropertyValue(name);
75− props.push([name, value]);
76− }
77− return props;
78− }
79−
80− function getBoundingBox(element) {
81− var bbox = element.getBoundingClientRect();
82− var style = window.getComputedStyle(element, null);
83−
84− var padding = {
85− top: parseFloat(style.getPropertyValue("padding-top")),
86− bottom: parseFloat(style.getPropertyValue("padding-bottom")),
87− left: parseFloat(style.getPropertyValue("padding-left")),
88− right: parseFloat(style.getPropertyValue("padding-right")),
89− };
90−
91− return {
92− top: bbox.top,
93− bottom: bbox.bottom,
94− left: bbox.left,
95− right: bbox.right,
96− width: bbox.width,
97− height: bbox.height,
98− padding: padding,
99− };
100− }
101− function getTextMetrics(element) {
102− // Given our element, we want to return the text metrics on the text within.
103− // If it is an element we want to measure:
104− // we want to get the font family
105− // and the font size.
106− // We're going to presume that the font is loaded.
107− let childrenTextMetrics = [];
108− for (i = 0; i < element.children.length; i++) {
109− if (element.children[i].classList.contains("t")) {
110− let style = window.getComputedStyle(element, null);
111− let fontSize = style.getPropertyValue("font-size");
112− let fontFamily = style.getPropertyValue("font-family");
113− let ctx = canvas.getContext("2d");
114−
115− ctx.font = fontSize + " " + fontFamily; //"16px Roboto";
116− let text = ctx.measureText(element.children[i].innerText);
117−
118− childrenTextMetrics.push({
119− actualBoundingBoxAscent: text.actualBoundingBoxAscent,
120− actualBoundingBoxDescent: text.actualBoundingBoxDescent,
121− actualBoundingBoxLeft: text.actualBoundingBoxLeft,
122− actualBoundingBoxRight: text.actualBoundingBoxRight,
123− width: text.width,
124− });
125− }
126− }
127− return childrenTextMetrics;
128− }
129− </script>
130− </head>
131− <style></style>
132− <body id="root">
133− <body id="root">
134− <div id="elm-home"></div>
135− <canvas id="canvas"></canvas>
136− </body>
137− </body>
138−
139− <script type="text/javascript">
140− // Starting Elm App,
141− var app = Elm.~~_module_name_~~.init({
142− node: document.getElementById("elm-home"),
143− });
144−
145− // create a canvas for text measurements
146− let canvas = createHiDPICanvas(200, 100, "canvas");
147−
148− var test_results = "waiting..";
149−
150− app.ports.report.subscribe(function (results) {
151− test_results = results;
152− // NOTE - this is the signal to the automation that it is cool to retrieve results now
153− // So don't remove this like you did before :D
154− document.title = "tests finished";
155− });
156−
157− app.ports.analyze.subscribe(function (ids) {
158− // ids : List String
159− var idsLength = ids.length;
160− var results = [];
161− for (var i = 0; i < idsLength; i++) {
162− var id = ids[i];
163− var element = document.getElementById(id);
164− if (element == null) {
165− console.log("id " + id + " not found");
166− }
167− var style = getStyle(element);
168− var bbox = getBoundingBox(element);
169− var metrics = getTextMetrics(element);
170−
171− var visible = isVisible(id, bbox);
172−
173− var result = {
174− textMetrics: metrics,
175− bbox: bbox,
176− style: style,
177− id: id,
178− isVisible: visible,
179− };
180− results.push(result);
181− }
182− app.ports.styles.send(results);
183− });
184− </script>
185−</html>
tests-rendering/automation/view.jsdeleted−73
@@ -1,73 +0,0 @@
1−const fs = require("fs");
2−const program = require("commander");
3−const path = require("path");
4−const chalk = require("chalk");
5−const childProcess = require("child_process");
6−const build = require("./build.js");
7−const chokidar = require("chokidar");
8−const http = require("http");
9−
10−var filepath = null;
11−var test_filepath = null;
12−program
13− .option("--all", "run all the tests")
14− .option("--debug", "run with debug on")
15− .arguments("<filepath>")
16− .action(function (p) {
17− test_filepath = path.join("./tests-rendering/cases/open", p);
18− })
19− .parse(process.argv);
20−
21−(async () => {
22− if (test_filepath && test_filepath == null && !program.run) {
23− console.log("Open Cases");
24− console.log("");
25− fs.readdirSync("./tests-rendering/cases/open").forEach((file) => {
26− if (file.endsWith("elm")) {
27− console.log(" " + file);
28− }
29− });
30− console.log("");
31− return;
32− }
33−
34− if (program.all) {
35− filepath = "./src/Tests/All.elm";
36− } else {
37− filepath = "src/Tests/Run.elm";
38− build.create_runner({
39− elm: test_filepath,
40− template: "./tests-rendering/automation/templates/Run.elm",
41− target: "./tests-rendering/src/Tests/Run.elm",
42− });
43− }
44−
45− //
46− // Compile and serve
47−
48− let content = await build.compile_to_string({
49− template: "./tests-rendering/automation/templates/gather-styles.html",
50− elm: filepath,
51− elmOptions: { cwd: "./tests-rendering", debug: program.debug },
52− });
53−
54− console.log("Finished compiling");
55− // console.log(content);
56−
57− chokidar.watch("./tests-rendering/*.elm").on("all", (event, path) => {
58− console.log("Changes detected, refresh!");
59− content = build.compile_to_string({
60− template: "./tests-rendering/automation/templates/gather-styles.html",
61− elm: filepath,
62− elmOptions: { cwd: "./tests-rendering", debug: program.debug },
63− });
64− });
65− console.log("Serving on http://localhost:8080");
66− http
67− .createServer(function (req, res) {
68− res.writeHead(200, { "Content-Type": "text/html" });
69− res.write(content);
70− res.end();
71− })
72− .listen(8080);
73−})();
tests-rendering/cases/elm.jsondeleted−23
@@ -1,23 +0,0 @@
1−{
2− "type": "application",
3− "source-directories": ["open", "../src/"],
4− "elm-version": "0.19.1",
5− "dependencies": {
6− "direct": {
7− "elm/browser": "1.0.0",
8− "elm/core": "1.0.0",
9− "elm/html": "1.0.0",
10− "elm/json": "1.0.0",
11− "elm/virtual-dom": "1.0.0",
12− "ohanhi/lorem": "1.0.2"
13− },
14− "indirect": {
15− "elm/time": "1.0.0",
16− "elm/url": "1.0.0"
17− }
18− },
19− "test-dependencies": {
20− "direct": {},
21− "indirect": {}
22− }
23−}
tests-rendering/cases/open/InFrontSize.elmdeleted−43
@@ -1,43 +0,0 @@
1−module InFrontSize exposing (view)
2−
3−{-|
4−
5−
6−# inFront elements with width fill are contained within the parent's border
7−
8−<https://github.com/mdgriffith/elm-ui/issues/201>
9−
10−Though they're expected to be the actual size of the parent.
11−
12−-}
13−
14−import Testable.Element exposing (..)
15−import Testable.Element.Background as Background
16−import Testable.Element.Border as Border
17−
18−
19−view =
20− layout []
21− (el
22− [ width (px 100)
23− , height (px 100)
24− , centerX
25− , centerY
26− , Background.color (rgb 0.1 0.1 0.1)
27− , Border.width 20
28− , Border.color (rgb 0.5 1 1)
29−
30− -- the following element should cover the parent's border
31− , inFront
32− (el
33− [ width fill
34− , height fill
35− , Background.color (rgb 0.1 0.5 0.9)
36−
37− -- , moveUp 40
38− ]
39− none
40− )
41− ]
42− none
43− )
tests-rendering/cases/open/LabelledInputAlignRight.elmdeleted−28
@@ -1,28 +0,0 @@
1−module LabelledInputAlignRight exposing (view)
2−
3−import Testable.Element exposing (..)
4−import Testable.Element.Input as Input
5−
6−
7−view =
8− layout [] <|
9− column [ width fill ]
10− [ Input.text
11− [ width (px 200)
12− , alignRight
13− ]
14− { onChange = always False
15− , text = ""
16− , placeholder = Nothing
17− , label = Input.labelLeft [] (text "label")
18− }
19− , Input.text
20− [ width (px 200)
21− , alignRight
22− ]
23− { onChange = always False
24− , text = ""
25− , placeholder = Nothing
26− , label = Input.labelHidden "label"
27− }
28− ]
tests-rendering/cases/open/NearbyElementBordersOverlap.elmdeleted−46
@@ -1,46 +0,0 @@
1−module NearbyElementBordersOverlap exposing (view)
2−
3−{-| Elements placed with onLeft, onRight, above & below overlap main element's border
4−
5−
6−# inFront elements with width fill are contained within the parent's border
7−
8−<https://github.com/mdgriffith/elm-ui/issues/223>
9−
10−In addition to the overlap, it affects layout in unexpected ways: eg if the elements
11−are the same height, onLeft and onRight elements will be vertically offset
12−from the main element.
13−
14−-}
15−
16−import Testable.Element exposing (..)
17−import Testable.Element.Border as Border
18−
19−
20−blue =
21− rgb 0 0 1
22−
23−
24−green =
25− rgb 0 1 0
26−
27−
28−grey =
29− rgb 0.5 0.5 0.5
30−
31−
32−view =
33− layout [ width fill, height fill ] <|
34− el
35− [ centerX
36− , centerY
37− , Border.width 10
38− , Border.color green
39− , padding 50
40− , above <| el [ Border.color grey, Border.width 10 ] <| text "above"
41− , below <| el [ Border.color grey, Border.width 10 ] <| text "below"
42− , onRight <| el [ Border.color blue, Border.width 10 ] <| text "onRight"
43− , onLeft <| el [ Border.color blue, Border.width 10 ] <| text "onLeft"
44− ]
45− <|
46− text "Centre"
tests-rendering/cases/open/StackedScrollingColumnsHeight.elmdeleted−42
@@ -1,42 +0,0 @@
1−module StackedScrollingColumnsHeight exposing (..)
2−
3−{-|
4−
5−
6−# Column height can be set incorrectly for two stacked columns with scrollbarY
7−
8−<https://github.com/mdgriffith/elm-ui/issues/197>
9−
10−Both red and green columns should always have equal height.
11−
12−Currently, the height is set incorrectly if only one column has enough content to scroll.
13−
14−Both columns are correctly set to the same height only if neither has enough content
15−to scroll or if both have enough content to scroll.
16−
17−-}
18−
19−import Testable.Element exposing (..)
20−import Testable.Element.Background as Background
21−
22−
23−view =
24− layout [ height fill ] <|
25− column [ height fill ]
26− [ column
27− [ height fill
28− , scrollbarY
29− , Background.color (rgb 0 255 0)
30− ]
31− <|
32− List.map (\_ -> text "Hello") <|
33− List.range 1 20
34− , column
35− [ height fill
36− , scrollbarY
37− , Background.color (rgb 255 0 0)
38− ]
39− <|
40− List.map (\_ -> text "Hello") <|
41− List.range 1 3
42− ]
tests-rendering/cases/open/WeirdCentering.elmdeleted−35
@@ -1,35 +0,0 @@
1−module WeirdCentering exposing (view)
2−
3−import Testable.Element exposing (..)
4−import Testable.Element.Background as Background
5−
6−
7−view =
8− layout [] <|
9− column []
10− [ text "Example with centerX:"
11− , row
12− [ width fill ]
13− [ row
14− [ centerX
15− , Background.color <| rgb 0 1 0
16− ]
17− [ paragraph
18− [ width shrink
19− ]
20− [ text "Hello world" ]
21− , paragraph
22− [ width shrink
23− ]
24− [ text "Hello world" ]
25− ]
26− ]
27− , text "Example without centerX:"
28− , row
29− [ width fill ]
30− [ row [ Background.color <| rgb 0 1 0 ]
31− [ paragraph [ width shrink ] [ text "Hello world" ]
32− , paragraph [ width shrink ] [ text "Hello world" ]
33− ]
34− ]
35− ]
tests-rendering/cases/resolved/ClippedElInFixedWidthColumn.elmdeleted−31
@@ -1,31 +0,0 @@
1−module ClippedElInFixedWidthColumn exposing (..)
2−
3−{-| el [ clip ] inside a fixed-width column rendered with 0px height in Chrome & Firefox
4−
5−<https://github.com/mdgriffith/elm-ui/issues/191>
6−
7−If an el [ clip ] is placed inside a fixed-width column which is inside a layout
8−with [ width fill, height fill ], then the element is rendered with 0px height in Chrome:
9−
10−layout [ width fill, height fill ] <|
11−column [ width <| px 300 ][ el [ clip ] <| text "The quick brown fox" ]
12−
13−In Firefox, the element is initially rendered correctly, but is resized to 0px height
14−on viewport resize. In Safari, the element is displayed correctly.
15−
16−The above seems to be the minimal reproduction:
17−
18−Removing attributes from layout or from column or from el makes the issue disappear.
19−Replacing column [ width <| px 300 ] with column [ width fill ] makes the issue disappear.
20−Replacing column with el also makes the issue disappear.
21−Adding htmlAttribute <| Attr.style "flex-basis" "auto" to clipped el is a workaround.
22−
23−-}
24−
25−import Testable.Element exposing (..)
26−
27−
28−view =
29− layout [ width fill, height fill ] <|
30− column [ width <| px 300 ]
31− [ el [ clip ] <| text "The quick brown fox" ]
tests-rendering/cases/resolved/ElInFixedHeightColumn.elmdeleted−41
@@ -1,41 +0,0 @@
1−module ElInFixedHeightColumn exposing (view)
2−
3−{-| el inside a fixed height column is rendered with zero height in Safari
4−
5−<https://github.com/mdgriffith/elm-ui/issues/190>
6−
7−If I put an el into a column of fixed height, the el is rendered with zero height
8−in Safari:
9−
10− layout [] <|
11− column
12− [ width fill
13− , height <| px 200
14− ]
15− [ el [ Border.width 3, Border.color <| rgb255 0 0 0 ] <| text "an element" ]
16−
17−Adding htmlAttribute <| Attr.style "flex-basis" "auto" to the el is a workaround
18−that fixes the problem in this instance.
19−
20−Expected behavior
21−
22−Element should be rendered the same as in Firefox & Chrome, with the border going
23−around the text.
24−
25−-}
26−
27−import Testable.Element exposing (..)
28−import Testable.Element.Border as Border
29−
30−
31−view =
32− layout [] <|
33− column
34− [ width fill
35− , height <| px 200
36− ]
37− [ el
38− []
39− <|
40− text "an element"
41− ]
tests-rendering/cases/resolved/Images/ImageRegression.elmdeleted−63
@@ -1,63 +0,0 @@
1−module ImageRegression exposing (main)
2−
3−{-| <https://github.com/mdgriffith/elm-ui/issues/232>
4−-}
5−
6−import Browser
7−import Element exposing (Element, centerX, clipX, el, image, px, rgb255, row, shrink, width)
8−import Element.Background as Background
9−import Html exposing (Html, button, div, text)
10−import Html.Events exposing (onClick)
11−
12−
13−type alias Model =
14− Int
15−
16−
17−type Msg
18− = NoOp
19−
20−
21−update : Msg -> Model -> Model
22−update msg model =
23− model
24−
25−
26−view : Model -> Html Msg
27−view model =
28− Element.layout [] <|
29− row
30− [ centerX
31− , width shrink
32− , Background.color <| rgb255 255 255 255
33− ]
34− [ viewCard "qs" True
35− , viewCard "ah" False
36− ]
37−
38−
39−main : Program () Model Msg
40−main =
41− Browser.sandbox
42− { init = 0
43− , view = view
44− , update = update
45− }
46−
47−
48−viewCard : String -> Bool -> Element Msg
49−viewCard card bool =
50− let
51− source =
52− "https://hearts-bawolk.herokuapp.com/static/cards/" ++ card ++ ".png"
53−
54− overlapStyles =
55− if bool then
56− [ width (px 50)
57− , clipX
58− ]
59−
60− else
61− []
62− in
63− el overlapStyles (image [] { src = source, description = "" })
tests-rendering/cases/resolved/Images/ImageRegression2.elmdeleted−19
@@ -1,19 +0,0 @@
1−module ImageRegression2 exposing (main)
2−
3−{-| <https://github.com/mdgriffith/elm-ui/issues/228>
4−-}
5−
6−import Element exposing (..)
7−
8−
9−main =
10− Element.layout []
11− (Element.row [ width fill, height fill, explain Debug.todo ]
12− [ text "BEFORE"
13− , image []
14− { src = "https://placekitten.com/300/200"
15− , description = "kitten"
16− }
17− , text "AFTER"
18− ]
19− )
tests-rendering/cases/resolved/Images/ImageSizing.elmdeleted−24
@@ -1,24 +0,0 @@
1−module ImageSizing exposing (main)
2−
3−{-| <https://github.com/mdgriffith/elm-ui/issues/62>
4−-}
5−
6−import Element as E exposing (column, el, px, row, text)
7−import Element.Border as Border
8−import Element.Font as Font
9−import Html exposing (Html)
10−
11−
12−main : Html ()
13−main =
14− E.layout [ E.height E.fill, Border.width 5, E.explain Debug.todo ] <|
15− E.image
16− [ -- E.height (E.px 500)
17− -- ,
18− -- E.width E.fill
19− E.height E.fill
20− ]
21− -- <| px 500 ]
22− { src = "http://bburdette.github.io/music-reader.png"
23− , description = "music-reader screenshot"
24− }
tests-rendering/cases/resolved/Input/FocusLinks.elmdeleted−37
@@ -1,37 +0,0 @@
1−module FocusLinks exposing (main)
2−
3−import Element exposing (Color, Element, el, focused, layout, link, row, spacing, text)
4−import Element.Border as Border
5−import Element.Region as Region
6−import Html exposing (Html)
7−
8−
9−main : Html msg
10−main =
11− layout [] links
12−
13−
14−links : Element msg
15−links =
16− row [ spacing 10 ]
17− [ siteLink "Elm website" "https://elm-lang.org/"
18− , siteLink "Elm-ui" "https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/Element"
19− ]
20−
21−
22−siteLink : String -> String -> Element msg
23−siteLink label url =
24− link [ focused [ Border.glow blue 2 ] ]
25− { url = url
26− , label = text label
27− }
28−
29−
30−blue : Color
31−blue =
32− Element.fromRgb255
33− { red = 100
34− , green = 180
35− , blue = 250
36− , alpha = 1
37− }
tests-rendering/cases/resolved/Input/FocusStylePrecedingElements.elmdeleted−38
@@ -1,38 +0,0 @@
1−module FocusStylePrecedingElements exposing (main)
2−
3−{-|
4−
5−
6−# `focused` style applied to an element when any element with a lower tab index is focused
7−
8−<https://github.com/mdgriffith/elm-ui/issues/198>
9−
10−When I add a focused attribute, the styles therein are applied not only when
11−the element is focused, but also when any element with a lower tab index is focused.
12−This behaviour is not browser-specific.
13−
14−To reproduce, tab through to the buttons in the Ellie below. As soon as the first
15−button has focus, the third button (which is the only one with a focused attribute)
16−is highlighted as well.
17−
18−I narrowed down the reason for this behaviour to this CSS selector:
19−.s:focus ~ .fc-250-50-50-255-fs:not(.focus)
20−
21−Disabling it produces the correct focus behaviour.
22−
23−-}
24−
25−import Element exposing (..)
26−import Element.Font as Font
27−import Element.Input as Input
28−
29−
30−main =
31− layout [] <|
32− column []
33− [ Input.button [] { onPress = Nothing, label = text "Button" }
34− , Input.button [] { onPress = Nothing, label = text "Button" }
35− , Input.button [ focused [ Font.color <| rgb255 250 50 50 ] ] { onPress = Nothing, label = text "Button" }
36− , Input.button [] { onPress = Nothing, label = text "Button" }
37− , Input.button [] { onPress = Nothing, label = text "Button" }
38− ]
tests-rendering/cases/resolved/Input/InputAlignment.elmdeleted−44
@@ -1,44 +0,0 @@
1−module InputAlignment exposing (main)
2−
3−import Browser
4−import Element exposing (fill, padding, width)
5−import Element.Border as Border
6−import Element.Font as Font
7−import Element.Input as Input
8−import Html exposing (Html)
9−
10−
11−view : () -> Html ()
12−view () =
13− Element.layout [ Font.alignRight ] <|
14− Element.column [ padding 10 ]
15− [ Element.el [ Border.width 1, padding 5, width fill ] <| Element.text "Element.el"
16− , Input.text
17− [ Border.width 1
18− , padding 5
19− , width fill
20− , Border.rounded 0
21− , Font.color (Element.rgb 0 0.5 0.5)
22− ]
23− { onChange = always ()
24− , text = "Input.text"
25− , placeholder = Nothing
26− , label = Input.labelHidden "Input.text"
27− }
28− , Element.paragraph []
29− [ Element.text "Helooooo!" ]
30− , Element.row []
31− [ Element.text "one!"
32− , Element.text "two!"
33− , Element.text "three!"
34− ]
35− ]
36−
37−
38−main : Program () () ()
39−main =
40− Browser.sandbox
41− { init = ()
42− , view = view
43− , update = \_ _ -> ()
44− }
tests-rendering/cases/resolved/Input/LabelAlignBaseline.elmdeleted−34
@@ -1,34 +0,0 @@
1−module LabelAlignBaseline exposing (..)
2−
3−import Element exposing (Element, alignRight, centerY, el, fill, padding, rgb255, row, spacing, text, width)
4−import Element.Background as Background
5−import Element.Border as Border
6−import Element.Font as Font
7−import Element.Input as Input
8−
9−
10−type Msg
11− = Msg
12−
13−
14−main =
15− Element.layout [] <|
16− Element.column []
17− [ Element.row []
18− [ Element.text "dissociated label"
19− , Input.text []
20− { text = "input"
21− , label = Input.labelHidden "hidden"
22− , onChange = \_ -> Msg
23− , placeholder = Nothing
24− }
25− ]
26− , Element.row []
27− [ Input.text []
28− { text = "input"
29− , label = Input.labelLeft [] <| Element.text "associated label"
30− , onChange = \_ -> Msg
31− , placeholder = Nothing
32− }
33− ]
34− ]
tests-rendering/cases/resolved/Input/Placeholder.elmdeleted−59
@@ -1,59 +0,0 @@
1−module Placeholder exposing (main)
2−
3−import Element exposing (..)
4−import Element.Background as Background
5−import Element.Input as Input
6−import Element.Keyed as Keyed
7−import Html.Attributes exposing (style)
8−
9−
10−grey =
11− rgb 0.8 0.8 0.8
12−
13−
14−darkGrey =
15− rgb 0.7 0.7 0.7
16−
17−
18−type Msg
19− = NoMsg String
20−
21−
22−main =
23− Element.layout [ width fill, height fill ] <|
24− column
25− [ width fill
26− , inFront
27− (el
28− [ width fill
29− , Background.color grey
30− , padding 20
31− , below <|
32− el
33− [ height (px 300)
34− , width (px 300)
35− , Background.color darkGrey
36− , htmlAttribute <| style "z-index" "1"
37− , moveRight 50
38− , padding 50
39− , alpha 0.5
40− ]
41− (el [ alignBottom ] (text "I'm a dropdown menu."))
42− ]
43− (text "I'm a toolbar.")
44− )
45− ]
46− [ Input.text []
47− { onChange = NoMsg
48− , text = ""
49− , placeholder = Just (Input.placeholder [] (text "I'm a text input."))
50− , label = Input.labelAbove [] none
51− }
52− , Input.multiline []
53− { onChange = NoMsg
54− , text = ""
55− , placeholder = Just (Input.placeholder [] (text "I'm a multiline input."))
56− , label = Input.labelAbove [] none
57− , spellcheck = False
58− }
59− ]
tests-rendering/cases/resolved/Input/Slider.elmdeleted−74
@@ -1,74 +0,0 @@
1−module Slider exposing (main)
2−
3−import Browser
4−import Element as Element exposing (Element)
5−import Element.Background as Background
6−import Element.Input as Input
7−import Html exposing (Html, button, div, text)
8−import Html.Events exposing (onClick)
9−
10−
11−type alias Model =
12− { rangeValue : Float }
13−
14−
15−initialModel : Model
16−initialModel =
17− { rangeValue = 160.0 }
18−
19−
20−type Msg
21− = UpdateRange Float
22−
23−
24−update : Msg -> Model -> Model
25−update msg model =
26− case msg of
27− UpdateRange value ->
28− { model | rangeValue = value }
29−
30−
31−viewModal =
32− Element.el
33− [ Element.width Element.fill
34− , Element.height Element.fill
35− , Element.paddingEach { top = 100, left = 0, bottom = 0, right = 0 }
36− , Background.color <| Element.rgba 0 0 0 0.8
37− ]
38− (Element.el [] (Element.text "Hello Modal"))
39−
40−
41−view : Model -> Html Msg
42−view model =
43− Element.layout
44− [--Element.inFront viewModal
45− ]
46− <|
47− Input.slider
48− [ Element.width Element.fill
49− , Element.behindContent <|
50− Element.el
51− [ Element.width Element.fill
52− , Element.height (Element.px 2)
53− , Element.centerY
54− , Background.color (Element.rgb 0.5 0.5 0.5)
55− ]
56− Element.none
57− ]
58− { onChange = UpdateRange
59− , label = Input.labelHidden ""
60− , min = 60.0
61− , max = 280.0
62− , value = model.rangeValue
63− , thumb = Input.defaultThumb
64− , step = Just 1.0
65− }
66−
67−
68−main : Program () Model Msg
69−main =
70− Browser.sandbox
71− { init = initialModel
72− , view = view
73− , update = update
74− }
tests-rendering/cases/resolved/Layout/BreaksWithinParagraph.elmdeleted−17
@@ -1,17 +0,0 @@
1−module BreaksWithinParagraph exposing (main)
2−
3−import Browser
4−import Element exposing (..)
5−import Element.Background as Background
6−import Element.Border as Border
7−import Element.Font as Font
8−
9−
10−main =
11− layout [ width fill, height fill ] <|
12− paragraph [ Border.width 1, width (px 50) ]
13− [ row []
14− [ text "Thequick"
15− ]
16− , text "redfox"
17− ]
tests-rendering/cases/resolved/Layout/ColumnLayouts.elmdeleted−103
@@ -1,103 +0,0 @@
1−module ColumnLayouts exposing (main)
2−
3−{-| -}
4−
5−import Element exposing (..)
6−import Element.Background as Background
7−import Element.Border as Border
8−import Element.Font as Font
9−
10−
11−main =
12− layout [] <|
13− column [ spacing 48 ]
14− [ column
15− [ width fill
16− , height <| px 200
17− , spacing 24
18− , Border.width 1
19− , Border.color pink
20− ]
21− [ elem
22− , elem
23− , elem
24− ]
25− , column
26− [ width fill
27− , spacing 24
28− , Border.width 1
29− , Border.color pink
30− ]
31− [ elem
32− , elem
33− , elem
34− ]
35− , el [ height <| px 400 ] <|
36− column [ height fill ]
37− [ column
38− [ width fill
39− , height <| px 200
40− , spacing 24
41− , Border.width 1
42− , Border.color pink
43− ]
44− [ elem
45− , elem
46− , el [ alignBottom ] elem
47− ]
48− , el [ alignBottom ] elem
49− ]
50− , column
51− [ width fill
52− , height <| px 200
53− , spacing 24
54− , Border.width 1
55− , Border.color pink
56− ]
57− [ elem
58− , el [] box
59− , el [ alignBottom ] elem
60− ]
61− , column
62− [ width fill
63− , height <| px 200
64− , spacing 24
65− , Border.width 1
66− , Border.color pink
67− ]
68− [ elem
69− , el [] box
70− , filled
71− , el [ alignBottom ] elem
72− ]
73− ]
74−
75−
76−filled =
77− el
78− [ width fill
79− , height fill
80− , Background.color pink
81− ]
82− (text "an element")
83−
84−
85−elem =
86− el
87− [ Background.color pink
88− ]
89− (text "an element")
90−
91−
92−box =
93− el
94− [ width (px 50)
95− , height (px 50)
96− , Background.color (rgb (240 / 255) 0 (245 / 255))
97− , Font.color (rgb 1 1 1)
98− ]
99− none
100−
101−
102−pink =
103− rgb (240 / 255) 0 (245 / 255)
tests-rendering/cases/resolved/Layout/Columns/DistributeHeight.elmdeleted−46
@@ -1,46 +0,0 @@
1−module DistributeHeight exposing (main)
2−
3−import Browser
4−import Element exposing (column, el, fill, fillPortion, height, minimum, none, px, rgb, row, text, width)
5−import Element.Background as Bg
6−import Html as Html exposing (Html)
7−
8−
9−type alias Model =
10− ()
11−
12−
13−update : msg -> Model -> Model
14−update _ model =
15− model
16−
17−
18−view : model -> Html msg
19−view _ =
20− Element.layout [ height fill, width fill ] <|
21− column [ height fill, width fill ]
22− [ row
23− [ height
24− fill
25− , width fill
26− , Bg.color <| rgb 1 0 0
27− ]
28− [ el
29− [ height <| px 200
30− , width fill
31− , Bg.color <| rgb 1 0 1
32− ]
33− (text "Helloooo!")
34− ]
35− , row [ height fill, width fill, Bg.color <| rgb 0 1 0 ]
36− [ none ]
37− ]
38−
39−
40−main : Program () Model msg
41−main =
42− Browser.sandbox
43− { init = ()
44− , view = view
45− , update = update
46− }
tests-rendering/cases/resolved/Layout/Columns/DistributeHeightCorrectly2.elmdeleted−86
@@ -1,86 +0,0 @@
1−module Other exposing (main)
2−
3−import Browser
4−import Element exposing (..)
5−import Element.Border as Border
6−import Element.Events as Events
7−import Html exposing (Html)
8−import Html.Attributes
9−
10−
11−type alias Model =
12− { count : Int }
13−
14−
15−initialModel : Model
16−initialModel =
17− { count = 0 }
18−
19−
20−type Msg
21− = Increment
22− | Decrement
23−
24−
25−update : Msg -> Model -> Model
26−update msg model =
27− case msg of
28− Increment ->
29− { model | count = model.count + 1 }
30−
31− Decrement ->
32− { model | count = model.count - 1 }
33−
34−
35−view : Model -> Html Msg
36−view model =
37− viewElements model
38− |> layout []
39−
40−
41−viewElements : Model -> Element Msg
42−viewElements model =
43− el [ height fill ] <|
44− column [ height fill ]
45− [ el
46− [ height (fillPortion 1)
47− ]
48− <|
49− viewCounter model
50− , el
51− [ height (fillPortion 2)
52− ]
53− <|
54− viewCounters model
55− ]
56−
57−
58−flexBasisZero : Element.Attribute msg
59−flexBasisZero =
60− htmlAttribute (Html.Attributes.style "flex-basis" "0")
61−
62−
63−viewCounters : Model -> Element Msg
64−viewCounters model =
65− column [ height fill ]
66− (List.repeat model.count model
67− |> List.map viewCounter
68− )
69−
70−
71−viewCounter : Model -> Element Msg
72−viewCounter model =
73− column [ width fill, height fill, Border.width 1, Border.dotted ]
74− [ el [ Events.onClick Increment, Border.width 1, Border.rounded 3 ] <| text "+1"
75− , el [] <| text <| String.fromInt model.count
76− , el [ Events.onClick Decrement, Border.width 1, Border.rounded 3 ] <| text "-1"
77− ]
78−
79−
80−main : Program () Model Msg
81−main =
82− Browser.sandbox
83− { init = initialModel
84− , view = view
85− , update = update
86− }
tests-rendering/cases/resolved/Layout/Columns/DoNotCollapseBelow0.elmdeleted−48
@@ -1,48 +0,0 @@
1−module DoNotCollapseBelow0 exposing (main)
2−
3−{-|
4−
5−
6−# Safari bug for `el` heigh calculation in combination with `height fill`
7−
8−The problem appears to be that the height of the first el is 0, and therefore the second
9−text is rendered on the first.
10−
11−Versions
12−
13−OS: macOS Mojave 10.14.5
14−Browser: Safari
15−Browser Version: 12.1.1 (14607.2.6.1.1)
16−Elm Version: 0.19
17−Elm UI Version: 1.1.5
18−
19−<https://github.com/mdgriffith/elm-ui/issues/147>
20−
21−I was able to pinpoint the issue using git bisect to this fd08f1a commit, which lines up.
22−
23−<https://github.com/mdgriffith/elm-ui/commit/fd08f1a953484ba96f2d05037d4f208eab351514>
24−
25−-}
26−
27−import Browser
28−import Element exposing (column, el, fill, height, layout, scrollbarY, text)
29−import Html exposing (Html)
30−
31−
32−view : () -> Html ()
33−view () =
34− layout [ height fill ] <|
35− column
36− [ height fill ]
37− [ el [] <| text "Element that Safari gives height 0, if inside an el and not just text."
38− , text "Text below the el above"
39− ]
40−
41−
42−main : Program () () ()
43−main =
44− Browser.sandbox
45− { init = ()
46− , view = view
47− , update = \() () -> ()
48− }
tests-rendering/cases/resolved/Layout/Columns/SafariTwo.elmdeleted−40
@@ -1,40 +0,0 @@
1−module SafariTwo exposing (main)
2−
3−{-| el inside a fixed height column is rendered with zero height in Safari
4−
5−<https://github.com/mdgriffith/elm-ui/issues/190>
6−
7−If I put an el into a column of fixed height, the el is rendered with zero height
8−in Safari:
9−
10− layout [] <|
11− column
12− [ width fill
13− , height <| px 200
14− ]
15− [ el [ Border.width 3, Border.color <| rgb255 0 0 0 ] <| text "an element" ]
16−
17−Adding htmlAttribute <| Attr.style "flex-basis" "auto" to the el is a workaround
18−that fixes the problem in this instance.
19−
20−Expected behavior
21−
22−Element should be rendered the same as in Firefox & Chrome, with the border going
23−around the text.
24−
25−-}
26−
27−import Element exposing (..)
28−
29−
30−main =
31− layout [] <|
32− column
33− [ width fill
34− , height <| px 200
35− ]
36− [ el
37− []
38− <|
39− text "an element"
40− ]
tests-rendering/cases/resolved/Layout/NestedParagraphs.elmdeleted−165
@@ -1,165 +0,0 @@
1−module Layout.NestedParagraphs exposing (view)
2−
3−{-| Paragraph with children more than one level deep breaks flow
4−
5−<https://github.com/mdgriffith/elm-ui/issues/173>
6−
7−First of all, thanks for such a pleasant library to use! It's been awesome not having to use CSS.
8−
9−The problem I ran into is that paragraph only seems correctly flow text in children a single level deep. As an example, I made an Ellie demonstrating this with an el within a link within a paragraph:
10−
11−<https://ellie-app.com/7JcgLRNprF7a1>
12−
13−This might be a regression, as the resolved #50 and #103 seem to refer to the same problem.
14−
15−Expected behavior
16−Text should flow with no breaks in the paragraph.
17−
18−Versions
19−
20− OS: macOS
21− Browser: Firefox
22− Browser Version: 71.0
23− Elm Version: 0.19.1
24− Elm UI Version: 1.1.5
25−
26−-}
27−
28−import Testable.Element as Element exposing (..)
29−import Testable.Element.Font as Font
30−import Testable.Generator
31−
32−
33−view =
34− layout [] <|
35− column [ spacing 48 ]
36− [ paragraph []
37− [ text "This is a paragraph with a "
38− , el [ Font.bold ] <| text "child"
39− , text " of depth one."
40− ]
41− , paragraph []
42− [ text "This is a paragraph with a "
43− , link []
44− { label =
45− el [ Font.bold ]
46− (text Testable.Generator.lorem)
47− , url = "http://example.com"
48− }
49− , text " of depth two."
50− ]
51− , el [ Font.size 32 ] (text "Many nested els")
52− , paragraph []
53− [ text "This is a paragraph with a "
54− , link []
55− { label =
56− el [ Font.bold ]
57− (text Testable.Generator.lorem)
58− , url = "http://example.com"
59− }
60− , text " of depth two."
61− , el [] (el [] (el [] (text Testable.Generator.lorem)))
62− , el [] (el [] (el [] (el [] (text Testable.Generator.lorem))))
63− ]
64− , el [ Font.size 32 ] (text "NestedParas in els")
65− , paragraph []
66− [ text "This is a paragraph with a "
67− , link []
68− { label =
69− el [ Font.bold ]
70− (text Testable.Generator.lorem)
71− , url = "http://example.com"
72− }
73− , text " of depth two."
74− , el [] (el [] (el [] (text Testable.Generator.lorem)))
75− , el []
76− (paragraph []
77− [ el []
78− (el [] (text Testable.Generator.lorem))
79− ]
80− )
81− ]
82− , el [ Font.size 32 ] (text "Nested with link")
83− , paragraph []
84− [ text "This is a paragraph with a "
85− , link []
86− { label =
87− el [ Font.bold ] <|
88− text "child"
89− , url = "http://example.com"
90− }
91− , text " of depth two."
92− ]
93− , el [ Font.size 32 ] (text "Para with boxes")
94− , paragraph []
95− [ text Testable.Generator.short
96− , Testable.Generator.box
97− , text Testable.Generator.short
98−
99− -- , text Testable.Generator.lorem
100− , Testable.Generator.box
101− ]
102− , el [ Font.size 32 ] (text "Row with boxes")
103− , paragraph []
104− [ text Testable.Generator.short
105− , row [ spacing 25 ]
106− [ Testable.Generator.box
107− , text Testable.Generator.short
108− , Testable.Generator.box
109−
110− -- , text Testable.Generator.lorem
111− ]
112− , text Testable.Generator.short
113−
114− -- , text Testable.Generator.lorem
115− , Testable.Generator.box
116− , paragraph []
117− [ text "This is a paragraph with a "
118− , el [ Font.bold ] <| text "child"
119− , text " of depth one."
120− ]
121− ]
122− , el [ Font.size 32 ] (text "Row with boxes and lots of content")
123− , paragraph []
124− [ column [ alignLeft ]
125− [ Testable.Generator.box, Testable.Generator.box, Testable.Generator.box ]
126− , text Testable.Generator.short
127− , row [ spacing 25 ]
128− [ Testable.Generator.box
129− , text Testable.Generator.lorem
130− , Testable.Generator.box
131−
132− -- , text Testable.Generator.lorem
133− ]
134− , text Testable.Generator.short
135−
136− -- , text Testable.Generator.lorem
137− , Testable.Generator.box
138− , paragraph []
139− [ text "This is a paragraph with a "
140− , el [ Font.bold ] <| text "child"
141− , text " of depth one."
142− ]
143− ]
144− , el [ Font.size 32 ] (text "Row with boxes")
145− , paragraph []
146− [ text Testable.Generator.short
147− , row []
148− [ Testable.Generator.box
149−
150− -- , text Testable.Generator.lorem
151− , Testable.Generator.box
152−
153− -- , text Testable.Generator.lorem
154− ]
155− , text Testable.Generator.short
156−
157− -- , text Testable.Generator.lorem
158− , Testable.Generator.box
159− , paragraph []
160− [ text "This is a paragraph with a "
161− , el [ Font.bold ] <| text "child"
162− , text " of depth one."
163− ]
164− ]
165− ]
tests-rendering/cases/resolved/Layout/Rounded.elmdeleted−54
@@ -1,54 +0,0 @@
1−module Rounded exposing (main)
2−
3−import Element exposing (..)
4−import Element.Background as Background
5−import Html exposing (Html)
6−
7−
8−sizePadding =
9− 10
10−
11−
12−sizeSpacing =
13− 11
14−
15−
16−nbElement =
17− 10
18−
19−
20−sizeElement =
21− 50
22−
23−
24−totalSizeElement =
25− nbElement * sizeElement
26−
27−
28−totalSpacing =
29− (nbElement - 1) * sizeSpacing
30−
31−
32−totalPadding =
33− 2 * sizePadding
34−
35−
36−sizeRow =
37− totalSizeElement + totalSpacing + totalPadding
38−
39−
40−main : Html msg
41−main =
42− layout [ width fill, height fill ] <|
43− -- The row should have 4.5px of padding to get
44− -- from the 5.5px of margin of the elements on the edge
45− -- up to 10px of padding specified on the wrappedRow.
46− -- Instead the row has 5px of padding.
47− wrappedRow [ width (px sizeRow), padding sizePadding, spacing sizeSpacing, Background.color (rgb 0 0 1) ]
48− <|
49− List.repeat nbElement <|
50− -- Each element has a margin of 5.5px (11px of spacing / 2)
51− el [ width (px sizeElement), height (px sizeElement), Background.color (rgb 1 0 0) ]
52− <|
53− el [ centerX, centerY ] <|
54− text "card"
tests-rendering/cases/resolved/Layout/SafariBugIssue147.elmdeleted−37
@@ -1,37 +0,0 @@
1−module Layout.SafariBugIssue147 exposing (view)
2−
3−{-|
4−
5−
6−# Safari bug for `el` heigh calculation in combination with `height fill`
7−
8−The problem appears to be that the height of the first el is 0, and therefore the second
9−text is rendered on the first.
10−
11−Versions
12−
13−OS: macOS Mojave 10.14.5
14−Browser: Safari
15−Browser Version: 12.1.1 (14607.2.6.1.1)
16−Elm Version: 0.19
17−Elm UI Version: 1.1.5
18−
19−<https://github.com/mdgriffith/elm-ui/issues/147>
20−
21−I was able to pinpoint the issue using git bisect to this fd08f1a commit, which lines up.
22−
23−<https://github.com/mdgriffith/elm-ui/commit/fd08f1a953484ba96f2d05037d4f208eab351514>
24−
25−-}
26−
27−import Testable.Element exposing (..)
28−
29−
30−view =
31− layout [ height fill ] <|
32− el [ height fill ] <|
33− column
34− [ height fill ]
35− [ el [] <| text "Element that Safari gives height 0, if inside an el and not just text."
36− , text "Text below the el above"
37− ]
tests-rendering/cases/resolved/Layout/WrapRow.elmdeleted−13
@@ -1,13 +0,0 @@
1−module WrapRow exposing (main)
2−
3−import Browser
4−import Element exposing (..)
5−
6−
7−main =
8− layout [] <|
9− wrappedRow
10− [ padding 10
11− , spacingXY 6 5
12− ]
13− [ text "Higher by 1 px" ]
tests-rendering/cases/resolved/Misc/Scroll.elmdeleted−48
@@ -1,48 +0,0 @@
1−module Scroll exposing (main)
2−
3−import Browser
4−import Element exposing (Element, alignTop, centerX, centerY, column, el, fill, fillPortion, height, inFront, layoutWith, none, padding, px, row, scrollbarY, spacing, text, width, wrappedRow)
5−import Element.Background as Background
6−import Element.Font as Font
7−import Element.Input as Input exposing (button)
8−import Html exposing (Html)
9−import Html.Attributes
10−
11−
12−type alias Model =
13− ()
14−
15−
16−type alias Msg =
17− ()
18−
19−
20−field i =
21− text <| "Scrolling text " ++ String.fromInt i
22−
23−
24−view : Model -> Html Msg
25−view model =
26− layoutWith { options = [] } [ height fill ] <|
27− row
28− [ height fill ]
29− [ column
30− [ height fill
31− , scrollbarY
32−
33− -- The width fill is required, when using scrollbarY above
34− -- else the width is set to 0.
35− --, width fill
36− ]
37− (List.map field (List.range 1 100))
38− , text "Non scrolling text"
39− ]
40−
41−
42−main : Program () Model Msg
43−main =
44− Browser.sandbox
45− { init = ()
46− , view = view
47− , update = \msg model -> model
48− }
tests-rendering/cases/resolved/Nearby/InFrontIssue.elmdeleted−64
@@ -1,64 +0,0 @@
1−module Nearby.InFrontIssue exposing (view)
2−
3−import Browser
4−import Element as Ui exposing (..)
5−import Element.Background as Background
6−import Element.Font as Font
7−import Html exposing (Html)
8−
9−
10−view : Html Msg
11−view =
12− let
13− a =
14− el
15− [ width fill
16− , height <| px 30
17− , Background.color <| rgb 0 1 0
18− ]
19− <|
20− text "A"
21−
22− b =
23− column
24− [ width fill
25− , height <| px 5000
26− , Background.color <| rgb 1 0 1
27− , spacing 60
28− ]
29− [ text "B"
30− , c
31− ]
32−
33− c =
34− el
35− [ width <| px 100
36− , height <| px 100
37− , Background.color <| rgb 0 0 0
38− , Font.color <| rgb 1 1 1
39− , paddingXY 0 30
40− , centerX
41− , above d
42− , below d
43− , onLeft d
44− , onRight d
45− ]
46− <|
47− text "C"
48−
49− d =
50− el
51− [ width <| px 100
52− , height <| px 100
53− , centerX
54− , Background.color <| rgb 1 1 1
55− , Font.color <| rgb 0 0 0
56− ]
57− <|
58− text "D"
59− in
60− layout
61− [ inFront a
62− , paddingXY 0 30
63− ]
64− b
tests-rendering/cases/resolved/Nearby/Issue22ZIndex.elmdeleted−87
@@ -1,87 +0,0 @@
1−module Nearby.Issue22ZIndex exposing (main)
2−
3−import Browser
4−import Element as Ui exposing (..)
5−import Element.Background as Background
6−import Element.Font as Font
7−import Html exposing (Html)
8−
9−
10−type alias Model =
11− {}
12−
13−
14−initialModel : Model
15−initialModel =
16− {}
17−
18−
19−type Msg
20− = NoOp
21−
22−
23−update : Msg -> Model -> Model
24−update msg model =
25− model
26−
27−
28−view : Model -> Html Msg
29−view model =
30− let
31− a =
32− el
33− [ width fill
34− , height <| px 30
35− , Background.color <| rgb 0 1 0
36− ]
37− <|
38− text "A"
39−
40− b =
41− column
42− [ width fill
43− , height <| px 5000
44− , Background.color <| rgb 1 0 1
45− , spacing 60
46− ]
47− [ text "B"
48− , c
49− ]
50−
51− c =
52− el
53− [ width fill
54− , height <| px 100
55− , Background.color <| rgb 0 0 0
56− , Font.color <| rgb 1 1 1
57− , paddingXY 0 30
58− , inFront d
59− ]
60− <|
61− text "C"
62−
63− d =
64− el
65− [ width <| px 100
66− , height <| px 100
67− , centerX
68− , Background.color <| rgb 1 1 1
69− , Font.color <| rgb 0 0 0
70− ]
71− <|
72− text "D"
73− in
74− layout
75− [ inFront a
76− , paddingXY 0 30
77− ]
78− b
79−
80−
81−main : Program () Model Msg
82−main =
83− Browser.sandbox
84− { init = initialModel
85− , view = view
86− , update = update
87− }
tests-rendering/cases/resolved/Nearby/OtherInFrontIssue.elmdeleted−55
@@ -1,55 +0,0 @@
1−module Nearby.OtherInFrontIssue exposing (main)
2−
3−import Browser
4−import Element exposing (Element)
5−import Element.Background as Background
6−import Html exposing (Html, button, div, text)
7−import Html.Attributes
8−import Html.Events exposing (onClick)
9−
10−
11−
12−-- helping hack
13−
14−
15−translateLeft : Element.Attribute msg
16−translateLeft =
17− Html.Attributes.style "transform" "translate(-100%)"
18− |> Element.htmlAttribute
19−
20−
21−main =
22− Element.layout
23− [ Element.inFront <|
24− Element.el
25− [ Element.alignLeft
26− , Background.color <| Element.rgb 1 0.5 0.5
27− , Element.height Element.fill
28− ]
29− <|
30− Element.text "Side Menu .........."
31− ]
32− contentPane
33−
34−
35−contentPane =
36− Element.column
37− [ Element.width Element.fill
38− , Element.height Element.fill
39− , Background.color <| Element.rgb 1 0 0
40− ]
41− [ Element.el
42− [ Element.centerX
43− , Element.centerY
44− , Element.onLeft <| Element.text " [ onLeft. onLeft onLeft onLeft onLeft onLeft onLeft ] "
45− ]
46− (Element.text " [ Content: This will remain behind the Side Menu. ]")
47− , Element.el
48− [ Element.centerX
49− , Element.centerY
50− , Element.behindContent <|
51− Element.el [ translateLeft ] <|
52− Element.text " [ behindContent + translateLeft. behindContent + translateLeft ] "
53− ]
54− (Element.text " [ Content: This will remain behind the Side Menu. ]")
55− ]
tests-rendering/cases/resolved/Nearby/ZIndexRegression.elmdeleted−43
@@ -1,43 +0,0 @@
1−module Nearby.ZIndexRegression exposing (main)
2−
3−import Element exposing (..)
4−import Element.Background as Background
5−import Html exposing (Html)
6−
7−
8−main : Html msg
9−main =
10− layout [] <|
11− column [ width fill, height fill ]
12− [ el
13− [ width fill
14− , height (px 100)
15− , Background.color (rgb 0 0 1)
16− , inFront menu
17− ]
18− none
19− , el
20− [ width fill
21− , height fill
22− , inFront menu
23− ]
24− none
25− ]
26−
27−
28−menu : Element msg
29−menu =
30− el
31− [ transparent True
32− , mouseOver [ transparent False ]
33− , width fill
34− , height fill
35− , below <|
36− el
37− [ width fill
38− , height (px 500)
39− , Background.color (rgb 1 0 0)
40− ]
41− none
42− ]
43− none
tests-rendering/elm.jsondeleted−25
@@ -1,25 +0,0 @@
1−{
2− "type": "application",
3− "source-directories": ["src", "../src", "cases/open", "cases/resolved"],
4− "elm-version": "0.19.1",
5− "dependencies": {
6− "direct": {
7− "elm/browser": "1.0.2",
8− "elm/core": "1.0.0",
9− "elm/html": "1.0.0",
10− "elm/json": "1.0.0",
11− "elm/parser": "1.1.0",
12− "elm/random": "1.0.0",
13− "elm/time": "1.0.0",
14− "elm/virtual-dom": "1.0.2",
15− "elm-explorations/test": "1.1.0"
16− },
17− "indirect": {
18− "elm/url": "1.0.0"
19− }
20− },
21− "test-dependencies": {
22− "direct": {},
23− "indirect": {}
24− }
25−}
tests-rendering/src/Testable/Element.elmdeleted−1723
@@ -1,1723 +0,0 @@
1−module Testable.Element exposing
2− ( Length(..)
3− , above
4− , alignBottom
5− , alignLeft
6− , alignRight
7− , alignTop
8− , alpha
9− , behindContent
10− , below
11− , centerX
12− , centerY
13− , clip
14− , column
15− , el
16− , expectRoundedEquality
17− , fill
18− , fillPortion
19− , height
20− , inFront
21− , isVisible
22− , label
23− , layout
24− , link
25− , maximum
26− , minimum
27− , moveDown
28− , moveLeft
29− , moveRight
30− , moveUp
31− , none
32− , onLeft
33− , onRight
34− , padding
35− , paddingXY
36− , paragraph
37− , px
38− , rgb
39− , rgba
40− , row
41− , scrollbarX
42− , scrollbarY
43− , scrollbars
44− , shrink
45− , spacing
46− , text
47− , textColumn
48− , toProgram
49− , transparent
50− , width
51− )
52−
53−{-| This module should mirror the top level `Element` api, with one important distinction.
54−
55−The resulting `Element msg` structure can either be rendered to Html or transformed into a test suite that can be run.
56−
57−In order to run the test:
58−
59− - render html
60− - gather information from the browser
61− - generate tests
62−
63−-}
64−
65−import Dict
66−import Element
67−import Html.Attributes
68−import Testable
69−import Testable.Runner
70−
71−
72−{-| This is used when we want to run all tests in a test suite instead of one at a time.
73−-}
74−toProgram : Testable.Runner.Testable -> Testable.Runner.TestableProgram
75−toProgram testable =
76− Testable.Runner.program [ testable ]
77−
78−
79−layout : List (Testable.Attr msg) -> Testable.Element Testable.Runner.Msg -> Testable.Runner.Testable
80−layout attrs elem =
81− Testable.Runner.testable "Test" elem
82−
83−
84−text : String -> Testable.Element msg
85−text =
86− Testable.Text
87−
88−
89−el : List (Testable.Attr msg) -> Testable.Element msg -> Testable.Element msg
90−el attrs =
91− Testable.El (implicitWidthHeightShrink attrs)
92−
93−
94−row : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
95−row attrs =
96− Testable.Row (implicitWidthHeightShrink attrs)
97−
98−
99−column : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
100−column attrs =
101− Testable.Column (implicitWidthHeightShrink attrs)
102−
103−
104−none : Testable.Element msg
105−none =
106− Testable.Empty
107−
108−
109−paragraph : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
110−paragraph attrs =
111− let
112− withImplicits =
113− implicitTest (widthHelper Nothing Nothing (Fill 1))
114− :: implicitTest (heightHelper Nothing Nothing Shrink)
115− :: attrs
116− in
117− Testable.Paragraph (skipOverridden withImplicits)
118−
119−
120−textColumn : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
121−textColumn attrs =
122− let
123− withImplicits =
124− implicitTest (widthHelper (Just 500) (Just 750) (Fill 1))
125− :: implicitTest (heightHelper Nothing Nothing Shrink)
126− :: attrs
127− in
128− Testable.TextColumn (skipOverridden withImplicits)
129−
130−
131−link :
132− List (Testable.Attr msg)
133− ->
134− { url : String
135− , label : Testable.Element msg
136− }
137− -> Testable.Element msg
138−link attrs details =
139− Testable.Link details.url
140− (implicitWidthHeightShrink attrs)
141− details.label
142−
143−
144−clip =
145− Testable.Attr Element.clip
146−
147−
148−{-| -}
149−scrollbars : Testable.Attr msg
150−scrollbars =
151− Testable.Attr Element.scrollbars
152−
153−
154−{-| -}
155−scrollbarY : Testable.Attr msg
156−scrollbarY =
157− Testable.Attr Element.scrollbarY
158−
159−
160−{-| -}
161−scrollbarX : Testable.Attr msg
162−scrollbarX =
163− Testable.Attr Element.scrollbarX
164−
165−
166−{-| Old labeling mechanism that i removed to hastily
167−-}
168−label str =
169− Testable.Batch []
170−
171−
172−moveUp x =
173− Testable.Attr (Element.moveUp x)
174−
175−
176−moveDown x =
177− Testable.Attr (Element.moveDown x)
178−
179−
180−moveRight x =
181− Testable.Attr (Element.moveRight x)
182−
183−
184−moveLeft x =
185− Testable.Attr (Element.moveLeft x)
186−
187−
188−type Length
189− = Px Int
190− | Fill Int
191− | Shrink
192− | Minimum Int Length
193− | Maximum Int Length
194−
195−
196−minimum =
197− Minimum
198−
199−
200−maximum =
201− Maximum
202−
203−
204−rgb =
205− Element.rgb
206−
207−
208−rgba =
209− Element.rgba
210−
211−
212−px : Int -> Length
213−px =
214− Px
215−
216−
217−fill : Length
218−fill =
219− Fill 1
220−
221−
222−shrink : Length
223−shrink =
224− Shrink
225−
226−
227−fillPortion : Int -> Length
228−fillPortion =
229− Fill
230−
231−
232−transparent : Bool -> Testable.Attr msg
233−transparent on =
234− Testable.LabeledTest
235− { label =
236− if on then
237− "transparent"
238−
239− else
240− "opaque"
241− , attr = Element.transparent on
242− , id = Testable.NoId
243− , test =
244− \context ->
245− let
246− selfTransparency =
247− context.self.style
248− |> Dict.get "opacity"
249− |> Maybe.withDefault "notfound"
250−
251− value =
252− if on then
253− "0"
254−
255− else
256− "1"
257− in
258− [ Testable.equal value selfTransparency ]
259− }
260−
261−
262−{-| -}
263−isVisible : Testable.Attr msg
264−isVisible =
265− Testable.AttrTest
266− { label = "is-visible"
267− , id = Testable.NoId
268− , test =
269− \context ->
270− [ Testable.equal context.self.isVisible True ]
271− }
272−
273−
274−{-| -}
275−alpha : Float -> Testable.Attr msg
276−alpha a =
277− Testable.LabeledTest
278− { label = "alpha-" ++ String.fromFloat a
279− , attr = Element.alpha a
280− , id = Testable.NoId
281− , test =
282− \context ->
283− let
284− selfTransparency =
285− context.self.style
286− |> Dict.get "opacity"
287− |> Maybe.withDefault "notfound"
288− in
289− [ Testable.equal (String.fromFloat a) selfTransparency ]
290− }
291−
292−
293−{-| -}
294−padding : Int -> Testable.Attr msg
295−padding pad =
296− Testable.LabeledTest
297− { label = "padding " ++ String.fromInt pad
298− , attr = Element.padding pad
299− , id = Testable.NoId
300− , test =
301− \found ->
302− [ Testable.true ("Padding " ++ String.fromInt pad ++ " is present")
303− (List.all ((==) pad)
304− [ floor found.self.bbox.padding.left
305− , floor found.self.bbox.padding.right
306− , floor found.self.bbox.padding.top
307− , floor found.self.bbox.padding.bottom
308− ]
309− )
310− ]
311− }
312−
313−
314−{-| -}
315−paddingXY : Int -> Int -> Testable.Attr msg
316−paddingXY x y =
317− Testable.LabeledTest
318− { label = "paddingXY " ++ String.fromInt x ++ ", " ++ String.fromInt y
319− , attr = Element.paddingXY x y
320− , id = Testable.NoId
321− , test =
322− \found ->
323− [ Testable.true ("PaddingXY (" ++ String.fromInt x ++ ", " ++ String.fromInt y ++ ") is present")
324− (List.all ((==) x)
325− [ floor found.self.bbox.padding.left
326− , floor found.self.bbox.padding.right
327− ]
328− && List.all ((==) y)
329− [ floor found.self.bbox.padding.top
330− , floor found.self.bbox.padding.bottom
331− ]
332− )
333− ]
334− }
335−
336−
337−listIf ls =
338− List.filter Tuple.first ls
339− |> List.map Tuple.second
340−
341−
342−widthHelper maybeMin maybeMax len =
343− let
344− addMin l =
345− case maybeMin of
346− Nothing ->
347− l
348−
349− Just minPx ->
350− l |> Element.minimum minPx
351−
352− addMax l =
353− case maybeMax of
354− Nothing ->
355− l
356−
357− Just maxPx ->
358− l |> Element.maximum maxPx
359−
360− minLabel =
361− case maybeMin of
362− Nothing ->
363− ""
364−
365− Just i ->
366− " min:" ++ String.fromInt i
367−
368− maxLabel =
369− case maybeMax of
370− Nothing ->
371− ""
372−
373− Just i ->
374− " max:" ++ String.fromInt i
375−
376− minMaxTest actualWidth =
377− case ( maybeMin, maybeMax ) of
378− ( Nothing, Nothing ) ->
379− True
380−
381− ( Just lower, Nothing ) ->
382− lower <= actualWidth
383−
384− ( Just lower, Just higher ) ->
385− lower <= actualWidth && actualWidth <= higher
386−
387− ( Nothing, Just higher ) ->
388− actualWidth <= higher
389− in
390− case len of
391− Minimum m newLen ->
392− widthHelper (Just m) maybeMax newLen
393−
394− Maximum m newLen ->
395− widthHelper maybeMin (Just m) newLen
396−
397− Px val ->
398− -- Pixel values should ignore min and max?
399− Testable.LabeledTest
400− { label = "width " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
401− , id = Testable.IsWidth
402− , attr =
403− Element.width
404− (Element.px val
405− |> addMin
406− |> addMax
407− )
408− , test =
409− \found ->
410− [ expectRoundedEquality
411− { expected = toFloat val
412− , found = found.self.bbox.width
413− }
414− , Testable.true "min/max is upheld" (minMaxTest (floor found.self.bbox.width))
415− ]
416− }
417−
418− Fill portion ->
419− Testable.LabeledTest
420− { label =
421− if portion == 1 then
422− "width fill" ++ minLabel ++ maxLabel
423−
424− else
425− "width fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
426− , id = Testable.IsWidth
427− , attr =
428− Element.width
429− (Element.fillPortion portion
430− |> addMin
431− |> addMax
432− )
433− , test =
434− \context ->
435− if List.member context.parentLayout [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
436− [ Testable.true "width fill doesn't apply to onright/onleft elements" True ]
437−
438− else
439− let
440− parentAvailableWidth =
441− context.parent.bbox.width - (context.self.bbox.padding.left + context.self.bbox.padding.right)
442− in
443− List.concat
444− [ case context.parentLayout of
445− Testable.IsNearby _ ->
446− [ Testable.true "Nearby Element has fill width"
447− ((floor context.parent.bbox.width == floor context.self.bbox.width)
448− || minMaxTest (floor context.self.bbox.width)
449− )
450− ]
451−
452− Testable.InColumn ->
453− [ Testable.true "Element within column has fill width"
454− ((floor parentAvailableWidth == floor context.self.bbox.width)
455− || minMaxTest (floor context.self.bbox.width)
456− )
457− ]
458−
459− Testable.InEl ->
460− [ Testable.true "Element within element has fill width" <|
461− (floor parentAvailableWidth == floor context.self.bbox.width)
462− || minMaxTest (floor context.self.bbox.width)
463− ]
464−
465− _ ->
466− let
467− spacePerPortion =
468− parentAvailableWidth / toFloat (List.length context.siblings + 1)
469− in
470− [ Testable.true "element has fill width" <|
471− (floor spacePerPortion == floor context.self.bbox.width)
472− || minMaxTest (floor context.self.bbox.width)
473− ]
474− , [ Testable.lessThanOrEqual "not larger than parent"
475− context.self.bbox.width
476− context.parent.bbox.width
477− ]
478− , case context.selfElement of
479− Testable.Paragraph _ _ ->
480− -- A paragraph with width fill
481− -- we want to test for correct text wrapping here.
482− --
483− let
484− childWidth child =
485− child.bbox.width
486−
487− totalChildren =
488− context.children
489− |> List.map childWidth
490− |> List.append (List.map .width context.self.textMetrics)
491− |> List.sum
492−
493− horizontalPadding =
494− context.self.bbox.padding.left + context.self.bbox.padding.right
495−
496− totalCalculatedWidth =
497− totalChildren + horizontalPadding
498−
499− expectedLines =
500− if boxChildrenHeight > 20 then
501− ceiling (boxChildrenHeight / 20)
502−
503− else
504− ceiling (totalCalculatedWidth / context.self.bbox.width)
505−
506− boxChildrenHeight =
507− context.children
508− |> List.map
509− (\c ->
510− c.bbox.height
511− )
512− |> List.sum
513− in
514− [ Testable.true "text wrapping, checking height"
515− -- all we're doing here is testing if wrapping is occurring
516− -- not the exact height, which is a little tricky to calculate perfectly without more information.
517− (if expectedLines > 1 then
518− context.self.bbox.height >= (20 * 2)
519−
520− else
521− -- then it's less than 2 ~ line heights
522− -- there's some weird variance here which makes it hard to be exact.
523− context.self.bbox.height < (20 * 2)
524− )
525− ]
526−
527− _ ->
528− []
529− ]
530− }
531−
532− Shrink ->
533− Testable.LabeledTest
534− { label = "width shrink" ++ minLabel ++ maxLabel
535− , attr =
536− Element.width
537− (Element.shrink
538− |> addMin
539− |> addMax
540− )
541− , id = Testable.IsWidth
542− , test =
543− \context ->
544− case context.selfElement of
545− Testable.El _ _ ->
546− let
547− childWidth child =
548− child.bbox.width
549−
550− totalChildren =
551− context.children
552− |> List.map childWidth
553− |> List.append (List.map .width context.self.textMetrics)
554− |> List.sum
555−
556− horizontalPadding =
557− context.self.bbox.padding.left + context.self.bbox.padding.right
558− in
559− listIf
560− [ ( (context.parentLayout /= Testable.InParagraph)
561− && (context.parentLayout /= Testable.InTextCol)
562− , Testable.rounded "equals children"
563− { expected = totalChildren + horizontalPadding
564− , found = context.self.bbox.width
565− }
566− )
567− , ( context.parentLayout /= Testable.AtRoot
568− , Testable.lessThanOrEqual "not larger than parent"
569− context.self.bbox.width
570− context.parent.bbox.width
571− )
572− ]
573−
574− Testable.Link _ _ _ ->
575− let
576− childWidth child =
577− child.bbox.width
578−
579− totalChildren =
580− context.children
581− |> List.map childWidth
582− |> List.append (List.map .width context.self.textMetrics)
583− |> List.sum
584−
585− horizontalPadding =
586− context.self.bbox.padding.left + context.self.bbox.padding.right
587− in
588− listIf
589− [ ( (context.parentLayout /= Testable.InParagraph)
590− && (context.parentLayout /= Testable.InTextCol)
591− , Testable.rounded "equals children"
592− { expected = totalChildren + horizontalPadding
593− , found = context.self.bbox.width
594− }
595− )
596− , ( context.parentLayout /= Testable.AtRoot
597− , Testable.lessThanOrEqual "not larger than parent"
598− context.self.bbox.width
599− context.parent.bbox.width
600− )
601− ]
602−
603− Testable.Row rowAttrs _ ->
604− -- width of row is the sum of all children widths
605− -- both text elements and others.
606− let
607− childWidth child =
608− child.bbox.width
609−
610− totalChildren =
611− context.children
612− |> List.map childWidth
613− |> List.append (List.map .width context.self.textMetrics)
614− |> List.sum
615−
616− horizontalPadding =
617− context.self.bbox.padding.left + context.self.bbox.padding.right
618−
619− spacingAmount =
620− Testable.getSpacingFromAttributes rowAttrs
621−
622− totalSpacing =
623− toFloat spacingAmount * (toFloat (List.length context.children) - 1)
624− in
625− listIf
626− [ ( True
627− , expectRoundedEquality
628− { expected = totalChildren + horizontalPadding + totalSpacing
629− , found = context.self.bbox.width
630− }
631− )
632− , ( context.parentLayout /= Testable.AtRoot
633− , Testable.lessThanOrEqual "not larger than parent"
634− context.self.bbox.width
635− context.parent.bbox.width
636− )
637− ]
638−
639− Testable.Column _ _ ->
640− -- The width of the column is the width of the widest child.
641− let
642− childWidth child =
643− child.bbox.width
644− + context.self.bbox.padding.left
645− + context.self.bbox.padding.right
646−
647− textChildren =
648− List.map
649− (\txt ->
650− txt.width
651− + context.self.bbox.padding.left
652− + context.self.bbox.padding.right
653− )
654− context.self.textMetrics
655−
656− allChildren =
657− context.children
658− |> List.map childWidth
659− |> List.append textChildren
660− in
661− listIf
662− [ ( True
663− , expectRoundedEquality
664− { expected = Maybe.withDefault 0 (List.maximum allChildren)
665− , found = context.self.bbox.width
666− }
667− )
668− , ( context.parentLayout /= Testable.AtRoot
669− , Testable.lessThanOrEqual "not larger than parent"
670− context.self.bbox.width
671− context.parent.bbox.width
672− )
673− ]
674−
675− Testable.TextColumn _ _ ->
676− -- The width of the column is the width of the widest child.
677− let
678− childWidth child =
679− child.bbox.width
680− + context.self.bbox.padding.left
681− + context.self.bbox.padding.right
682−
683− textChildren =
684− List.map
685− (\txt ->
686− txt.width
687− + context.self.bbox.padding.left
688− + context.self.bbox.padding.right
689− )
690− context.self.textMetrics
691−
692− allChildren =
693− context.children
694− |> List.map childWidth
695− |> List.append textChildren
696− in
697− listIf
698− [ ( True
699− , expectRoundedEquality
700− { expected = Maybe.withDefault 0 (List.maximum allChildren)
701− , found = context.self.bbox.width
702− }
703− )
704− , ( context.parentLayout /= Testable.AtRoot
705− , Testable.lessThanOrEqual "not larger than parent"
706− context.self.bbox.width
707− context.parent.bbox.width
708− )
709− ]
710−
711− Testable.Paragraph _ _ ->
712− -- This should be the size it's text,
713− -- unless it takes up all available space, in which case it should wrap.
714− let
715− childWidth child =
716− child.bbox.width
717−
718− totalChildren =
719− context.children
720− |> List.map childWidth
721− |> List.append (List.map .width context.self.textMetrics)
722− |> List.sum
723−
724− horizontalPadding =
725− context.self.bbox.padding.left + context.self.bbox.padding.right
726− in
727− listIf
728− [ ( True
729− , expectRoundedEquality
730− { expected = totalChildren + horizontalPadding
731− , found = context.self.bbox.width
732− }
733− )
734− , ( context.parentLayout /= Testable.AtRoot
735− , Testable.lessThanOrEqual "not larger than parent"
736− context.self.bbox.width
737− context.parent.bbox.width
738− )
739− ]
740−
741− Testable.Text _ ->
742− []
743−
744− Testable.Empty ->
745− []
746− }
747−
748−
749−heightHelper maybeMin maybeMax len =
750− let
751− addMin l =
752− case maybeMin of
753− Nothing ->
754− l
755−
756− Just minPx ->
757− l |> Element.minimum minPx
758−
759− addMax l =
760− case maybeMax of
761− Nothing ->
762− l
763−
764− Just maxPx ->
765− l |> Element.maximum maxPx
766−
767− minLabel =
768− case maybeMin of
769− Nothing ->
770− ""
771−
772− Just i ->
773− " min:" ++ String.fromInt i
774−
775− maxLabel =
776− case maybeMax of
777− Nothing ->
778− ""
779−
780− Just i ->
781− " max:" ++ String.fromInt i
782−
783− minMaxTest actualheight =
784− case ( maybeMin, maybeMax ) of
785− ( Nothing, Nothing ) ->
786− True
787−
788− ( Just lower, Nothing ) ->
789− lower <= actualheight
790−
791− ( Just lower, Just higher ) ->
792− lower <= actualheight && actualheight <= higher
793−
794− ( Nothing, Just higher ) ->
795− actualheight <= higher
796− in
797− case len of
798− Minimum m newLen ->
799− heightHelper (Just m) maybeMax newLen
800−
801− Maximum m newLen ->
802− heightHelper maybeMin (Just m) newLen
803−
804− Px val ->
805− -- Pixel values should ignore min and max?
806− Testable.LabeledTest
807− { label = "height " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
808− , attr =
809− Element.height
810− (Element.px val
811− |> addMin
812− |> addMax
813− )
814− , id = Testable.IsHeight
815− , test =
816− \found ->
817− [ expectRoundedEquality
818− { expected = toFloat val
819− , found = found.self.bbox.height
820− }
821− , Testable.true "min/max holds true"
822− (minMaxTest (floor found.self.bbox.height))
823− ]
824− }
825−
826− Fill portion ->
827− Testable.LabeledTest
828− { label = "height fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
829− , attr =
830− Element.height
831− (Element.fillPortion portion
832− |> addMin
833− |> addMax
834− )
835− , id = Testable.IsHeight
836− , test =
837− \context ->
838− [ if List.member context.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
839− Testable.true "height fill doesn't apply to above/below elements" True
840−
841− else
842− let
843− parentAvailableHeight =
844− context.parent.bbox.height - (context.self.bbox.padding.top + context.self.bbox.padding.bottom)
845− in
846− case context.parentLayout of
847− Testable.IsNearby _ ->
848− Testable.true "Nearby Element has fill height"
849− ((floor context.parent.bbox.height == floor context.self.bbox.height)
850− || minMaxTest (floor context.self.bbox.height)
851− )
852−
853− Testable.InColumn ->
854− Testable.true "Element within column has fill height"
855− ((floor parentAvailableHeight == floor context.self.bbox.height)
856− || minMaxTest (floor context.self.bbox.height)
857− )
858−
859− Testable.InEl ->
860− Testable.true "Element within el has fill height" <|
861− (floor parentAvailableHeight == floor context.self.bbox.height)
862− || minMaxTest (floor context.self.bbox.height)
863−
864− _ ->
865− let
866− spacePerPortion =
867− parentAvailableHeight / toFloat (List.length context.siblings + 1)
868− in
869− Testable.true "el has fill height" <|
870− (floor spacePerPortion == floor context.self.bbox.height)
871− || minMaxTest (floor context.self.bbox.height)
872− ]
873− }
874−
875− Shrink ->
876− Testable.LabeledTest
877− { label = "height shrink" ++ minLabel ++ maxLabel
878− , attr =
879− Element.height
880− (Element.shrink
881− |> addMin
882− |> addMax
883− )
884− , id = Testable.IsHeight
885− , test =
886− \context ->
887− case context.selfElement of
888− Testable.El _ _ ->
889− let
890− childHeight child =
891− child.bbox.height
892− in
893− if List.isEmpty context.children then
894− -- context.self.textMetrics
895− -- |> List.map Testable.textHeight
896− -- |> List.sum
897− -- TODO: apparently the font metrics we have are for the literal characters rendered
898− -- not for the font itself.
899− [ Testable.todo "calculate height from actual text metrics"
900− ]
901−
902− else
903− [ expectRoundedEquality
904− { expected =
905− context.children
906− |> List.map childHeight
907− |> List.sum
908− |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
909− , found = context.self.bbox.height
910− }
911− , Testable.lessThanOrEqual "not larger than parent"
912− context.self.bbox.height
913− context.parent.bbox.height
914− ]
915−
916− Testable.Link _ _ _ ->
917− let
918− childHeight child =
919− child.bbox.height
920− in
921− if List.isEmpty context.children then
922− -- context.self.textMetrics
923− -- |> List.map Testable.textHeight
924− -- |> List.sum
925− -- TODO: apparently the font metrics we have are for the literal characters rendered
926− -- not for the font itself.
927− [ Testable.todo "calculate height from actual text metrics"
928− ]
929−
930− else
931− [ expectRoundedEquality
932− { expected =
933− context.children
934− |> List.map childHeight
935− |> List.sum
936− |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
937− , found = context.self.bbox.height
938− }
939− , Testable.lessThanOrEqual "not larger than parent"
940− context.self.bbox.height
941− context.parent.bbox.height
942− ]
943−
944− Testable.Row _ _ ->
945− let
946− childHeight child =
947− child.bbox.height
948− in
949− if List.isEmpty context.children then
950− -- context.self.textMetrics
951− -- |> List.map Testable.textHeight
952− -- |> List.sum
953− -- TODO: apparently the font metrics we have are for the literal characters rendered
954− -- not for the font itself.
955− [ Testable.todo "calculate height from actual text metrics" ]
956−
957− else
958− [ expectRoundedEquality
959− { expected =
960− context.children
961− |> List.map childHeight
962− |> List.maximum
963− |> Maybe.withDefault 0
964− |> (\h -> h + context.self.bbox.padding.top + context.self.bbox.padding.bottom)
965− , found = context.self.bbox.height
966− }
967− , Testable.lessThanOrEqual "not larger than parent"
968− context.self.bbox.height
969− context.parent.bbox.height
970− ]
971−
972− Testable.Column colAttrs _ ->
973− let
974− childHeight child =
975− child.bbox.height
976−
977− totalChildren =
978− context.children
979− |> List.map childHeight
980− |> List.append (List.map Testable.textHeight context.self.textMetrics)
981− |> List.sum
982−
983− verticalPadding =
984− context.self.bbox.padding.top + context.self.bbox.padding.bottom
985−
986− spacingAmount =
987− Testable.getSpacingFromAttributes colAttrs
988−
989− totalSpacing =
990− toFloat spacingAmount * (toFloat (List.length context.children) - 1)
991− in
992− [ expectRoundedEquality
993− { expected = totalChildren + verticalPadding + totalSpacing
994− , found = context.self.bbox.height
995− }
996− , Testable.lessThanOrEqual "not larger than parent"
997− context.self.bbox.height
998− context.parent.bbox.height
999− ]
1000−
1001− Testable.TextColumn _ _ ->
1002− []
1003−
1004− Testable.Paragraph _ _ ->
1005− []
1006−
1007− Testable.Text _ ->
1008− []
1009−
1010− Testable.Empty ->
1011− []
1012− }
1013−
1014−
1015−width : Length -> Testable.Attr msg
1016−width len =
1017− widthHelper Nothing Nothing len
1018−
1019−
1020−height : Length -> Testable.Attr msg
1021−height len =
1022− heightHelper Nothing Nothing len
1023−
1024−
1025−spacing : Int -> Testable.Attr msg
1026−spacing space =
1027− Testable.Batch
1028− [ Testable.Spacing space
1029− , Testable.LabeledTest
1030− { label = "spacing: " ++ String.fromInt space
1031− , attr = Element.spacing space
1032− , id = Testable.NoId
1033− , test =
1034− \found ->
1035− let
1036− findDistance child total =
1037− List.concatMap
1038− (\otherChild ->
1039− let
1040− horizontal =
1041− round <|
1042− child.bbox.left
1043− - otherChild.bbox.right
1044−
1045− vertical =
1046− round <|
1047− child.bbox.top
1048− - otherChild.bbox.bottom
1049− in
1050− [ if horizontal > 0 then
1051− horizontal
1052−
1053− else
1054− space
1055− , if vertical > 0 then
1056− vertical
1057−
1058− else
1059− space
1060− ]
1061− )
1062− found.children
1063− ++ total
1064−
1065− distances =
1066− List.foldl findDistance [] found.children
1067−
1068− allAreSpaced =
1069− List.foldl
1070− (\x wrong ->
1071− if not (x >= space) then
1072− x :: wrong
1073−
1074− else
1075− wrong
1076− )
1077− []
1078− distances
1079− in
1080− [ Testable.true
1081− ("All children are at least "
1082− ++ String.fromInt space
1083− ++ " pixels apart."
1084− ++ Debug.toString allAreSpaced
1085− ++ " are not though"
1086− )
1087− (allAreSpaced == [])
1088− ]
1089− }
1090− ]
1091−
1092−
1093−{-| alignLeft needs to account for
1094−
1095− - parent padding
1096− - elements to the left
1097− - spacing value
1098−
1099−in order to calculate the expected result.
1100−
1101−Also need parent rendering context if this is to work with wrapped rows in the future.
1102−
1103−All sibling elements
1104−
1105−-}
1106−alignLeft : Testable.Attr msg
1107−alignLeft =
1108− Testable.LabeledTest
1109− { label = "alignLeft"
1110− , attr = Element.alignLeft
1111− , id = Testable.NoId
1112− , test =
1113− \found ->
1114− [ if List.member found.parentLayout [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
1115− Testable.true "alignLeft doesn't apply to elements that are onLeft or onRight" True
1116−
1117− else if
1118− List.member found.parentLayout
1119− [ Testable.IsNearby Testable.InFront
1120− , Testable.IsNearby Testable.Behind
1121− , Testable.IsNearby Testable.Above
1122− , Testable.IsNearby Testable.Below
1123− ]
1124− then
1125− expectRoundedEquality
1126− { found = found.self.bbox.left
1127− , expected = found.parent.bbox.left
1128− }
1129−
1130− else if List.length found.siblings == 0 then
1131− expectRoundedEquality
1132− { found = found.self.bbox.left
1133− , expected = found.parent.bbox.left + found.parent.bbox.padding.left
1134− }
1135−
1136− else
1137− case found.parentLayout of
1138− Testable.InRow ->
1139− let
1140− siblingsOnLeft =
1141− List.filter (\x -> x.bbox.right < found.self.bbox.left) found.siblings
1142−
1143− spacings =
1144− toFloat (List.length siblingsOnLeft * found.parentSpacing)
1145−
1146− widthsOnLeft =
1147− siblingsOnLeft
1148− |> List.map (.width << .bbox)
1149− |> List.sum
1150− in
1151− expectRoundedEquality
1152− { found = found.self.bbox.left
1153− , expected = found.parent.bbox.left + (found.parent.bbox.padding.left + widthsOnLeft + spacings)
1154− }
1155−
1156− _ ->
1157− expectRoundedEquality
1158− { found = found.self.bbox.left
1159− , expected = found.parent.bbox.left + found.parent.bbox.padding.left
1160− }
1161− ]
1162− }
1163−
1164−
1165−{-| -}
1166−centerX : Testable.Attr msg
1167−centerX =
1168− Testable.LabeledTest
1169− { label = "centerX"
1170− , attr = Element.centerX
1171− , id = Testable.NoId
1172− , test =
1173− \found ->
1174− let
1175− selfCenter : Float
1176− selfCenter =
1177− found.self.bbox.left + (found.self.bbox.width / 2)
1178−
1179− parentCenter : Float
1180− parentCenter =
1181− found.parent.bbox.left + (found.parent.bbox.width / 2)
1182− in
1183− if List.member found.parentLayout [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
1184− [ Testable.true "centerX doesn't apply to elements that are onLeft or onRight" True ]
1185−
1186− else if List.length found.siblings == 0 then
1187− [ expectRoundedEquality
1188− { found = selfCenter
1189− , expected = parentCenter
1190− }
1191− ]
1192−
1193− else
1194− case found.parentLayout of
1195− Testable.InRow ->
1196− let
1197− siblingsOnLeft =
1198− List.filter (\x -> x.bbox.right < found.self.bbox.left) found.siblings
1199−
1200− siblingsOnRight =
1201− List.filter (\x -> x.bbox.left > found.self.bbox.right) found.siblings
1202−
1203− widthsOnLeft : Float
1204− widthsOnLeft =
1205− siblingsOnLeft
1206− |> List.map (.width << .bbox)
1207− |> List.sum
1208− |> (\x -> x + (toFloat (List.length siblingsOnLeft) * toFloat found.parentSpacing))
1209−
1210− widthsOnRight =
1211− siblingsOnRight
1212− |> List.map (.width << .bbox)
1213− |> List.sum
1214− |> (\x -> x + (toFloat (List.length siblingsOnRight) * toFloat found.parentSpacing))
1215−
1216− expectedCenter : Float
1217− expectedCenter =
1218− found.parent.bbox.left
1219− + widthsOnLeft
1220− + ((found.parent.bbox.width - (widthsOnRight + widthsOnLeft))
1221− / 2
1222− )
1223− in
1224− [ expectRoundedEquality
1225− { found = selfCenter
1226− , expected = expectedCenter
1227− }
1228− ]
1229−
1230− _ ->
1231− [ expectRoundedEquality
1232− { found = selfCenter
1233− , expected = parentCenter
1234− }
1235− ]
1236− }
1237−
1238−
1239−{-| -}
1240−alignRight : Testable.Attr msg
1241−alignRight =
1242− Testable.LabeledTest
1243− { label = "alignRight"
1244− , attr = Element.alignRight
1245− , id = Testable.NoId
1246− , test =
1247− \found ->
1248− if List.member found.parentLayout [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
1249− [ Testable.true "alignRight doesn't apply to elements that are onLeft or onRight" True ]
1250−
1251− else if
1252− List.member found.parentLayout
1253− [ Testable.IsNearby Testable.InFront
1254− , Testable.IsNearby Testable.Behind
1255− , Testable.IsNearby Testable.Above
1256− , Testable.IsNearby Testable.Below
1257− ]
1258− then
1259− [ expectRoundedEquality
1260− { found = found.self.bbox.right
1261− , expected = found.parent.bbox.right
1262− }
1263− ]
1264−
1265− else if List.length found.siblings == 0 then
1266− [ expectRoundedEquality
1267− { found = found.self.bbox.right
1268− , expected = found.parent.bbox.right + found.parent.bbox.padding.right
1269− }
1270− ]
1271−
1272− else
1273− case found.parentLayout of
1274− Testable.InRow ->
1275− let
1276− siblingsOnRight =
1277− List.filter (\x -> x.bbox.left > found.self.bbox.right) found.siblings
1278−
1279− spacings =
1280− toFloat (List.length siblingsOnRight * found.parentSpacing)
1281−
1282− widthsOnRight =
1283− siblingsOnRight
1284− |> List.map (.width << .bbox)
1285− |> List.sum
1286− in
1287− [ expectRoundedEquality
1288− { found = found.self.bbox.right
1289− , expected = found.parent.bbox.right - (found.parent.bbox.padding.right + widthsOnRight + spacings)
1290− }
1291− ]
1292−
1293− _ ->
1294− [ expectRoundedEquality
1295− { found = found.self.bbox.right
1296− , expected = found.parent.bbox.right + found.parent.bbox.padding.right
1297− }
1298− ]
1299− }
1300−
1301−
1302−{-| -}
1303−alignTop : Testable.Attr msg
1304−alignTop =
1305− Testable.LabeledTest
1306− { label = "alignTop"
1307− , attr = Element.alignTop
1308− , id = Testable.NoId
1309− , test =
1310− \found ->
1311− if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1312− [ Testable.true "alignTop doesn't apply to elements that are above or below" True ]
1313−
1314− else if
1315− List.member found.parentLayout
1316− [ Testable.IsNearby Testable.InFront
1317− , Testable.IsNearby Testable.Behind
1318− , Testable.IsNearby Testable.OnRight
1319− , Testable.IsNearby Testable.OnLeft
1320− ]
1321− then
1322− [ expectRoundedEquality
1323− { found = found.self.bbox.top
1324− , expected = found.parent.bbox.top
1325− }
1326− ]
1327−
1328− else if List.length found.siblings == 0 then
1329− [ expectRoundedEquality
1330− { found = found.self.bbox.top
1331− , expected = found.parent.bbox.top + found.parent.bbox.padding.top
1332− }
1333− ]
1334−
1335− else
1336− case found.parentLayout of
1337− Testable.InColumn ->
1338− let
1339− siblingsAbove =
1340− List.filter (\x -> x.bbox.bottom < found.self.bbox.top) found.siblings
1341−
1342− spacings =
1343− toFloat (List.length siblingsAbove * found.parentSpacing)
1344−
1345− heightsAbove =
1346− siblingsAbove
1347− |> List.map (.height << .bbox)
1348− |> List.sum
1349− in
1350− [ expectRoundedEquality
1351− { found = found.self.bbox.top
1352− , expected = found.parent.bbox.top + (found.parent.bbox.padding.top + heightsAbove + spacings)
1353− }
1354− ]
1355−
1356− _ ->
1357− [ expectRoundedEquality
1358− { found = found.self.bbox.top
1359− , expected = found.parent.bbox.top
1360− }
1361− ]
1362− }
1363−
1364−
1365−{-| -}
1366−alignBottom : Testable.Attr msg
1367−alignBottom =
1368− Testable.LabeledTest
1369− { label = "alignBottom"
1370− , attr = Element.alignBottom
1371− , id = Testable.NoId
1372− , test =
1373− \found ->
1374− if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1375− [ Testable.true "alignBottom doesn't apply to elements that are above or below" True ]
1376−
1377− else if
1378− List.member found.parentLayout
1379− [ Testable.IsNearby Testable.InFront
1380− , Testable.IsNearby Testable.Behind
1381− , Testable.IsNearby Testable.OnRight
1382− , Testable.IsNearby Testable.OnLeft
1383− ]
1384− then
1385− [ expectRoundedEquality
1386− { found = found.self.bbox.bottom
1387− , expected = found.parent.bbox.bottom
1388− }
1389− ]
1390−
1391− else if List.length found.siblings == 0 then
1392− [ expectRoundedEquality
1393− { found = found.self.bbox.bottom
1394− , expected = found.parent.bbox.bottom + found.parent.bbox.padding.bottom
1395− }
1396− ]
1397−
1398− else
1399− case found.parentLayout of
1400− Testable.InColumn ->
1401− let
1402− siblingsBelow =
1403− List.filter (\x -> x.bbox.top > found.self.bbox.bottom) found.siblings
1404−
1405− spacings =
1406− toFloat (List.length siblingsBelow * found.parentSpacing)
1407−
1408− heightsBelow =
1409− siblingsBelow
1410− |> List.map (.height << .bbox)
1411− |> List.sum
1412− in
1413− [ expectRoundedEquality
1414− { found = found.self.bbox.bottom
1415− , expected = found.parent.bbox.bottom - (found.parent.bbox.padding.bottom + heightsBelow + spacings)
1416− }
1417− ]
1418−
1419− _ ->
1420− [ expectRoundedEquality
1421− { found = found.self.bbox.bottom
1422− , expected = found.parent.bbox.bottom + found.parent.bbox.padding.bottom
1423− }
1424− ]
1425− }
1426−
1427−
1428−expectRoundedEquality : { expected : Float, found : Float } -> Testable.LayoutExpectation
1429−expectRoundedEquality { expected, found } =
1430− Testable.true
1431− ("expected " ++ floatToString expected ++ ", found " ++ floatToString found)
1432− (abs (expected - found) < 1)
1433−
1434−
1435−floatToString : Float -> String
1436−floatToString x =
1437− String.fromFloat (toFloat (round (x * 100)) / 100)
1438−
1439−
1440−{-| -}
1441−centerY : Testable.Attr msg
1442−centerY =
1443− Testable.LabeledTest
1444− { label = "centerY"
1445− , attr = Element.centerY
1446− , id = Testable.NoId
1447− , test =
1448− \found ->
1449− let
1450− selfCenter =
1451− found.self.bbox.top + (found.self.bbox.height / 2)
1452−
1453− parentCenter =
1454− found.parent.bbox.top + (found.parent.bbox.height / 2)
1455− in
1456− if List.member found.parentLayout [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
1457− [ Testable.true "centerY doesn't apply to elements that are above or below" True ]
1458−
1459− else if List.length found.siblings == 0 then
1460− [ expectRoundedEquality
1461− { found = selfCenter
1462− , expected = parentCenter
1463− }
1464− ]
1465−
1466− else
1467− case found.parentLayout of
1468− Testable.InColumn ->
1469− let
1470− siblingsOnTop =
1471− List.filter (\x -> x.bbox.bottom < found.self.bbox.top) found.siblings
1472−
1473− siblingsBelow =
1474− List.filter (\x -> x.bbox.top > found.self.bbox.bottom) found.siblings
1475−
1476− heightsAbove : Float
1477− heightsAbove =
1478− siblingsOnTop
1479− |> List.map (.height << .bbox)
1480− |> List.sum
1481− |> (\x -> x + (toFloat (List.length siblingsOnTop) * toFloat found.parentSpacing))
1482−
1483− heightsBelow =
1484− siblingsBelow
1485− |> List.map (.height << .bbox)
1486− |> List.sum
1487− |> (\x -> x + (toFloat (List.length siblingsBelow) * toFloat found.parentSpacing))
1488−
1489− expectedCenter : Float
1490− expectedCenter =
1491− found.parent.bbox.top
1492− + heightsAbove
1493− + ((found.parent.bbox.height - (heightsBelow + heightsAbove))
1494− / 2
1495− )
1496− in
1497− [ expectRoundedEquality
1498− { found = selfCenter
1499− , expected = expectedCenter
1500− }
1501− ]
1502−
1503− _ ->
1504− [ expectRoundedEquality
1505− { found = selfCenter
1506− , expected = parentCenter
1507− }
1508− ]
1509− }
1510−
1511−
1512−{-| -}
1513−above : Testable.Element msg -> Testable.Attr msg
1514−above element =
1515− Testable.Nearby
1516− { location = Testable.Above
1517− , element = element
1518− , label = "above"
1519− , test =
1520− \found ->
1521− [ expectRoundedEquality
1522− { found = found.self.bbox.bottom
1523− , expected = found.parent.bbox.top
1524− }
1525− ]
1526− }
1527−
1528−
1529−{-| -}
1530−below : Testable.Element msg -> Testable.Attr msg
1531−below element =
1532− Testable.Nearby
1533− { location = Testable.Below
1534− , element = element
1535− , label = "below"
1536− , test =
1537− \found ->
1538− [ expectRoundedEquality
1539− { found = found.self.bbox.top
1540− , expected = found.parent.bbox.bottom
1541− }
1542− ]
1543− }
1544−
1545−
1546−{-| -}
1547−onRight : Testable.Element msg -> Testable.Attr msg
1548−onRight element =
1549− Testable.Nearby
1550− { location = Testable.OnRight
1551− , element = element
1552− , label = "onRight"
1553− , test =
1554− \found ->
1555− [ expectRoundedEquality
1556− { found = found.self.bbox.left
1557− , expected = found.parent.bbox.right
1558− }
1559− ]
1560− }
1561−
1562−
1563−{-| -}
1564−onLeft : Testable.Element msg -> Testable.Attr msg
1565−onLeft element =
1566− Testable.Nearby
1567− { location = Testable.OnLeft
1568− , element = element
1569− , label = "onLeft"
1570− , test =
1571− \found ->
1572− [ expectRoundedEquality
1573− { found = found.self.bbox.right
1574− , expected = found.parent.bbox.left
1575− }
1576− ]
1577− }
1578−
1579−
1580−compare x vs y =
1581− vs (round x) (round y) || vs (floor x) (floor y)
1582−
1583−
1584−{-| -}
1585−inFront : Testable.Element msg -> Testable.Attr msg
1586−inFront element =
1587− Testable.Nearby
1588− { location = Testable.InFront
1589− , element = element
1590− , label = "inFront"
1591− , test =
1592− \found ->
1593− [ withinHelper found ]
1594− }
1595−
1596−
1597−withinHelper found =
1598− let
1599− horizontalCheck =
1600− if found.self.bbox.width > found.parent.bbox.width then
1601− [ compare found.self.bbox.right (<=) found.parent.bbox.right
1602− || compare found.self.bbox.left (>=) found.parent.bbox.left
1603− ]
1604−
1605− else
1606− [ compare found.self.bbox.right (<=) found.parent.bbox.right
1607− , compare found.self.bbox.left (>=) found.parent.bbox.left
1608− ]
1609−
1610− verticalCheck =
1611− if found.self.bbox.width > found.parent.bbox.width then
1612− [ compare found.self.bbox.top (>=) found.parent.bbox.top
1613− || compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1614− ]
1615−
1616− else
1617− [ compare found.self.bbox.top (>=) found.parent.bbox.top
1618− , compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1619− ]
1620− in
1621− Testable.true "within the confines of the parent"
1622− (List.all ((==) True)
1623− (List.concat
1624− [ horizontalCheck
1625− , verticalCheck
1626− ]
1627− )
1628− )
1629−
1630−
1631−{-| -}
1632−behindContent : Testable.Element msg -> Testable.Attr msg
1633−behindContent element =
1634− Testable.Nearby
1635− { location = Testable.Behind
1636− , element = element
1637− , label = "behindContent"
1638− , test =
1639− \found ->
1640− [ withinHelper found ]
1641− }
1642−
1643−
1644−
1645−{- Implicit width/height calcualtions -}
1646−
1647−
1648−implicitWidthHeightShrink attrs =
1649− let
1650− withImplicits =
1651− implicitTest (widthHelper Nothing Nothing Shrink)
1652− :: implicitTest (heightHelper Nothing Nothing Shrink)
1653− :: attrs
1654− in
1655− skipOverridden withImplicits
1656−
1657−
1658−attrId attr =
1659− case attr of
1660− Testable.LabeledTest details ->
1661− details.id
1662−
1663− Testable.AttrTest details ->
1664− details.id
1665−
1666− _ ->
1667− Testable.NoId
1668−
1669−
1670−skipOverridden ls =
1671− List.foldr
1672− (\attr ( found, caught ) ->
1673− let
1674− ( skip, has ) =
1675− case attrId attr of
1676− Testable.NoId ->
1677− ( False, found )
1678−
1679− Testable.IsWidth ->
1680− ( found.hasWidth
1681− , { hasWidth = True
1682− , hasHeight = found.hasHeight
1683− }
1684− )
1685−
1686− Testable.IsHeight ->
1687− ( found.hasHeight
1688− , { hasWidth = found.hasWidth
1689− , hasHeight = True
1690− }
1691− )
1692− in
1693− ( has
1694− , if skip then
1695− caught
1696−
1697− else
1698− attr :: caught
1699− )
1700− )
1701− ( { hasWidth = False
1702− , hasHeight = False
1703− }
1704− , []
1705− )
1706− ls
1707− |> Tuple.second
1708− |> List.reverse
1709−
1710−
1711−{-| This is taking a normal test and rmoving its ability to attach a real `Element` attribute.
1712−-}
1713−implicitTest attr =
1714− case attr of
1715− Testable.LabeledTest details ->
1716− Testable.AttrTest
1717− { test = details.test
1718− , label = "Implicit -> " ++ details.label
1719− , id = details.id
1720− }
1721−
1722− otherwise ->
1723− otherwise
tests-rendering/src/Testable/Element/Border.elmdeleted−20
@@ -1,20 +0,0 @@
1−module Testable.Element.Border exposing (..)
2−
3−{-| -}
4−
5−import Dict
6−import Element exposing (Color)
7−import Element.Border as Border
8−import Element.Font as Font
9−import Expect
10−import Testable
11−
12−
13−color : Color -> Testable.Attr msg
14−color clr =
15− Testable.Attr (Border.color clr)
16−
17−
18−width : Int -> Testable.Attr msg
19−width i =
20− Testable.Attr (Border.width i)
tests-rendering/src/Testable/Generator.elmdeleted−398
@@ -1,398 +0,0 @@
1−module Testable.Generator exposing (..)
2−
3−{-| -}
4−
5−import Testable
6−import Testable.Element exposing (..)
7−import Testable.Element.Background as Background
8−import Testable.Element.Font as Font
9−
10−
11−{-| Given a list of attributes, generate every context this list of attributes could be in.
12−
13−So, this means,
14−
15− - every element type
16− - in every element type
17−
18−-}
19−element : String -> List (Testable.Attr msg) -> List ( String, Testable.Element msg )
20−element label attrs =
21− -- [ ( label, paragraph attrs [ short ] )
22− -- ]
23− mapEveryCombo
24− (\( selfLabel, makeSelf ) ( childLabel, child ) ->
25− ( label ++ " - " ++ selfLabel ++ " > " ++ childLabel
26− , makeSelf attrs child
27− )
28− )
29− layouts
30− contents
31−
32−
33−{-| Given a list of attributes, generate every context this list of attributes could be in.
34−
35−So, this means,
36−
37− - every element type
38− - in every element type
39−
40−-}
41−elementInLayout : String -> List (Testable.Attr msg) -> List ( String, Testable.Element msg )
42−elementInLayout label attrs =
43− mapEveryCombo3
44− (\( layoutLabel, makeLayout ) ( selfLabel, makeSelf ) ( childLabel, child ) ->
45− ( label ++ " - " ++ layoutLabel ++ " > " ++ selfLabel ++ " > " ++ childLabel
46− , makeLayout [] (makeSelf attrs child)
47− )
48− )
49− layouts
50− layouts
51− contents
52−
53−
54−{-| Sometimes we want to try a whole bunch of combinations of attributes
55−
56−This makes it a bit easier to construct
57−
58−-}
59−elementWith : String -> List ( String, List (Testable.Attr msg) ) -> List ( String, Testable.Element msg )
60−elementWith label labelAttrs =
61− mapEveryCombo3
62− (\( attrLabel, attrs ) ( selfLabel, makeSelf ) ( childLabel, child ) ->
63− ( label ++ " - " ++ selfLabel ++ " with " ++ attrLabel ++ " > " ++ childLabel
64− , makeSelf attrs child
65− )
66− )
67− labelAttrs
68− layouts
69− contents
70−
71−
72−{-| This varies the layout element that an element is in.
73−-}
74−elementInLayoutWith :
75− String
76− ->
77− List
78− ( String
79− , { self : List (Testable.Attr msg)
80− , parent : List (Testable.Attr msg)
81− }
82− )
83− -> List ( String, Testable.Element msg )
84−elementInLayoutWith label labelAttrs =
85− mapEveryCombo4
86− (\( attrLabel, attrs ) ( layoutLabel, makeLayout ) ( selfLabel, makeSelf ) ( childLabel, child ) ->
87− ( label ++ " - " ++ layoutLabel ++ " > " ++ selfLabel ++ " with " ++ attrLabel ++ " > " ++ childLabel
88− , makeLayout attrs.parent (makeSelf attrs.self child)
89− )
90− )
91− labelAttrs
92− allLayouts
93− layouts
94− contents
95−
96−
97−layouts =
98− [ ( "el"
99− , \attrs child ->
100− el attrs child
101− )
102− , ( "row"
103− , \attrs child ->
104− row attrs [ child ]
105− )
106− , ( "col"
107− , \attrs child ->
108− column attrs [ child ]
109− )
110− , ( "para"
111− , \attrs child ->
112− paragraph attrs [ child ]
113− )
114− , ( "txtCol"
115− , \attrs child ->
116− textColumn attrs [ child ]
117− )
118− ]
119−
120−
121−allElements =
122− [ ( "el"
123− , \attrs child ->
124− el attrs child
125− )
126− , ( "row"
127− , \attrs child ->
128− row attrs [ child ]
129− )
130− , ( "col"
131− , \attrs child ->
132− column attrs [ child ]
133− )
134− , ( "para"
135− , \attrs child ->
136− paragraph attrs [ child ]
137− )
138− , ( "txtCol"
139− , \attrs child ->
140− textColumn attrs [ child ]
141− )
142− ]
143−
144−
145−allLayouts =
146− [ ( "el"
147− , \attrs child ->
148− el attrs child
149− )
150− , ( "row 3, self 1"
151− , \attrs child ->
152− row attrs [ child, box, box ]
153− )
154− , ( "row 3, self 2"
155− , \attrs child ->
156− row attrs [ box, child, box ]
157− )
158− , ( "row 3, self 3"
159− , \attrs child ->
160− row attrs [ box, box, child ]
161− )
162− , ( "col 3, self 1"
163− , \attrs child ->
164− column attrs [ child, box, box ]
165− )
166− , ( "col 3, self 2"
167− , \attrs child ->
168− column attrs [ box, child, box ]
169− )
170− , ( "col 3, self 3"
171− , \attrs child ->
172− column attrs [ box, box, child ]
173− )
174− , ( "para"
175− , \attrs child ->
176− paragraph attrs [ child ]
177− )
178− , ( "txtCol"
179− , \attrs child ->
180− textColumn attrs [ child ]
181− )
182− ]
183−
184−
185−nearbys =
186− [ ( "inFront", inFront )
187− , ( "above", above )
188− , ( "onLeft", onLeft )
189− , ( "onRight", onRight )
190− , ( "below", below )
191− , ( "behindContent", behindContent )
192− ]
193−
194−
195−alignments =
196− horizontal ++ vertical
197−
198−
199−horizontal =
200− [ Tuple.pair "alignLeft" alignLeft
201− , Tuple.pair "alignRight" alignRight
202− , Tuple.pair "centerX" centerX
203− ]
204−
205−
206−vertical =
207− [ Tuple.pair "alignTop" alignTop
208− , Tuple.pair "alignBottom" alignBottom
209− , Tuple.pair "centerY" centerY
210− ]
211−
212−
213−extractLabel maybe =
214− maybe
215−
216−
217−allAlignments =
218− mapEveryCombo
219− (\maybeOne maybeTwo ->
220− let
221− labels =
222− List.filterMap (Maybe.map Tuple.first)
223− [ maybeOne
224− , maybeTwo
225− ]
226−
227− attrs =
228− List.filterMap (Maybe.map Tuple.second)
229− [ maybeOne
230− , maybeTwo
231− ]
232− in
233− Tuple.pair (String.join "++" labels)
234− attrs
235− )
236− (Nothing :: List.map Just horizontal)
237− (Nothing :: List.map Just vertical)
238−
239−
240−contents =
241− [ ( "none", none )
242− , ( "short text", text short )
243−
244− -- , ( "long text", text lorem )
245− , ( "box"
246− , box
247− )
248− ]
249−
250−
251−box =
252− el
253− [ width (px 50)
254− , height (px 50)
255− , Background.color (rgb (240 / 255) 0 (245 / 255))
256− , Font.color (rgb 1 1 1)
257− ]
258− none
259−
260−
261−short =
262− "short and small"
263−
264−
265−lorem =
266− "There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable. If you are going to use a passage of Lorem Ipsum, you need to be sure there isn't anything embarrassing hidden in the middle of text. All the Lorem Ipsum generators on the Internet tend to repeat predefined chunks as necessary, making this the first true generator on the Internet. It uses a dictionary of over 200 Latin words, combined with a handful of model sentence structures, to generate Lorem Ipsum which looks reasonable. The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc."
267−
268−
269−mapEveryCombo fn listOne listTwo =
270− List.concatMap
271− (\one ->
272− List.map
273− (\two ->
274− fn one two
275− )
276− listTwo
277− )
278− listOne
279−
280−
281−mapEveryCombo3 fn listOne listTwo listThree =
282− List.concatMap
283− (\one ->
284− List.concatMap
285− (\two ->
286− List.map
287− (\three ->
288− fn one two three
289− )
290− listThree
291− )
292− listTwo
293− )
294− listOne
295−
296−
297−mapEveryCombo4 fn listOne listTwo listThree listFour =
298− List.concatMap
299− (\one ->
300− List.concatMap
301− (\two ->
302− List.concatMap
303− (\three ->
304− List.map
305− (\four ->
306− fn one two three four
307− )
308− listFour
309− )
310− listThree
311− )
312− listTwo
313− )
314− listOne
315−
316−
317−sizes render =
318− List.concatMap
319− (\( widthLen, heightLen ) ->
320− [ text (Debug.toString ( widthLen, heightLen ))
321− , render
322− (\attrs children ->
323− el
324− (width widthLen
325− :: height heightLen
326− :: attrs
327− )
328− children
329− )
330− ]
331− )
332− allLengthPairs
333−
334−
335−allLengthPairs : List ( Length, Length )
336−allLengthPairs =
337− let
338− crossProduct len =
339− List.map (Tuple.pair len) lengths
340− in
341− List.concatMap crossProduct lengths
342−
343−
344−lengths =
345− [ px 50
346− , fill
347− , shrink
348− , fill
349− |> maximum 100
350− , fill
351− |> maximum 100
352− |> minimum 50
353− , shrink
354− |> maximum 100
355− , shrink
356− |> maximum 100
357− |> minimum 50
358− ]
359−
360−
361−type Generated thing
362− = Generated (List (Labeled thing))
363−
364−
365−type alias Labeled thing =
366− ( String, thing )
367−
368−
369−with : List (Labeled a) -> List (Labeled (a -> b)) -> List (Labeled b)
370−with first funcs =
371− List.concatMap
372− (\( lbl, fst ) ->
373− List.map
374− (\( fnLbl, fn ) ->
375− Tuple.pair (fnLbl ++ "+" ++ lbl) (fn fst)
376− )
377− funcs
378− )
379− first
380−
381−
382−generate : String -> generated -> List (Labeled generated)
383−generate lbl fn =
384− [ Tuple.pair lbl fn
385− ]
386−
387−
388−test : List (Labeled (Testable.Element msg))
389−test =
390− generate "Alignments"
391− (\align ->
392− el align none
393− )
394− |> with allAlignments
395−
396−
397−
398−-- |>
tests-rendering/src/Testable/Runner.elmdeleted−607
@@ -1,607 +0,0 @@
1−port module Testable.Runner exposing
2− ( Msg
3− , Testable
4− , TestableProgram
5− , program
6− , rename
7− , show
8− , testable
9− )
10−
11−{-| -}
12−
13−import Browser
14−import Dict exposing (Dict)
15−import Element
16−import Element.Background as Background
17−import Element.Border as Border
18−import Element.Events as Events
19−import Element.Font as Font
20−import Html exposing (Html)
21−import Html.Attributes
22−import Process
23−import Task
24−import Testable
25−import Time
26−
27−
28−show : Testable.Element msg -> Html msg
29−show =
30− Testable.toHtml
31−
32−
33−type alias TestableProgram =
34− Program () (Model Msg) Msg
35−
36−
37−{-| This should be a real type, but I'm too busy atm.
38−-}
39−type alias Testable =
40− ( String, Testable.Element Msg )
41−
42−
43−rename : String -> Testable -> Testable
44−rename newName ( _, el ) =
45− ( newName, el )
46−
47−
48−testable : String -> Testable.Element Msg -> Testable
49−testable =
50− Tuple.pair
51−
52−
53−palette =
54− { white = Element.rgb 1 1 1
55− , red = Element.rgb 1 0 0
56− , green = Element.rgb 0 1 0
57− , black = Element.rgb 0 0 0
58− , lightGrey = Element.rgb 0.7 0.7 0.7
59− }
60−
61−
62−program : List Testable -> TestableProgram
63−program tests =
64− let
65− ( current, upcoming ) =
66− case tests of
67− [] ->
68− ( Nothing, [] )
69−
70− cur :: remaining ->
71− ( Just cur, remaining )
72− in
73− Browser.element
74− { init =
75− always
76− ( { current = current
77− , upcoming = upcoming
78− , finished = []
79− , selected = 0
80− , highlightDomId = Nothing
81− }
82− , Task.perform (always Analyze)
83− (Process.sleep 64
84− |> Task.andThen
85− (always Time.now)
86− )
87− )
88− , view = view
89− , update = update
90− , subscriptions = subscriptions
91− }
92−
93−
94−subscriptions : Model Msg -> Sub Msg
95−subscriptions model =
96− Sub.batch
97− [ styles RefreshBoundingBox
98− ]
99−
100−
101−type alias Model msg =
102− { current : Maybe ( String, Testable.Element msg )
103− , upcoming : List ( String, Testable.Element msg )
104− , finished : List (WithResults (Testable.Element msg))
105− , selected : Int
106− , highlightDomId : Maybe String
107− }
108−
109−
110−type alias WithResults thing =
111− { index : Int
112− , element : thing
113− , label : String
114− , results :
115− List Testable.LayoutTest
116− }
117−
118−
119−encodeForReport :
120− List (WithResults (Testable.Element msg))
121− ->
122− List
123− { label : String
124− , results :
125− List
126− { description : String
127− , passing : Bool
128− , todo : Bool
129− }
130− }
131−encodeForReport withResults =
132− let
133− prepareExpectation layoutTest exp =
134− case exp of
135− Testable.Todo description ->
136− { description = description
137− , passing = False
138− , todo = True
139− }
140−
141− Testable.Expect details ->
142− { description = details.description
143− , passing = details.result
144− , todo = False
145− }
146−
147− prepareNode layoutTest =
148− List.map (prepareExpectation layoutTest) layoutTest.expectations
149−
150− prepare { label, results } =
151− { label = label
152− , results = List.concatMap prepareNode results
153− }
154− in
155− List.map prepare withResults
156−
157−
158−type Msg
159− = NoOp
160− | Analyze
161− | Select Int
162− | HighlightDomID (Maybe String)
163− | RefreshBoundingBox
164− (List
165− { id : String
166− , bbox : Testable.BoundingBox
167− , style : List ( String, String )
168− , isVisible : Bool
169− , textMetrics : List Testable.TextMetrics
170− }
171− )
172−
173−
174−runTest : Int -> Dict String Testable.Found -> String -> Testable.Element msg -> WithResults (Testable.Element msg)
175−runTest index boxes label element =
176− let
177− results =
178− Testable.runTests boxes element
179− in
180− { index = index
181− , element = element
182− , label = label
183− , results = results
184− }
185−
186−
187−update : Msg -> Model Msg -> ( Model Msg, Cmd Msg )
188−update msg model =
189− case msg of
190− NoOp ->
191− ( model, Cmd.none )
192−
193− HighlightDomID newId ->
194− ( { model | highlightDomId = newId }
195− , Cmd.none
196− )
197−
198− Select index ->
199− ( { model | selected = index }
200− , Cmd.none
201− )
202−
203− RefreshBoundingBox boxes ->
204− case model.current of
205− Nothing ->
206− ( model
207− , Cmd.none
208− )
209−
210− Just ( label, current ) ->
211− let
212− toTuple box =
213− ( box.id
214− , { style = Dict.fromList box.style
215− , bbox = box.bbox
216− , isVisible = box.isVisible
217− , textMetrics = box.textMetrics
218− }
219− )
220−
221− foundData =
222− boxes
223− |> List.map toTuple
224− |> Dict.fromList
225−
226− currentResults =
227− runTest (List.length model.finished) foundData label current
228− in
229− case model.upcoming of
230− [] ->
231− ( { model
232− | current = Nothing
233− , finished = model.finished ++ [ currentResults ]
234− }
235− , report (encodeForReport (currentResults :: model.finished))
236− )
237−
238− newCurrent :: remaining ->
239− ( { model
240− | finished = model.finished ++ [ currentResults ]
241− , current = Just newCurrent
242− , upcoming = remaining
243− }
244− , Task.perform (always Analyze)
245− (Process.sleep 64
246− |> Task.andThen
247− (always Time.now)
248− )
249− )
250−
251− Analyze ->
252− case model.current of
253− Nothing ->
254− ( model
255− , Cmd.none
256− )
257−
258− Just ( label, current ) ->
259− ( model
260− , analyze (Testable.getIds current)
261− )
262−
263−
264−view : Model Msg -> Html.Html Msg
265−view model =
266− case model.current of
267− Nothing ->
268− if List.isEmpty model.upcoming then
269− let
270− selected =
271− getByIndex model.selected model.finished
272− in
273− Element.layout
274− [ Font.size 16
275− , Element.inFront (Element.html (viewElementHighlight model))
276− , Element.height Element.fill
277− ]
278− <|
279− Element.row [ Element.width Element.fill, Element.height Element.fill ]
280− [ Element.el
281− [ Element.width
282− (Element.fill
283− |> Element.maximum 900
284− )
285− , Element.alignTop
286− , Element.height Element.fill
287− , Element.scrollbars
288− ]
289− (Element.el
290− [ Element.centerX
291− , Element.padding 100
292− , Border.dashed
293− , Border.width 2
294− , Border.color palette.lightGrey
295− , Font.size 20
296− , Element.inFront
297− (Element.el
298− [ Font.size 14
299− , Font.color palette.lightGrey
300− ]
301− (Element.text "test case")
302− )
303− ]
304− (case selected of
305− Nothing ->
306− Element.text "nothing selected"
307−
308− Just sel ->
309− Testable.toElement sel.element
310− )
311− )
312− , Element.column
313− [ Element.spacing 20
314− , Element.padding 20
315− , Element.width Element.fill
316− , Element.height Element.fill
317− , Element.scrollbarY
318− ]
319− (model.finished
320− |> List.sortBy hasFailure
321− |> List.map (viewResult model.selected)
322− )
323− ]
324−
325− else
326− Html.text ""
327−
328− Just ( label, current ) ->
329− Testable.toHtml current
330−
331−
332−getByIndex i ls =
333− List.foldl
334− (\elem ( index, found ) ->
335− if i == index then
336− ( index + 1, Just elem )
337−
338− else
339− ( index + 1, found )
340− )
341− ( 0, Nothing )
342− ls
343− |> Tuple.second
344−
345−
346−viewElementHighlight model =
347− case model.highlightDomId of
348− Nothing ->
349− Html.text ""
350−
351− Just highlightDomId ->
352− let
353− elementHighlight =
354− highlightDomId ++ " { outline: solid black; }"
355−
356− testId =
357− highlightDomId
358− |> String.dropLeft 1
359− |> String.append "#tests-"
360−
361− testHighlight =
362− testId ++ " { outline: dashed black; }"
363−
364− styleSheet =
365− String.join "\n"
366− [ elementHighlight
367− , testHighlight
368− ]
369− in
370− Html.node "style"
371− []
372− [ Html.text styleSheet
373− ]
374−
375−
376−hasFailure : WithResults (Testable.Element Msg) -> Int
377−hasFailure myTest =
378− if
379− List.any
380− (not << isPassing)
381− myTest.results
382− then
383− 0
384−
385− else
386− 1
387−
388−
389−isExpectationPassing result =
390− case result of
391− Testable.Todo label ->
392− True
393−
394− Testable.Expect details ->
395− details.result
396−
397−
398−isPassing layoutTest =
399− List.all isExpectationPassing layoutTest.expectations
400−
401−
402−viewResult : Int -> WithResults (Testable.Element Msg) -> Element.Element Msg
403−viewResult selectedIndex myTest =
404− if myTest.index == selectedIndex then
405− Element.column
406− [ Element.alignLeft
407− , Element.spacing 16
408− ]
409− [ Element.el [ Font.size 24 ] (Element.text myTest.label)
410− , Element.column
411− [ Element.alignLeft, Element.spacing 16 ]
412− (myTest.results
413− |> groupBy .elementDomId
414− |> List.map (expandDetails >> viewLayoutTestGroup)
415− )
416− ]
417−
418− else
419− let
420− ( passing, failing ) =
421− List.partition isPassing myTest.results
422− in
423− Element.column
424− [ Element.alignLeft
425− , Element.spacing 16
426− , Element.pointer
427− , Events.onClick (Select myTest.index)
428− ]
429− [ Element.row [ Element.spacing 16 ]
430− [ Element.el [ Font.size 16 ] (Element.text myTest.label)
431− , Element.text (String.fromInt (List.length passing) ++ " passing")
432− , let
433− failingCount =
434− List.length failing
435− in
436− if failingCount == 0 then
437− Element.none
438−
439− else
440− Element.text (String.fromInt (List.length failing) ++ " failing")
441− ]
442− ]
443−
444−
445−expandDetails group =
446− case group.members of
447− [] ->
448− { id = group.id
449− , elementType = Testable.EmptyType
450− , members = group.members
451− }
452−
453− top :: _ ->
454− { id = group.id
455− , elementType = top.elementType
456− , members = group.members
457− }
458−
459−
460−groupBy fn list =
461− groupWhile (\one two -> fn one == fn two) list
462− |> List.map
463− (\( fst, remaining ) ->
464− { id = fn fst
465− , members = fst :: remaining
466− }
467− )
468−
469−
470−groupWhile : (a -> a -> Bool) -> List a -> List ( a, List a )
471−groupWhile isSameGroup items =
472− List.foldr
473− (\x acc ->
474− case acc of
475− [] ->
476− [ ( x, [] ) ]
477−
478− ( y, restOfGroup ) :: groups ->
479− if isSameGroup x y then
480− ( x, y :: restOfGroup ) :: groups
481−
482− else
483− ( x, [] ) :: acc
484− )
485− []
486− items
487−
488−
489−viewLayoutTestGroup group =
490− let
491− testId =
492− group.id
493− |> String.dropLeft 1
494− |> String.append "tests-"
495− in
496− Element.column
497− [ Element.spacing 8
498− , Element.htmlAttribute (Html.Attributes.id testId)
499− , Events.onMouseEnter (HighlightDomID (Just group.id))
500− , Events.onMouseLeave (HighlightDomID Nothing)
501− , Element.htmlAttribute (Html.Attributes.style "user-select" "none")
502− ]
503− [ Element.row [ Element.spacing 16 ]
504− [ Element.el [] (Element.text (Testable.elementTypeToString group.elementType))
505− , Element.el [ Font.color palette.lightGrey ] (Element.text group.id)
506− ]
507− , Element.column
508− [ Element.spacing 8
509− , Element.paddingXY 32 0
510− ]
511− (List.map viewLayoutTest group.members)
512− ]
513−
514−
515−type alias Grouped thing =
516− { id : String
517− , members : List thing
518− }
519−
520−
521−viewLayoutTest layoutTest =
522− Element.column
523− [ Element.spacing 8
524− ]
525− [ Element.row [ Element.spacing 8 ]
526− [ Element.el [ Font.bold ] (Element.text layoutTest.label)
527−
528− -- , Element.el [ Font.color palette.lightGrey ] (Element.text layoutTest.elementDomId)
529− ]
530− , Element.column [ Element.spacing 8 ]
531− (List.map viewLayoutExpectation layoutTest.expectations)
532− ]
533−
534−
535−viewLayoutExpectation expectation =
536− case expectation of
537− Testable.Todo label ->
538− Element.row [ Element.spacing 4 ]
539− [ todo, Element.text label ]
540−
541− Testable.Expect details ->
542− if details.result then
543− Element.row [ Element.spacing 4 ]
544− [ pass, Element.text details.description ]
545−
546− else
547− Element.row [ Element.spacing 4 ]
548− [ fail, Element.text details.description ]
549−
550−
551−badge color text =
552− Element.el
553− [ Background.color color
554− , Font.color palette.black
555− , Element.paddingXY 4 8
556− , Border.rounded 2
557− ]
558− (Element.text text)
559−
560−
561−todo =
562− badge palette.lightGrey "todo"
563−
564−
565−pass =
566− badge palette.green "pass"
567−
568−
569−fail =
570− badge palette.red "fail"
571−
572−
573−formatKeyValue : String -> String -> String
574−formatKeyValue key val =
575− key ++ ": " ++ val
576−
577−
578−port report :
579− List
580− { label : String
581− , results :
582− List
583− { description : String
584− , passing : Bool
585− , todo : Bool
586− }
587− }
588− -> Cmd msg
589−
590−
591−port test : String -> Cmd msg
592−
593−
594−port analyze : List String -> Cmd msg
595−
596−
597−port styles :
598− (List
599− { id : String
600− , bbox : Testable.BoundingBox
601− , style : List ( String, String )
602− , isVisible : Bool
603− , textMetrics : List Testable.TextMetrics
604− }
605− -> msg
606− )
607− -> Sub msg
tests-rendering/src/Tests/Alignment.elmdeleted−49
@@ -1,49 +0,0 @@
1−module Tests.Alignment exposing (view)
2−
3−{-| Testing nearby elements such as those defined with `above`, `below`, etc.
4−-}
5−
6−import Testable
7−import Testable.Element exposing (..)
8−import Testable.Element.Background as Background
9−import Testable.Element.Font as Font
10−import Testable.Generator
11−import Tests.Palette as Palette exposing (..)
12−
13−
14−box attrs =
15− el
16− ([ width (px 50)
17− , height (px 50)
18− , Background.color blue
19− ]
20− ++ attrs
21− )
22− none
23−
24−
25−{-| -}
26−view : List ( String, Testable.Element msg )
27−view =
28− List.concat
29− [ Testable.Generator.generate "Alignments"
30− (\layout element alignment ->
31− layout
32− [ width (px 800)
33− , height (px 800)
34− , Background.color lightGrey
35− ]
36− (element
37− ([ width (px 200)
38− , height (px 200)
39− , Background.color red
40− ]
41− ++ alignment
42− )
43− none
44− )
45− )
46− |> Testable.Generator.with Testable.Generator.allLayouts
47− |> Testable.Generator.with Testable.Generator.allElements
48− |> Testable.Generator.with Testable.Generator.allAlignments
49− ]
tests-rendering/src/Tests/All.elmdeleted−44
@@ -1,44 +0,0 @@
1−module Tests.All exposing (main)
2−
3−{-| -}
4−
5−import Layout.NestedParagraphs
6−import Layout.SafariBugIssue147
7−import Testable.Generator
8−import Testable.Runner
9−import Tests.Alignment
10−import Tests.Nearby
11−import Tests.Spacing
12−import Tests.TextWrapping
13−import Tests.Transparency
14−
15−
16−main : Testable.Runner.TestableProgram
17−main =
18− (Testable.Runner.program << List.concat)
19− [ Testable.Generator.elementInLayout "Basics" []
20− , Tests.Nearby.view
21− , Tests.Alignment.view
22− , Tests.Spacing.view
23−
24− -- [
25− -- , Tuple.pair "Transparency" Tests.Transparency.view
26− -- ]
27− -- , [ Tuple.pair "Paragraph wrapping" Tests.TextWrapping.view
28− -- ]
29− , issues
30− ]
31−
32−
33−issues =
34− [ -- Testable.Runner.rename "Weird Centering" WeirdCentering.view
35− -- , Testable.Runner.rename "Stacked scrolling columns height" StackedScrollingColumnsHeight.view
36− -- ,
37− Testable.Runner.rename "Safari bug issue147" Layout.SafariBugIssue147.view
38− , Testable.Runner.rename "Nested paragraphs" Layout.NestedParagraphs.view
39−
40− -- , Testable.Runner.rename "Issue 22, zIndex" Nearby.Issue22ZIndex.view
41− -- , Testable.Runner.rename "inFrontIssue" Nearby.InFrontIssue.view
42− -- , Testable.Runner.rename "El in fixed height column" ElInFixedHeightColumn.view
43− -- , Testable.Runner.rename "Clipped el in fixed width column" ClippedElInFixedWidthColumn.view
44− ]
tests-rendering/src/Tests/Nearby.elmdeleted−179
@@ -1,179 +0,0 @@
1−module Tests.Nearby exposing (view)
2−
3−{-| Testing nearby elements such as those defined with `above`, `below`, etc.
4−-}
5−
6−import Html
7−import Testable
8−import Testable.Element exposing (..)
9−import Testable.Element.Background as Background
10−import Testable.Element.Font as Font
11−import Testable.Generator
12−import Testable.Runner
13−import Tests.Palette as Palette exposing (..)
14−
15−
16−box attrs =
17− el
18− ([ width (px 50)
19− , height (px 50)
20− , Background.color blue
21− ]
22− ++ attrs
23− )
24− none
25−
26−
27−justBox size color attrs =
28− el
29− ([ width (px size)
30− , height (px size)
31− , Background.color color
32− ]
33− ++ attrs
34− )
35− none
36−
37−
38−littleBox name attrs =
39− el
40− ([ label name
41− , width (px 5)
42− , height (px 5)
43− ]
44− ++ attrs
45− )
46− none
47−
48−
49−p attrs =
50− paragraph
51− ([ Background.color blue
52− , Font.color white
53− , padding 20
54− ]
55− ++ attrs
56− )
57− [ text "Lorem Ipsum or something or other." ]
58−
59−
60−{-| -}
61−view : List ( String, Testable.Element msg )
62−view =
63− List.concat
64− [ [ Tuple.pair "Parent inFront above child inFront" layeredVisibility
65− , Tuple.pair "Sibling onLeft above sibling inFront" overlappingChildren
66− , Tuple.pair "el with all nearbys and alignments" master
67− , Tuple.pair "paragraph with all nearbys and alignments" masterParagraph
68− ]
69− , Testable.Generator.generate "Nearbys"
70− (\element nearby ->
71− element
72− [ nearby (box [])
73− , width (px 200)
74− , height (px 200)
75− , Background.color red
76− ]
77− none
78− )
79− |> Testable.Generator.with Testable.Generator.allElements
80− |> Testable.Generator.with Testable.Generator.nearbys
81− , Testable.Generator.generate "Nearbys with alignment"
82− (\element nearby align ->
83− element
84− [ nearby (box [ align ])
85− , width (px 200)
86− , height (px 200)
87− , Background.color red
88− ]
89− none
90− )
91− |> Testable.Generator.with Testable.Generator.allElements
92− |> Testable.Generator.with Testable.Generator.nearbys
93− |> Testable.Generator.with Testable.Generator.alignments
94− ]
95−
96−
97−layeredVisibility =
98− el
99− [ centerX
100− , inFront (justBox 40 red [ isVisible ])
101− ]
102− (el [ inFront (justBox 30 green []) ]
103− (justBox 50 blue [])
104− )
105−
106−
107−overlappingChildren =
108− row [ centerX ]
109− [ el [ inFront (justBox 40 green []) ]
110− (justBox 40 darkGrey [])
111− , el [ onLeft (littleBox "overlapping" [ isVisible, Background.color red ]) ]
112− (justBox 40 darkGrey [])
113− ]
114−
115−
116−little name attrs =
117− el
118− ([ label name
119− , width (px 5)
120− , height (px 5)
121− , Background.color darkCharcoal
122− ]
123− ++ attrs
124− )
125− none
126−
127−
128−master =
129− el [ padding 20 ] <|
130− box
131− [ above (little "above-left" [ alignLeft ])
132− , above (little "above-center" [ centerX ])
133− , above (little "above-right" [ alignRight ])
134− , below (little "below-left" [ alignLeft ])
135− , below (little "below-center" [ centerX ])
136− , below (little "below-right" [ alignRight ])
137− , onRight (little "onRight-left" [ alignTop ])
138− , onRight (little "onRight-center" [ centerY ])
139− , onRight (little "onRight-right" [ alignBottom ])
140− , onLeft (little "onLeft-left" [ alignTop ])
141− , onLeft (little "onLeft-center" [ centerY ])
142− , onLeft (little "onLeft-right" [ alignBottom ])
143− , inFront (little "infront-left-top" [ alignTop, alignLeft ])
144− , inFront (little "infront-center-top" [ alignTop, centerX ])
145− , inFront (little "infront-right-top" [ alignTop, alignRight ])
146− , inFront (little "infront-left-center" [ centerY, alignLeft ])
147− , inFront (little "infront-center-center" [ centerY, centerX ])
148− , inFront (little "infront-right-center" [ centerY, alignRight ])
149− , inFront (little "infront-left-bottom" [ alignBottom, alignLeft ])
150− , inFront (little "infront-center-bottom" [ alignBottom, centerX ])
151− , inFront (little "infront-right-bottom" [ alignBottom, alignRight ])
152− ]
153−
154−
155−masterParagraph =
156− el [ padding 20 ] <|
157− p
158− [ above (little "above-left" [ alignLeft ])
159− , above (little "above-center" [ centerX ])
160− , above (little "above-right" [ alignRight ])
161− , below (little "below-left" [ alignLeft ])
162− , below (little "below-center" [ centerX ])
163− , below (little "below-right" [ alignRight ])
164− , onRight (little "onRight-left" [ alignTop ])
165− , onRight (little "onRight-center" [ centerY ])
166− , onRight (little "onRight-right" [ alignBottom ])
167− , onLeft (little "onLeft-left" [ alignTop ])
168− , onLeft (little "onLeft-center" [ centerY ])
169− , onLeft (little "onLeft-right" [ alignBottom ])
170− , inFront (little "infront-left-top" [ alignTop, alignLeft ])
171− , inFront (little "infront-center-top" [ alignTop, centerX ])
172− , inFront (little "infront-right-top" [ alignTop, alignRight ])
173− , inFront (little "infront-left-center" [ centerY, alignLeft ])
174− , inFront (little "infront-center-center" [ centerY, centerX ])
175− , inFront (little "infront-right-center" [ centerY, alignRight ])
176− , inFront (little "infront-left-bottom" [ alignBottom, alignLeft ])
177− , inFront (little "infront-center-bottom" [ alignBottom, centerX ])
178− , inFront (little "infront-right-bottom" [ alignBottom, alignRight ])
179− ]
tests-rendering/src/Tests/Run.elmdeleted−14
@@ -1,14 +0,0 @@
1−module Tests.Run exposing (main)
2−
3−{-| _NOTE_ this is auto-generated! Notouchy!
4−-}
5−
6−import ElInFixedHeightColumn
7−import Testable.Runner
8−
9−
10−main : Testable.Runner.TestableProgram
11−main =
12− Testable.Runner.program
13− [ Testable.Runner.rename " El In Fixed Height Column" ElInFixedHeightColumn.view
14− ]
tests-rendering/src/Tests/Spacing.elmdeleted−36
@@ -1,36 +0,0 @@
1−module Tests.Spacing exposing (view)
2−
3−{-| Test that spacing works
4−-}
5−
6−import Testable
7−import Testable.Element exposing (..)
8−import Testable.Element.Background as Background
9−import Testable.Element.Font as Font
10−import Testable.Generator
11−import Tests.Palette as Palette exposing (..)
12−
13−
14−{-| -}
15−view : List ( String, Testable.Element msg )
16−view =
17− List.concat
18− [ Testable.Generator.generate "Spacing"
19− (\layout element ->
20− layout
21− [ width (px 800)
22− , height (px 800)
23− , Background.color lightGrey
24− , spacing 20
25− ]
26− (element
27− [ width (px 200)
28− , height (px 200)
29− , Background.color red
30− ]
31− none
32− )
33− )
34− |> Testable.Generator.with Testable.Generator.allLayouts
35− |> Testable.Generator.with Testable.Generator.allElements
36− ]
tests-rendering/src/Tests/TextWrapping.elmdeleted−51
@@ -1,51 +0,0 @@
1−module Tests.TextWrapping exposing (main, view)
2−
3−import Html
4−import Testable
5−import Testable.Element exposing (..)
6−import Testable.Element.Background as Background
7−import Testable.Element.Font as Font
8−import Testable.Generator
9−import Testable.Runner
10−import Tests.Palette as Palette exposing (..)
11−
12−
13−box attrs =
14− el
15− ([ width (px 50)
16− , height (px 50)
17− , Background.color blue
18− ]
19− ++ attrs
20− )
21− none
22−
23−
24−{-| -}
25−main : Html.Html msg
26−main =
27− Testable.Runner.show view
28−
29−
30−view =
31− el [] <|
32− paragraph []
33− [ Testable.Generator.box
34− ]
35−
36−
37−
38−-- column [ spacing 16 ]
39−-- [ paragraph []
40−-- [ el [] (text Testable.Generator.short)
41−-- ]
42−-- -- , paragraph []
43−-- -- [ text Testable.Generator.lorem
44−-- -- , text Testable.Generator.lorem
45−-- -- ]
46−-- -- , paragraph []
47−-- -- [ text Testable.Generator.lorem
48−-- -- , paragraph []
49−-- -- [ text Testable.Generator.lorem ]
50−-- -- ]
51−-- ]
tests/Tests/Basic.elmnew file+54
@@ -0,0 +1,54 @@
1+module Tests.Basic exposing (view)
2+
3+{-| -}
4+
5+import Element as Actual
6+import Html
7+import Testable
8+import Testable.Element as Element exposing (..)
9+import Testable.Element.Background as Background
10+import Testable.Element.Font as Font
11+import Testable.Runner
12+import Tests.Palette as Palette
13+
14+
15+{-| -}
16+main : Html.Html msg
17+main =
18+ Testable.Runner.show view
19+
20+
21+{-| -}
22+view : Testable.Element msg
23+view =
24+ row [ spacing 50, alignTop ]
25+ [ el
26+ [ width (px 200)
27+ , height (px 200)
28+ , Background.color Palette.blue
29+ , Font.color Palette.white
30+ ]
31+ (text "Hello!")
32+ , el
33+ [ width (px 200)
34+ , height (px 200)
35+ , Background.color Palette.blue
36+ , Font.color Palette.white
37+ ]
38+ (text "Hello!")
39+ , el
40+ [ width (px 200)
41+ , height (px 200)
42+ , Background.color (Actual.rgba 0 0 1 1)
43+ , Font.color Palette.white
44+ , below
45+ (el
46+ [ Background.color Palette.grey
47+ , width (px 50)
48+ , height (px 50)
49+ ]
50+ none
51+ )
52+ ]
53+ (text "Hello!")
54+ ]
tests/Tests/ColumnAlignment.elmnew file+176
@@ -0,0 +1,176 @@
1+module Tests.ColumnAlignment exposing (..)
2+
3+import Html
4+import Testable
5+import Testable.Element as Element exposing (..)
6+import Testable.Element.Background as Background
7+import Testable.Element.Font as Font
8+import Testable.Runner
9+import Tests.Palette as Palette exposing (..)
10+
11+
12+{-| -}
13+main : Html.Html msg
14+main =
15+ Testable.Runner.show view
16+
17+
18+box attrs =
19+ el
20+ ([ width (px 50)
21+ , height (px 50)
22+ , Background.color blue
23+ ]
24+ ++ attrs
25+ )
26+ none
27+
28+
29+container =
30+ el [ width (px 100), height (px 100) ]
31+
32+
33+view =
34+ let
35+ colContainer attrs children =
36+ column ([ Background.color lightGrey, spacing 20, width (px 100), height (px 500) ] ++ attrs) children
37+
38+ tallContainer attrs children =
39+ column ([ Background.color lightGrey, spacing 20, width (px 100), height fill ] ++ attrs) children
40+ in
41+ column
42+ [ width fill, spacing 20 ]
43+ [ el [] (text "Alignment Within a Column")
44+ , row [ spacing 20 ]
45+ [ colContainer []
46+ [ box [] ]
47+ , colContainer []
48+ [ box [ centerY ]
49+ ]
50+ , colContainer []
51+ [ box [ alignBottom, label "first" ]
52+ ]
53+ ]
54+ , row [ spacing 20 ]
55+ [ colContainer []
56+ [ box [] ]
57+ , colContainer []
58+ [ box []
59+ , box []
60+ , box []
61+ ]
62+ , colContainer []
63+ [ box [ alignLeft, label "first" ]
64+ , box [ centerX, label "second" ]
65+ , box [ alignRight, label "third" ]
66+ ]
67+ ]
68+ , row [ spacing 20 ]
69+ [ colContainer []
70+ [ box []
71+ , box []
72+ , box []
73+ ]
74+ , colContainer []
75+ [ box []
76+ , box []
77+ , box [ alignBottom, label "third" ]
78+ ]
79+ , colContainer []
80+ [ box []
81+ , box [ alignBottom, label "second" ]
82+ , box []
83+ ]
84+ , colContainer []
85+ [ box [ alignBottom, label "first" ]
86+ , box []
87+ , box []
88+ ]
89+ ]
90+ , text "centerY"
91+ , row [ spacing 20 ]
92+ [ colContainer [ height fill ]
93+ [ box [ centerY, label "solo" ]
94+ ]
95+ , colContainer []
96+ [ box []
97+ , box [ centerY, label "middle" ]
98+ , box []
99+ ]
100+ , colContainer []
101+ [ box []
102+ , box []
103+ , box [ centerY, label "last" ]
104+ ]
105+ ]
106+ , text "multiple centerY"
107+ , row [ height (px 800), spacing 20 ]
108+ [ tallContainer []
109+ [ box []
110+ , box [ centerY ]
111+ , box [ centerY ]
112+ , box [ centerY ]
113+ , box [ centerY ]
114+ , box [ alignBottom ]
115+ ]
116+ , tallContainer []
117+ [ box []
118+ , box [ centerY ]
119+ , box []
120+ ]
121+ , tallContainer []
122+ [ box []
123+ , box []
124+ , box [ centerY ]
125+ ]
126+ ]
127+ , text "top, center, bottom"
128+ , row [ spacing 20 ]
129+ [ colContainer []
130+ [ box [ alignTop, label "first" ]
131+ , box []
132+ , box [ alignBottom, label "last" ]
133+ ]
134+ , colContainer []
135+ [ box [ alignTop ]
136+ , box [ centerY ]
137+ , box [ alignBottom ]
138+ ]
139+ , colContainer []
140+ [ box [ alignLeft, alignTop ]
141+ , box [ centerX, centerY ]
142+ , box [ alignRight, alignBottom ]
143+ ]
144+ ]
145+ , el [ width fill ] (text "Column in a Row")
146+ , row [ width fill, spacing 20, label "row" ]
147+ [ box [ alignLeft, alignTop, label "box" ]
148+ , column
149+ [ alignLeft
150+ , alignTop
151+ , spacing 20
152+ , label "column"
153+ , Background.color lightGrey
154+ ]
155+ [ box []
156+ , box []
157+ , box []
158+ ]
159+ , column
160+ [ spacing 20
161+ , width (px 100)
162+ , alignLeft
163+ , alignTop
164+ , Background.color lightGrey
165+ ]
166+ [ box []
167+ , box []
168+ , box []
169+ ]
170+ , colContainer []
171+ [ box [ alignRight ]
172+ , box [ centerX ]
173+ , box [ alignLeft ]
174+ ]
175+ ]
176+ ]
tests/Tests/ColumnSpacing.elmnew file+68
@@ -0,0 +1,68 @@
1+module Tests.ColumnSpacing exposing (..)
2+
3+import Html
4+import Testable
5+import Testable.Element as Element exposing (..)
6+import Testable.Element.Background as Background
7+import Testable.Element.Font as Font
8+import Testable.Runner
9+import Tests.Palette as Palette exposing (..)
10+
11+
12+{-| -}
13+main : Html.Html msg
14+main =
15+ Testable.Runner.show view
16+
17+
18+box attrs =
19+ el
20+ ([ width (px 50)
21+ , height (px 50)
22+ , Background.color blue
23+ ]
24+ ++ attrs
25+ )
26+ none
27+
28+
29+tinyBox attrs =
30+ el
31+ ([ width (px 20)
32+ , height (px 20)
33+
34+ -- , centerY
35+ , Background.color darkCharcoal
36+ ]
37+ ++ attrs
38+ )
39+ none
40+
41+
42+container =
43+ el [ width (px 100), height (px 100) ]
44+
45+
46+view =
47+ let
48+ colContainer attrs children =
49+ column ([ spacing 20, width (px 100), height (px 500) ] ++ attrs) children
50+ in
51+ column
52+ []
53+ [ el [] (text "Spacing within a column")
54+ , row []
55+ [ colContainer []
56+ [ box [] ]
57+ , colContainer []
58+ [ box []
59+ , box []
60+ , box []
61+ ]
62+ , colContainer [ onRight (tinyBox []) ]
63+ [ box []
64+ , box []
65+ , box []
66+ ]
67+ ]
68+ ]
tests/Tests/ElementAlignment.elmnew file+111
@@ -0,0 +1,111 @@
1+module Tests.ElementAlignment exposing (..)
2+
3+import Generator
4+import Html
5+import Testable
6+import Testable.Element as Element exposing (..)
7+import Testable.Element.Background as Background
8+import Testable.Element.Font as Font
9+import Testable.Runner
10+import Tests.Palette as Palette exposing (..)
11+
12+
13+{-| -}
14+main : Html.Html msg
15+main =
16+ Testable.Runner.show view
17+
18+
19+box : List (Testable.Attr msg) -> Testable.Element msg
20+box attrs =
21+ el
22+ ([ width (px 50)
23+ , height (px 50)
24+ , Background.color blue
25+ ]
26+ ++ attrs
27+ )
28+ none
29+
30+
31+container : Testable.Element msg -> Testable.Element msg
32+container =
33+ el
34+ [ width (px 200)
35+ , height (px 200)
36+ , Background.color lightGrey
37+ ]
38+
39+
40+view : Testable.Element msg
41+view =
42+ column []
43+ [ el [] (text "Alignment Within an El")
44+ , container <|
45+ box []
46+ , text "alignLeft, centerX, alignRight"
47+ , column [ spacing 20 ] <|
48+ Generator.sizes
49+ (\resizeable ->
50+ row [ spacing 20 ]
51+ [ container <|
52+ resizeable [ Background.color blue, alignLeft ] none
53+ , container <|
54+ resizeable [ Background.color blue, centerX ] none
55+ , container <|
56+ resizeable [ Background.color blue, alignRight ] none
57+ ]
58+ )
59+ , text "top, centerY, bottom"
60+ , column [ spacing 20 ] <|
61+ Generator.sizes
62+ (\resizeable ->
63+ row [ spacing 20 ]
64+ [ container <|
65+ resizeable [ alignTop ] none
66+ , container <|
67+ resizeable [ centerY ] none
68+ , container <|
69+ resizeable [ alignBottom ] none
70+ ]
71+ )
72+ , text "align top ++ alignments"
73+ , column [ spacing 20 ] <|
74+ Generator.sizes
75+ (\resizeable ->
76+ row [ spacing 20 ]
77+ [ container <|
78+ resizeable [ alignTop, alignLeft ] none
79+ , container <|
80+ resizeable [ alignTop, centerX ] none
81+ , container <|
82+ resizeable [ alignTop, alignRight ] none
83+ ]
84+ )
85+ , text "centerY ++ alignments"
86+ , column [ spacing 20 ] <|
87+ Generator.sizes
88+ (\resizeable ->
89+ row [ spacing 20 ]
90+ [ container <|
91+ resizeable [ centerY, alignLeft ] none
92+ , container <|
93+ resizeable [ centerY, centerX ] none
94+ , container <|
95+ resizeable [ centerY, alignRight ] none
96+ ]
97+ )
98+ , text "alignBottom ++ alignments"
99+ , column [ spacing 20 ] <|
100+ Generator.sizes
101+ (\resizeable ->
102+ row [ spacing 20 ]
103+ [ container <|
104+ resizeable [ alignBottom, alignLeft ] none
105+ , container <|
106+ resizeable [ alignBottom, centerX ] none
107+ , container <|
108+ resizeable [ alignBottom, alignRight ] none
109+ ]
110+ )
111+ ]
tests/Tests/Nearby.elmnew file+438
@@ -0,0 +1,438 @@
1+module Tests.Nearby exposing (view)
2+
3+{-| Testing nearby elements such as those defined with `above`, `below`, etc.
4+-}
5+
6+import Html
7+import Testable
8+import Testable.Element exposing (..)
9+import Testable.Element.Background as Background
10+import Testable.Element.Font as Font
11+import Testable.Runner
12+import Tests.Palette as Palette exposing (..)
13+
14+
15+box attrs =
16+ el
17+ ([ width (px 50)
18+ , height (px 50)
19+ , Background.color blue
20+ ]
21+ ++ attrs
22+ )
23+ none
24+
25+
26+justBox size color attrs =
27+ el
28+ ([ width (px size)
29+ , height (px size)
30+ , Background.color color
31+ ]
32+ ++ attrs
33+ )
34+ none
35+
36+
37+littleBox name attrs =
38+ el
39+ ([ label name
40+ , width (px 5)
41+ , height (px 5)
42+ ]
43+ ++ attrs
44+ )
45+ none
46+
47+
48+p attrs =
49+ paragraph
50+ ([ Background.color blue
51+ , Font.color white
52+ , padding 20
53+ ]
54+ ++ attrs
55+ )
56+ [ text "Lorem Ipsum or something or other." ]
57+
58+
59+{-| -}
60+main : Html.Html msg
61+main =
62+ Testable.Runner.show view
63+
64+
65+{-| -}
66+view : Testable.Element msg
67+view =
68+ let
69+ transparentBox attrs =
70+ el
71+ ([ Font.color white
72+ , width (px 50)
73+ , height (px 50)
74+ , Background.color (rgba 52 101 164 0.8)
75+ ]
76+ ++ attrs
77+ )
78+ (text "hi")
79+
80+ -- single location name box =
81+ -- row [ height (px 100), width fill, spacing 50 ]
82+ -- [ box
83+ -- [ location
84+ -- (el
85+ -- [ width (px 20)
86+ -- , height (px 20)
87+ -- , Background.color darkCharcoal
88+ -- ]
89+ -- none
90+ -- )
91+ -- ]
92+ -- , box
93+ -- [ location
94+ -- (el
95+ -- [ width (px 20)
96+ -- , height (px 20)
97+ -- , alignLeft
98+ -- , Background.color darkCharcoal
99+ -- ]
100+ -- none
101+ -- )
102+ -- ]
103+ -- ]
104+ little name attrs =
105+ el
106+ ([ label name
107+ , width (px 5)
108+ , height (px 5)
109+ , Background.color darkCharcoal
110+ ]
111+ ++ attrs
112+ )
113+ none
114+
115+ nearby location name render =
116+ column [ spacing 32, label "column" ]
117+ [ el [ padding 20, Background.color green, Font.color white ] (text name)
118+ , row [ height (px 100), width fill, spacing 50 ]
119+ [ render
120+ [ location
121+ (el
122+ [ label name
123+ , width (px 20)
124+ , height (px 20)
125+ , Background.color darkCharcoal
126+ ]
127+ none
128+ )
129+ ]
130+ , render
131+ [ location
132+ (el
133+ [ label name
134+ , width (px 20)
135+ , height (px 20)
136+ , alignLeft
137+ , Background.color darkCharcoal
138+ ]
139+ none
140+ )
141+ ]
142+ , render
143+ [ location
144+ (el
145+ [ label name
146+ , width (px 20)
147+ , height (px 20)
148+ , centerX
149+ , Background.color darkCharcoal
150+ ]
151+ none
152+ )
153+ ]
154+ , render
155+ [ location
156+ (el
157+ [ label name
158+ , width (px 20)
159+ , height (px 20)
160+ , alignRight
161+ , Background.color darkCharcoal
162+ ]
163+ none
164+ )
165+ ]
166+ , render
167+ [ location
168+ (el
169+ [ label name
170+ , width (px 20)
171+ , height (px 20)
172+ , alignTop
173+ , Background.color darkCharcoal
174+ ]
175+ none
176+ )
177+ ]
178+ , render
179+ [ location
180+ (el
181+ [ label name
182+ , width (px 20)
183+ , height (px 20)
184+ , centerY
185+ , Background.color darkCharcoal
186+ ]
187+ none
188+ )
189+ ]
190+ , render
191+ [ location
192+ (el
193+ [ label name
194+ , width (px 20)
195+ , height (px 20)
196+ , alignBottom
197+ , Background.color darkCharcoal
198+ ]
199+ none
200+ )
201+ ]
202+ ]
203+ , text "widths/heights"
204+ , row [ height (px 100), width fill, spacing 50, label "Row" ]
205+ [ render
206+ [ location
207+ (el
208+ [ label name
209+ , width fill
210+ , height fill
211+ , Background.color darkCharcoal
212+ ]
213+ none
214+ )
215+ ]
216+ , render
217+ [ location
218+ (el
219+ [ label name
220+ , width (px 20)
221+ , height fill
222+ , Background.color darkCharcoal
223+ ]
224+ none
225+ )
226+ ]
227+ , render
228+ [ label "render"
229+ , location
230+ (el
231+ [ label name
232+ , width fill
233+ , height (px 20)
234+ , Background.color darkCharcoal
235+ ]
236+ none
237+ )
238+ ]
239+ , render
240+ [ location
241+ (el
242+ [ label name
243+ , width (px 20)
244+ , height shrink
245+ , Background.color darkCharcoal
246+ , Font.color white
247+ ]
248+ (text "h-shrink")
249+ )
250+ ]
251+ , render
252+ [ location
253+ (el
254+ [ label name
255+ , width shrink
256+ , height (px 20)
257+ , Background.color darkCharcoal
258+ , Font.color white
259+ ]
260+ (text "w-shrink")
261+ )
262+ ]
263+ ]
264+ , text "on paragraph"
265+ , row [ width fill, spacing 50, label "Row" ]
266+ [ p
267+ [ location
268+ (el
269+ [ label name
270+ , width (px 20)
271+ , height (px 20)
272+ , Background.color darkCharcoal
273+ ]
274+ none
275+ )
276+ ]
277+ , p
278+ [ location
279+ (el
280+ [ label name
281+ , width (px 20)
282+ , height (px 20)
283+ , alignLeft
284+ , Background.color darkCharcoal
285+ ]
286+ none
287+ )
288+ ]
289+ , p
290+ [ location
291+ (el
292+ [ label name
293+ , width (px 20)
294+ , height (px 20)
295+ , centerX
296+ , Background.color darkCharcoal
297+ ]
298+ none
299+ )
300+ ]
301+ , p
302+ [ location
303+ (el
304+ [ label name
305+ , width (px 20)
306+ , height (px 20)
307+ , alignRight
308+ , Background.color darkCharcoal
309+ ]
310+ none
311+ )
312+ ]
313+ , p
314+ [ location
315+ (el
316+ [ label name
317+ , width (px 20)
318+ , height (px 20)
319+ , alignTop
320+ , Background.color darkCharcoal
321+ ]
322+ none
323+ )
324+ ]
325+ , p
326+ [ location
327+ (el
328+ [ label name
329+ , width (px 20)
330+ , height (px 20)
331+ , centerY
332+ , Background.color darkCharcoal
333+ ]
334+ none
335+ )
336+ ]
337+ , p
338+ [ location
339+ (el
340+ [ label name
341+ , width (px 20)
342+ , height (px 20)
343+ , alignBottom
344+ , Background.color darkCharcoal
345+ ]
346+ none
347+ )
348+ ]
349+ ]
350+ ]
351+
352+ master =
353+ el [ padding 20 ] <|
354+ box
355+ [ above (little "above-left" [ alignLeft ])
356+ , above (little "above-center" [ centerX ])
357+ , above (little "above-right" [ alignRight ])
358+ , below (little "below-left" [ alignLeft ])
359+ , below (little "below-center" [ centerX ])
360+ , below (little "below-right" [ alignRight ])
361+ , onRight (little "onRight-left" [ alignTop ])
362+ , onRight (little "onRight-center" [ centerY ])
363+ , onRight (little "onRight-right" [ alignBottom ])
364+ , onLeft (little "onLeft-left" [ alignTop ])
365+ , onLeft (little "onLeft-center" [ centerY ])
366+ , onLeft (little "onLeft-right" [ alignBottom ])
367+ , inFront (little "infront-left-top" [ alignTop, alignLeft ])
368+ , inFront (little "infront-center-top" [ alignTop, centerX ])
369+ , inFront (little "infront-right-top" [ alignTop, alignRight ])
370+ , inFront (little "infront-left-center" [ centerY, alignLeft ])
371+ , inFront (little "infront-center-center" [ centerY, centerX ])
372+ , inFront (little "infront-right-center" [ centerY, alignRight ])
373+ , inFront (little "infront-left-bottom" [ alignBottom, alignLeft ])
374+ , inFront (little "infront-center-bottom" [ alignBottom, centerX ])
375+ , inFront (little "infront-right-bottom" [ alignBottom, alignRight ])
376+ ]
377+
378+ masterParagraph =
379+ el [ padding 20 ] <|
380+ p
381+ [ above (little "above-left" [ alignLeft ])
382+ , above (little "above-center" [ centerX ])
383+ , above (little "above-right" [ alignRight ])
384+ , below (little "below-left" [ alignLeft ])
385+ , below (little "below-center" [ centerX ])
386+ , below (little "below-right" [ alignRight ])
387+ , onRight (little "onRight-left" [ alignTop ])
388+ , onRight (little "onRight-center" [ centerY ])
389+ , onRight (little "onRight-right" [ alignBottom ])
390+ , onLeft (little "onLeft-left" [ alignTop ])
391+ , onLeft (little "onLeft-center" [ centerY ])
392+ , onLeft (little "onLeft-right" [ alignBottom ])
393+ , inFront (little "infront-left-top" [ alignTop, alignLeft ])
394+ , inFront (little "infront-center-top" [ alignTop, centerX ])
395+ , inFront (little "infront-right-top" [ alignTop, alignRight ])
396+ , inFront (little "infront-left-center" [ centerY, alignLeft ])
397+ , inFront (little "infront-center-center" [ centerY, centerX ])
398+ , inFront (little "infront-right-center" [ centerY, alignRight ])
399+ , inFront (little "infront-left-bottom" [ alignBottom, alignLeft ])
400+ , inFront (little "infront-center-bottom" [ alignBottom, centerX ])
401+ , inFront (little "infront-right-bottom" [ alignBottom, alignRight ])
402+ ]
403+ in
404+ column
405+ [ centerX, label "Nearby Elements", spacing 100 ]
406+ [ layeredVisibility
407+ , overlappingChildren
408+
409+ -- Note: visibility checks like the above
410+ -- need to be at the top so they're in the viewport
411+ , master
412+ , masterParagraph
413+ , nearby above "above" box
414+ , nearby below "below" box
415+ , nearby inFront "inFront" box
416+ , nearby onRight "onRight" box
417+ , nearby onLeft "onLeft" box
418+ , nearby behindContent "behindContent" transparentBox
419+ ]
420+
421+
422+layeredVisibility =
423+ el
424+ [ centerX
425+ , inFront (justBox 40 red [ isVisible ])
426+ ]
427+ (el [ inFront (justBox 30 green []) ]
428+ (justBox 50 blue [])
429+ )
430+
431+
432+overlappingChildren =
433+ row [ centerX ]
434+ [ el [ inFront (justBox 40 green []) ]
435+ (justBox 40 darkGrey [])
436+ , el [ onLeft (littleBox "overlapping" [ isVisible, Background.color red ]) ]
437+ (justBox 40 darkGrey [])
438+ ]
tests-rendering/src/Tests/Palette.elm → tests/Tests/Palette.elmrenamed

The content is the same.

tests/Tests/RowAlignment.elmnew file+212
@@ -0,0 +1,212 @@
1+module Tests.RowAlignment exposing (..)
2+
3+import Generator
4+import Html
5+import Testable
6+import Testable.Element as Element exposing (..)
7+import Testable.Element.Background as Background
8+import Testable.Element.Font as Font
9+import Testable.Runner
10+import Tests.Palette as Palette exposing (..)
11+
12+
13+{-| -}
14+main : Html.Html msg
15+main =
16+ Testable.Runner.show view
17+
18+
19+box attrs =
20+ el
21+ ([ width (px 50)
22+ , height (px 50)
23+ , Background.color blue
24+ ]
25+ ++ attrs
26+ )
27+ none
28+
29+
30+view =
31+ let
32+ rowContainer attrs children =
33+ row
34+ ([ spacing 20
35+ , height (px 100)
36+ , Background.color lightGrey
37+ ]
38+ ++ attrs
39+ )
40+ children
41+ in
42+ column [ width (px 500), spacing 20 ]
43+ [ el [] (text "Alignment Within a Row")
44+ , column [ spacing 20 ] <|
45+ Generator.sizes <|
46+ \resizeable ->
47+ rowContainer
48+ [ label "single child" ]
49+ [ resizeable [] none ]
50+ , column [ spacing 20 ] <|
51+ Generator.sizes <|
52+ \resizeable ->
53+ rowContainer
54+ [ label "single child" ]
55+ [ resizeable [ centerX ] none ]
56+ , column [ spacing 20 ] <|
57+ Generator.sizes <|
58+ \resizeable ->
59+ rowContainer [ label "single child" ]
60+ [ resizeable [ alignRight ] none ]
61+ , column [ spacing 20 ] <|
62+ Generator.sizes <|
63+ \resizeable ->
64+ rowContainer []
65+ [ resizeable [] none
66+ , resizeable [] none
67+ , resizeable [] none
68+ ]
69+ , column [ spacing 20 ] <|
70+ Generator.sizes <|
71+ \resizeable ->
72+ rowContainer []
73+ [ resizeable [] none
74+ , resizeable [] none
75+ , resizeable [ alignRight, label "Right Child in Row" ] none
76+ ]
77+ , column [ spacing 20 ] <|
78+ Generator.sizes <|
79+ \resizeable ->
80+ rowContainer
81+ []
82+ [ resizeable [] none
83+ , resizeable [ alignRight, label "Middle Child in Row" ] none
84+ , resizeable [] none
85+ ]
86+ , column [ spacing 20 ] <|
87+ Generator.sizes <|
88+ \resizeable ->
89+ rowContainer []
90+ [ resizeable [ alignRight, label "Left Child in Row" ] none
91+ , resizeable [] none
92+ , resizeable [] none
93+ ]
94+ , text "center X"
95+ , column [ spacing 20 ] <|
96+ Generator.sizes <|
97+ \resizeable ->
98+ rowContainer []
99+ [ resizeable [ centerX, label "Left Child in Row" ] none
100+ , resizeable [] none
101+ , resizeable [] none
102+ ]
103+ , column [ spacing 20 ] <|
104+ Generator.sizes <|
105+ \resizeable ->
106+ rowContainer []
107+ [ resizeable [] none
108+ , resizeable [ centerX, label "Middle Child in Row" ] none
109+ , resizeable [] none
110+ ]
111+ , column [ spacing 20 ] <|
112+ Generator.sizes <|
113+ \resizeable ->
114+ rowContainer []
115+ [ resizeable [] none
116+ , resizeable [] none
117+ , resizeable [ centerX, label "Right Child in Row" ] none
118+ ]
119+ , column [ spacing 20 ] <|
120+ Generator.sizes <|
121+ \resizeable ->
122+ rowContainer []
123+ [ resizeable [] none
124+ , resizeable [] none
125+ , resizeable [ centerX, label "Middle-Right Child in Row" ] none
126+ , resizeable [] none
127+ ]
128+ , column [ spacing 20 ] <|
129+ Generator.sizes <|
130+ \resizeable ->
131+ rowContainer []
132+ [ resizeable [] none
133+ , resizeable [] none
134+ , resizeable [ centerX, label "Middle-Right Child in Row" ] none
135+ , resizeable [ centerX, label "Middle-Right Child in Row" ] none
136+ , resizeable [] none
137+ ]
138+ , column [ spacing 20 ] <|
139+ Generator.sizes <|
140+ \resizeable ->
141+ rowContainer []
142+ [ resizeable [] none
143+ , resizeable [] none
144+ , resizeable [ centerX, label "Middle-Right Child in Row" ] none
145+ , resizeable [ centerX, label "Middle-Right Child in Row" ] none
146+ , resizeable [ centerX, label "Middle-Right Child in Row" ] none
147+ , resizeable [] none
148+ ]
149+ , text "left x right"
150+ , column [ spacing 20 ] <|
151+ Generator.sizes <|
152+ \resizeable ->
153+ rowContainer []
154+ [ resizeable [ alignLeft, label "Left Child in Row" ] none
155+ , resizeable [] none
156+ , resizeable [ alignRight, label "Right Child in Row" ] none
157+ ]
158+ , text "left center right"
159+ , column [ spacing 20 ] <|
160+ Generator.sizes <|
161+ \resizeable ->
162+ rowContainer []
163+ [ resizeable [ alignLeft, label "Left Child in Row" ] none
164+ , resizeable [ centerX, label "Middle Child in Row" ] none
165+ , resizeable [ alignRight, label "Right Child in Row" ] none
166+ ]
167+ , text "vertical alignment"
168+ , column [ spacing 20 ] <|
169+ Generator.sizes <|
170+ \resizeable ->
171+ rowContainer []
172+ [ resizeable [ alignTop, label "Left Child in Row" ] none
173+ , resizeable [ centerY, label "Middle Child in Row" ] none
174+ , resizeable [ alignBottom, label "Right Child in Row" ] none
175+ ]
176+ , text "x and y alignments"
177+ , column [ spacing 20 ] <|
178+ Generator.sizes <|
179+ \resizeable ->
180+ rowContainer []
181+ [ resizeable [ alignLeft, alignTop, label "Left Child" ] none
182+ , resizeable [ centerX, centerY, label "Middle Child" ] none
183+ , resizeable [ alignRight, alignBottom, label "Right Child" ] none
184+ ]
185+ , text "align Top and X alignments "
186+ , column [ spacing 20 ] <|
187+ Generator.sizes <|
188+ \resizeable ->
189+ rowContainer []
190+ [ resizeable [ alignLeft, alignTop, label "Left Child" ] none
191+ , resizeable [ centerX, alignTop, label "Middle Child" ] none
192+ , resizeable [ alignRight, alignTop, label "Right Child" ] none
193+ ]
194+ , text "align Bottom and X alignments "
195+ , column [ spacing 20 ] <|
196+ Generator.sizes <|
197+ \resizeable ->
198+ rowContainer []
199+ [ resizeable [ alignLeft, alignBottom, label "Left Child" ] none
200+ , resizeable [ centerX, alignBottom, label "Middle Child" ] none
201+ , resizeable [ alignRight, alignBottom, label "Right Child" ] none
202+ ]
203+ , text "centerY and X alignments "
204+ , column [ spacing 20 ] <|
205+ Generator.sizes <|
206+ \resizeable ->
207+ rowContainer []
208+ [ resizeable [ alignLeft, centerY, label "Left Child" ] none
209+ , resizeable [ centerX, centerY, label "Middle Child" ] none
210+ , resizeable [ alignRight, centerY, label "Right Child" ] none
211+ ]
212+ ]
tests/Tests/RowSpacing.elmnew file+69
@@ -0,0 +1,69 @@
1+module Tests.RowSpacing exposing (..)
2+
3+import Html
4+import Testable
5+import Testable.Element as Element exposing (..)
6+import Testable.Element.Background as Background
7+import Testable.Element.Font as Font
8+import Testable.Runner
9+import Tests.Palette as Palette exposing (..)
10+
11+
12+{-| -}
13+main : Html.Html msg
14+main =
15+ Testable.Runner.show view
16+
17+
18+box attrs =
19+ el
20+ ([ width (px 50)
21+ , height (px 50)
22+ , Background.color blue
23+ ]
24+ ++ attrs
25+ )
26+ none
27+
28+
29+tinyBox attrs =
30+ el
31+ ([ width (px 20)
32+ , height (px 20)
33+
34+ -- , centerY
35+ , Background.color darkCharcoal
36+ ]
37+ ++ attrs
38+ )
39+ none
40+
41+
42+container =
43+ el [ width (px 100), height (px 100) ]
44+
45+
46+view =
47+ let
48+ colContainer attrs children =
49+ row ([ spacing 20, width (px 500), height (px 120) ] ++ attrs) children
50+ in
51+ column
52+ []
53+ [ el [] (text "Spacing within a row")
54+ , column []
55+ [ box []
56+ , colContainer []
57+ [ box [] ]
58+ , colContainer []
59+ [ box []
60+ , box []
61+ , box []
62+ ]
63+ , colContainer [ below (tinyBox []) ]
64+ [ box []
65+ , box []
66+ , box []
67+ ]
68+ ]
69+ ]
tests/Tests/Run.elmnew file+29
@@ -0,0 +1,29 @@
1+port module Tests.Run exposing (main)
2+
3+{-| -}
4+
5+import Testable.Runner
6+import Tests.Basic
7+import Tests.ColumnAlignment
8+import Tests.ColumnSpacing
9+import Tests.ElementAlignment
10+import Tests.Nearby
11+import Tests.RowAlignment
12+import Tests.RowSpacing
13+import Tests.Transparency
14+
15+
16+main : Testable.Runner.TestableProgram
17+main =
18+ Testable.Runner.program
19+ [ Tuple.pair "Basic Element" Tests.Basic.view
20+ , Tuple.pair "Nearby" Tests.Nearby.view
21+ , Tuple.pair "Element Alignment" Tests.ElementAlignment.view
22+ , Tuple.pair "Transparency" Tests.Transparency.view
23+ , Tuple.pair "Column Alignment" Tests.ColumnAlignment.view
24+
25+ -- This has 12k cases, so it runs slow and sometimes crashes IE
26+ , Tuple.pair "Row Alignment" Tests.RowAlignment.view
27+ , Tuple.pair "Column Spacing" Tests.ColumnSpacing.view
28+ , Tuple.pair "Row Spacing" Tests.RowSpacing.view
29+ ]
tests-rendering/src/Tests/Table.elm.todo → tests/Tests/Table.elm.todorenamed

The content is the same.

tests-rendering/src/Tests/Transparency.elm → tests/Tests/Transparency.elmrenamed

The content is the same.

tests-rendering/src/Tests/WidthHeight.elm → tests/Tests/WidthHeight.elmrenamed

The content is the same.

tests-rendering/automation/publish-file.sh → tests/automation/publish-file.shrenamed−2
@@ -19,8 +19,6 @@ if [ -z "$(git status --porcelain)" ]; then
1919else
2020 cd "$DIRECTORY"
2121 # Uncommitted changes
22− git config --global user.email "$GIT_EMAIL"
23− git config --global user.name "$GIT_NAME"
2422 git add .
2523 git commit -m "Elm UI test for $NAME on $BUILD"
2624 git push origin master
tests/automation/run.jsnew file+291
@@ -0,0 +1,291 @@
1+const compileToString = require("node-elm-compiler").compileToString;
2+const { Builder, By, Key, until } = require('selenium-webdriver');
3+const chrome = require('selenium-webdriver/chrome');
4+const firefox = require('selenium-webdriver/firefox');
5+const fs = require('fs');
6+const program = require('commander');
7+const path = require("path");
8+const chalk = require('chalk');
9+const childProcess = require('child_process')
10+
11+program.option('-s, --sauce', 'run tests on sauce labs')
12+ .option('--chrome', 'run chrome tests (default)')
13+ .option('--firefox', 'run firefox tests')
14+ .option('--ie', 'run ie tests')
15+ .option('--edge', 'run edge tests')
16+ .option('--build [value]', 'Set build number for sauce labs')
17+ .option('--name [value]', 'Set run name for sauce labs')
18+ .option('--verbose', 'Print out all test results')
19+ .parse(process.argv)
20+
21+
22+// 'Windows 10'
23+
24+
25+const windows = {
26+ chrome: {
27+ platform: "Windows 10"
28+ , browser: "chrome"
29+ , browserVersion: "latest"
30+ },
31+ firefox: {
32+ platform: "Windows 10"
33+ , browser: "firefox"
34+ , browserVersion: "latest"
35+ },
36+ edge: {
37+ platform: "Windows 10"
38+ , browser: "MicrosoftEdge"
39+ , browserVersion: "latest"
40+ },
41+ ie: {
42+ platform: "Windows 10"
43+ , browser: "internet explorer"
44+ , browserVersion: "latest"
45+ }
46+}
47+
48+const all_windows = [
49+ windows.chrome
50+ , windows.firefox
51+ , windows.edge
52+ , windows.ie
53+]
54+
55+// "macOS 10.14"
56+const osx = {
57+ chrome: {
58+ platform: "macOS 10.14"
59+ , browser: "chrome"
60+ , browserVersion: "latest"
61+ },
62+ firefox: {
63+ platform: "macOS 10.14"
64+ , browser: "firefox"
65+ , browserVersion: "latest"
66+ },
67+ safari: {
68+ platform: "macOS 10.14"
69+ , browser: "safari"
70+ , browserVersion: "latest"
71+ }
72+}
73+
74+const all_osx = [
75+ osx.chrome
76+ , osx.firefox
77+ , osx.safari
78+]
79+
80+const all_browsers =
81+ all_windows.concat(all_osx)
82+
83+function prepare_all_envs(config) {
84+ var envs = []
85+
86+ for (i = 0; i < all_windows.length; i++) {
87+ envs.push({
88+ browser: windows[i].browser,
89+ browserVersion: windows[i].browserVersion,
90+ platform: winddows[i].platform,
91+ build: config.build,
92+ name: config.name
93+ })
94+ }
95+
96+ // for (i = 0; i < osx.length; i++) {
97+ // envs.push({
98+ // browser: osx[i].browser,
99+ // browserVersion: osx[i].browserVersion,
100+ // platform: "macOS 10.14",
101+ // build: config.build,
102+ // name: config.name
103+ // })
104+ // }
105+
106+ return envs
107+}
108+
109+async function compile_and_embed(config) {
110+ var template = fs.readFileSync(config.template)
111+ // we embed the compiled js to avoid having to start a server to read the app.
112+ await compileToString(config.elm, config.elmOptions).then(function (compiled_elm_code) {
113+ const compiled = eval(`\`${template}\``)
114+ fs.writeFileSync(config.target, compiled)
115+ });
116+}
117+
118+
119+
120+
121+function prepare_sauce_driver(env) {
122+ const username = process.env.SAUCE_USERNAME;
123+ const accessKey = process.env.SAUCE_ACCESS_KEY;
124+
125+ driver = new Builder().withCapabilities({
126+ 'browserName': env.browser,
127+ 'platformName': env.platform,
128+ 'browserVersion': env.browserVersion,
129+ /* Pass Sauce User Name and Access Key */
130+ 'sauce:options': {
131+ 'username': username,
132+ 'accessKey': accessKey,
133+ 'build': env.build,
134+ 'name': env.name
135+ }
136+ }).usingServer("https://@ondemand.saucelabs.com:443/wd/hub").build();
137+
138+ return driver;
139+}
140+
141+async function prepare_local_driver(env) {
142+ const firefoxOptions = new firefox.Options().headless()
143+ const chromeOptions = new chrome.Options().headless()
144+
145+ let driver = await new Builder()
146+ .forBrowser(env.browser)
147+ .setChromeOptions(chromeOptions)
148+ .setFirefoxOptions(firefoxOptions)
149+ .build();
150+
151+ return driver;
152+}
153+
154+async function run_test(driver, url) {
155+ var results = null
156+ try {
157+ await driver.manage().window().setRect({ width: 1200, height: 800, x: 0, y: 0 });
158+ await driver.get(url);
159+ await driver.wait(until.titleIs('tests finished'), 120 * 1000);
160+ results = await driver.executeScript("return test_results")
161+ } finally {
162+ await driver.quit();
163+ }
164+ return results
165+}
166+
167+
168+
169+(async () => {
170+ var dir = "tmp"
171+ if (!fs.existsSync(dir)) {
172+ fs.mkdirSync(dir);
173+ }
174+ console.log("Compiling tests")
175+ await compile_and_embed({
176+ template: "./tests/automation/templates/gather-styles.html",
177+ target: "./tmp/test.html",
178+ elm: ["Tests/Run.elm"],
179+ elmOptions: { cwd: "./tests" }
180+ })
181+ console.log("Done compiling")
182+
183+ if (program.sauce) {
184+ const build = program.build
185+ const name = program.name
186+
187+ if (build == null || name == null) {
188+ throw ("A Build and a Name must be specified.");
189+ }
190+
191+ var results = []
192+
193+ // Publish to netlify
194+ childProcess.execSync("sh tests/automation/publish-file.sh", {
195+ env: {
196+ FILE: "test.html",
197+ BUILD: program.build,
198+ NAME: program.name
199+ }
200+ })
201+ var url = `http://elm-ui-testing.netlify.com/tests/${program.build}/${program.name}/`
202+ console.log(`Running sauce labs test:`)
203+ console.log(` ${url}`)
204+
205+ const envs = prepare_all_envs({ build: build, name: name })
206+ var test_runs = []
207+ var test_labels = []
208+ for (i = 0; i < envs.length; i++) {
209+ var driver = prepare_sauce_driver(envs[i])
210+ test_runs.push(run_test(driver, url))
211+ test_labels.push(envs[i])
212+
213+ }
214+ var results = await Promise.all(test_runs)
215+ for (i = 0; i < results.length; i++) {
216+ print_results(renderEnvName(test_labels[i]), results[i]);
217+ }
218+
219+ } else {
220+ // Run chrome if nothing else is selected
221+ if (program.chrome || (!program.chrome && !program.firefox)) {
222+ console.log("Running locally on Chrome...")
223+ const driver = await prepare_local_driver(osx.chrome)
224+ var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
225+ print_results("Local Chrome", results);
226+ }
227+ if (program.firefox) {
228+ console.log("Running locally on Firefox...")
229+ const driver = await prepare_local_driver(osx.firefox)
230+ var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
231+ print_results("Local Firefox", results);
232+ }
233+ if (program.ie) {
234+ console.log("Running locally on IE...")
235+ const driver = await prepare_local_driver(windows.ie)
236+ var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
237+ print_results("Local IE", results);
238+ }
239+ if (program.edge) {
240+ console.log("Running locally on Edge...")
241+ const driver = await prepare_local_driver(windows.edge)
242+ var results = await run_test(driver, "file://" + path.resolve('./tmp/test.html'))
243+ print_results("Local Edge", results);
244+ }
245+ }
246+})();
247+
248+function renderEnvName(env) {
249+ return `${env.platform}, ${env.browser} ${env.browserVersion}`
250+}
251+
252+function print_results(label, results) {
253+ var total_passed = 0
254+ var total_failed = 0
255+ var i;
256+ if (program.verbose) {
257+ console.log(label)
258+ }
259+ for (i = 0; i < results.length; i++) {
260+ var passed = 0
261+ var failed = 0
262+ for (j = 0; j < results[i].results.length; j++) {
263+ if (results[i].results[j][1] == null) {
264+ passed = passed + 1
265+ } else {
266+ if (failed == 0) {
267+ if (!program.verbose) {
268+ console.log(label)
269+ }
270+ console.log(results[i].label)
271+ }
272+ failed = failed + 1
273+ console.log(" " + chalk.red("fail") + " -> " + results[i].results[j][0])
274+ console.log(" " + results[i].results[j][1].description)
275+ }
276+ }
277+ total_passed = total_passed + passed
278+ total_failed = total_failed + failed
279+
280+ if (failed != 0) {
281+ console.log(chalk.green(` ${passed} tests passed`))
282+ console.log(chalk.red(` ${failed} tests failed`))
283+ console.log()
284+ } else if (program.verbose) {
285+ console.log(results[i].label + chalk.green(` ${passed} tests passed`))
286+ }
287+ }
288+ if (total_failed == 0) {
289+ console.log(`${label} -> ` + chalk.green(`All ${total_passed} tests passed`))
290+ }
291+}
tests/automation/templates/gather-styles.htmlnew file+105
@@ -0,0 +1,105 @@
1+<!DOCTYPE HTML>
2+<html>
3+ <head>
4+ <meta charset="UTF-8">
5+ <title>Rendering Benchmark Viewer</title>
6+ <script>
7+ ${compiled_elm_code}
8+ </script>
9+ </head>
10+ <style>
11+ </style>
12+ <body id="root"></body>
13+
14+ <script type="text/javascript">
15+
16+ var app = Elm.Tests.Run.init();
17+
18+ var test_results = "waiting.."
19+
20+ app.ports.report.subscribe(function (results) {
21+ test_results = results;
22+ })
23+
24+ app.ports.analyze.subscribe(function (ids) {
25+ // ids : List String
26+ var idsLength = ids.length;
27+ var results = [];
28+ for (var i = 0; i < idsLength; i++) {
29+ var id = ids[i];
30+ var element = document.getElementById(id);
31+ if (element == null) {
32+ console.log("id " + id + " not found");
33+ }
34+ var style = getStyle(element);
35+ var bbox = getBoundingBox(element);
36+
37+ var visible = isVisible(id, bbox);
38+
39+
40+ var result = { "bbox": bbox, "style": style, "id": id, "isVisible": visible };
41+ results.push(result);
42+
43+ }
44+ app.ports.styles.send(results);
45+ });
46+
47+ function isVisible(id, bbox) {
48+ var current = document.getElementById(id);
49+ var result = 0;
50+ if (current == document.elementFromPoint(bbox['left'], bbox['top'])) {
51+ result++;
52+ }
53+ if (current == document.elementFromPoint(bbox['left'], bbox['bottom'] - 1)) {
54+ result++;
55+ }
56+ if (current == document.elementFromPoint(bbox['right'] - 1, bbox['top'])) {
57+ result++;
58+ }
59+ if (current == document.elementFromPoint(bbox['right'] - 1, bbox['bottom'] - 1)) {
60+ result++;
61+ }
62+
63+
64+ if (result == 4) {
65+ return true;
66+ } else {
67+ return false
68+ }
69+ }
70+
71+ function getStyle(element) {
72+ var props = []
73+ var style = window.getComputedStyle(element);
74+ for (var i = style.length; i--;) {
75+ var name = style.item(i);
76+ var value = style.getPropertyValue(name);
77+ props.push([name, value]);
78+ }
79+ return props;
80+ }
81+
82+ function getBoundingBox(element) {
83+ var bbox = element.getBoundingClientRect();
84+ var style = window.getComputedStyle(element, null);
85+
86+ var padding = {
87+ 'top': parseFloat(style.getPropertyValue('padding-top'))
88+ , 'bottom': parseFloat(style.getPropertyValue('padding-bottom'))
89+ , 'left': parseFloat(style.getPropertyValue('padding-left'))
90+ , 'right': parseFloat(style.getPropertyValue('padding-right'))
91+ };
92+
93+ return {
94+ 'top': bbox.top
95+ , 'bottom': bbox.bottom
96+ , 'left': bbox.left
97+ , 'right': bbox.right
98+ , 'width': bbox.width
99+ , 'height': bbox.height
100+ , 'padding': padding
101+ }
102+ }
103+
104+ </script>
105+</html>
tests/elm.jsonnew file+30
@@ -0,0 +1,30 @@
1+{
2+ "type": "application",
3+ "source-directories": [
4+ "src",
5+ "suite",
6+ "../src",
7+ "."
8+ ],
9+ "elm-version": "0.19.0",
10+ "dependencies": {
11+ "direct": {
12+ "elm/browser": "1.0.0",
13+ "elm/core": "1.0.0",
14+ "elm/html": "1.0.0",
15+ "elm/json": "1.0.0",
16+ "elm/parser": "1.1.0",
17+ "elm/random": "1.0.0",
18+ "elm/time": "1.0.0",
19+ "elm/virtual-dom": "1.0.0",
20+ "elm-explorations/test": "1.1.0"
21+ },
22+ "indirect": {
23+ "elm/url": "1.0.0"
24+ }
25+ },
26+ "test-dependencies": {
27+ "direct": {},
28+ "indirect": {}
29+ }
30+}
tests-rendering/src/Generator.elm → tests/src/Generator.elmrenamed

The content is the same.

tests-rendering/src/Testable.elm → tests/src/Testable.elmrenamed+131−337
@@ -1,48 +1,21 @@
1−module Testable exposing
2− ( Attr(..)
3− , AttributeId(..)
4− , BoundingBox
5− , Element(..)
6− , ElementType(..)
7− , Found
8− , LayoutContext(..)
9− , LayoutExpectation(..)
10− , LayoutTest
11− , Location(..)
12− , Style
13− , Surroundings
14− , TextMetrics
15− , compareFormattedColor
16− , elementTypeToString
17− , equal
18− , formatColor
19− , formatColorWithAlpha
20− , getIds
21− , getSpacing
22− , getSpacingFromAttributes
23− , lessThanOrEqual
24− , rounded
25− , runTests
26− , textHeight
27− , toElement
28− , toHtml
29− , todo
30− , true
31− )
1+module Testable exposing (Attr(..), BoundingBox, Element(..), Found, LayoutContext(..), Location(..), Style, Surroundings, addAttribute, applyLabels, compareFormattedColor, createAttributeTest, createTest, formatColor, formatColorWithAlpha, getElementId, getIds, getSpacing, idAttr, levelToString, render, renderAttribute, renderElement, runTests, toTest)
322
333{-| -}
344
355import Dict exposing (Dict)
366import Element exposing (Color)
7+import Expect
378import Html exposing (Html)
389import Html.Attributes
3910import Internal.Model as Internal
11+import Random
4012import Test exposing (Test)
13+import Test.Runner
14+import Test.Runner.Failure
4115
4216
4317type Element msg
4418 = El (List (Attr msg)) (Element msg)
45− | Link String (List (Attr msg)) (Element msg)
4619 | Row (List (Attr msg)) (List (Element msg))
4720 | Column (List (Attr msg)) (List (Element msg))
4821 | TextColumn (List (Attr msg)) (List (Element msg))
@@ -51,104 +24,22 @@ type Element msg
5124 | Empty
5225
5326
54−type ElementType
55− = ElType
56− | RowType
57− | ColumnType
58− | TextColumnType
59− | ParagraphType
60− | TextType
61− | EmptyType
62−
63−
64−elementTypeToString : ElementType -> String
65−elementTypeToString elem =
66− case elem of
67− ElType ->
68− "El"
69−
70− RowType ->
71− "Row"
72−
73− ColumnType ->
74− "Column"
75−
76− TextColumnType ->
77− "TextColumn"
78−
79− ParagraphType ->
80− "Paragraph"
81−
82− TextType ->
83− "Text"
84−
85− EmptyType ->
86− "Empty"
87−
88−
89−toElementType : Element msg -> ElementType
90−toElementType elem =
91− case elem of
92− El _ _ ->
93− ElType
94−
95− Link _ _ _ ->
96− ElType
97−
98− Row _ _ ->
99− RowType
100−
101− Column _ _ ->
102− ColumnType
103−
104− TextColumn _ _ ->
105− TextColumnType
106−
107− Paragraph _ _ ->
108− ParagraphType
109−
110− Text _ ->
111− TextType
112−
113− Empty ->
114− EmptyType
115−
116−
117−{-| We have an attribute id in order to remove tests when an overriding attribtue is assigned.
118−
119−Basically, we want to implictly test for height/width shrink.
120−
121−But we want to skip this test if width/height is already set.
122−
123−This allows us to do that by comparing identities.
124−
125−-}
126−type AttributeId
127− = NoId
128− | IsWidth
129− | IsHeight
130−
131−
13227type Attr msg
13328 = Attr (Element.Attribute msg)
134− | AttrTest
135− { test : Surroundings msg -> List LayoutExpectation
136− , label : String
137− , id : AttributeId
138− }
29+ | AttrTest (Surroundings -> Test)
13930 | Batch (List (Attr msg))
14031 | Spacing Int
14132 | Nearby
14233 { location : Location
14334 , element : Element msg
144− , test : Surroundings msg -> List LayoutExpectation
35+ , test : Surroundings -> () -> Expect.Expectation
14536 , label : String
14637 }
38+ | Label String
14739 | LabeledTest
148− { test : Surroundings msg -> List LayoutExpectation
40+ { test : Surroundings -> () -> Expect.Expectation
14941 , label : String
15042 , attr : Element.Attribute msg
151− , id : AttributeId
15243 }
15344
15445
@@ -166,20 +57,16 @@ type LayoutContext
16657 | InRow
16758 | InEl
16859 | InColumn
169− | InParagraph
170− | InTextCol
171− | AtRoot
17260
17361
174−type alias Surroundings msg =
62+type alias Surroundings =
17563 { siblings : List Found
17664 , parent : Found
17765 , children : List Found
17866 , self : Found
179− , selfElement : Element msg
18067
18168 -- These values are needed to perform some types of tests.
182− , parentLayout : LayoutContext
69+ , location : LayoutContext
18370 , parentSpacing : Int
18471 }
18572
@@ -188,36 +75,9 @@ type alias Found =
18875 { bbox : BoundingBox
18976 , style : Style
19077 , isVisible : Bool
191− , textMetrics : List TextMetrics
19278 }
19379
19480
195−type alias TextMetrics =
196− { actualBoundingBoxAscent : Float
197− , actualBoundingBoxDescent : Float
198− , actualBoundingBoxLeft : Float
199− , actualBoundingBoxRight : Float
200− , width : Float
201− }
202−
203−
204−{-| The font metrics we currently have are `actual`, meaning for the text actually rendered, not the font as a whole.
205−
206−We also know the font size is 20, so we're just going to return 20.
207−
208−TODO: improve font metric collection using something like opentype.js
209−
210−-}
211−textHeight metrics =
212− let
213− actualHeight =
214− metrics.actualBoundingBoxAscent
215− + metrics.actualBoundingBoxDescent
216− in
217− -- actualHeight / 20
218− 20
219−
220−
22181{-| -}
22282type alias Style =
22383 Dict String String
@@ -239,67 +99,6 @@ type alias BoundingBox =
23999 }
240100
241101
242−type LayoutExpectation
243− = Expect
244− { description : String
245− , result : Bool
246− }
247− | Todo String
248−
249−
250−type alias LayoutTest =
251− { elementDomId : String
252− , elementType : ElementType
253− , label : String
254− , expectations : List LayoutExpectation
255− }
256−
257−
258−
259−{- Expectations -}
260−
261−
262−floatToString : Float -> String
263−floatToString x =
264− String.fromFloat (toFloat (round (x * 100)) / 100)
265−
266−
267−lessThanOrEqual : String -> Float -> Float -> LayoutExpectation
268−lessThanOrEqual label one two =
269− Expect
270− { description = label ++ " " ++ floatToString one ++ " <= " ++ floatToString two
271− , result = one <= two
272− }
273−
274−
275−rounded : String -> { expected : Float, found : Float } -> LayoutExpectation
276−rounded label { expected, found } =
277− true
278− (label ++ "| expected " ++ floatToString expected ++ ", found " ++ floatToString found)
279− (abs (expected - found) < 1)
280−
281−
282−equal : a -> a -> LayoutExpectation
283−equal one two =
284− Expect
285− { description = "Are equal"
286− , result = one == two
287− }
288−
289−
290−true : String -> Bool -> LayoutExpectation
291−true label passing =
292− Expect
293− { description = label
294− , result = passing
295− }
296−
297−
298−todo : String -> LayoutExpectation
299−todo =
300− Todo
301−
302−
303102
304103{- Retrieve Ids -}
305104
@@ -335,9 +134,6 @@ getElementId level el =
335134 El attrs child ->
336135 id :: getElementId (0 :: level) child ++ attributeIDs attrs
337136
338− Link _ attrs child ->
339− id :: getElementId (0 :: level) child ++ attributeIDs attrs
340−
341137 Row attrs children ->
342138 id :: childrenIDs children ++ attributeIDs attrs
343139
@@ -361,19 +157,9 @@ getElementId level el =
361157{- Render as Html -}
362158
363159
364−toElement : Element msg -> Element.Element msg
365−toElement el =
366− renderElement [ 0, 0 ] el
367−
368−
369−toHtml : Element msg -> Html msg
370−toHtml el =
371− Element.layout
372− [ idAttr "0"
373− , Element.width (Element.px 1000)
374− , Element.height (Element.px 1000)
375− ]
376− <|
160+render : Element msg -> Html msg
161+render el =
162+ Element.layout [ idAttr "0" ] <|
377163 renderElement [ 0, 0 ] el
378164
379165
@@ -402,13 +188,6 @@ renderElement level el =
402188 (id :: makeAttributes attrs)
403189 (renderElement (0 :: level) child)
404190
405− Link url attrs child ->
406− Element.link
407− (id :: makeAttributes attrs)
408− { url = url
409− , label = renderElement (0 :: level) child
410− }
411−
412191 Row attrs children ->
413192 Element.row
414193 (id :: makeAttributes attrs)
@@ -448,6 +227,9 @@ renderAttribute level attrIndex attr =
448227 Spacing _ ->
449228 []
450229
230+ Label _ ->
231+ []
232+
451233 Nearby { location, element } ->
452234 case location of
453235 Above ->
@@ -480,36 +262,30 @@ renderAttribute level attrIndex attr =
480262{- Convert to Test -}
481263
482264
483−runTests : Dict String Found -> Element msg -> List LayoutTest
484−runTests harvested el =
265+toTest : String -> Dict String Found -> Element msg -> Test
266+toTest label harvested el =
485267 let
486268 maybeFound =
487269 Dict.get "se-0" harvested
488270 in
489271 case maybeFound of
490272 Nothing ->
491− [ { elementDomId = "se-0"
492− , elementType = EmptyType
493− , label = "Finding root element"
494− , expectations =
495− [ Expect
496− { description = "Locating root element for rendering tests"
497− , result = False
498− }
499− ]
500− }
501− ]
273+ Test.describe label
274+ [ Test.test "Find Root" <|
275+ \_ -> Expect.fail "unable to find root"
276+ ]
502277
503278 Just root ->
504− createTest
505− { siblings = []
506− , parent = root
507− , cache = harvested
508− , parentSpacing = 0
509− , level = [ 0, 0 ]
510− , element = el
511− , location = AtRoot
512− }
279+ Test.describe label <|
280+ createTest
281+ { siblings = []
282+ , parent = root
283+ , cache = harvested
284+ , parentSpacing = 0
285+ , level = [ 0, 0 ]
286+ , element = el
287+ , location = InEl
288+ }
513289
514290
515291levelToString : List Int -> String
@@ -529,7 +305,7 @@ createTest :
529305 , location : LayoutContext
530306 , parentSpacing : Int
531307 }
532− -> List LayoutTest
308+ -> List Test
533309createTest { siblings, parent, cache, level, element, location, parentSpacing } =
534310 let
535311 spacing =
@@ -539,7 +315,7 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
539315 id =
540316 levelToString level
541317
542− testChildren : Found -> List (Element msg) -> List LayoutTest
318+ testChildren : Found -> List (Element msg) -> List Test
543319 testChildren found children =
544320 let
545321 childrenFound =
@@ -567,13 +343,13 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
567343 { a
568344 | index : Int
569345 , previous : List Found
570− , tests : List LayoutTest
346+ , tests : List Test
571347 , upcoming : List Found
572348 }
573349 ->
574350 { index : Int
575351 , previous : List Found
576− , tests : List LayoutTest
352+ , tests : List Test
577353 , upcoming : List Found
578354 }
579355 applyChildTest found child childTest =
@@ -600,9 +376,6 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
600376 El _ _ ->
601377 InEl
602378
603− Link _ _ _ ->
604− InEl
605−
606379 Row _ _ ->
607380 InRow
608381
@@ -610,10 +383,10 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
610383 InColumn
611384
612385 TextColumn _ _ ->
613− InTextCol
386+ InColumn
614387
615388 Paragraph _ _ ->
616− InParagraph
389+ InRow
617390
618391 Text _ ->
619392 InEl
@@ -640,7 +413,7 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
640413 rest
641414 }
642415
643− tests : Found -> List (Attr msg) -> List (Element msg) -> List LayoutTest
416+ tests : Found -> List (Attr msg) -> List (Element msg) -> List Test
644417 tests self attributes children =
645418 let
646419 findBBox elem ( i, gathered ) =
@@ -680,6 +453,7 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
680453
681454 attributeTests =
682455 attributes
456+ |> applyLabels
683457 |> List.indexedMap
684458 -- Found -> Dict String Found -> List Int -> Int -> Surroundings -> Attr msg -> List Test
685459 (\i attr ->
@@ -690,9 +464,8 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
690464 { siblings = siblings
691465 , parent = parent
692466 , self = self
693− , selfElement = element
694467 , children = childrenFoundData
695− , parentLayout = location
468+ , location = location
696469 , parentSpacing = parentSpacing
697470 }
698471 attr
@@ -712,26 +485,13 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
712485 []
713486
714487 _ ->
715− [ { elementDomId = id
716− , elementType = EmptyType
717− , label = "Finding element in DOM"
718− , expectations =
719− [ Expect
720− { description = "Locating element for rendering test"
721− , result = False
722− }
723− ]
724− }
725− ]
488+ [ Test.test ("Unable to find " ++ id) (always <| Expect.fail "failed id lookup") ]
726489
727490 Just self ->
728491 case element of
729492 El attrs child ->
730493 tests self attrs [ child ]
731494
732− Link _ attrs child ->
733− tests self attrs [ child ]
734−
735495 Row attrs children ->
736496 tests self attrs children
737497
@@ -751,33 +511,59 @@ createTest { siblings, parent, cache, level, element, location, parentSpacing }
751511 []
752512
753513
754−createAttributeTest :
755− Found
756− -> Dict String Found
757− -> List Int
758− -> Int
759− -> Surroundings msg
760− -> Attr msg
761− -> List LayoutTest
514+applyLabels : List (Attr msg) -> List (Attr msg)
515+applyLabels attrs =
516+ let
517+ toLabel attr =
518+ case attr of
519+ Label label ->
520+ Just label
521+
522+ _ ->
523+ Nothing
524+
525+ newLabels =
526+ attrs
527+ |> List.filterMap toLabel
528+ |> String.join ", "
529+
530+ applyLabel newLabel attr =
531+ case attr of
532+ LabeledTest labeled ->
533+ LabeledTest
534+ { labeled
535+ | label =
536+ if newLabel == "" then
537+ labeled.label
538+
539+ else
540+ newLabel ++ ", " ++ labeled.label
541+ }
542+
543+ x ->
544+ x
545+ in
546+ List.map (applyLabel newLabels) attrs
547+
548+
549+createAttributeTest : Found -> Dict String Found -> List Int -> Int -> Surroundings -> Attr msg -> List Test
762550createAttributeTest parent cache level attrIndex surroundings attr =
763551 let
764− domId =
765− "#" ++ levelToString level
552+ indexLabel =
553+ levelToString (attrIndex :: level)
766554 in
767555 case attr of
768556 Attr _ ->
769557 []
770558
559+ Label _ ->
560+ []
561+
771562 Spacing _ ->
772563 []
773564
774− AttrTest details ->
775− [ { elementDomId = domId
776− , elementType =
777− toElementType surroundings.selfElement
778− , label = details.label
779− , expectations = details.test surroundings
780− }
565+ AttrTest test ->
566+ [ test surroundings
781567 ]
782568
783569 Nearby nearby ->
@@ -788,29 +574,16 @@ createAttributeTest parent cache level attrIndex surroundings attr =
788574 , parentSpacing = 0
789575 , level = attrIndex :: -1 :: level
790576 , location = IsNearby nearby.location
791− , element =
792− addAttribute
793− (AttrTest
794− { label = nearby.label
795− , test =
796− nearby.test
797− , id = NoId
798− }
799− )
800− nearby.element
577+ , element = addAttribute (AttrTest (\context -> Test.test (nearby.label ++ " #" ++ indexLabel) (nearby.test context))) nearby.element
801578 }
802579
803580 Batch batch ->
804581 batch
805− |> List.indexedMap (\i attribute -> createAttributeTest parent cache level i surroundings attribute)
582+ |> List.indexedMap (\i attribute -> createAttributeTest parent cache (attrIndex :: level) i surroundings attribute)
806583 |> List.concat
807584
808585 LabeledTest { label, test } ->
809− [ { elementDomId = domId
810− , elementType = toElementType surroundings.selfElement
811− , label = label
812− , expectations = test surroundings
813− }
586+ [ Test.test (label ++ " #" ++ indexLabel) (test surroundings)
814587 ]
815588
816589
@@ -820,9 +593,6 @@ addAttribute attr el =
820593 El attrs child ->
821594 El (attr :: attrs) child
822595
823− Link url attrs child ->
824− Link url (attr :: attrs) child
825−
826596 Row attrs children ->
827597 Row (attr :: attrs) children
828598
@@ -842,6 +612,48 @@ addAttribute attr el =
842612 Text str
843613
844614
615+runTests :
616+ Random.Seed
617+ -> Test
618+ ->
619+ List
620+ ( String
621+ , Maybe
622+ { given : Maybe String
623+ , description : String
624+ , reason : Test.Runner.Failure.Reason
625+ }
626+ )
627+runTests seed tests =
628+ let
629+ run runner =
630+ let
631+ ran =
632+ List.map Test.Runner.getFailureReason (runner.run ())
633+ in
634+ List.map2 Tuple.pair runner.labels ran
635+
636+ results =
637+ case Test.Runner.fromTest 100 seed tests of
638+ Test.Runner.Plain rnrs ->
639+ List.map run rnrs
640+
641+ Test.Runner.Only rnrs ->
642+ List.map run rnrs
643+
644+ Test.Runner.Skipping rnrs ->
645+ List.map run rnrs
646+
647+ Test.Runner.Invalid invalid ->
648+ let
649+ _ =
650+ Debug.log "Invalid tests" invalid
651+ in
652+ []
653+ in
654+ List.concat results
655+
656+
845657compareFormattedColor : Color -> String -> Bool
846658compareFormattedColor color expected =
847659 formatColor color == expected || formatColorWithAlpha color == expected
@@ -878,21 +690,6 @@ formatColor (Internal.Rgba red green blue alpha) =
878690 ++ ")"
879691
880692
881−getSpacingFromAttributes attrs =
882− case attrs of
883− [] ->
884− 0
885−
886− (Spacing i) :: remain ->
887− i
888−
889− (Batch batched) :: remain ->
890− getSpacingFromAttributes (batched ++ remain)
891−
892− _ :: remain ->
893− getSpacingFromAttributes remain
894−
895−
896693getSpacing : Element msg -> Maybe Int
897694getSpacing el =
898695 let
@@ -918,9 +715,6 @@ getSpacing el =
918715 El attrs _ ->
919716 filterAttrs attrs
920717
921− Link _ attrs _ ->
922− filterAttrs attrs
923−
924718 Row attrs _ ->
925719 filterAttrs attrs
926720
tests/src/Testable/Element.elmnew file+1107
@@ -0,0 +1,1107 @@
1+module Testable.Element exposing
2+ ( Length(..)
3+ , above
4+ , alignBottom
5+ , alignLeft
6+ , alignRight
7+ , alignTop
8+ , alpha
9+ , behindContent
10+ , below
11+ , centerX
12+ , centerY
13+ , column
14+ , el
15+ , expectRoundedEquality
16+ , fill
17+ , fillPortion
18+ , height
19+ , inFront
20+ , isVisible
21+ , label
22+ , maximum
23+ , minimum
24+ , none
25+ , onLeft
26+ , onRight
27+ , padding
28+ , paddingXY
29+ , paragraph
30+ , px
31+ , row
32+ , shrink
33+ , spacing
34+ , text
35+ , textColumn
36+ , transparent
37+ , width
38+ )
39+
40+{-| This module should mirror the top level `Element` api, with one important distinction.
41+
42+The resulting `Element msg` structure can either be rendered to Html or transformed into a test suite that can be run.
43+
44+In order to run the test:
45+
46+ - render html
47+ - gather information from the browser
48+ - generate tests
49+
50+-}
51+
52+import Dict
53+import Element
54+import Expect
55+import Html.Attributes
56+import Testable
57+
58+
59+text : String -> Testable.Element msg
60+text =
61+ Testable.Text
62+
63+
64+el : List (Testable.Attr msg) -> Testable.Element msg -> Testable.Element msg
65+el =
66+ Testable.El
67+
68+
69+row : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
70+row =
71+ Testable.Row
72+
73+
74+column : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
75+column =
76+ Testable.Column
77+
78+
79+none : Testable.Element msg
80+none =
81+ Testable.Empty
82+
83+
84+paragraph : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
85+paragraph =
86+ Testable.Paragraph
87+
88+
89+textColumn : List (Testable.Attr msg) -> List (Testable.Element msg) -> Testable.Element msg
90+textColumn =
91+ Testable.TextColumn
92+
93+
94+type Length
95+ = Px Int
96+ | Fill Int
97+ | Shrink
98+ | Minimum Int Length
99+ | Maximum Int Length
100+
101+
102+minimum =
103+ Minimum
104+
105+
106+maximum =
107+ Maximum
108+
109+
110+px : Int -> Length
111+px =
112+ Px
113+
114+
115+fill : Length
116+fill =
117+ Fill 1
118+
119+
120+shrink : Length
121+shrink =
122+ Shrink
123+
124+
125+fillPortion : Int -> Length
126+fillPortion =
127+ Fill
128+
129+
130+label : String -> Testable.Attr msg
131+label =
132+ Testable.Label
133+
134+
135+transparent : Bool -> Testable.Attr msg
136+transparent on =
137+ Testable.LabeledTest
138+ { label =
139+ if on then
140+ "transparent"
141+
142+ else
143+ "opaque"
144+ , attr = Element.transparent on
145+ , test =
146+ \context _ ->
147+ let
148+ selfTransparency =
149+ context.self.style
150+ |> Dict.get "opacity"
151+ |> Maybe.withDefault "notfound"
152+
153+ value =
154+ if on then
155+ "0"
156+
157+ else
158+ "1"
159+ in
160+ Expect.equal value selfTransparency
161+ }
162+
163+
164+{-| -}
165+isVisible : Testable.Attr msg
166+isVisible =
167+ Testable.LabeledTest
168+ { label = "is-visible"
169+ , attr = Element.htmlAttribute (Html.Attributes.style "not" "applicable")
170+ , test =
171+ \context _ ->
172+ Expect.equal context.self.isVisible True
173+ }
174+
175+
176+{-| -}
177+alpha : Float -> Testable.Attr msg
178+alpha a =
179+ Testable.LabeledTest
180+ { label = "alpha-" ++ String.fromFloat a
181+ , attr = Element.alpha a
182+ , test =
183+ \context _ ->
184+ let
185+ selfTransparency =
186+ context.self.style
187+ |> Dict.get "opacity"
188+ |> Maybe.withDefault "notfound"
189+ in
190+ Expect.equal (String.fromFloat a) selfTransparency
191+ }
192+
193+
194+{-| -}
195+padding : Int -> Testable.Attr msg
196+padding pad =
197+ Testable.LabeledTest
198+ { label = "padding " ++ String.fromInt pad
199+ , attr = Element.padding pad
200+ , test =
201+ \found _ ->
202+ Expect.true ("Padding " ++ String.fromInt pad ++ " is present")
203+ (List.all ((==) pad)
204+ [ floor found.self.bbox.padding.left
205+ , floor found.self.bbox.padding.right
206+ , floor found.self.bbox.padding.top
207+ , floor found.self.bbox.padding.bottom
208+ ]
209+ )
210+ }
211+
212+
213+{-| -}
214+paddingXY : Int -> Int -> Testable.Attr msg
215+paddingXY x y =
216+ Testable.LabeledTest
217+ { label = "paddingXY " ++ String.fromInt x ++ ", " ++ String.fromInt y
218+ , attr = Element.paddingXY x y
219+ , test =
220+ \found _ ->
221+ Expect.true ("PaddingXY (" ++ String.fromInt x ++ ", " ++ String.fromInt y ++ ") is present")
222+ (List.all ((==) x)
223+ [ floor found.self.bbox.padding.left
224+ , floor found.self.bbox.padding.right
225+ ]
226+ && List.all ((==) y)
227+ [ floor found.self.bbox.padding.top
228+ , floor found.self.bbox.padding.bottom
229+ ]
230+ )
231+ }
232+
233+
234+widthHelper maybeMin maybeMax len =
235+ let
236+ addMin l =
237+ case maybeMin of
238+ Nothing ->
239+ l
240+
241+ Just minPx ->
242+ l |> Element.minimum minPx
243+
244+ addMax l =
245+ case maybeMax of
246+ Nothing ->
247+ l
248+
249+ Just maxPx ->
250+ l |> Element.maximum maxPx
251+
252+ minLabel =
253+ case maybeMin of
254+ Nothing ->
255+ ""
256+
257+ Just i ->
258+ " min:" ++ String.fromInt i
259+
260+ maxLabel =
261+ case maybeMax of
262+ Nothing ->
263+ ""
264+
265+ Just i ->
266+ " max:" ++ String.fromInt i
267+
268+ minMaxTest actualWidth =
269+ case ( maybeMin, maybeMax ) of
270+ ( Nothing, Nothing ) ->
271+ True
272+
273+ ( Just lower, Nothing ) ->
274+ lower <= actualWidth
275+
276+ ( Just lower, Just higher ) ->
277+ lower <= actualWidth && actualWidth <= higher
278+
279+ ( Nothing, Just higher ) ->
280+ actualWidth <= higher
281+ in
282+ case len of
283+ Minimum m newLen ->
284+ widthHelper (Just m) maybeMax newLen
285+
286+ Maximum m newLen ->
287+ widthHelper maybeMin (Just m) newLen
288+
289+ Px val ->
290+ -- Pixel values should ignore min and max?
291+ Testable.LabeledTest
292+ { label = "width " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
293+ , attr =
294+ Element.width
295+ (Element.px val
296+ |> addMin
297+ |> addMax
298+ )
299+ , test =
300+ \found _ ->
301+ Expect.all
302+ [ \_ ->
303+ Expect.true "exact width is exact" (floor found.self.bbox.width == val)
304+ , \_ -> Expect.true "min/max is upheld" (minMaxTest (floor found.self.bbox.width))
305+ ]
306+ ()
307+ }
308+
309+ Fill portion ->
310+ Testable.LabeledTest
311+ { label = "width fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
312+ , attr =
313+ Element.width
314+ (Element.fillPortion portion
315+ |> addMin
316+ |> addMax
317+ )
318+ , test =
319+ \context _ ->
320+ if List.member context.location [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
321+ Expect.true "width fill doesn't apply to onright/onleft elements" True
322+
323+ else
324+ let
325+ parentAvailableWidth =
326+ context.parent.bbox.width - (context.self.bbox.padding.left + context.self.bbox.padding.right)
327+ in
328+ case context.location of
329+ Testable.IsNearby _ ->
330+ Expect.true "Nearby Element has fill width"
331+ ((floor context.parent.bbox.width == floor context.self.bbox.width)
332+ || minMaxTest (floor context.self.bbox.width)
333+ )
334+
335+ Testable.InColumn ->
336+ Expect.true "Element within column has fill width"
337+ ((floor parentAvailableWidth == floor context.self.bbox.width)
338+ || minMaxTest (floor context.self.bbox.width)
339+ )
340+
341+ Testable.InEl ->
342+ Expect.true "Element within element has fill width" <|
343+ (floor parentAvailableWidth == floor context.self.bbox.width)
344+ || minMaxTest (floor context.self.bbox.width)
345+
346+ _ ->
347+ let
348+ spacePerPortion =
349+ parentAvailableWidth / toFloat (List.length context.siblings + 1)
350+ in
351+ Expect.true "element has fill width" <|
352+ (floor spacePerPortion == floor context.self.bbox.width)
353+ || minMaxTest (floor context.self.bbox.width)
354+ }
355+
356+ Shrink ->
357+ Testable.LabeledTest
358+ { label = "width shrink" ++ minLabel ++ maxLabel
359+ , attr =
360+ Element.width
361+ (Element.shrink
362+ |> addMin
363+ |> addMax
364+ )
365+ , test =
366+ \context _ ->
367+ let
368+ childWidth child =
369+ -- TODO: add margin values to widths
370+ child.bbox.width
371+
372+ totalChildren =
373+ context.children
374+ |> List.map childWidth
375+ |> List.sum
376+
377+ horizontalPadding =
378+ context.self.bbox.padding.left + context.self.bbox.padding.right
379+
380+ spacingValue =
381+ toFloat context.parentSpacing * (toFloat (List.length context.children) - 1)
382+ in
383+ if totalChildren == 0 then
384+ -- TODO: The issue is that we have a hard time measuring `text` elements
385+ -- So if a element has a text child, then it's width isn't going to show up in the system.
386+ expectRoundedEquality context.self.bbox.width context.self.bbox.width
387+
388+ else
389+ -- This fails if this element is actually a column
390+ -- So we need to capture what this element is in order to do this calculation.
391+ expectRoundedEquality (totalChildren + horizontalPadding + spacingValue) context.self.bbox.width
392+ }
393+
394+
395+heightHelper maybeMin maybeMax len =
396+ let
397+ addMin l =
398+ case maybeMin of
399+ Nothing ->
400+ l
401+
402+ Just minPx ->
403+ l |> Element.minimum minPx
404+
405+ addMax l =
406+ case maybeMax of
407+ Nothing ->
408+ l
409+
410+ Just maxPx ->
411+ l |> Element.maximum maxPx
412+
413+ minLabel =
414+ case maybeMin of
415+ Nothing ->
416+ ""
417+
418+ Just i ->
419+ " min:" ++ String.fromInt i
420+
421+ maxLabel =
422+ case maybeMax of
423+ Nothing ->
424+ ""
425+
426+ Just i ->
427+ " max:" ++ String.fromInt i
428+
429+ minMaxTest actualheight =
430+ case ( maybeMin, maybeMax ) of
431+ ( Nothing, Nothing ) ->
432+ True
433+
434+ ( Just lower, Nothing ) ->
435+ lower <= actualheight
436+
437+ ( Just lower, Just higher ) ->
438+ lower <= actualheight && actualheight <= higher
439+
440+ ( Nothing, Just higher ) ->
441+ actualheight <= higher
442+ in
443+ case len of
444+ Minimum m newLen ->
445+ heightHelper (Just m) maybeMax newLen
446+
447+ Maximum m newLen ->
448+ heightHelper maybeMin (Just m) newLen
449+
450+ Px val ->
451+ -- Pixel values should ignore min and max?
452+ Testable.LabeledTest
453+ { label = "height " ++ String.fromInt val ++ "px" ++ minLabel ++ maxLabel
454+ , attr =
455+ Element.height
456+ (Element.px val
457+ |> addMin
458+ |> addMax
459+ )
460+ , test =
461+ \found _ ->
462+ Expect.all
463+ [ \_ ->
464+ Expect.true ("exact height is exact: " ++ String.fromInt (floor found.self.bbox.height) ++ "," ++ String.fromInt val)
465+ (floor found.self.bbox.height == val)
466+ , \_ ->
467+ Expect.true "min/max holds true"
468+ (minMaxTest (floor found.self.bbox.height))
469+ ]
470+ ()
471+ }
472+
473+ Fill portion ->
474+ Testable.LabeledTest
475+ { label = "height fill-" ++ String.fromInt portion ++ minLabel ++ maxLabel
476+ , attr =
477+ Element.height
478+ (Element.fillPortion portion
479+ |> addMin
480+ |> addMax
481+ )
482+ , test =
483+ \context _ ->
484+ if List.member context.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
485+ Expect.true "height fill doesn't apply to above/below elements" True
486+
487+ else
488+ let
489+ parentAvailableHeight =
490+ context.parent.bbox.height - (context.self.bbox.padding.top + context.self.bbox.padding.bottom)
491+ in
492+ case context.location of
493+ Testable.IsNearby _ ->
494+ Expect.true "Nearby Element has fill height"
495+ ((floor context.parent.bbox.height == floor context.self.bbox.height)
496+ || minMaxTest (floor context.self.bbox.height)
497+ )
498+
499+ Testable.InColumn ->
500+ Expect.true "Element within column has fill height"
501+ ((floor parentAvailableHeight == floor context.self.bbox.height)
502+ || minMaxTest (floor context.self.bbox.height)
503+ )
504+
505+ Testable.InEl ->
506+ Expect.true "Element within el has fill height" <|
507+ (floor parentAvailableHeight == floor context.self.bbox.height)
508+ || minMaxTest (floor context.self.bbox.height)
509+
510+ _ ->
511+ let
512+ spacePerPortion =
513+ parentAvailableHeight / toFloat (List.length context.siblings + 1)
514+ in
515+ Expect.true "el has fill height" <|
516+ (floor spacePerPortion == floor context.self.bbox.height)
517+ || minMaxTest (floor context.self.bbox.height)
518+ }
519+
520+ Shrink ->
521+ Testable.LabeledTest
522+ { label = "height shrink" ++ minLabel ++ maxLabel
523+ , attr =
524+ Element.height
525+ (Element.shrink
526+ |> addMin
527+ |> addMax
528+ )
529+ , test =
530+ \context _ ->
531+ let
532+ childWidth child =
533+ -- TODO: add margin values to heights
534+ child.bbox.height
535+
536+ totalChildren =
537+ context.children
538+ |> List.map childWidth
539+ |> List.sum
540+
541+ verticalPadding =
542+ context.self.bbox.padding.top + context.self.bbox.padding.bottom
543+
544+ spacingValue =
545+ toFloat context.parentSpacing * (toFloat (List.length context.children) - 1)
546+ in
547+ if totalChildren == 0 then
548+ -- TODO: The issue is that we have a hard time measuring `text` elements
549+ -- So if a element has a text child, then it's height isn't going to show up in the system.
550+ expectRoundedEquality context.self.bbox.height context.self.bbox.height
551+
552+ else
553+ -- This fails if this element is actually a column
554+ -- So we need to capture what this element is in order to do this calculation.
555+ expectRoundedEquality (totalChildren + verticalPadding + spacingValue) context.self.bbox.height
556+ }
557+
558+
559+width : Length -> Testable.Attr msg
560+width len =
561+ widthHelper Nothing Nothing len
562+
563+
564+height : Length -> Testable.Attr msg
565+height len =
566+ heightHelper Nothing Nothing len
567+
568+
569+spacing : Int -> Testable.Attr msg
570+spacing space =
571+ Testable.Batch
572+ [ Testable.Spacing space
573+ , Testable.LabeledTest
574+ { label = "spacing: " ++ String.fromInt space
575+ , attr = Element.spacing space
576+ , test =
577+ \found _ ->
578+ let
579+ findDistance child total =
580+ List.concatMap
581+ (\otherChild ->
582+ let
583+ horizontal =
584+ round <|
585+ child.bbox.left
586+ - otherChild.bbox.right
587+
588+ vertical =
589+ round <|
590+ child.bbox.top
591+ - otherChild.bbox.bottom
592+ in
593+ [ if horizontal > 0 then
594+ horizontal
595+
596+ else
597+ space
598+ , if vertical > 0 then
599+ vertical
600+
601+ else
602+ space
603+ ]
604+ )
605+ found.children
606+ ++ total
607+
608+ distances =
609+ List.foldl findDistance [] found.children
610+
611+ allAreSpaced =
612+ List.foldl
613+ (\x wrong ->
614+ if not (x >= space) then
615+ x :: wrong
616+
617+ else
618+ wrong
619+ )
620+ []
621+ distances
622+ in
623+ Expect.true
624+ ("All children are at least "
625+ ++ String.fromInt space
626+ ++ " pixels apart."
627+ ++ Debug.toString allAreSpaced
628+ ++ " are not though"
629+ )
630+ (allAreSpaced == [])
631+ }
632+ ]
633+
634+
635+{-| alignLeft needs to account for
636+
637+ - parent padding
638+ - elements to the left
639+ - spacing value
640+
641+in order to calculate the expected result.
642+
643+Also need parent rendering context if this is to work with wrapped rows in the future.
644+
645+All sibling elements
646+
647+-}
648+alignLeft : Testable.Attr msg
649+alignLeft =
650+ Testable.LabeledTest
651+ { label = "alignLeft"
652+ , attr = Element.alignLeft
653+ , test =
654+ \found _ ->
655+ if List.member found.location [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
656+ Expect.true "alignLeft doesn't apply to elements that are onLeft or onRight" True
657+
658+ else if
659+ List.member found.location
660+ [ Testable.IsNearby Testable.InFront
661+ , Testable.IsNearby Testable.Behind
662+ , Testable.IsNearby Testable.Above
663+ , Testable.IsNearby Testable.Below
664+ ]
665+ then
666+ expectRoundedEquality
667+ found.self.bbox.left
668+ found.parent.bbox.left
669+
670+ else if List.length found.siblings == 0 then
671+ expectRoundedEquality
672+ found.self.bbox.left
673+ (found.parent.bbox.left + found.parent.bbox.padding.left)
674+
675+ else
676+ case found.location of
677+ Testable.InRow ->
678+ let
679+ siblingsOnLeft =
680+ List.filter (\x -> x.bbox.right < found.self.bbox.left) found.siblings
681+
682+ spacings =
683+ toFloat (List.length siblingsOnLeft * found.parentSpacing)
684+
685+ widthsOnLeft =
686+ siblingsOnLeft
687+ |> List.map (.width << .bbox)
688+ |> List.sum
689+ in
690+ expectRoundedEquality
691+ found.self.bbox.left
692+ (found.parent.bbox.left + (found.parent.bbox.padding.left + widthsOnLeft + spacings))
693+
694+ _ ->
695+ expectRoundedEquality
696+ found.self.bbox.left
697+ (found.parent.bbox.left + found.parent.bbox.padding.left)
698+ }
699+
700+
701+{-| -}
702+centerX : Testable.Attr msg
703+centerX =
704+ Testable.LabeledTest
705+ { label = "centerX"
706+ , attr = Element.centerX
707+ , test =
708+ \found _ ->
709+ let
710+ selfCenter : Float
711+ selfCenter =
712+ found.self.bbox.left + (found.self.bbox.width / 2)
713+
714+ parentCenter : Float
715+ parentCenter =
716+ found.parent.bbox.left + (found.parent.bbox.width / 2)
717+ in
718+ if List.member found.location [ Testable.IsNearby Testable.OnRight, Testable.IsNearby Testable.OnLeft ] then
719+ Expect.true "centerX doesn't apply to elements that are onLeft or onRight" True
720+
721+ else if List.length found.siblings == 0 then
722+ expectRoundedEquality
723+ selfCenter
724+ parentCenter
725+
726+ else
727+ case found.location of
728+ Testable.InRow ->
729+ let
730+ siblingsOnLeft =
731+ List.filter (\x -> x.bbox.right < found.self.bbox.left) found.siblings
732+
733+ siblingsOnRight =
734+ List.filter (\x -> x.bbox.left > found.self.bbox.right) found.siblings
735+
736+ widthsOnLeft : Float
737+ widthsOnLeft =
738+ siblingsOnLeft
739+ |> List.map (.width << .bbox)
740+ |> List.sum
741+ |> (\x -> x + (toFloat (List.length siblingsOnLeft) * toFloat found.parentSpacing))
742+
743+ widthsOnRight =
744+ siblingsOnRight
745+ |> List.map (.width << .bbox)
746+ |> List.sum
747+ |> (\x -> x + (toFloat (List.length siblingsOnRight) * toFloat found.parentSpacing))
748+
749+ expectedCenter : Float
750+ expectedCenter =
751+ found.parent.bbox.left
752+ + widthsOnLeft
753+ + ((found.parent.bbox.width - (widthsOnRight + widthsOnLeft))
754+ / 2
755+ )
756+ in
757+ expectRoundedEquality
758+ selfCenter
759+ expectedCenter
760+
761+ _ ->
762+ expectRoundedEquality selfCenter parentCenter
763+ }
764+
765+
766+{-| -}
767+alignRight : Testable.Attr msg
768+alignRight =
769+ Testable.LabeledTest
770+ { label = "alignRight"
771+ , attr = Element.alignRight
772+ , test =
773+ \found _ ->
774+ if List.member found.location [ Testable.IsNearby Testable.OnLeft, Testable.IsNearby Testable.OnRight ] then
775+ Expect.true "alignRight doesn't apply to elements that are onLeft or onRight" True
776+
777+ else if
778+ List.member found.location
779+ [ Testable.IsNearby Testable.InFront
780+ , Testable.IsNearby Testable.Behind
781+ , Testable.IsNearby Testable.Above
782+ , Testable.IsNearby Testable.Below
783+ ]
784+ then
785+ expectRoundedEquality
786+ found.self.bbox.right
787+ found.parent.bbox.right
788+
789+ else if List.length found.siblings == 0 then
790+ expectRoundedEquality
791+ found.self.bbox.right
792+ (found.parent.bbox.right + found.parent.bbox.padding.right)
793+
794+ else
795+ case found.location of
796+ Testable.InRow ->
797+ let
798+ siblingsOnRight =
799+ List.filter (\x -> x.bbox.left > found.self.bbox.right) found.siblings
800+
801+ spacings =
802+ toFloat (List.length siblingsOnRight * found.parentSpacing)
803+
804+ widthsOnRight =
805+ siblingsOnRight
806+ |> List.map (.width << .bbox)
807+ |> List.sum
808+ in
809+ expectRoundedEquality
810+ found.self.bbox.right
811+ (found.parent.bbox.right - (found.parent.bbox.padding.right + widthsOnRight + spacings))
812+
813+ _ ->
814+ expectRoundedEquality
815+ found.self.bbox.right
816+ (found.parent.bbox.right + found.parent.bbox.padding.right)
817+ }
818+
819+
820+{-| -}
821+alignTop : Testable.Attr msg
822+alignTop =
823+ Testable.LabeledTest
824+ { label = "alignTop"
825+ , attr = Element.alignTop
826+ , test =
827+ \found _ ->
828+ if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
829+ Expect.true "alignTop doesn't apply to elements that are above or below" True
830+
831+ else if
832+ List.member found.location
833+ [ Testable.IsNearby Testable.InFront
834+ , Testable.IsNearby Testable.Behind
835+ , Testable.IsNearby Testable.OnRight
836+ , Testable.IsNearby Testable.OnLeft
837+ ]
838+ then
839+ expectRoundedEquality
840+ found.self.bbox.top
841+ found.parent.bbox.top
842+
843+ else if List.length found.siblings == 0 then
844+ expectRoundedEquality
845+ found.self.bbox.top
846+ (found.parent.bbox.top + found.parent.bbox.padding.top)
847+
848+ else
849+ case found.location of
850+ Testable.InColumn ->
851+ let
852+ siblingsAbove =
853+ List.filter (\x -> x.bbox.bottom < found.self.bbox.top) found.siblings
854+
855+ spacings =
856+ toFloat (List.length siblingsAbove * found.parentSpacing)
857+
858+ heightsAbove =
859+ siblingsAbove
860+ |> List.map (.height << .bbox)
861+ |> List.sum
862+ in
863+ expectRoundedEquality
864+ found.self.bbox.top
865+ (found.parent.bbox.top + (found.parent.bbox.padding.top + heightsAbove + spacings))
866+
867+ _ ->
868+ expectRoundedEquality
869+ found.self.bbox.top
870+ found.parent.bbox.top
871+ }
872+
873+
874+{-| -}
875+alignBottom : Testable.Attr msg
876+alignBottom =
877+ Testable.LabeledTest
878+ { label = "alignBottom"
879+ , attr = Element.alignBottom
880+ , test =
881+ \found _ ->
882+ if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
883+ Expect.true "alignBottom doesn't apply to elements that are above or below" True
884+
885+ else if
886+ List.member found.location
887+ [ Testable.IsNearby Testable.InFront
888+ , Testable.IsNearby Testable.Behind
889+ , Testable.IsNearby Testable.OnRight
890+ , Testable.IsNearby Testable.OnLeft
891+ ]
892+ then
893+ expectRoundedEquality
894+ found.self.bbox.bottom
895+ found.parent.bbox.bottom
896+
897+ else if List.length found.siblings == 0 then
898+ expectRoundedEquality
899+ found.self.bbox.bottom
900+ (found.parent.bbox.bottom + found.parent.bbox.padding.bottom)
901+
902+ else
903+ case found.location of
904+ Testable.InColumn ->
905+ let
906+ siblingsBelow =
907+ List.filter (\x -> x.bbox.top > found.self.bbox.bottom) found.siblings
908+
909+ spacings =
910+ toFloat (List.length siblingsBelow * found.parentSpacing)
911+
912+ heightsBelow =
913+ siblingsBelow
914+ |> List.map (.height << .bbox)
915+ |> List.sum
916+ in
917+ expectRoundedEquality
918+ found.self.bbox.bottom
919+ (found.parent.bbox.bottom - (found.parent.bbox.padding.bottom + heightsBelow + spacings))
920+
921+ _ ->
922+ expectRoundedEquality
923+ found.self.bbox.bottom
924+ (found.parent.bbox.bottom + found.parent.bbox.padding.bottom)
925+ }
926+
927+
928+expectRoundedEquality x y =
929+ Expect.true ("within 1 of each other " ++ String.fromFloat x ++ ":" ++ String.fromFloat y)
930+ (abs (x - y) < 1)
931+
932+
933+{-| -}
934+centerY : Testable.Attr msg
935+centerY =
936+ Testable.LabeledTest
937+ { label = "centerY"
938+ , attr = Element.centerY
939+ , test =
940+ \found _ ->
941+ let
942+ selfCenter =
943+ found.self.bbox.top + (found.self.bbox.height / 2)
944+
945+ parentCenter =
946+ found.parent.bbox.top + (found.parent.bbox.height / 2)
947+ in
948+ if List.member found.location [ Testable.IsNearby Testable.Above, Testable.IsNearby Testable.Below ] then
949+ Expect.true "centerY doesn't apply to elements that are above or below" True
950+
951+ else if List.length found.siblings == 0 then
952+ expectRoundedEquality
953+ selfCenter
954+ parentCenter
955+
956+ else
957+ case found.location of
958+ Testable.InColumn ->
959+ let
960+ siblingsOnTop =
961+ List.filter (\x -> x.bbox.bottom < found.self.bbox.top) found.siblings
962+
963+ siblingsBelow =
964+ List.filter (\x -> x.bbox.top > found.self.bbox.bottom) found.siblings
965+
966+ heightsAbove : Float
967+ heightsAbove =
968+ siblingsOnTop
969+ |> List.map (.height << .bbox)
970+ |> List.sum
971+ |> (\x -> x + (toFloat (List.length siblingsOnTop) * toFloat found.parentSpacing))
972+
973+ heightsBelow =
974+ siblingsBelow
975+ |> List.map (.height << .bbox)
976+ |> List.sum
977+ |> (\x -> x + (toFloat (List.length siblingsBelow) * toFloat found.parentSpacing))
978+
979+ expectedCenter : Float
980+ expectedCenter =
981+ found.parent.bbox.top
982+ + heightsAbove
983+ + ((found.parent.bbox.height - (heightsBelow + heightsAbove))
984+ / 2
985+ )
986+ in
987+ expectRoundedEquality
988+ selfCenter
989+ expectedCenter
990+
991+ _ ->
992+ expectRoundedEquality selfCenter parentCenter
993+ }
994+
995+
996+{-| -}
997+above : Testable.Element msg -> Testable.Attr msg
998+above element =
999+ Testable.Nearby
1000+ { location = Testable.Above
1001+ , element = element
1002+ , label = "above"
1003+ , test =
1004+ \found _ ->
1005+ expectRoundedEquality found.self.bbox.bottom found.parent.bbox.top
1006+ }
1007+
1008+
1009+{-| -}
1010+below : Testable.Element msg -> Testable.Attr msg
1011+below element =
1012+ Testable.Nearby
1013+ { location = Testable.Below
1014+ , element = element
1015+ , label = "below"
1016+ , test =
1017+ \found _ ->
1018+ expectRoundedEquality found.self.bbox.top found.parent.bbox.bottom
1019+ }
1020+
1021+
1022+{-| -}
1023+onRight : Testable.Element msg -> Testable.Attr msg
1024+onRight element =
1025+ Testable.Nearby
1026+ { location = Testable.OnRight
1027+ , element = element
1028+ , label = "onRight"
1029+ , test =
1030+ \found _ ->
1031+ expectRoundedEquality found.self.bbox.left found.parent.bbox.right
1032+ }
1033+
1034+
1035+{-| -}
1036+onLeft : Testable.Element msg -> Testable.Attr msg
1037+onLeft element =
1038+ Testable.Nearby
1039+ { location = Testable.OnLeft
1040+ , element = element
1041+ , label = "onLeft"
1042+ , test =
1043+ \found _ ->
1044+ expectRoundedEquality found.self.bbox.right found.parent.bbox.left
1045+ }
1046+
1047+
1048+compare x vs y =
1049+ vs (round x) (round y) || vs (floor x) (floor y)
1050+
1051+
1052+{-| -}
1053+inFront : Testable.Element msg -> Testable.Attr msg
1054+inFront element =
1055+ Testable.Nearby
1056+ { location = Testable.InFront
1057+ , element = element
1058+ , label = "inFront"
1059+ , test =
1060+ withinHelper
1061+ }
1062+
1063+
1064+withinHelper found _ =
1065+ let
1066+ horizontalCheck =
1067+ if found.self.bbox.width > found.parent.bbox.width then
1068+ [ compare found.self.bbox.right (<=) found.parent.bbox.right
1069+ || compare found.self.bbox.left (>=) found.parent.bbox.left
1070+ ]
1071+
1072+ else
1073+ [ compare found.self.bbox.right (<=) found.parent.bbox.right
1074+ , compare found.self.bbox.left (>=) found.parent.bbox.left
1075+ ]
1076+
1077+ verticalCheck =
1078+ if found.self.bbox.width > found.parent.bbox.width then
1079+ [ compare found.self.bbox.top (>=) found.parent.bbox.top
1080+ || compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1081+ ]
1082+
1083+ else
1084+ [ compare found.self.bbox.top (>=) found.parent.bbox.top
1085+ , compare found.self.bbox.bottom (<=) found.parent.bbox.bottom
1086+ ]
1087+ in
1088+ Expect.true "within the confines of the parent"
1089+ (List.all ((==) True)
1090+ (List.concat
1091+ [ horizontalCheck
1092+ , verticalCheck
1093+ ]
1094+ )
1095+ )
1096+
1097+
1098+{-| -}
1099+behindContent : Testable.Element msg -> Testable.Attr msg
1100+behindContent element =
1101+ Testable.Nearby
1102+ { location = Testable.Behind
1103+ , element = element
1104+ , label = "behindContent"
1105+ , test =
1106+ withinHelper
1107+ }
tests-rendering/src/Testable/Element/Background.elm → tests/src/Testable/Element/Background.elmrenamed+4−5
@@ -5,24 +5,23 @@ module Testable.Element.Background exposing (color)
55import Dict
66import Element exposing (Color)
77import Element.Background as Background
8+import Expect
89import Testable
910
1011
1112color : Color -> Testable.Attr msg
1213color clr =
1314 Testable.LabeledTest
14− { label = "background color"
15+ { label = "background color-" ++ Testable.formatColor clr
1516 , attr = Background.color clr
16− , id = Testable.NoId
1717 , test =
18− \context ->
18+ \context _ ->
1919 let
2020 selfBackgroundColor =
2121 context.self.style
2222 |> Dict.get "background-color"
2323 |> Maybe.withDefault "notfound"
2424 in
25− [ Testable.true ("expected " ++ (Testable.formatColor clr ++ ", found " ++ selfBackgroundColor))
25+ Expect.true ("Expected color: " ++ (Testable.formatColor clr ++ " vs found:" ++ selfBackgroundColor))
2626 (Testable.compareFormattedColor clr selfBackgroundColor)
27− ]
2827 }
tests-rendering/src/Testable/Element/Font.elm → tests/src/Testable/Element/Font.elmrenamed+6−14
@@ -1,35 +1,29 @@
1−module Testable.Element.Font exposing (bold, color, size)
1+module Testable.Element.Font exposing (color)
22
33{-| -}
44
55import Dict
66import Element exposing (Color)
77import Element.Font as Font
8+import Expect
89import Testable
910
1011
11−bold : Testable.Attr msg
12−bold =
13− Testable.Attr Font.bold
14−
15−
1612color : Color -> Testable.Attr msg
1713color clr =
1814 Testable.LabeledTest
1915 { label = "font color-" ++ Testable.formatColor clr
2016 , attr = Font.color clr
21− , id = Testable.NoId
2217 , test =
23− \context ->
18+ \context _ ->
2419 let
2520 selfFontColor =
2621 context.self.style
2722 |> Dict.get "color"
2823 |> Maybe.withDefault "notfound"
2924 in
30− [ Testable.true ("Color Match - " ++ (Testable.formatColor clr ++ " vs " ++ selfFontColor))
25+ Expect.true ("Color Match - " ++ (Testable.formatColor clr ++ " vs " ++ selfFontColor))
3126 (Testable.compareFormattedColor clr selfFontColor)
32− ]
3327 }
3428
3529
@@ -38,9 +32,8 @@ size i =
3832 Testable.LabeledTest
3933 { label = "font size-" ++ String.fromInt i
4034 , attr = Font.size i
41− , id = Testable.NoId
4235 , test =
43− \context ->
36+ \context _ ->
4437 let
4538 selfFontSize =
4639 context.self.style
@@ -50,7 +43,6 @@ size i =
5043 formattedInt =
5144 String.fromInt i
5245 in
53− [ Testable.true ("Size Match - " ++ (formattedInt ++ " vs " ++ selfFontSize))
46+ Expect.true ("Size Match - " ++ (formattedInt ++ " vs " ++ selfFontSize))
5447 (formattedInt == selfFontSize)
55− ]
5648 }
tests/src/Testable/FuzzMain.elm.oldnew file+632
@@ -0,0 +1,632 @@
1+port module FuzzMain exposing (Model, Msg(..), PossibleAttributes, Stage(..), Testable, TestableElement(..), allIndividualTestables, allPossibilities, analyze, attr, availableAttributes, content, createContainer, createElement, generateTest, generateTests, heightFill, heightPx, heights, init, layout, main, possibleToList, runTest, styles, subscriptions, testableLayout, tests, update, view, viewResult, widthFill, widthPx, widths)
2+
3+{-| -}
4+
5+import AnimationFrame
6+import Color
7+import Dict exposing (Dict)
8+import Element
9+import Element.Background as Background
10+import Element.Border as Border
11+import Element.Font as Font
12+import Expect
13+import Fuzz
14+import Html exposing (Html)
15+import List.Extra
16+import Random
17+import Test
18+import Test.Runner
19+import Test.Runner.Failure
20+import Testable
21+import Tests exposing (Testable)
22+import Time exposing (Time)
23+
24+
25+init : ( Model Msg, Cmd Msg )
26+init =
27+ ( { current = Nothing
28+ , upcoming =
29+ -- Tests.tests
30+ []
31+
32+ -- generateTests (Random.initialSeed 227852860) 1
33+ , finished = []
34+ , stage = BeginRendering
35+ }
36+ , Cmd.none
37+ )
38+
39+
40+main : Program Never (Model Msg) Msg
41+main =
42+ Html.program
43+ { init = init
44+ , view = view
45+ , update = update
46+ , subscriptions = subscriptions
47+ }
48+
49+
50+type alias Model msg =
51+ { current : Maybe (Testable msg)
52+ , upcoming : List (Testable msg)
53+ , finished : List (Testable msg)
54+ , stage : Stage
55+ }
56+
57+
58+type Msg
59+ = NoOp
60+ | Tick Time
61+ | RefreshBoundingBox
62+ (List
63+ { id : String
64+ , bbox : Testable.BoundingBox
65+ , style : Testable.Style
66+ }
67+ )
68+
69+
70+type Stage
71+ = Rendered
72+ | BeginRendering
73+ | GatherData
74+ | Finished
75+
76+
77+runTest : Dict String Testable.Found -> Testable msg -> Testable msg
78+runTest boxes test =
79+ let
80+ tests =
81+ Testable.toTest test.label boxes test.element
82+
83+ seed =
84+ Random.initialSeed 227852860
85+
86+ results =
87+ Testable.runTests seed (Debug.log "created Tests" tests)
88+ |> Debug.log "run tests"
89+ in
90+ { test | results = Just results }
91+
92+
93+generateTests : Random.Seed -> Int -> List (Testable msg)
94+generateTests seed num =
95+ if num <= 0 then
96+ []
97+
98+ else
99+ let
100+ ( testable, newSeed ) =
101+ generateTest seed
102+ in
103+ testable :: generateTests newSeed (num - 1)
104+
105+
106+generateTest : Random.Seed -> ( Testable msg, Random.Seed )
107+generateTest seed =
108+ testableLayout
109+ |> Test.Runner.fuzz
110+ |> flip Random.step seed
111+ |> (\( ( val, shrinker ), newSeed ) -> ( val, seed ))
112+
113+
114+update : Msg -> Model Msg -> ( Model Msg, Cmd Msg )
115+update msg model =
116+ case msg of
117+ NoOp ->
118+ ( model, Cmd.none )
119+
120+ RefreshBoundingBox boxes ->
121+ case model.current of
122+ Nothing ->
123+ ( { model | stage = Finished }
124+ , Cmd.none
125+ )
126+
127+ Just current ->
128+ let
129+ toTuple box =
130+ ( box.id, { style = box.style, bbox = box.bbox } )
131+
132+ foundData =
133+ boxes
134+ |> List.map toTuple
135+ |> Dict.fromList
136+
137+ currentResults =
138+ runTest foundData current
139+ in
140+ case model.upcoming of
141+ [] ->
142+ ( { model
143+ | stage = Finished
144+ , current = Nothing
145+ , finished = currentResults :: model.finished
146+ }
147+ , Cmd.none
148+ )
149+
150+ newCurrent :: remaining ->
151+ ( { model
152+ | finished = currentResults :: model.finished
153+ , stage = BeginRendering
154+ }
155+ , Cmd.none
156+ )
157+
158+ Tick time ->
159+ case model.stage of
160+ BeginRendering ->
161+ case model.upcoming of
162+ [] ->
163+ ( { model | stage = Rendered }
164+ , Cmd.none
165+ )
166+
167+ current :: remaining ->
168+ ( { model
169+ | stage = Rendered
170+ , upcoming = remaining
171+ , current = Just current
172+ }
173+ , Cmd.none
174+ )
175+
176+ Rendered ->
177+ case model.current of
178+ Nothing ->
179+ ( { model | stage = Finished }
180+ , Cmd.none
181+ )
182+
183+ Just test ->
184+ ( { model | stage = GatherData }
185+ , analyze (Testable.getIds test.element)
186+ )
187+
188+ _ ->
189+ ( { model | stage = Rendered }
190+ , Cmd.none
191+ )
192+
193+
194+subscriptions : { a | stage : Stage } -> Sub Msg
195+subscriptions model =
196+ Sub.batch
197+ [ styles RefreshBoundingBox
198+ , case model.stage of
199+ BeginRendering ->
200+ AnimationFrame.times Tick
201+
202+ Rendered ->
203+ AnimationFrame.times Tick
204+
205+ _ ->
206+ Sub.none
207+ ]
208+
209+
210+port analyze : List String -> Cmd msg
211+
212+
213+port styles : (List { id : String, bbox : Testable.BoundingBox, style : Testable.Style } -> msg) -> Sub msg
214+
215+
216+view : Model Msg -> Html Msg
217+view model =
218+ case model.current of
219+ Nothing ->
220+ if model.stage == Finished then
221+ Element.layout [] <|
222+ Element.column
223+ [ Element.spacing 20
224+ , Element.padding 20
225+ , Element.width (Element.px 800)
226+
227+ -- , Background.color Color.grey
228+ ]
229+ (List.map viewResult model.finished)
230+
231+ else
232+ Html.text "running?"
233+
234+ Just current ->
235+ Testable.render current.element
236+
237+
238+viewResult : Testable Msg -> Element.Element Msg
239+viewResult testable =
240+ let
241+ viewSingle result =
242+ case result of
243+ ( label, Nothing ) ->
244+ Element.el
245+ [ Background.color Color.green
246+ , Font.color Color.white
247+ , Element.paddingXY 20 10
248+ , Element.alignLeft
249+ , Border.rounded 3
250+ ]
251+ <|
252+ Element.text (label ++ " - " ++ "Success!")
253+
254+ ( label, Just { given, description, reason } ) ->
255+ Element.row
256+ [ Background.color Color.red
257+ , Font.color Color.white
258+ , Element.paddingXY 20 10
259+ , Element.alignLeft
260+ , Element.spacing 25
261+ , Border.rounded 3
262+ ]
263+ [ Element.el [ Element.width Element.fill ] <| Element.text label
264+
265+ -- , Element.el [ Element.width Element.fill ] <| Element.text description
266+ , Element.el [ Element.width Element.fill ] <| Element.text (toString reason)
267+ ]
268+ in
269+ Element.column
270+ [ Border.width 1
271+ , Border.color Color.lightGrey
272+ , Element.padding 20
273+ , Element.height Element.shrink
274+ , Element.alignLeft
275+ ]
276+ [ Element.el [ Font.bold ] (Element.text testable.label)
277+ , Element.column [ Element.alignLeft, Element.spacing 20 ]
278+ (case testable.results of
279+ Nothing ->
280+ [ Element.text "no results" ]
281+
282+ Just results ->
283+ List.map viewSingle results
284+ )
285+ ]
286+
287+
288+{--}
289+type alias Testable msg =
290+ { element : Testable.Element msg
291+ , label : String
292+ , results :
293+ Maybe
294+ (List
295+ ( String
296+ , Maybe
297+ { given : Maybe String
298+ , description : String
299+ , reason : Test.Runner.Failure.Reason
300+ }
301+ )
302+ )
303+ }
304+
305+
306+attr tag label attr test =
307+ Testable.Batch
308+ [ Testable.Attr attr
309+ , Testable.AttrTest
310+ (\found ->
311+ Test.test (tag ++ ": " ++ label) <|
312+ \_ -> test found
313+ )
314+ ]
315+
316+
317+widthFill tag =
318+ attr tag
319+ "width fill"
320+ (Element.width Element.fill)
321+ (\context ->
322+ let
323+ spacePerPortion =
324+ context.parent.bbox.width / toFloat (List.length context.siblings + 1)
325+ in
326+ Expect.equal spacePerPortion context.self.bbox.width
327+ )
328+
329+
330+heightFill tag =
331+ attr tag
332+ "height fill"
333+ (Element.height Element.fill)
334+ (\context ->
335+ let
336+ spacePerPortion =
337+ context.parent.bbox.height / toFloat (List.length context.siblings + 1)
338+ in
339+ Expect.equal spacePerPortion context.self.bbox.height
340+ )
341+
342+
343+heightPx px tag =
344+ attr tag
345+ ("height at " ++ toString px ++ "px")
346+ (Element.height (Element.px (round px)))
347+ (\found ->
348+ Expect.equal found.self.bbox.height px
349+ )
350+
351+
352+widthPx px tag =
353+ attr tag
354+ ("width at " ++ toString px ++ "px")
355+ (Element.width (Element.px (round px)))
356+ (\found ->
357+ Expect.equal found.self.bbox.width px
358+ )
359+
360+
361+type alias PossibleAttributes msg =
362+ { width : String -> Testable.Attr msg
363+ , height : String -> Testable.Attr msg
364+ }
365+
366+
367+possibleToList str { width, height } =
368+ width str :: height str :: []
369+
370+
371+availableAttributes : { width : Float, height : Float } -> Fuzz.Fuzzer (PossibleAttributes msg)
372+availableAttributes bounds =
373+ Fuzz.map2 PossibleAttributes
374+ (Fuzz.oneOf
375+ (List.map Fuzz.constant (widths bounds.width))
376+ )
377+ (Fuzz.oneOf
378+ (List.map Fuzz.constant (heights bounds.height))
379+ )
380+
381+
382+widths : Float -> List (String -> Testable.Attr msg)
383+widths width =
384+ [ \tag ->
385+ attr tag
386+ (" with width at " ++ toString width ++ "px")
387+ (Element.width (Element.px (round width)))
388+ (\found ->
389+ Expect.equal found.self.bbox.width width
390+ )
391+ , \tag ->
392+ attr tag
393+ " with width fill"
394+ (Element.width Element.fill)
395+ (\context ->
396+ let
397+ -- {-|
398+ -- Calculation is
399+ -- totalparentwidth - (paddingLeft ++ paddingRight)
400+ -- minus widths of all the other children
401+ -- -}
402+ otherWidth =
403+ -- Debug.log "width" <|
404+ List.sum <|
405+ -- Debug.log "widths" <|
406+ List.map (\child -> child.bbox.width) context.siblings
407+
408+ spacePerPortion =
409+ context.parent.bbox.width - otherWidth
410+ in
411+ Expect.equal spacePerPortion context.self.bbox.width
412+ )
413+ ]
414+
415+
416+heights : Float -> List (String -> Testable.Attr msg)
417+heights height =
418+ [ \tag ->
419+ attr tag
420+ (" with height at " ++ toString height ++ "px")
421+ (Element.height (Element.px (round height)))
422+ (\found ->
423+ Expect.equal found.self.bbox.height height
424+ )
425+ , \tag ->
426+ attr tag
427+ " with height fill"
428+ (Element.height Element.fill)
429+ (\context ->
430+ let
431+ -- {-|
432+ -- Calculation is
433+ -- totalparentwidth - (paddingLeft ++ paddingRight)
434+ -- minus widths of all the other children
435+ -- -}
436+ otherHeight =
437+ List.sum <|
438+ List.map (\child -> child.bbox.height) context.siblings
439+
440+ spacePerPortion =
441+ context.parent.bbox.height - otherHeight
442+ in
443+ Expect.equal spacePerPortion context.self.bbox.height
444+ )
445+ ]
446+
447+
448+content : Testable.Element msg
449+content =
450+ Testable.El
451+ [ Testable.Attr <| Element.width (Element.px 20)
452+ , Testable.Attr <| Element.height (Element.px 20)
453+ ]
454+ Testable.Empty
455+
456+
457+tests : List (Testable msg)
458+tests =
459+ [ { label = "Width/Height 200"
460+ , results = Nothing
461+ , element =
462+ Testable.El
463+ [ widthPx 200 "single element"
464+ , heightPx 200 "single element"
465+ ]
466+ Testable.Empty
467+ }
468+ , { label = "Width Fill/Height Fill - 1"
469+ , results = Nothing
470+ , element =
471+ Testable.El
472+ [ widthFill "single element"
473+ , heightFill "single element"
474+ ]
475+ <|
476+ content
477+ }
478+ , { label = "Width Fill/Height Fill - 2"
479+ , results = Nothing
480+ , element =
481+ Testable.El
482+ [ widthFill "top element"
483+ , heightFill "top element"
484+ ]
485+ <|
486+ Testable.El
487+ [ widthFill "embedded element"
488+ , heightFill "embedded element"
489+ ]
490+ <|
491+ content
492+ }
493+ , { label = "Row Width Fill/Height Fill"
494+ , results = Nothing
495+ , element =
496+ Testable.Row
497+ [ widthFill "on row"
498+ , heightFill "on row"
499+ ]
500+ [ Testable.El
501+ [ widthFill "row - 1"
502+ , heightFill "row - 1"
503+ ]
504+ content
505+ , Testable.El
506+ [ widthFill "row - 2"
507+ , heightFill "row - 2"
508+ ]
509+ content
510+ , Testable.El
511+ [ widthFill "row - 3"
512+ , heightFill "row - 3"
513+ ]
514+ content
515+ ]
516+ }
517+ ]
518+
519+
520+
521+{- Generating A Complete Test Suite
522+
523+-}
524+
525+
526+type TestableElement
527+ = El
528+ | Row
529+ | Column
530+
531+
532+allIndividualTestables : List (Fuzz.Fuzzer TestableElement)
533+allIndividualTestables =
534+ [ Fuzz.constant El
535+ , Fuzz.constant Row
536+ , Fuzz.constant Column
537+ ]
538+
539+
540+testableLayout : Fuzz.Fuzzer (Testable msg)
541+testableLayout =
542+ let
543+ asTestable layout =
544+ { element = layout
545+ , label = "A Sweet Test"
546+ , results = Nothing
547+ }
548+ in
549+ Fuzz.map asTestable layout
550+
551+
552+layout : Fuzz.Fuzzer (Testable.Element msg)
553+layout =
554+ Fuzz.map4 createContainer
555+ (Fuzz.tuple3
556+ ( availableAttributes { width = 20, height = 20 }
557+ , availableAttributes { width = 20, height = 20 }
558+ , availableAttributes { width = 20, height = 20 }
559+ )
560+ )
561+ (availableAttributes { width = 200, height = 200 })
562+ (Fuzz.oneOf allIndividualTestables)
563+ (Fuzz.oneOf allIndividualTestables)
564+
565+
566+createElement : String -> TestableElement -> PossibleAttributes msg -> Testable.Element msg
567+createElement tag layout possibleAttrs =
568+ let
569+ attrs =
570+ possibleToList tag possibleAttrs
571+ in
572+ case layout of
573+ El ->
574+ Testable.El attrs content
575+
576+ Row ->
577+ Testable.Row attrs
578+ [ content
579+ , content
580+ , content
581+ ]
582+
583+ Column ->
584+ Testable.Column attrs
585+ [ content
586+ , content
587+ , content
588+ ]
589+
590+
591+createContainer : ( PossibleAttributes msg, PossibleAttributes msg, PossibleAttributes msg ) -> PossibleAttributes msg -> TestableElement -> TestableElement -> Testable.Element msg
592+createContainer ( a1, a2, a3 ) possibleAttrs parent child =
593+ let
594+ attrs =
595+ possibleToList "0" possibleAttrs
596+ in
597+ case parent of
598+ El ->
599+ Testable.El attrs (createElement "0-0" child a1)
600+
601+ Row ->
602+ Testable.Row attrs
603+ [ createElement "0-0" child a1
604+ , createElement "0-1" child a2
605+ , createElement "0-2" child a3
606+ ]
607+
608+ Column ->
609+ Testable.Column attrs
610+ [ createElement "0-0" child a1
611+ , createElement "0-1" child a2
612+ , createElement "0-2" child a3
613+ ]
614+
615+
616+{-| Given a list of a list of possibilities,
617+
618+choose once from each list.
619+
620+ [ [width (px 100), width fill]
621+ , [height (px 100), height fill]
622+ ]
623+ ->
624+
625+ [ [width (px 100), height (px 100)]
626+ , [width (px 100), height fill]
627+ ]
628+
629+-}
630+allPossibilities : List (List a) -> List (List a)
631+allPossibilities =
632+ List.Extra.cartesianProduct
tests/src/Testable/Runner.elmnew file+470
@@ -0,0 +1,470 @@
1+port module Testable.Runner exposing (TestableProgram, program, show)
2+
3+{-| -}
4+
5+import Browser
6+import Char
7+import Dict exposing (Dict)
8+import Element
9+import Element.Background as Background
10+import Element.Border as Border
11+import Element.Font as Font
12+import Html exposing (Html)
13+import Parser exposing ((|.), (|=))
14+import Process
15+import Random
16+import Set
17+import Task
18+import Test.Runner
19+import Test.Runner.Failure as Failure
20+import Testable
21+import Time
22+
23+
24+show : Testable.Element msg -> Html msg
25+show =
26+ Testable.render
27+
28+
29+type alias TestableProgram =
30+ Program () (Model Msg) Msg
31+
32+
33+palette =
34+ { white = Element.rgb 1 1 1
35+ , red = Element.rgb 1 0 0
36+ , green = Element.rgb 0 1 0
37+ , black = Element.rgb 0 0 0
38+ , lightGrey = Element.rgb 0.7 0.7 0.7
39+ }
40+
41+
42+program : List ( String, Testable.Element Msg ) -> TestableProgram
43+program tests =
44+ let
45+ ( current, upcoming ) =
46+ case tests of
47+ [] ->
48+ ( Nothing, [] )
49+
50+ cur :: remaining ->
51+ ( Just cur, remaining )
52+ in
53+ Browser.document
54+ { init =
55+ always
56+ ( { current = current
57+ , upcoming = upcoming
58+ , finished = []
59+ }
60+ , Task.perform (always Analyze)
61+ (Process.sleep 32
62+ |> Task.andThen
63+ (always Time.now)
64+ )
65+ )
66+ , view = view
67+ , update = update
68+ , subscriptions = subscriptions
69+ }
70+
71+
72+subscriptions : Model Msg -> Sub Msg
73+subscriptions model =
74+ Sub.batch
75+ [ styles RefreshBoundingBox
76+ ]
77+
78+
79+type alias Model msg =
80+ { current : Maybe ( String, Testable.Element msg )
81+ , upcoming : List ( String, Testable.Element msg )
82+ , finished : List (WithResults (Testable.Element msg))
83+ }
84+
85+
86+type alias WithResults thing =
87+ { element : thing
88+ , label : String
89+ , results :
90+ List
91+ ( String
92+ , Maybe
93+ { given : Maybe String
94+ , description : String
95+ , reason : Failure.Reason
96+ }
97+ )
98+ }
99+
100+
101+prepareResults :
102+ List (WithResults (Testable.Element msg))
103+ ->
104+ List
105+ { label : String
106+ , results :
107+ List
108+ ( String
109+ , Maybe
110+ { given : Maybe String
111+ , description : String
112+ }
113+ )
114+ }
115+prepareResults withResults =
116+ let
117+ prepareNode ( x, maybeResult ) =
118+ ( x
119+ , case maybeResult of
120+ Nothing ->
121+ Nothing
122+
123+ Just res ->
124+ Just
125+ { given = res.given
126+ , description = res.description
127+ }
128+ )
129+
130+ prepare { label, results } =
131+ { label = label
132+ , results = List.map prepareNode results
133+ }
134+ in
135+ List.map prepare withResults
136+
137+
138+type Msg
139+ = NoOp
140+ | Analyze
141+ | RefreshBoundingBox
142+ (List
143+ { id : String
144+ , bbox : Testable.BoundingBox
145+ , isVisible : Bool
146+ , style : List ( String, String )
147+ }
148+ )
149+
150+
151+runTest : Dict String Testable.Found -> String -> Testable.Element msg -> WithResults (Testable.Element msg)
152+runTest boxes label element =
153+ let
154+ tests =
155+ Testable.toTest label boxes element
156+
157+ seed =
158+ Random.initialSeed 227852860
159+
160+ results =
161+ Testable.runTests seed tests
162+ in
163+ { element = element
164+ , label = label
165+ , results = results
166+ }
167+
168+
169+update : Msg -> Model Msg -> ( Model Msg, Cmd Msg )
170+update msg model =
171+ case msg of
172+ NoOp ->
173+ ( model, Cmd.none )
174+
175+ RefreshBoundingBox boxes ->
176+ case model.current of
177+ Nothing ->
178+ ( model
179+ , Cmd.none
180+ )
181+
182+ Just ( label, current ) ->
183+ let
184+ toTuple box =
185+ ( box.id
186+ , { style = Dict.fromList box.style
187+ , bbox = box.bbox
188+ , isVisible = box.isVisible
189+ }
190+ )
191+
192+ foundData =
193+ boxes
194+ |> List.map toTuple
195+ |> Dict.fromList
196+
197+ currentResults =
198+ runTest foundData label current
199+ in
200+ case model.upcoming of
201+ [] ->
202+ ( { model
203+ | current = Nothing
204+ , finished = model.finished ++ [ currentResults ]
205+ }
206+ , report (prepareResults (currentResults :: model.finished))
207+ )
208+
209+ newCurrent :: remaining ->
210+ ( { model
211+ | finished = model.finished ++ [ currentResults ]
212+ , current = Just newCurrent
213+ , upcoming = remaining
214+ }
215+ , Task.perform (always Analyze)
216+ (Process.sleep 32
217+ |> Task.andThen
218+ (always Time.now)
219+ )
220+ )
221+
222+ Analyze ->
223+ case model.current of
224+ Nothing ->
225+ ( model
226+ , Cmd.none
227+ )
228+
229+ Just ( label, current ) ->
230+ ( model
231+ , analyze (Testable.getIds current)
232+ )
233+
234+
235+view : Model Msg -> Browser.Document Msg
236+view model =
237+ case model.current of
238+ Nothing ->
239+ if List.isEmpty model.upcoming then
240+ { title = "tests finished"
241+ , body =
242+ [ case model.finished of
243+ [] ->
244+ Element.layout [] <|
245+ Element.column
246+ [ Element.spacing 20
247+ , Element.padding 20
248+ , Element.width (Element.px 800)
249+
250+ -- , Background.color Color.grey
251+ ]
252+ [ Element.none ]
253+
254+ finished :: remaining ->
255+ if False then
256+ viewResultsInline finished
257+
258+ else
259+ Element.layout [] <|
260+ Element.column
261+ [ Element.spacing 20
262+ , Element.padding 20
263+ , Element.width (Element.px 800)
264+ ]
265+ (List.map viewResult (finished :: remaining))
266+ ]
267+ }
268+
269+ else
270+ { title = "tests finished"
271+ , body = []
272+ }
273+
274+ Just ( label, current ) ->
275+ { title = "running"
276+ , body =
277+ [ Testable.render current ]
278+ }
279+
280+
281+viewResultsInline : WithResults (Testable.Element Msg) -> Html Msg
282+viewResultsInline testable =
283+ Html.div
284+ []
285+ [ viewResultsAnnotationStylesheet testable.results
286+ , Testable.render testable.element
287+ ]
288+
289+
290+{-| Our ID is part of our label. This could be fixed farther down the chain, but I think it'd be pretty involved.
291+
292+So, now we can just parse the id out of the label.
293+
294+-}
295+parseId str =
296+ str
297+ |> Parser.run
298+ (Parser.succeed identity
299+ |. Parser.chompWhile (\c -> c /= '#')
300+ |= Parser.variable
301+ { start = \c -> c == '#'
302+ , inner = \c -> Char.isAlphaNum c || c == '-'
303+ , reserved = Set.empty
304+ }
305+ )
306+ |> Result.toMaybe
307+
308+
309+viewResultsAnnotationStylesheet results =
310+ let
311+ toStyleClass ( label, maybeFailure ) =
312+ case maybeFailure of
313+ Nothing ->
314+ ""
315+
316+ Just failure ->
317+ case parseId label of
318+ Nothing ->
319+ Debug.log "NO ID FOUND" label
320+
321+ Just id ->
322+ id ++ " { background-color:red; outline: dashed; };"
323+
324+ styleSheet =
325+ results
326+ |> List.map toStyleClass
327+ |> String.join ""
328+ in
329+ Html.node "style"
330+ []
331+ [ Html.text styleSheet
332+ ]
333+
334+
335+viewResult : WithResults (Testable.Element Msg) -> Element.Element Msg
336+viewResult testable =
337+ let
338+ isPassing result =
339+ case Tuple.second result of
340+ Nothing ->
341+ True
342+
343+ Just _ ->
344+ False
345+
346+ ( passing, failing ) =
347+ List.partition isPassing testable.results
348+
349+ viewSingle result =
350+ case result of
351+ ( label, Nothing ) ->
352+ Element.el
353+ [ Background.color palette.green
354+ , Font.color palette.black
355+ , Element.paddingXY 20 10
356+ , Element.alignLeft
357+ , Border.rounded 3
358+ ]
359+ <|
360+ Element.text ("Success! - " ++ label)
361+
362+ ( label, Just ({ given, description } as reason) ) ->
363+ Element.column
364+ [ Background.color palette.red
365+ , Font.color palette.black
366+ , Element.paddingXY 20 10
367+ , Element.alignLeft
368+ , Element.width Element.shrink
369+
370+ -- , Element.spacing 25
371+ , Border.rounded 3
372+ ]
373+ [ Element.el [ Element.width Element.fill ] <| Element.text label
374+ , Element.el [ Element.width Element.fill ] <| Element.text (viewReason reason)
375+ ]
376+ in
377+ Element.column
378+ [ Border.width 1
379+ , Border.color palette.lightGrey
380+ , Element.padding 20
381+ , Element.height Element.shrink
382+ , Element.alignLeft
383+ , Element.spacing 16
384+ ]
385+ [ Element.el [ Font.bold, Font.size 64 ] (Element.text testable.label)
386+ , Element.column [ Element.alignLeft, Element.spacing 20 ]
387+ (failing
388+ |> List.map viewSingle
389+ )
390+ , Element.el
391+ [ Element.alignLeft
392+ , Element.spacing 20
393+ , Background.color palette.green
394+ , Font.color palette.black
395+ , Element.paddingXY 20 10
396+ , Element.alignLeft
397+ , Border.rounded 3
398+ ]
399+ (Element.text (String.fromInt (List.length passing) ++ " tests passing!"))
400+ ]
401+
402+
403+viewReason { description, reason } =
404+ case reason of
405+ Failure.Custom ->
406+ description
407+
408+ Failure.Equality one two ->
409+ description ++ " " ++ one ++ " " ++ two
410+
411+ Failure.Comparison one two ->
412+ description ++ " " ++ one ++ " " ++ two
413+
414+ Failure.ListDiff expected actual ->
415+ "expected\n"
416+ ++ String.join " \n" expected
417+ ++ "actual\n"
418+ ++ String.join " \n" actual
419+
420+ Failure.CollectionDiff { expected, actual, extra, missing } ->
421+ String.join "\n"
422+ [ formatKeyValue "expected" expected
423+ , formatKeyValue "actual" actual
424+ , formatKeyValue "extra" (String.join ", " extra)
425+ , formatKeyValue "missing" (String.join ", " missing)
426+ ]
427+
428+ Failure.TODO ->
429+ description
430+
431+ Failure.Invalid _ ->
432+ description
433+
434+
435+formatKeyValue : String -> String -> String
436+formatKeyValue key val =
437+ key ++ ": " ++ val
438+
439+
440+port report :
441+ List
442+ { label : String
443+ , results :
444+ List
445+ ( String
446+ , Maybe
447+ { given : Maybe String
448+ , description : String
449+ }
450+ )
451+ }
452+ -> Cmd msg
453+
454+
455+port test : String -> Cmd msg
456+
457+
458+port analyze : List String -> Cmd msg
459+
460+
461+port styles :
462+ (List
463+ { id : String
464+ , bbox : Testable.BoundingBox
465+ , style : List ( String, String )
466+ , isVisible : Bool
467+ }
468+ -> msg
469+ )
470+ -> Sub msg
tests/ClassNames.elm → tests/suite/ClassNames.elmrenamed+3−5
@@ -3,12 +3,12 @@ module ClassNames exposing (suite)
33{-| -}
44
55import Expect
6−import Html exposing (Html)
6+import Html
7+import Internal.Flag as Flag
78import Internal.Style
8−import Test exposing (Test)
9+import Test
910
1011
11−suite : Test
1212suite =
1313 Test.describe "Classname Collisions"
1414 [ Test.test "No duplicates" <|
@@ -17,7 +17,6 @@ suite =
1717 ]
1818
1919
20−main : Html msg
2120main =
2221 Html.div []
2322 [ Html.text "The following names collide"
@@ -26,7 +25,6 @@ main =
2625 ]
2726
2827
29−viewPair : ( String, String ) -> Html msg
3028viewPair ( name, description ) =
3129 Html.div []
3230 [ Html.text name
tests/Flags.elm → tests/suite/Flags.elmrenamed+1
@@ -3,6 +3,7 @@ module Flags exposing (suite)
33{-| -}
44
55import Expect
6+import Html
67import Internal.Flag as Flag
78import Test
89
tests/suite/elm-package.jsonnew file+16
@@ -0,0 +1,16 @@
1+{
2+ "version": "1.0.0",
3+ "summary": "helpful summary of your project, less than 80 characters",
4+ "repository": "https://github.com/user/project.git",
5+ "license": "BSD3",
6+ "source-directories": [
7+ ".",
8+ "../../src"
9+ ],
10+ "exposed-modules": [],
11+ "dependencies": {
12+ "elm-lang/core": "5.1.1 <= v < 6.0.0",
13+ "elm-lang/html": "2.0.0 <= v < 3.0.0"
14+ },
15+ "elm-version": "0.18.0 <= v < 0.19.0"
16+}
yarn.lock+1167−370
@@ -2,10 +2,10 @@
22# yarn lockfile v1
33
44
5−"@types/color-name@^1.1.1":
5+abbrev@1:
66 version "1.1.1"
7− resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
8− integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
7+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
8+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
99
1010agent-base@^4.1.0:
1111 version "4.3.0"
@@ -15,37 +15,72 @@ agent-base@^4.1.0:
1515 es6-promisify "^5.0.0"
1616
1717ajv@^6.5.5:
18− version "6.12.0"
19− resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
20− integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
18+ version "6.10.0"
19+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
20+ integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
2121 dependencies:
22− fast-deep-equal "^3.1.1"
22+ fast-deep-equal "^2.0.1"
2323 fast-json-stable-stringify "^2.0.0"
2424 json-schema-traverse "^0.4.1"
2525 uri-js "^4.2.2"
2626
27−ansi-styles@^3.2.1:
27+ansi-regex@^2.0.0:
28+ version "2.1.1"
29+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
30+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
31+
32+ansi-regex@^3.0.0:
33+ version "3.0.0"
34+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
35+ integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
36+
37+ansi-styles@^3.1.0, ansi-styles@^3.2.1:
2838 version "3.2.1"
2939 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
3040 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
3141 dependencies:
3242 color-convert "^1.9.0"
3343
34−ansi-styles@^4.1.0:
35− version "4.2.1"
36− resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
37− integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
44+anymatch@^2.0.0:
45+ version "2.0.0"
46+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
47+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
3848 dependencies:
39− "@types/color-name" "^1.1.1"
40− color-convert "^2.0.1"
49+ micromatch "^3.1.4"
50+ normalize-path "^2.1.1"
4151
42−anymatch@~3.1.1:
43− version "3.1.1"
44− resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
45− integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
52+aproba@^1.0.3:
53+ version "1.2.0"
54+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
55+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
56+
57+are-we-there-yet@~1.1.2:
58+ version "1.1.5"
59+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
60+ integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
4661 dependencies:
47− normalize-path "^3.0.0"
48− picomatch "^2.0.4"
62+ delegates "^1.0.0"
63+ readable-stream "^2.0.6"
64+
65+arr-diff@^4.0.0:
66+ version "4.0.0"
67+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
68+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
69+
70+arr-flatten@^1.1.0:
71+ version "1.1.0"
72+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
73+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
74+
75+arr-union@^3.1.0:
76+ version "3.1.0"
77+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
78+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
79+
80+array-unique@^0.3.2:
81+ version "0.3.2"
82+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
83+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
4984
5085asn1@~0.2.3:
5186 version "0.2.4"
@@ -59,6 +94,16 @@ assert-plus@1.0.0, assert-plus@^1.0.0:
5994 resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
6095 integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
6196
97+assign-symbols@^1.0.0:
98+ version "1.0.0"
99+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
100+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
101+
102+async-each@^1.0.1:
103+ version "1.0.3"
104+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
105+ integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
106+
62107async-limiter@~1.0.0:
63108 version "1.0.0"
64109 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
@@ -69,21 +114,39 @@ asynckit@^0.4.0:
69114 resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
70115 integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
71116
117+atob@^2.1.1:
118+ version "2.1.2"
119+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
120+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
121+
72122aws-sign2@~0.7.0:
73123 version "0.7.0"
74124 resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
75125 integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
76126
77127aws4@^1.8.0:
78− version "1.9.1"
79− resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
80− integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
128+ version "1.8.0"
129+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
130+ integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
81131
82132balanced-match@^1.0.0:
83133 version "1.0.0"
84134 resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
85135 integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
86136
137+base@^0.11.1:
138+ version "0.11.2"
139+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
140+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
141+ dependencies:
142+ cache-base "^1.0.1"
143+ class-utils "^0.3.5"
144+ component-emitter "^1.2.1"
145+ define-property "^1.0.0"
146+ isobject "^3.0.1"
147+ mixin-deep "^1.2.0"
148+ pascalcase "^0.1.1"
149+
87150bcrypt-pbkdf@^1.0.0:
88151 version "1.0.2"
89152 resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -91,10 +154,10 @@ bcrypt-pbkdf@^1.0.0:
91154 dependencies:
92155 tweetnacl "^0.14.3"
93156
94−binary-extensions@^2.0.0:
95− version "2.0.0"
96− resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
97− integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==
157+binary-extensions@^1.0.0:
158+ version "1.13.1"
159+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
160+ integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
98161
99162binary@^0.3.0:
100163 version "0.3.0"
@@ -104,21 +167,21 @@ binary@^0.3.0:
104167 buffers "~0.1.1"
105168 chainsaw "~0.1.0"
106169
107−binwrap@0.2.2:
108− version "0.2.2"
109− resolved "https://registry.yarnpkg.com/binwrap/-/binwrap-0.2.2.tgz#7d1ea74b28332f18dfdc75548aef993041ffafc9"
110− integrity sha512-Y+Wvypk3JhH5GPZAvlwJAWOVH/OsOhQMSj37vySuWHwQivoALplPxfBA8b973rFJI7OS+O+1YmmYXIiEXVMAcw==
170+binwrap@^0.2.0-rc2:
171+ version "0.2.1"
172+ resolved "https://registry.yarnpkg.com/binwrap/-/binwrap-0.2.1.tgz#d88467026170cb2776b9d47f002d3b4316aa9a87"
173+ integrity sha512-kILc2+zMfFEv66/NLfO2GIpmWRPE8hL68fv+o5A94OlN9AIIG4zernpgn9bpPAImb5t4QwFxnqAGSyP1+tGKrA==
111174 dependencies:
112− mustache "^3.0.1"
113− request "^2.88.0"
114− request-promise "^4.2.4"
115− tar "^4.4.10"
175+ mustache "^2.3.0"
176+ request "^2.87.0"
177+ request-promise "^4.2.0"
178+ tar "^4.4.8"
116179 unzip-stream "^0.3.0"
117180
118181bluebird@^3.5.0:
119− version "3.7.2"
120− resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
121− integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
182+ version "3.5.5"
183+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
184+ integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
122185
123186brace-expansion@^1.1.7:
124187 version "1.1.11"
@@ -128,12 +191,21 @@ brace-expansion@^1.1.7:
128191 balanced-match "^1.0.0"
129192 concat-map "0.0.1"
130193
131−braces@~3.0.2:
132− version "3.0.2"
133− resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
134− integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
135− dependencies:
136− fill-range "^7.0.1"
194+braces@^2.3.1, braces@^2.3.2:
195+ version "2.3.2"
196+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
197+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
198+ dependencies:
199+ arr-flatten "^1.1.0"
200+ array-unique "^0.3.2"
201+ extend-shallow "^2.0.1"
202+ fill-range "^4.0.0"
203+ isobject "^3.0.1"
204+ repeat-element "^1.1.2"
205+ snapdragon "^0.8.1"
206+ snapdragon-node "^2.0.1"
207+ split-string "^3.0.2"
208+ to-regex "^3.0.1"
137209
138210buffer-from@^1.0.0:
139211 version "1.1.1"
@@ -145,6 +217,21 @@ buffers@~0.1.1:
145217 resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
146218 integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s=
147219
220+cache-base@^1.0.1:
221+ version "1.0.1"
222+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
223+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
224+ dependencies:
225+ collection-visit "^1.0.0"
226+ component-emitter "^1.2.1"
227+ get-value "^2.0.6"
228+ has-value "^1.0.0"
229+ isobject "^3.0.1"
230+ set-value "^2.0.0"
231+ to-object-path "^0.3.0"
232+ union-value "^1.0.0"
233+ unset-value "^1.0.0"
234+
148235caseless@~0.12.0:
149236 version "0.12.0"
150237 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -157,13 +244,14 @@ chainsaw@~0.1.0:
157244 dependencies:
158245 traverse ">=0.3.0 <0.4"
159246
160−chalk@3.0.0:
161− version "3.0.0"
162− resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
163− integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
247+chalk@2.1.0:
248+ version "2.1.0"
249+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e"
250+ integrity sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==
164251 dependencies:
165− ansi-styles "^4.1.0"
166− supports-color "^7.1.0"
252+ ansi-styles "^3.1.0"
253+ escape-string-regexp "^1.0.5"
254+ supports-color "^4.0.0"
167255
168256chalk@^2.4.2:
169257 version "2.4.2"
@@ -174,25 +262,52 @@ chalk@^2.4.2:
174262 escape-string-regexp "^1.0.5"
175263 supports-color "^5.3.0"
176264
177−chokidar@3.3.0:
178− version "3.3.0"
179− resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
180− integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==
181− dependencies:
182− anymatch "~3.1.1"
183− braces "~3.0.2"
184− glob-parent "~5.1.0"
185− is-binary-path "~2.1.0"
186− is-glob "~4.0.1"
187− normalize-path "~3.0.0"
188− readdirp "~3.2.0"
265+chokidar@2.1.2:
266+ version "2.1.2"
267+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058"
268+ integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==
269+ dependencies:
270+ anymatch "^2.0.0"
271+ async-each "^1.0.1"
272+ braces "^2.3.2"
273+ glob-parent "^3.1.0"
274+ inherits "^2.0.3"
275+ is-binary-path "^1.0.0"
276+ is-glob "^4.0.0"
277+ normalize-path "^3.0.0"
278+ path-is-absolute "^1.0.0"
279+ readdirp "^2.2.1"
280+ upath "^1.1.0"
189281 optionalDependencies:
190− fsevents "~2.1.1"
282+ fsevents "^1.2.7"
191283
192284chownr@^1.1.1:
193− version "1.1.4"
194− resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
195− integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
285+ version "1.1.2"
286+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
287+ integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
288+
289+class-utils@^0.3.5:
290+ version "0.3.6"
291+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
292+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
293+ dependencies:
294+ arr-union "^3.1.0"
295+ define-property "^0.2.5"
296+ isobject "^3.0.0"
297+ static-extend "^0.1.1"
298+
299+code-point-at@^1.0.0:
300+ version "1.1.0"
301+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
302+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
303+
304+collection-visit@^1.0.0:
305+ version "1.0.0"
306+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
307+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
308+ dependencies:
309+ map-visit "^1.0.0"
310+ object-visit "^1.0.0"
196311
197312color-convert@^1.9.0:
198313 version "1.9.3"
@@ -201,23 +316,11 @@ color-convert@^1.9.0:
201316 dependencies:
202317 color-name "1.1.3"
203318
204−color-convert@^2.0.1:
205− version "2.0.1"
206− resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
207− integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
208− dependencies:
209− color-name "~1.1.4"
210−
211319color-name@1.1.3:
212320 version "1.1.3"
213321 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
214322 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
215323
216−color-name@~1.1.4:
217− version "1.1.4"
218− resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
219− integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
220−
221324combined-stream@^1.0.6, combined-stream@~1.0.6:
222325 version "1.0.8"
223326 resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -230,6 +333,11 @@ commander@^2.20.0:
230333 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
231334 integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
232335
336+component-emitter@^1.2.1:
337+ version "1.3.0"
338+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
339+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
340+
233341concat-map@0.0.1:
234342 version "0.0.1"
235343 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -245,6 +353,16 @@ concat-stream@1.6.2:
245353 readable-stream "^2.2.2"
246354 typedarray "^0.0.6"
247355
356+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
357+ version "1.1.0"
358+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
359+ integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
360+
361+copy-descriptor@^0.1.0:
362+ version "0.1.1"
363+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
364+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
365+
248366core-util-is@1.0.2, core-util-is@~1.0.0:
249367 version "1.0.2"
250368 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -258,26 +376,6 @@ cross-spawn@4.0.0:
258376 lru-cache "^4.0.1"
259377 which "^1.2.9"
260378
261−cross-spawn@6.0.5:
262− version "6.0.5"
263− resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
264− integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
265− dependencies:
266− nice-try "^1.0.4"
267− path-key "^2.0.1"
268− semver "^5.5.0"
269− shebang-command "^1.2.0"
270− which "^1.2.9"
271−
272−cross-spawn@7.0.1:
273− version "7.0.1"
274− resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
275− integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
276− dependencies:
277− path-key "^3.1.0"
278− shebang-command "^2.0.0"
279− which "^2.0.1"
280−
281379dashdash@^1.12.0:
282380 version "1.14.1"
283381 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -285,14 +383,14 @@ dashdash@^1.12.0:
285383 dependencies:
286384 assert-plus "^1.0.0"
287385
288−debug@2.6.9:
386+debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
289387 version "2.6.9"
290388 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
291389 integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
292390 dependencies:
293391 ms "2.0.0"
294392
295−debug@^3.1.0:
393+debug@^3.1.0, debug@^3.2.6:
296394 version "3.2.6"
297395 resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
298396 integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@@ -306,11 +404,53 @@ debug@^4.1.0:
306404 dependencies:
307405 ms "^2.1.1"
308406
407+decode-uri-component@^0.2.0:
408+ version "0.2.0"
409+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
410+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
411+
412+deep-extend@^0.6.0:
413+ version "0.6.0"
414+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
415+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
416+
417+define-property@^0.2.5:
418+ version "0.2.5"
419+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
420+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
421+ dependencies:
422+ is-descriptor "^0.1.0"
423+
424+define-property@^1.0.0:
425+ version "1.0.0"
426+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
427+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
428+ dependencies:
429+ is-descriptor "^1.0.0"
430+
431+define-property@^2.0.2:
432+ version "2.0.2"
433+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
434+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
435+ dependencies:
436+ is-descriptor "^1.0.2"
437+ isobject "^3.0.1"
438+
309439delayed-stream@~1.0.0:
310440 version "1.0.0"
311441 resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
312442 integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
313443
444+delegates@^1.0.0:
445+ version "1.0.0"
446+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
447+ integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
448+
449+detect-libc@^1.0.2:
450+ version "1.0.3"
451+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
452+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
453+
314454ecc-jsbn@~0.1.1:
315455 version "0.1.2"
316456 resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -319,35 +459,37 @@ ecc-jsbn@~0.1.1:
319459 jsbn "~0.1.0"
320460 safer-buffer "^2.1.0"
321461
322−elm-test@^0.19.1-revision2:
323− version "0.19.1-revision2"
324− resolved "https://registry.yarnpkg.com/elm-test/-/elm-test-0.19.1-revision2.tgz#e73a7240ac6fd997279c825b7dc342fb65349028"
325− integrity sha512-zVs2mVeyIE+K9y7/8b333h5xRMDWAoqbBDm7ThLDhyTi7ICxeL3t5uOS4KZCrRk9+4sP6+voSbcBlgr46Q+GiQ==
462+elm-test@^0.19.0-rev6:
463+ version "0.19.0-rev6"
464+ resolved "https://registry.yarnpkg.com/elm-test/-/elm-test-0.19.0-rev6.tgz#75ce658936b43c5b033bc2db490445c6f96f021e"
465+ integrity sha512-Qdy9QusZF+eT0203XBiT1Y/UhFeUjcSuyyzf3iyp32dsYpAfcoDTWHjlBVjia1CyvFauESQ4pc81nKaq6snClg==
326466 dependencies:
327− chalk "3.0.0"
328− chokidar "3.3.0"
329− cross-spawn "7.0.1"
330− elmi-to-json "1.3.0"
467+ chalk "2.1.0"
468+ chokidar "2.1.2"
469+ cross-spawn "4.0.0"
470+ elmi-to-json "0.19.1"
331471 find-parent-dir "^0.3.0"
332− firstline "2.0.2"
333− fs-extra "8.1.0"
334− glob "7.1.6"
335− lodash "4.17.15"
472+ firstline "1.2.1"
473+ fs-extra "0.30.0"
474+ glob "7.1.1"
475+ lodash "4.17.11"
336476 minimist "^1.2.0"
337477 murmur-hash-js "1.0.0"
338− node-elm-compiler "5.0.4"
478+ node-elm-compiler "5.0.3"
339479 split "1.0.1"
340− supports-color "7.1.0"
341− temp "0.9.1"
342− which "2.0.1"
343− xmlbuilder "^13.0.2"
480+ supports-color "4.2.0"
481+ temp "0.8.3"
482+ which "1.3.1"
483+ xmlbuilder "^8.2.2"
484+ optionalDependencies:
485+ fsevents "1.2.4"
344486
345−elmi-to-json@1.3.0:
346− version "1.3.0"
347− resolved "https://registry.yarnpkg.com/elmi-to-json/-/elmi-to-json-1.3.0.tgz#9de59d66d1df50f775a83405610ad41861a4305a"
348− integrity sha512-6m1D5/Pb5pUrSOOBgRG3fE2mK19nhmLgZ16jj2KWTVIhT+0GIBuDI1iV0Fee27CZH790J7uMcdGWJ7fnVvpsKg==
487+elmi-to-json@0.19.1:
488+ version "0.19.1"
489+ resolved "https://registry.yarnpkg.com/elmi-to-json/-/elmi-to-json-0.19.1.tgz#0711ed958dd7cc405a4f620b4ec21b6060f86cda"
490+ integrity sha512-O0Z3YsYU9OTb1hTDGORWxi69QjQFEIPfZVq/oc1D5lhL3swduHKY8vdKGuo+WlKVdTas99oNIsgL7yojWdYcsQ==
349491 dependencies:
350− binwrap "0.2.2"
492+ binwrap "^0.2.0-rc2"
351493
352494es6-promise@^4.0.3:
353495 version "4.2.8"
@@ -366,11 +508,53 @@ escape-string-regexp@^1.0.5:
366508 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
367509 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
368510
511+expand-brackets@^2.1.4:
512+ version "2.1.4"
513+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
514+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
515+ dependencies:
516+ debug "^2.3.3"
517+ define-property "^0.2.5"
518+ extend-shallow "^2.0.1"
519+ posix-character-classes "^0.1.0"
520+ regex-not "^1.0.0"
521+ snapdragon "^0.8.1"
522+ to-regex "^3.0.1"
523+
524+extend-shallow@^2.0.1:
525+ version "2.0.1"
526+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
527+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
528+ dependencies:
529+ is-extendable "^0.1.0"
530+
531+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
532+ version "3.0.2"
533+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
534+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
535+ dependencies:
536+ assign-symbols "^1.0.0"
537+ is-extendable "^1.0.1"
538+
369539extend@~3.0.2:
370540 version "3.0.2"
371541 resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
372542 integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
373543
544+extglob@^2.0.4:
545+ version "2.0.4"
546+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
547+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
548+ dependencies:
549+ array-unique "^0.3.2"
550+ define-property "^1.0.0"
551+ expand-brackets "^2.1.4"
552+ extend-shallow "^2.0.1"
553+ fragment-cache "^0.2.1"
554+ regex-not "^1.0.0"
555+ snapdragon "^0.8.1"
556+ to-regex "^3.0.1"
557+
374558extract-zip@^1.6.6:
375559 version "1.6.7"
376560 resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
@@ -391,15 +575,15 @@ extsprintf@^1.2.0:
391575 resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
392576 integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
393577
394−fast-deep-equal@^3.1.1:
395− version "3.1.1"
396− resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
397− integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
578+fast-deep-equal@^2.0.1:
579+ version "2.0.1"
580+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
581+ integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
398582
399583fast-json-stable-stringify@^2.0.0:
400− version "2.1.0"
401− resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
402− integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
584+ version "2.0.0"
585+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
586+ integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
403587
404588fd-slicer@~1.0.1:
405589 version "1.0.1"
@@ -408,12 +592,15 @@ fd-slicer@~1.0.1:
408592 dependencies:
409593 pend "~1.2.0"
410594
411−fill-range@^7.0.1:
412− version "7.0.1"
413− resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
414− integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
595+fill-range@^4.0.0:
596+ version "4.0.0"
597+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
598+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
415599 dependencies:
416− to-regex-range "^5.0.1"
600+ extend-shallow "^2.0.1"
601+ is-number "^3.0.0"
602+ repeat-string "^1.6.1"
603+ to-regex-range "^2.1.0"
417604
418605find-elm-dependencies@2.0.1:
419606 version "2.0.1"
@@ -423,14 +610,6 @@ find-elm-dependencies@2.0.1:
423610 firstline "1.2.0"
424611 lodash "4.17.11"
425612
426−find-elm-dependencies@2.0.2:
427− version "2.0.2"
428− resolved "https://registry.yarnpkg.com/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz#589a759a021e6e2f8f0df805f973313fc4b55693"
429− integrity sha512-nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==
430− dependencies:
431− firstline "1.2.0"
432− lodash "4.17.15"
433−
434613find-parent-dir@^0.3.0:
435614 version "0.3.0"
436615 resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54"
@@ -441,10 +620,15 @@ firstline@1.2.0:
441620 resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.0.tgz#c9f4886e7f7fbf0afc12d71941dce06b192aea05"
442621 integrity sha1-yfSIbn9/vwr8EtcZQdzgaxkq6gU=
443622
444−firstline@2.0.2:
445− version "2.0.2"
446− resolved "https://registry.yarnpkg.com/firstline/-/firstline-2.0.2.tgz#3fdfd894a80e181cd2fa478b07cadb8d446c53cd"
447− integrity sha512-8KcmfI0jgSECnzdhucm0i7vrwef3BWwgjimW2YkRC5eSFwjb5DibVoA0YvgkYwwxuJi9c+7M7X3b3lX8o9B6wg==
623+firstline@1.2.1:
624+ version "1.2.1"
625+ resolved "https://registry.yarnpkg.com/firstline/-/firstline-1.2.1.tgz#b88673c42009f8821fac2926e99720acee924fae"
626+ integrity sha1-uIZzxCAJ+IIfrCkm6ZcgrO6ST64=
627+
628+for-in@^1.0.2:
629+ version "1.0.2"
630+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
631+ integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
448632
449633forever-agent@~0.6.1:
450634 version "0.6.1"
@@ -460,31 +644,70 @@ form-data@~2.3.2:
460644 combined-stream "^1.0.6"
461645 mime-types "^2.1.12"
462646
463−fs-extra@8.1.0:
464− version "8.1.0"
465− resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
466− integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
647+fragment-cache@^0.2.1:
648+ version "0.2.1"
649+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
650+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
467651 dependencies:
468− graceful-fs "^4.2.0"
469− jsonfile "^4.0.0"
470− universalify "^0.1.0"
652+ map-cache "^0.2.2"
653+
654+fs-extra@0.30.0:
655+ version "0.30.0"
656+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
657+ integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=
658+ dependencies:
659+ graceful-fs "^4.1.2"
660+ jsonfile "^2.1.0"
661+ klaw "^1.0.0"
662+ path-is-absolute "^1.0.0"
663+ rimraf "^2.2.8"
471664
472665fs-minipass@^1.2.5:
473− version "1.2.7"
474− resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
475− integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
666+ version "1.2.6"
667+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07"
668+ integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==
476669 dependencies:
477− minipass "^2.6.0"
670+ minipass "^2.2.1"
478671
479672fs.realpath@^1.0.0:
480673 version "1.0.0"
481674 resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
482675 integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
483676
484−fsevents@~2.1.1:
485− version "2.1.2"
486− resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
487− integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==
677+fsevents@1.2.4:
678+ version "1.2.4"
679+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
680+ integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==
681+ dependencies:
682+ nan "^2.9.2"
683+ node-pre-gyp "^0.10.0"
684+
685+fsevents@^1.2.7:
686+ version "1.2.9"
687+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f"
688+ integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==
689+ dependencies:
690+ nan "^2.12.1"
691+ node-pre-gyp "^0.12.0"
692+
693+gauge@~2.7.3:
694+ version "2.7.4"
695+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
696+ integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
697+ dependencies:
698+ aproba "^1.0.3"
699+ console-control-strings "^1.0.0"
700+ has-unicode "^2.0.0"
701+ object-assign "^4.1.0"
702+ signal-exit "^3.0.0"
703+ string-width "^1.0.1"
704+ strip-ansi "^3.0.1"
705+ wide-align "^1.1.0"
706+
707+get-value@^2.0.3, get-value@^2.0.6:
708+ version "2.0.6"
709+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
710+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
488711
489712getpass@^0.1.1:
490713 version "0.1.7"
@@ -493,17 +716,30 @@ getpass@^0.1.1:
493716 dependencies:
494717 assert-plus "^1.0.0"
495718
496−glob-parent@~5.1.0:
497− version "5.1.0"
498− resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2"
499− integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
719+glob-parent@^3.1.0:
720+ version "3.1.0"
721+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
722+ integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
500723 dependencies:
501− is-glob "^4.0.1"
724+ is-glob "^3.1.0"
725+ path-dirname "^1.0.0"
726+
727+glob@7.1.1:
728+ version "7.1.1"
729+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
730+ integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg=
731+ dependencies:
732+ fs.realpath "^1.0.0"
733+ inflight "^1.0.4"
734+ inherits "2"
735+ minimatch "^3.0.2"
736+ once "^1.3.0"
737+ path-is-absolute "^1.0.0"
502738
503−glob@7.1.6, glob@^7.1.3:
504− version "7.1.6"
505− resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
506− integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
739+glob@^7.1.3:
740+ version "7.1.4"
741+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
742+ integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
507743 dependencies:
508744 fs.realpath "^1.0.0"
509745 inflight "^1.0.4"
@@ -512,17 +748,17 @@ glob@7.1.6, glob@^7.1.3:
512748 once "^1.3.0"
513749 path-is-absolute "^1.0.0"
514750
515−graceful-fs@^4.1.6, graceful-fs@^4.2.0:
516− version "4.2.3"
517− resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
518− integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
751+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
752+ version "4.2.0"
753+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b"
754+ integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==
519755
520756har-schema@^2.0.0:
521757 version "2.0.0"
522758 resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
523759 integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
524760
525−har-validator@~5.1.3:
761+har-validator@~5.1.0:
526762 version "5.1.3"
527763 resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
528764 integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
@@ -530,15 +766,51 @@ har-validator@~5.1.3:
530766 ajv "^6.5.5"
531767 har-schema "^2.0.0"
532768
769+has-flag@^2.0.0:
770+ version "2.0.0"
771+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
772+ integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=
773+
533774has-flag@^3.0.0:
534775 version "3.0.0"
535776 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
536777 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
537778
538−has-flag@^4.0.0:
539− version "4.0.0"
540− resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
541− integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
779+has-unicode@^2.0.0:
780+ version "2.0.1"
781+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
782+ integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
783+
784+has-value@^0.3.1:
785+ version "0.3.1"
786+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
787+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
788+ dependencies:
789+ get-value "^2.0.3"
790+ has-values "^0.1.4"
791+ isobject "^2.0.0"
792+
793+has-value@^1.0.0:
794+ version "1.0.0"
795+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
796+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
797+ dependencies:
798+ get-value "^2.0.6"
799+ has-values "^1.0.0"
800+ isobject "^3.0.0"
801+
802+has-values@^0.1.4:
803+ version "0.1.4"
804+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
805+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
806+
807+has-values@^1.0.0:
808+ version "1.0.0"
809+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
810+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
811+ dependencies:
812+ is-number "^3.0.0"
813+ kind-of "^4.0.0"
542814
543815http-signature@~1.2.0:
544816 version "1.2.0"
@@ -557,6 +829,20 @@ https-proxy-agent@^2.2.1:
557829 agent-base "^4.1.0"
558830 debug "^3.1.0"
559831
832+iconv-lite@^0.4.4:
833+ version "0.4.24"
834+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
835+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
836+ dependencies:
837+ safer-buffer ">= 2.1.2 < 3"
838+
839+ignore-walk@^3.0.1:
840+ version "3.0.1"
841+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
842+ integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==
843+ dependencies:
844+ minimatch "^3.0.4"
845+
560846immediate@~3.0.5:
561847 version "3.0.6"
562848 resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
@@ -575,36 +861,137 @@ inherits@2, inherits@^2.0.3, inherits@~2.0.3:
575861 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
576862 integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
577863
578−is-binary-path@~2.1.0:
579− version "2.1.0"
580− resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
581− integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
864+ini@~1.3.0:
865+ version "1.3.5"
866+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
867+ integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
868+
869+is-accessor-descriptor@^0.1.6:
870+ version "0.1.6"
871+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
872+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
873+ dependencies:
874+ kind-of "^3.0.2"
875+
876+is-accessor-descriptor@^1.0.0:
877+ version "1.0.0"
878+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
879+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
880+ dependencies:
881+ kind-of "^6.0.0"
882+
883+is-binary-path@^1.0.0:
884+ version "1.0.1"
885+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
886+ integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
887+ dependencies:
888+ binary-extensions "^1.0.0"
889+
890+is-buffer@^1.1.5:
891+ version "1.1.6"
892+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
893+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
894+
895+is-data-descriptor@^0.1.4:
896+ version "0.1.4"
897+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
898+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
899+ dependencies:
900+ kind-of "^3.0.2"
901+
902+is-data-descriptor@^1.0.0:
903+ version "1.0.0"
904+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
905+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
906+ dependencies:
907+ kind-of "^6.0.0"
908+
909+is-descriptor@^0.1.0:
910+ version "0.1.6"
911+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
912+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
913+ dependencies:
914+ is-accessor-descriptor "^0.1.6"
915+ is-data-descriptor "^0.1.4"
916+ kind-of "^5.0.0"
917+
918+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
919+ version "1.0.2"
920+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
921+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
922+ dependencies:
923+ is-accessor-descriptor "^1.0.0"
924+ is-data-descriptor "^1.0.0"
925+ kind-of "^6.0.2"
926+
927+is-extendable@^0.1.0, is-extendable@^0.1.1:
928+ version "0.1.1"
929+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
930+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
931+
932+is-extendable@^1.0.1:
933+ version "1.0.1"
934+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
935+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
582936 dependencies:
583− binary-extensions "^2.0.0"
937+ is-plain-object "^2.0.4"
584938
585−is-extglob@^2.1.1:
939+is-extglob@^2.1.0, is-extglob@^2.1.1:
586940 version "2.1.1"
587941 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
588942 integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
589943
590−is-glob@^4.0.1, is-glob@~4.0.1:
944+is-fullwidth-code-point@^1.0.0:
945+ version "1.0.0"
946+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
947+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
948+ dependencies:
949+ number-is-nan "^1.0.0"
950+
951+is-fullwidth-code-point@^2.0.0:
952+ version "2.0.0"
953+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
954+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
955+
956+is-glob@^3.1.0:
957+ version "3.1.0"
958+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
959+ integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
960+ dependencies:
961+ is-extglob "^2.1.0"
962+
963+is-glob@^4.0.0:
591964 version "4.0.1"
592965 resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
593966 integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
594967 dependencies:
595968 is-extglob "^2.1.1"
596969
597−is-number@^7.0.0:
598− version "7.0.0"
599− resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
600− integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
970+is-number@^3.0.0:
971+ version "3.0.0"
972+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
973+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
974+ dependencies:
975+ kind-of "^3.0.2"
976+
977+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
978+ version "2.0.4"
979+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
980+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
981+ dependencies:
982+ isobject "^3.0.1"
601983
602984is-typedarray@~1.0.0:
603985 version "1.0.0"
604986 resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
605987 integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
606988
607−isarray@~1.0.0:
989+is-windows@^1.0.2:
990+ version "1.0.2"
991+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
992+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
993+
994+isarray@1.0.0, isarray@~1.0.0:
608995 version "1.0.0"
609996 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
610997 integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
@@ -614,6 +1001,18 @@ isexe@^2.0.0:
6141001 resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
6151002 integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
6161003
1004+isobject@^2.0.0:
1005+ version "2.1.0"
1006+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
1007+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
1008+ dependencies:
1009+ isarray "1.0.0"
1010+
1011+isobject@^3.0.0, isobject@^3.0.1:
1012+ version "3.0.1"
1013+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
1014+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
1015+
6171016isstream@~0.1.2:
6181017 version "0.1.2"
6191018 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -639,10 +1038,10 @@ json-stringify-safe@~5.0.1:
6391038 resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
6401039 integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
6411040
642−jsonfile@^4.0.0:
643− version "4.0.0"
644− resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
645− integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
1041+jsonfile@^2.1.0:
1042+ version "2.4.0"
1043+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
1044+ integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
6461045 optionalDependencies:
6471046 graceful-fs "^4.1.6"
6481047
@@ -666,6 +1065,37 @@ jszip@^3.1.5:
6661065 readable-stream "~2.3.6"
6671066 set-immediate-shim "~1.0.1"
6681067
1068+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
1069+ version "3.2.2"
1070+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
1071+ integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
1072+ dependencies:
1073+ is-buffer "^1.1.5"
1074+
1075+kind-of@^4.0.0:
1076+ version "4.0.0"
1077+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
1078+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
1079+ dependencies:
1080+ is-buffer "^1.1.5"
1081+
1082+kind-of@^5.0.0:
1083+ version "5.1.0"
1084+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
1085+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
1086+
1087+kind-of@^6.0.0, kind-of@^6.0.2:
1088+ version "6.0.2"
1089+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
1090+ integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
1091+
1092+klaw@^1.0.0:
1093+ version "1.3.1"
1094+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
1095+ integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk=
1096+ optionalDependencies:
1097+ graceful-fs "^4.1.9"
1098+
6691099lie@~3.3.0:
6701100 version "3.3.0"
6711101 resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
@@ -673,16 +1103,11 @@ lie@~3.3.0:
6731103 dependencies:
6741104 immediate "~3.0.5"
6751105
676−lodash@4.17.11:
1106+lodash@4.17.11, lodash@^4.17.11:
6771107 version "4.17.11"
6781108 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
6791109 integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
6801110
681−lodash@4.17.15, lodash@^4.17.15:
682− version "4.17.15"
683− resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
684− integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
685−
6861111lru-cache@^4.0.1:
6871112 version "4.1.5"
6881113 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@@ -691,24 +1116,55 @@ lru-cache@^4.0.1:
6911116 pseudomap "^1.0.2"
6921117 yallist "^2.1.2"
6931118
694−mime-db@1.43.0:
695− version "1.43.0"
696− resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
697− integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
1119+map-cache@^0.2.2:
1120+ version "0.2.2"
1121+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
1122+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
1123+
1124+map-visit@^1.0.0:
1125+ version "1.0.0"
1126+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
1127+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
1128+ dependencies:
1129+ object-visit "^1.0.0"
1130+
1131+micromatch@^3.1.10, micromatch@^3.1.4:
1132+ version "3.1.10"
1133+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
1134+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
1135+ dependencies:
1136+ arr-diff "^4.0.0"
1137+ array-unique "^0.3.2"
1138+ braces "^2.3.1"
1139+ define-property "^2.0.2"
1140+ extend-shallow "^3.0.2"
1141+ extglob "^2.0.4"
1142+ fragment-cache "^0.2.1"
1143+ kind-of "^6.0.2"
1144+ nanomatch "^1.2.9"
1145+ object.pick "^1.3.0"
1146+ regex-not "^1.0.0"
1147+ snapdragon "^0.8.1"
1148+ to-regex "^3.0.2"
1149+
1150+mime-db@1.40.0:
1151+ version "1.40.0"
1152+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
1153+ integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
6981154
6991155mime-types@^2.1.12, mime-types@~2.1.19:
700− version "2.1.26"
701− resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
702− integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==
1156+ version "2.1.24"
1157+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
1158+ integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
7031159 dependencies:
704− mime-db "1.43.0"
1160+ mime-db "1.40.0"
7051161
7061162mime@^2.0.3:
7071163 version "2.4.4"
7081164 resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
7091165 integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
7101166
711−minimatch@^3.0.4:
1167+minimatch@^3.0.2, minimatch@^3.0.4:
7121168 version "3.0.4"
7131169 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
7141170 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -721,24 +1177,32 @@ minimist@0.0.8:
7211177 integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
7221178
7231179minimist@^1.2.0:
724− version "1.2.4"
725− resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.4.tgz#40357ef9582f8cd42ba8eaa274ddcf27f0c979b7"
726− integrity sha512-wTiNDqe4D2rbTJGZk1qcdZgFtY0/r+iuE6GDT7V0/+Gu5MLpIDm4+CssDECR79OJs/OxLPXMzdxy153b5Qy3hg==
1180+ version "1.2.0"
1181+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
1182+ integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
7271183
728−minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
729− version "2.9.0"
730− resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
731− integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
1184+minipass@^2.2.1, minipass@^2.3.5:
1185+ version "2.3.5"
1186+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
1187+ integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==
7321188 dependencies:
7331189 safe-buffer "^5.1.2"
7341190 yallist "^3.0.0"
7351191
7361192minizlib@^1.2.1:
737− version "1.3.3"
738− resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
739− integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
1193+ version "1.2.1"
1194+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
1195+ integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==
1196+ dependencies:
1197+ minipass "^2.2.1"
1198+
1199+mixin-deep@^1.2.0:
1200+ version "1.3.2"
1201+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
1202+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
7401203 dependencies:
741− minipass "^2.9.0"
1204+ for-in "^1.0.2"
1205+ is-extendable "^1.0.1"
7421206
7431207mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1:
7441208 version "0.5.1"
@@ -762,27 +1226,43 @@ murmur-hash-js@1.0.0:
7621226 resolved "https://registry.yarnpkg.com/murmur-hash-js/-/murmur-hash-js-1.0.0.tgz#5041049269c96633c866386960b2f4289e75e5b0"
7631227 integrity sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA=
7641228
765−mustache@^3.0.1:
766− version "3.2.1"
767− resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.1.tgz#89e78a9d207d78f2799b1e95764a25bf71a28322"
768− integrity sha512-RERvMFdLpaFfSRIEe632yDm5nsd0SDKn8hGmcUwswnyiE5mtdZLDybtHAz6hjJhawokF0hXvGLtx9mrQfm6FkA==
769−
770−nice-try@^1.0.4:
771− version "1.0.5"
772− resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
773− integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
774−
775−node-elm-compiler@5.0.4:
776− version "5.0.4"
777− resolved "https://registry.yarnpkg.com/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz#e139c517c4b91f914cccb0a06e3329e3c49d02ac"
778− integrity sha512-VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==
779− dependencies:
780− cross-spawn "6.0.5"
781− find-elm-dependencies "2.0.2"
782− lodash "4.17.15"
783− temp "^0.9.0"
784−
785−node-elm-compiler@^5.0.3:
1229+mustache@^2.3.0:
1230+ version "2.3.2"
1231+ resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5"
1232+ integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==
1233+
1234+nan@^2.12.1, nan@^2.9.2:
1235+ version "2.14.0"
1236+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
1237+ integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
1238+
1239+nanomatch@^1.2.9:
1240+ version "1.2.13"
1241+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
1242+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
1243+ dependencies:
1244+ arr-diff "^4.0.0"
1245+ array-unique "^0.3.2"
1246+ define-property "^2.0.2"
1247+ extend-shallow "^3.0.2"
1248+ fragment-cache "^0.2.1"
1249+ is-windows "^1.0.2"
1250+ kind-of "^6.0.2"
1251+ object.pick "^1.3.0"
1252+ regex-not "^1.0.0"
1253+ snapdragon "^0.8.1"
1254+ to-regex "^3.0.1"
1255+
1256+needle@^2.2.1:
1257+ version "2.4.0"
1258+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
1259+ integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
1260+ dependencies:
1261+ debug "^3.2.6"
1262+ iconv-lite "^0.4.4"
1263+ sax "^1.2.4"
1264+
1265+node-elm-compiler@5.0.3, node-elm-compiler@^5.0.3:
7861266 version "5.0.3"
7871267 resolved "https://registry.yarnpkg.com/node-elm-compiler/-/node-elm-compiler-5.0.3.tgz#69ffe02c0db4948c4ad9a4f91f8e45b0840c7943"
7881268 integrity sha512-I3CWm/ExYYQ/a9bjB0OL9VsGa3Lmgbb8QOs4y2kEiB/DTkTqkcTaCr/lVyOYjRpgR25TsmOBATscsg6H6aC9Hg==
@@ -792,16 +1272,119 @@ node-elm-compiler@^5.0.3:
7921272 lodash "4.17.11"
7931273 temp "^0.8.3"
7941274
795−normalize-path@^3.0.0, normalize-path@~3.0.0:
1275+node-pre-gyp@^0.10.0:
1276+ version "0.10.3"
1277+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
1278+ integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==
1279+ dependencies:
1280+ detect-libc "^1.0.2"
1281+ mkdirp "^0.5.1"
1282+ needle "^2.2.1"
1283+ nopt "^4.0.1"
1284+ npm-packlist "^1.1.6"
1285+ npmlog "^4.0.2"
1286+ rc "^1.2.7"
1287+ rimraf "^2.6.1"
1288+ semver "^5.3.0"
1289+ tar "^4"
1290+
1291+node-pre-gyp@^0.12.0:
1292+ version "0.12.0"
1293+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149"
1294+ integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==
1295+ dependencies:
1296+ detect-libc "^1.0.2"
1297+ mkdirp "^0.5.1"
1298+ needle "^2.2.1"
1299+ nopt "^4.0.1"
1300+ npm-packlist "^1.1.6"
1301+ npmlog "^4.0.2"
1302+ rc "^1.2.7"
1303+ rimraf "^2.6.1"
1304+ semver "^5.3.0"
1305+ tar "^4"
1306+
1307+nopt@^4.0.1:
1308+ version "4.0.1"
1309+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
1310+ integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
1311+ dependencies:
1312+ abbrev "1"
1313+ osenv "^0.1.4"
1314+
1315+normalize-path@^2.1.1:
1316+ version "2.1.1"
1317+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
1318+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
1319+ dependencies:
1320+ remove-trailing-separator "^1.0.1"
1321+
1322+normalize-path@^3.0.0:
7961323 version "3.0.0"
7971324 resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
7981325 integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
7991326
1327+npm-bundled@^1.0.1:
1328+ version "1.0.6"
1329+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd"
1330+ integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
1331+
1332+npm-packlist@^1.1.6:
1333+ version "1.4.4"
1334+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44"
1335+ integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==
1336+ dependencies:
1337+ ignore-walk "^3.0.1"
1338+ npm-bundled "^1.0.1"
1339+
1340+npmlog@^4.0.2:
1341+ version "4.1.2"
1342+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
1343+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
1344+ dependencies:
1345+ are-we-there-yet "~1.1.2"
1346+ console-control-strings "~1.1.0"
1347+ gauge "~2.7.3"
1348+ set-blocking "~2.0.0"
1349+
1350+number-is-nan@^1.0.0:
1351+ version "1.0.1"
1352+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
1353+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
1354+
8001355oauth-sign@~0.9.0:
8011356 version "0.9.0"
8021357 resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
8031358 integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
8041359
1360+object-assign@^4.1.0:
1361+ version "4.1.1"
1362+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
1363+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
1364+
1365+object-copy@^0.1.0:
1366+ version "0.1.0"
1367+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
1368+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
1369+ dependencies:
1370+ copy-descriptor "^0.1.0"
1371+ define-property "^0.2.5"
1372+ kind-of "^3.0.3"
1373+
1374+object-visit@^1.0.0:
1375+ version "1.0.1"
1376+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
1377+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
1378+ dependencies:
1379+ isobject "^3.0.0"
1380+
1381+object.pick@^1.3.0:
1382+ version "1.3.0"
1383+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
1384+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
1385+ dependencies:
1386+ isobject "^3.0.1"
1387+
8051388once@^1.3.0:
8061389 version "1.4.0"
8071390 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -809,31 +1392,44 @@ once@^1.3.0:
8091392 dependencies:
8101393 wrappy "1"
8111394
812−os-tmpdir@~1.0.1:
1395+os-homedir@^1.0.0:
1396+ version "1.0.2"
1397+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
1398+ integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
1399+
1400+os-tmpdir@^1.0.0, os-tmpdir@~1.0.1:
8131401 version "1.0.2"
8141402 resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
8151403 integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
8161404
1405+osenv@^0.1.4:
1406+ version "0.1.5"
1407+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
1408+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
1409+ dependencies:
1410+ os-homedir "^1.0.0"
1411+ os-tmpdir "^1.0.0"
1412+
8171413pako@~1.0.2:
8181414 version "1.0.10"
8191415 resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
8201416 integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==
8211417
1418+pascalcase@^0.1.1:
1419+ version "0.1.1"
1420+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
1421+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
1422+
1423+path-dirname@^1.0.0:
1424+ version "1.0.2"
1425+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
1426+ integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
1427+
8221428path-is-absolute@^1.0.0:
8231429 version "1.0.1"
8241430 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
8251431 integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
8261432
827−path-key@^2.0.1:
828− version "2.0.1"
829− resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
830− integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
831−
832−path-key@^3.1.0:
833− version "3.1.1"
834− resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
835− integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
836−
8371433pend@~1.2.0:
8381434 version "1.2.0"
8391435 resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
@@ -844,10 +1440,10 @@ performance-now@^2.1.0:
8441440 resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
8451441 integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
8461442
847−picomatch@^2.0.4:
848− version "2.2.1"
849− resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a"
850− integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==
1443+posix-character-classes@^0.1.0:
1444+ version "0.1.1"
1445+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
1446+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
8511447
8521448process-nextick-args@~2.0.0:
8531449 version "2.0.1"
@@ -869,10 +1465,15 @@ pseudomap@^1.0.2:
8691465 resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
8701466 integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
8711467
872−psl@^1.1.28:
873− version "1.7.0"
874− resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c"
875− integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==
1468+psl@^1.1.24, psl@^1.1.28:
1469+ version "1.2.0"
1470+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.2.0.tgz#df12b5b1b3a30f51c329eacbdef98f3a6e136dc6"
1471+ integrity sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==
1472+
1473+punycode@^1.4.1:
1474+ version "1.4.1"
1475+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
1476+ integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
8761477
8771478punycode@^2.1.0, punycode@^2.1.1:
8781479 version "2.1.1"
@@ -898,7 +1499,17 @@ qs@~6.5.2:
8981499 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
8991500 integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
9001501
901−readable-stream@^2.2.2, readable-stream@~2.3.6:
1502+rc@^1.2.7:
1503+ version "1.2.8"
1504+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
1505+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
1506+ dependencies:
1507+ deep-extend "^0.6.0"
1508+ ini "~1.3.0"
1509+ minimist "^1.2.0"
1510+ strip-json-comments "~2.0.1"
1511+
1512+readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6:
9021513 version "2.3.6"
9031514 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
9041515 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -911,34 +1522,59 @@ readable-stream@^2.2.2, readable-stream@~2.3.6:
9111522 string_decoder "~1.1.1"
9121523 util-deprecate "~1.0.1"
9131524
914−readdirp@~3.2.0:
915− version "3.2.0"
916− resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839"
917− integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==
1525+readdirp@^2.2.1:
1526+ version "2.2.1"
1527+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
1528+ integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
9181529 dependencies:
919− picomatch "^2.0.4"
1530+ graceful-fs "^4.1.11"
1531+ micromatch "^3.1.10"
1532+ readable-stream "^2.0.2"
1533+
1534+regex-not@^1.0.0, regex-not@^1.0.2:
1535+ version "1.0.2"
1536+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
1537+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
1538+ dependencies:
1539+ extend-shallow "^3.0.2"
1540+ safe-regex "^1.1.0"
1541+
1542+remove-trailing-separator@^1.0.1:
1543+ version "1.1.0"
1544+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
1545+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
9201546
921−request-promise-core@1.1.3:
1547+repeat-element@^1.1.2:
9221548 version "1.1.3"
923− resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9"
924− integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==
1549+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
1550+ integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
1551+
1552+repeat-string@^1.6.1:
1553+ version "1.6.1"
1554+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
1555+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
1556+
1557+request-promise-core@1.1.2:
1558+ version "1.1.2"
1559+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346"
1560+ integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==
9251561 dependencies:
926− lodash "^4.17.15"
1562+ lodash "^4.17.11"
9271563
928−request-promise@^4.2.4:
929− version "4.2.5"
930− resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.5.tgz#186222c59ae512f3497dfe4d75a9c8461bd0053c"
931− integrity sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==
1564+request-promise@^4.2.0:
1565+ version "4.2.4"
1566+ resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.4.tgz#1c5ed0d71441e38ad58c7ce4ea4ea5b06d54b310"
1567+ integrity sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==
9321568 dependencies:
9331569 bluebird "^3.5.0"
934− request-promise-core "1.1.3"
1570+ request-promise-core "1.1.2"
9351571 stealthy-require "^1.1.1"
9361572 tough-cookie "^2.3.3"
9371573
938−request@^2.88.0:
939− version "2.88.2"
940− resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
941− integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
1574+request@^2.87.0:
1575+ version "2.88.0"
1576+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
1577+ integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
9421578 dependencies:
9431579 aws-sign2 "~0.7.0"
9441580 aws4 "^1.8.0"
@@ -947,7 +1583,7 @@ request@^2.88.0:
9471583 extend "~3.0.2"
9481584 forever-agent "~0.6.1"
9491585 form-data "~2.3.2"
950− har-validator "~5.1.3"
1586+ har-validator "~5.1.0"
9511587 http-signature "~1.2.0"
9521588 is-typedarray "~1.0.0"
9531589 isstream "~0.1.2"
@@ -957,24 +1593,32 @@ request@^2.88.0:
9571593 performance-now "^2.1.0"
9581594 qs "~6.5.2"
9591595 safe-buffer "^5.1.2"
960− tough-cookie "~2.5.0"
1596+ tough-cookie "~2.4.3"
9611597 tunnel-agent "^0.6.0"
9621598 uuid "^3.3.2"
9631599
964−rimraf@^2.6.1:
965− version "2.7.1"
966− resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
967− integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
968− dependencies:
969− glob "^7.1.3"
1600+resolve-url@^0.2.1:
1601+ version "0.2.1"
1602+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
1603+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
1604+
1605+ret@~0.1.10:
1606+ version "0.1.15"
1607+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
1608+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
9701609
971−rimraf@^2.6.3, rimraf@~2.6.2:
1610+rimraf@^2.2.8, rimraf@^2.6.1, rimraf@^2.6.3:
9721611 version "2.6.3"
9731612 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
9741613 integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
9751614 dependencies:
9761615 glob "^7.1.3"
9771616
1617+rimraf@~2.2.6:
1618+ version "2.2.8"
1619+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
1620+ integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=
1621+
9781622safe-buffer@^5.0.1, safe-buffer@^5.1.2:
9791623 version "5.2.0"
9801624 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
@@ -985,12 +1629,19 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
9851629 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
9861630 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
9871631
988−safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
1632+safe-regex@^1.1.0:
1633+ version "1.1.0"
1634+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
1635+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
1636+ dependencies:
1637+ ret "~0.1.10"
1638+
1639+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
9891640 version "2.1.2"
9901641 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
9911642 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
9921643
993−sax@>=0.6.0:
1644+sax@>=0.6.0, sax@^1.2.4:
9941645 version "1.2.4"
9951646 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
9961647 integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@@ -1005,39 +1656,93 @@ selenium-webdriver@^4.0.0-alpha.4:
10051656 tmp "0.0.30"
10061657 xml2js "^0.4.19"
10071658
1008−semver@^5.5.0:
1009− version "5.7.1"
1010− resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1011− integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1659+semver@^5.3.0:
1660+ version "5.7.0"
1661+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
1662+ integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
1663+
1664+set-blocking@~2.0.0:
1665+ version "2.0.0"
1666+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1667+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
10121668
10131669set-immediate-shim@~1.0.1:
10141670 version "1.0.1"
10151671 resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
10161672 integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
10171673
1018−shebang-command@^1.2.0:
1019− version "1.2.0"
1020− resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
1021− integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
1674+set-value@^2.0.0, set-value@^2.0.1:
1675+ version "2.0.1"
1676+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
1677+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
10221678 dependencies:
1023− shebang-regex "^1.0.0"
1679+ extend-shallow "^2.0.1"
1680+ is-extendable "^0.1.1"
1681+ is-plain-object "^2.0.3"
1682+ split-string "^3.0.1"
10241683
1025−shebang-command@^2.0.0:
1026− version "2.0.0"
1027− resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
1028− integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1029− dependencies:
1030− shebang-regex "^3.0.0"
1684+signal-exit@^3.0.0:
1685+ version "3.0.2"
1686+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
1687+ integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
10311688
1032−shebang-regex@^1.0.0:
1033− version "1.0.0"
1034− resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
1035− integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
1689+snapdragon-node@^2.0.1:
1690+ version "2.1.1"
1691+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
1692+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
1693+ dependencies:
1694+ define-property "^1.0.0"
1695+ isobject "^3.0.0"
1696+ snapdragon-util "^3.0.1"
1697+
1698+snapdragon-util@^3.0.1:
1699+ version "3.0.1"
1700+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
1701+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
1702+ dependencies:
1703+ kind-of "^3.2.0"
1704+
1705+snapdragon@^0.8.1:
1706+ version "0.8.2"
1707+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
1708+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
1709+ dependencies:
1710+ base "^0.11.1"
1711+ debug "^2.2.0"
1712+ define-property "^0.2.5"
1713+ extend-shallow "^2.0.1"
1714+ map-cache "^0.2.2"
1715+ source-map "^0.5.6"
1716+ source-map-resolve "^0.5.0"
1717+ use "^3.1.0"
1718+
1719+source-map-resolve@^0.5.0:
1720+ version "0.5.2"
1721+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
1722+ integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==
1723+ dependencies:
1724+ atob "^2.1.1"
1725+ decode-uri-component "^0.2.0"
1726+ resolve-url "^0.2.1"
1727+ source-map-url "^0.4.0"
1728+ urix "^0.1.0"
1729+
1730+source-map-url@^0.4.0:
1731+ version "0.4.0"
1732+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
1733+ integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
10361734
1037−shebang-regex@^3.0.0:
1038− version "3.0.0"
1039− resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
1040− integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1735+source-map@^0.5.6:
1736+ version "0.5.7"
1737+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
1738+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
1739+
1740+split-string@^3.0.1, split-string@^3.0.2:
1741+ version "3.1.0"
1742+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
1743+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
1744+ dependencies:
1745+ extend-shallow "^3.0.0"
10411746
10421747split@1.0.1:
10431748 version "1.0.1"
@@ -1061,11 +1766,36 @@ sshpk@^1.7.0:
10611766 safer-buffer "^2.0.2"
10621767 tweetnacl "~0.14.0"
10631768
1769+static-extend@^0.1.1:
1770+ version "0.1.2"
1771+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
1772+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
1773+ dependencies:
1774+ define-property "^0.2.5"
1775+ object-copy "^0.1.0"
1776+
10641777stealthy-require@^1.1.1:
10651778 version "1.1.1"
10661779 resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
10671780 integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
10681781
1782+string-width@^1.0.1:
1783+ version "1.0.2"
1784+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
1785+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
1786+ dependencies:
1787+ code-point-at "^1.0.0"
1788+ is-fullwidth-code-point "^1.0.0"
1789+ strip-ansi "^3.0.0"
1790+
1791+"string-width@^1.0.2 || 2":
1792+ version "2.1.1"
1793+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
1794+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
1795+ dependencies:
1796+ is-fullwidth-code-point "^2.0.0"
1797+ strip-ansi "^4.0.0"
1798+
10691799string_decoder@~1.1.1:
10701800 version "1.1.1"
10711801 resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@@ -1073,12 +1803,38 @@ string_decoder@~1.1.1:
10731803 dependencies:
10741804 safe-buffer "~5.1.0"
10751805
1076−supports-color@7.1.0, supports-color@^7.1.0:
1077− version "7.1.0"
1078− resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
1079− integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
1806+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
1807+ version "3.0.1"
1808+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
1809+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
10801810 dependencies:
1081− has-flag "^4.0.0"
1811+ ansi-regex "^2.0.0"
1812+
1813+strip-ansi@^4.0.0:
1814+ version "4.0.0"
1815+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
1816+ integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
1817+ dependencies:
1818+ ansi-regex "^3.0.0"
1819+
1820+strip-json-comments@~2.0.1:
1821+ version "2.0.1"
1822+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1823+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1824+
1825+supports-color@4.2.0:
1826+ version "4.2.0"
1827+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.2.0.tgz#ad986dc7eb2315d009b4d77c8169c2231a684037"
1828+ integrity sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==
1829+ dependencies:
1830+ has-flag "^2.0.0"
1831+
1832+supports-color@^4.0.0:
1833+ version "4.5.0"
1834+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
1835+ integrity sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=
1836+ dependencies:
1837+ has-flag "^2.0.0"
10821838
10831839supports-color@^5.3.0:
10841840 version "5.5.0"
@@ -1087,32 +1843,26 @@ supports-color@^5.3.0:
10871843 dependencies:
10881844 has-flag "^3.0.0"
10891845
1090−tar@^4.4.10:
1091− version "4.4.13"
1092− resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
1093− integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
1846+tar@^4, tar@^4.4.8:
1847+ version "4.4.10"
1848+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1"
1849+ integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==
10941850 dependencies:
10951851 chownr "^1.1.1"
10961852 fs-minipass "^1.2.5"
1097− minipass "^2.8.6"
1853+ minipass "^2.3.5"
10981854 minizlib "^1.2.1"
10991855 mkdirp "^0.5.0"
11001856 safe-buffer "^5.1.2"
11011857 yallist "^3.0.3"
11021858
1103−temp@0.9.1, temp@^0.9.0:
1104− version "0.9.1"
1105− resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697"
1106− integrity sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==
1107− dependencies:
1108− rimraf "~2.6.2"
1109−
1110−temp@^0.8.3:
1111− version "0.8.4"
1112− resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2"
1113− integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==
1859+temp@0.8.3, temp@^0.8.3:
1860+ version "0.8.3"
1861+ resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
1862+ integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=
11141863 dependencies:
1115− rimraf "~2.6.2"
1864+ os-tmpdir "^1.0.0"
1865+ rimraf "~2.2.6"
11161866
11171867through@2:
11181868 version "2.3.8"
@@ -1126,14 +1876,32 @@ tmp@0.0.30:
11261876 dependencies:
11271877 os-tmpdir "~1.0.1"
11281878
1129−to-regex-range@^5.0.1:
1130− version "5.0.1"
1131− resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1132− integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1879+to-object-path@^0.3.0:
1880+ version "0.3.0"
1881+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
1882+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
1883+ dependencies:
1884+ kind-of "^3.0.2"
1885+
1886+to-regex-range@^2.1.0:
1887+ version "2.1.1"
1888+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
1889+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
11331890 dependencies:
1134− is-number "^7.0.0"
1891+ is-number "^3.0.0"
1892+ repeat-string "^1.6.1"
11351893
1136−tough-cookie@^2.3.3, tough-cookie@~2.5.0:
1894+to-regex@^3.0.1, to-regex@^3.0.2:
1895+ version "3.0.2"
1896+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
1897+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
1898+ dependencies:
1899+ define-property "^2.0.2"
1900+ extend-shallow "^3.0.2"
1901+ regex-not "^1.0.2"
1902+ safe-regex "^1.1.0"
1903+
1904+tough-cookie@^2.3.3:
11371905 version "2.5.0"
11381906 resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
11391907 integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
@@ -1141,6 +1909,14 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0:
11411909 psl "^1.1.28"
11421910 punycode "^2.1.1"
11431911
1912+tough-cookie@~2.4.3:
1913+ version "2.4.3"
1914+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
1915+ integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
1916+ dependencies:
1917+ psl "^1.1.24"
1918+ punycode "^1.4.1"
1919+
11441920"traverse@>=0.3.0 <0.4":
11451921 version "0.3.9"
11461922 resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
@@ -1163,10 +1939,23 @@ typedarray@^0.0.6:
11631939 resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
11641940 integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
11651941
1166−universalify@^0.1.0:
1167− version "0.1.2"
1168− resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
1169− integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
1942+union-value@^1.0.0:
1943+ version "1.0.1"
1944+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
1945+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
1946+ dependencies:
1947+ arr-union "^3.1.0"
1948+ get-value "^2.0.6"
1949+ is-extendable "^0.1.1"
1950+ set-value "^2.0.1"
1951+
1952+unset-value@^1.0.0:
1953+ version "1.0.0"
1954+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
1955+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
1956+ dependencies:
1957+ has-value "^0.3.1"
1958+ isobject "^3.0.0"
11701959
11711960unzip-stream@^0.3.0:
11721961 version "0.3.0"
@@ -1176,6 +1965,11 @@ unzip-stream@^0.3.0:
11761965 binary "^0.3.0"
11771966 mkdirp "^0.5.1"
11781967
1968+upath@^1.1.0:
1969+ version "1.1.2"
1970+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
1971+ integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
1972+
11791973uri-js@^4.2.2:
11801974 version "4.2.2"
11811975 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
@@ -1183,15 +1977,25 @@ uri-js@^4.2.2:
11831977 dependencies:
11841978 punycode "^2.1.0"
11851979
1980+urix@^0.1.0:
1981+ version "0.1.0"
1982+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
1983+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
1984+
1985+use@^3.1.0:
1986+ version "3.1.1"
1987+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
1988+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
1989+
11861990util-deprecate@~1.0.1:
11871991 version "1.0.2"
11881992 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
11891993 integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
11901994
11911995uuid@^3.3.2:
1192− version "3.4.0"
1193− resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
1194− integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
1996+ version "3.3.2"
1997+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
1998+ integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
11951999
11962000verror@1.10.0:
11972001 version "1.10.0"
@@ -1202,26 +2006,19 @@ verror@1.10.0:
12022006 core-util-is "1.0.2"
12032007 extsprintf "^1.2.0"
12042008
1205−which@2.0.1:
1206− version "2.0.1"
1207− resolved "https://registry.yarnpkg.com/which/-/which-2.0.1.tgz#f1cf94d07a8e571b6ff006aeb91d0300c47ef0a4"
1208− integrity sha512-N7GBZOTswtB9lkQBZA4+zAXrjEIWAUOB93AvzUiudRzRxhUdLURQ7D/gAIMY1gatT/LTbmbcv8SiYazy3eYB7w==
1209− dependencies:
1210− isexe "^2.0.0"
1211−
1212−which@^1.2.9:
2009+which@1.3.1, which@^1.2.9:
12132010 version "1.3.1"
12142011 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
12152012 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
12162013 dependencies:
12172014 isexe "^2.0.0"
12182015
1219−which@^2.0.1:
1220− version "2.0.2"
1221− resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
1222− integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
2016+wide-align@^1.1.0:
2017+ version "1.1.3"
2018+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
2019+ integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
12232020 dependencies:
1224− isexe "^2.0.0"
2021+ string-width "^1.0.2 || 2"
12252022
12262023wrappy@1:
12272024 version "1.0.2"
@@ -1243,10 +2040,10 @@ xml2js@^0.4.19:
12432040 sax ">=0.6.0"
12442041 xmlbuilder "~9.0.1"
12452042
1246−xmlbuilder@^13.0.2:
1247− version "13.0.2"
1248− resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7"
1249− integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==
2043+xmlbuilder@^8.2.2:
2044+ version "8.2.2"
2045+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
2046+ integrity sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=
12502047
12512048xmlbuilder@~9.0.1:
12522049 version "9.0.7"
@@ -1259,9 +2056,9 @@ yallist@^2.1.2:
12592056 integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
12602057
12612058yallist@^3.0.0, yallist@^3.0.3:
1262− version "3.1.1"
1263− resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
1264− integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
2059+ version "3.0.3"
2060+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
2061+ integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
12652062
12662063yauzl@2.4.1:
12672064 version "2.4.1"