diff --git a/.eslintrc.json b/.eslintrc.json index 7f8e075..9d6a62b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,7 +1,6 @@ { - "env": { "commonjs": true }, "extends": "eslint:recommended", - "parserOptions": { "ecmaVersion": 5 }, + "parserOptions": { "ecmaVersion": 6, "sourceType": "module" }, "rules": { "block-scoped-var": "error", "consistent-return": "error", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43f9f20..e16f413 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ jobs: - name: Set up PureScript toolchain uses: purescript-contrib/setup-purescript@main with: + purescript: "unstable" purs-tidy: "latest" - name: Cache PureScript dependencies @@ -49,8 +50,17 @@ jobs: - name: Build the project run: npm run build - - name: Run tests - run: npm run test +# - name: Run tests +# run: npm run test - name: Check formatting run: purs-tidy check src test + + - name: Verify Bower & Pulp + run: | + npm install bower pulp@16.0.0-0 + npx bower install + npx pulp build -- --censor-lib --strict + if [ -d "test" ]; then + npx pulp test + fi diff --git a/CHANGELOG.md b/CHANGELOG.md index 7770782..2bbf719 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ Notable changes to this project are documented in this file. The format is based ## [Unreleased] Breaking changes: +- Migrate FFI to ES modules (#185 by @JordanMartinez) +- Replaced polymorphic proxies with monomorphic `Proxy` (#185 by @JordanMartinez) New features: diff --git a/bower.json b/bower.json index b11275c..eddfbf3 100644 --- a/bower.json +++ b/bower.json @@ -17,15 +17,15 @@ "url": "https://github.com/purescript-contrib/purescript-react.git" }, "dependencies": { - "purescript-effect": "^3.0.0", - "purescript-exceptions": "^5.0.0", - "purescript-maybe": "^5.0.0", - "purescript-nullable": "^5.0.0", - "purescript-prelude": "^5.0.0", - "purescript-typelevel-prelude": "^6.0.0", - "purescript-unsafe-coerce": "^5.0.0" + "purescript-effect": "master", + "purescript-exceptions": "master", + "purescript-maybe": "master", + "purescript-nullable": "main", + "purescript-prelude": "master", + "purescript-typelevel-prelude": "master", + "purescript-unsafe-coerce": "master" }, "devDependencies": { - "purescript-console": "^5.0.0" + "purescript-console": "master" } } diff --git a/package.json b/package.json index acf39bb..5617636 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,6 @@ }, "devDependencies": { "eslint": "^7.10.0", - "purescript-psa": "^0.8.0" + "purescript-psa": "^0.8.2" } } diff --git a/packages.dhall b/packages.dhall index 7a6905b..582d6d3 100644 --- a/packages.dhall +++ b/packages.dhall @@ -1,4 +1,4 @@ let upstream = - https://github.com/purescript/package-sets/releases/download/psc-0.14.3-20210722/packages.dhall sha256:1ceb43aa59436bf5601bac45f6f3781c4e1f0e4c2b8458105b018e5ed8c30f8c + https://raw.githubusercontent.com/purescript/package-sets/prepare-0.15/src/packages.dhall in upstream diff --git a/spago.dhall b/spago.dhall index 4e5b7a6..0119ab6 100644 --- a/spago.dhall +++ b/spago.dhall @@ -6,7 +6,6 @@ , "maybe" , "nullable" , "prelude" - , "psci-support" , "typelevel-prelude" , "unsafe-coerce" ] diff --git a/src/React.js b/src/React.js index 91d4c45..b445652 100644 --- a/src/React.js +++ b/src/React.js @@ -1,43 +1,40 @@ -/* global exports */ -"use strict"; - -var React = require("react"); +import React from "react"; function createClass(baseClass) { function bindProperty(instance, prop, value) { switch (prop) { - case 'state': - case 'render': - case 'componentDidMount': - case 'componentWillUnmount': + case "state": + case "render": + case "componentDidMount": + case "componentWillUnmount": instance[prop] = value; break; - case 'componentDidCatch': - case 'componentWillUpdate': - case 'shouldComponentUpdate': - case 'getSnapshotBeforeUpdate': + case "componentDidCatch": + case "componentWillUpdate": + case "shouldComponentUpdate": + case "getSnapshotBeforeUpdate": instance[prop] = function (a, b) { return value(a)(b)(); }; break; - case 'componentDidUpdate': + case "componentDidUpdate": instance[prop] = function (a, b, c) { return value(a)(b)(c)(); }; break; - case 'unsafeComponentWillMount': - instance['UNSAFE_componentWillMount'] = value; + case "unsafeComponentWillMount": + instance["UNSAFE_componentWillMount"] = value; break; - case 'unsafeComponentWillReceiveProps': - instance['UNSAFE_componentWillReceiveProps'] = function (a) { return value(a)(); }; + case "unsafeComponentWillReceiveProps": + instance["UNSAFE_componentWillReceiveProps"] = function (a) { return value(a)(); }; break; - case 'unsafeComponentWillUpdate': - instance['UNSAFE_componentWillUpdate'] = function (a, b) { return value(a)(b)(); }; + case "unsafeComponentWillUpdate": + instance["UNSAFE_componentWillUpdate"] = function (a, b) { return value(a)(b)(); }; break; default: - throw new Error('[purescript-react] Not a component property: ' + prop); + throw new Error("[purescript-react] Not a component property: " + prop); } } @@ -46,6 +43,7 @@ function createClass(baseClass) { var Constructor = function (props) { baseClass.call(this, props); var spec = ctrFn(this)(); + // eslint-disable-next-line guard-for-in for (var k in spec) { bindProperty(this, k, spec[k]); } @@ -60,6 +58,10 @@ function createClass(baseClass) { }; } +var componentImpl = createClass(React.Component); +export {componentImpl}; + +// eslint-disable-next-line no-unused-vars function createClassWithDerivedState(classCtr) { return function(displayName) { return function(getDerivedStateFromProps) { @@ -72,28 +74,22 @@ function createClassWithDerivedState(classCtr) { }; } -var componentImpl = createClass(React.Component); -exports.componentImpl = componentImpl; -exports.componentWithDerivedStateImpl = createClassWithDerivedState(componentImpl); +export const componentWithDerivedStateImpl = createClassWithDerivedState(componentImpl); var pureComponentImpl = createClass(React.PureComponent); -exports.pureComponentImpl = pureComponentImpl; -exports.pureComponentWithDerivedStateImpl = createClassWithDerivedState(pureComponentImpl); - -exports.statelessComponent = function(x) { return x; }; - -exports.fragment = React.Fragment; +export {pureComponentImpl}; +export const pureComponentWithDerivedStateImpl = createClassWithDerivedState(pureComponentImpl); +export function statelessComponent(x) { return x; } +export const fragment = React.Fragment; function getProps(this_) { return function(){ return this_.props; }; } -exports.getProps = getProps; - -exports.childrenToArray = React.Children.toArray; - -exports.childrenCount = React.Children.count; +export {getProps}; +export const childrenToArray = React.Children.toArray; +export const childrenCount = React.Children.count; function setStateImpl(this_) { return function(state){ @@ -102,7 +98,7 @@ function setStateImpl(this_) { }; }; } -exports.setStateImpl = setStateImpl; +export {setStateImpl}; function setStateWithCallbackImpl(this_) { return function(state){ @@ -113,17 +109,17 @@ function setStateWithCallbackImpl(this_) { }; }; } -exports.setStateWithCallbackImpl = setStateWithCallbackImpl; +export {setStateWithCallbackImpl}; function getState(this_) { return function(){ if (!this_.state) { - throw new Error('[purescript-react] Cannot get state within constructor'); + throw new Error("[purescript-react] Cannot get state within constructor"); } return this_.state; }; } -exports.getState = getState; +export {getState}; function forceUpdateWithCallback(this_) { return function(cb) { @@ -132,7 +128,7 @@ function forceUpdateWithCallback(this_) { }; }; } -exports.forceUpdateWithCallback = forceUpdateWithCallback; +export {forceUpdateWithCallback}; function createElement(class_) { return function(props){ @@ -141,15 +137,15 @@ function createElement(class_) { }; }; } -exports.createElementImpl = createElement; -exports.createElementTagName = createElement; +export {createElement as createElementImpl}; +export {createElement as createElementTagName}; function createLeafElement(class_) { return function(props) { return React.createElement(class_, props); }; } -exports.createLeafElementImpl = createLeafElement; +export {createLeafElement as createLeafElementImpl}; function createElementDynamic(class_) { return function(props) { @@ -157,9 +153,9 @@ function createElementDynamic(class_) { return React.createElement(class_, props, children); }; }; -}; -exports.createElementDynamicImpl = createElementDynamic; -exports.createElementTagNameDynamic = createElementDynamic; +} +export {createElementDynamic as createElementDynamicImpl}; +export {createElementDynamic as createElementTagNameDynamic}; function createContext(defaultValue) { var context = React.createContext(defaultValue); @@ -168,4 +164,4 @@ function createContext(defaultValue) { provider: context.Provider }; } -exports.createContext = createContext; +export {createContext}; diff --git a/src/React/DOM/Props.js b/src/React/DOM/Props.js index 68e4a39..f82d507 100644 --- a/src/React/DOM/Props.js +++ b/src/React/DOM/Props.js @@ -1,8 +1,3 @@ -/* global exports */ -"use strict"; - -var React = require("react"); - function unsafeMkProps(key) { return function(value){ var result = {}; @@ -10,7 +5,7 @@ function unsafeMkProps(key) { return result; }; } -exports.unsafeMkProps = unsafeMkProps; +export {unsafeMkProps}; function unsafeUnfoldProps(key) { return function(value){ @@ -19,7 +14,7 @@ function unsafeUnfoldProps(key) { props[key] = result; for (var subprop in value) { - if (value.hasOwnProperty(subprop)) { + if (Object.hasOwnProperty.apply(value, [subprop])) { result[subprop] = value[subprop]; } } @@ -27,14 +22,14 @@ function unsafeUnfoldProps(key) { return props; }; } -exports.unsafeUnfoldProps = unsafeUnfoldProps; +export {unsafeUnfoldProps}; function unsafePrefixProps(prefix) { return function(value){ var result = {}; for (var prop in value) { - if (value.hasOwnProperty(prop)) { + if (Object.hasOwnProperty.apply(value, [prop])) { result[prefix + prop] = value[prop]; } } @@ -42,7 +37,7 @@ function unsafePrefixProps(prefix) { return result; }; } -exports.unsafePrefixProps = unsafePrefixProps; +export {unsafePrefixProps}; function unsafeFromPropsArray(props) { var result = {}; @@ -51,12 +46,12 @@ function unsafeFromPropsArray(props) { var prop = props[i]; for (var key in prop) { - if (prop.hasOwnProperty(key)) { + if (Object.hasOwnProperty.apply(prop, [key])) { result[key] = prop[key]; } } } return result; -}; -exports.unsafeFromPropsArray = unsafeFromPropsArray; +} +export {unsafeFromPropsArray}; diff --git a/src/React/Ref.js b/src/React/Ref.js index a08fe02..865a9c6 100644 --- a/src/React/Ref.js +++ b/src/React/Ref.js @@ -1,13 +1,10 @@ -"use strict"; +import React from "react"; +export const createRef = React.createRef; -var React = require("react"); - -exports.createRef = React.createRef; - -exports.liftCallbackRef = function(ref) { +export function liftCallbackRef(ref) { return { current: ref }; } -exports.getCurrentRef_ = function(ref) { +export function getCurrentRef_(ref) { return ref.current; } diff --git a/src/React/SyntheticEvent.js b/src/React/SyntheticEvent.js index 6d39ee0..499161e 100644 --- a/src/React/SyntheticEvent.js +++ b/src/React/SyntheticEvent.js @@ -1,47 +1,45 @@ -'use strict'; - -exports.preventDefault = function preventDefault(event) { +export function preventDefault(event) { return function() { return event.preventDefault(); }; -}; +} -exports.isDefaultPrevented = function isDefaultPrevented(event) { +export function isDefaultPrevented(event) { return function() { return event.isDefaultPrevented(); }; -}; +} -exports.stopPropagation = function stopPropagation(event) { +export function stopPropagation(event) { return function() { return event.stopPropagation(); }; -}; +} -exports.isPropagationStopped = function isPropagationStopped(event) { +export function isPropagationStopped(event) { return function() { return event.isPropagationStopped(); }; -}; +} -exports.persist = function persist(event) { +export function persist(event) { return function() { return event.persist(); }; -}; +} -exports.getModifierState = function getModifierState(key) { +export function getModifierState(key) { return function(event) { return function() { return event.getModifierState(key); }; }; -}; +} -exports.unsafeGet = function unsafeGet(key) { +export function unsafeGet(key) { return function (event) { return function () { return event[key]; }; }; -}; +} diff --git a/src/React/SyntheticEvent.purs b/src/React/SyntheticEvent.purs index f4c97e0..4695065 100644 --- a/src/React/SyntheticEvent.purs +++ b/src/React/SyntheticEvent.purs @@ -391,10 +391,10 @@ foreign import getModifierState -> Effect Boolean get - :: forall l r s a proxy + :: forall l r s a . Row.Cons l a r s => IsSymbol l - => proxy l + => Proxy l -> SyntheticEvent_ s -> Effect a get l r = unsafeGet (reflectSymbol l) r