From b95e5506d21d6390e0f936a78f9a5093f27b9ac0 Mon Sep 17 00:00:00 2001 From: Miel Truyen Date: Tue, 14 Apr 2020 11:54:30 +0200 Subject: [PATCH] v0.0.11: Added unit-tests, solved the key={...} problem, updated the build/watch configuration of CSX to be able to build minified and non-minified bundle outputs, as well as a CJS version of lib/ (for consuming in Node-environment, like Jest). The previous tests were renamed to examples, and should still need to be updated. --- .idea/misc.xml | 2 +- .idea/webResources.xml | 2 + README.md | 1 + {tests => examples}/.babelrc | 0 {tests => examples}/basic/index.html | 0 {tests => examples}/basic/index.jsx | 0 {tests => examples}/basic/index.scss | 0 {tests => examples}/basic/page.jsx | 0 {tests => examples}/cfg/.babelrc | 0 {tests => examples}/cfg/rollup-build.js | 4 +- {tests => examples}/index.html | 0 {tests => examples}/index.jsx | 0 .../pdf/assets/fonts/DINPro-Black.otf | Bin .../pdf/assets/fonts/DINPro-BlackItalic.otf | Bin .../pdf/assets/fonts/DINPro-Bold.otf | Bin .../pdf/assets/fonts/DINPro-BoldItalic.otf | Bin .../pdf/assets/fonts/DINPro-Cond.otf | Bin .../pdf/assets/fonts/DINPro-CondBlack.otf | Bin .../pdf/assets/fonts/DINPro-CondBlackIta.otf | Bin .../pdf/assets/fonts/DINPro-CondBold.otf | Bin .../pdf/assets/fonts/DINPro-CondBoldIta.otf | Bin .../pdf/assets/fonts/DINPro-CondIta.otf | Bin .../pdf/assets/fonts/DINPro-CondLight.otf | Bin .../pdf/assets/fonts/DINPro-CondLightIta.otf | Bin .../pdf/assets/fonts/DINPro-CondMediIta.otf | Bin .../pdf/assets/fonts/DINPro-CondMedium.otf | Bin .../pdf/assets/fonts/DINPro-Italic.otf | Bin .../pdf/assets/fonts/DINPro-Light.otf | Bin .../pdf/assets/fonts/DINPro.otf | Bin {tests => examples}/pdf/assets/logo.svg | 0 {tests => examples}/pdf/fonts.pcss | 0 {tests => examples}/pdf/index.html | 0 {tests => examples}/pdf/index.jsx | 0 {tests => examples}/pdf/index.pcss | 0 {tests => examples}/postcss.config.js | 0 {tests => examples}/svg/index.html | 0 {tests => examples}/svg/index.jsx | 0 {tests => examples}/svg/index.scss | 0 {tests => examples}/svg/svg-loader.jsx | 0 .../svg/svg-loader.shadow.scss | 0 {tests => examples}/svg/svg-tester-two.jsx | 0 {tests => examples}/svg/svg-tester.jsx | 0 {tests => examples}/table/index.html | 0 {tests => examples}/table/index.jsx | 0 {tests => examples}/table/index.scss | 0 {tests => examples}/table/table-component.jsx | 0 .../table/table-component.scss | 0 .../todos-mvc/components/my-todo.jsx | 0 .../todos-mvc/components/my-todo.scss | 0 .../todos-mvc/components/todo-input.jsx | 0 .../todos-mvc/components/todo-input.scss | 0 .../todos-mvc/components/todo-item.jsx | 0 .../todos-mvc/components/todo-item.scss | 0 {tests => examples}/todos-mvc/index.html | 0 {tests => examples}/todos-mvc/index.jsx | 0 {tests => examples}/todos-mvc/index.scss | 0 jest.config.js | 13 + jest/.babelrc | 23 + jest/README.md | 4 + jest/components/basic.test.js | 111 + jest/postcss.config.js | 9 + jest/render/basic-render.test.js | 215 ++ jest/render/key-property.test.js | 61 + jest/render/ref-property.test.js | 17 + jest/render/render-opts.test.js | 44 + jest/utils/next-animation-frame.js | 7 + jest/utils/test-container.js | 13 + package.json | 19 +- packages/babel-helpers/.npmignore | 3 - packages/babel-helpers/README.md | 19 - packages/babel-helpers/lib/helpers.js | 1919 ------------- packages/babel-helpers/lib/index.js | 276 -- packages/babel-helpers/package.json | 21 - packages/babel-helpers/src/helpers.js | 1997 ------------- packages/babel-helpers/src/index.js | 291 -- .../test/fixtures/dependencies/basic/input.js | 1 - .../fixtures/dependencies/basic/options.json | 3 - .../fixtures/dependencies/basic/output.js | 5 - .../fixtures/dependencies/basic/plugin.js | 25 - .../test/fixtures/dependencies/deep/input.js | 1 - .../fixtures/dependencies/deep/options.json | 3 - .../test/fixtures/dependencies/deep/output.js | 7 - .../test/fixtures/dependencies/deep/plugin.js | 30 - .../fixtures/dependencies/missing/input.js | 1 - .../dependencies/missing/options.json | 4 - .../fixtures/dependencies/missing/plugin.js | 21 - .../fixtures/dependencies/multiple/input.js | 1 - .../dependencies/multiple/options.json | 3 - .../fixtures/dependencies/multiple/output.js | 7 - .../fixtures/dependencies/multiple/plugin.js | 30 - .../rename-binding-equal/input.js | 1 - .../rename-binding-equal/options.json | 3 - .../rename-binding-equal/output.js | 9 - .../rename-binding-equal/plugin.js | 28 - .../dependencies/rename-deep-global/input.js | 3 - .../rename-deep-global/options.json | 3 - .../dependencies/rename-deep-global/output.js | 6 - .../dependencies/rename-deep-global/plugin.js | 27 - .../dependencies/reuse-dependency/input.js | 2 - .../reuse-dependency/options.json | 3 - .../dependencies/reuse-dependency/output.js | 6 - .../dependencies/reuse-dependency/plugin.js | 29 - .../variable-same-name-dependency/input.js | 1 - .../options.json | 3 - .../variable-same-name-dependency/output.js | 5 - .../variable-same-name-dependency/plugin.js | 28 - .../test/helpers/define-helper.js | 26 - packages/babel-helpers/test/index.js | 3 - packages/csx/cfg/.babelrc | 19 + packages/csx/cfg/build.js | 54 + packages/csx/cfg/config.js | 170 ++ packages/csx/cfg/log-bundle.js | 25 + packages/csx/cfg/register.js | 4 + packages/csx/cfg/watch.js | 93 + packages/csx/package.json | 16 +- packages/csx/rollup.config.js | 27 - packages/csx/src/vdom/render.js | 8 +- packages/csx/src/vdom/types/vnode-renderer.js | 2 +- packages/csx/src/vdom/types/vnode.js | 2 +- packages/csx/yarn.lock | 32 + yarn.lock | 2484 ++++++++++++++++- 121 files changed, 3406 insertions(+), 4929 deletions(-) create mode 100644 README.md rename {tests => examples}/.babelrc (100%) rename {tests => examples}/basic/index.html (100%) rename {tests => examples}/basic/index.jsx (100%) rename {tests => examples}/basic/index.scss (100%) rename {tests => examples}/basic/page.jsx (100%) rename {tests => examples}/cfg/.babelrc (100%) rename {tests => examples}/cfg/rollup-build.js (98%) rename {tests => examples}/index.html (100%) rename {tests => examples}/index.jsx (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-Black.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-BlackItalic.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-Bold.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-BoldItalic.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-Cond.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondBlack.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondBlackIta.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondBold.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondBoldIta.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondIta.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondLight.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondLightIta.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondMediIta.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-CondMedium.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-Italic.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro-Light.otf (100%) rename {tests => examples}/pdf/assets/fonts/DINPro.otf (100%) rename {tests => examples}/pdf/assets/logo.svg (100%) rename {tests => examples}/pdf/fonts.pcss (100%) rename {tests => examples}/pdf/index.html (100%) rename {tests => examples}/pdf/index.jsx (100%) rename {tests => examples}/pdf/index.pcss (100%) rename {tests => examples}/postcss.config.js (100%) rename {tests => examples}/svg/index.html (100%) rename {tests => examples}/svg/index.jsx (100%) rename {tests => examples}/svg/index.scss (100%) rename {tests => examples}/svg/svg-loader.jsx (100%) rename {tests => examples}/svg/svg-loader.shadow.scss (100%) rename {tests => examples}/svg/svg-tester-two.jsx (100%) rename {tests => examples}/svg/svg-tester.jsx (100%) rename {tests => examples}/table/index.html (100%) rename {tests => examples}/table/index.jsx (100%) rename {tests => examples}/table/index.scss (100%) rename {tests => examples}/table/table-component.jsx (100%) rename {tests => examples}/table/table-component.scss (100%) rename {tests => examples}/todos-mvc/components/my-todo.jsx (100%) rename {tests => examples}/todos-mvc/components/my-todo.scss (100%) rename {tests => examples}/todos-mvc/components/todo-input.jsx (100%) rename {tests => examples}/todos-mvc/components/todo-input.scss (100%) rename {tests => examples}/todos-mvc/components/todo-item.jsx (100%) rename {tests => examples}/todos-mvc/components/todo-item.scss (100%) rename {tests => examples}/todos-mvc/index.html (100%) rename {tests => examples}/todos-mvc/index.jsx (100%) rename {tests => examples}/todos-mvc/index.scss (100%) create mode 100644 jest.config.js create mode 100644 jest/.babelrc create mode 100644 jest/README.md create mode 100644 jest/components/basic.test.js create mode 100644 jest/postcss.config.js create mode 100644 jest/render/basic-render.test.js create mode 100644 jest/render/key-property.test.js create mode 100644 jest/render/ref-property.test.js create mode 100644 jest/render/render-opts.test.js create mode 100644 jest/utils/next-animation-frame.js create mode 100644 jest/utils/test-container.js delete mode 100644 packages/babel-helpers/.npmignore delete mode 100644 packages/babel-helpers/README.md delete mode 100644 packages/babel-helpers/lib/helpers.js delete mode 100644 packages/babel-helpers/lib/index.js delete mode 100644 packages/babel-helpers/package.json delete mode 100644 packages/babel-helpers/src/helpers.js delete mode 100644 packages/babel-helpers/src/index.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/basic/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/basic/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/basic/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/basic/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/deep/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/deep/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/deep/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/deep/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/missing/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/missing/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/missing/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/multiple/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/multiple/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/multiple/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/multiple/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/plugin.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/input.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/options.json delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/output.js delete mode 100644 packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/plugin.js delete mode 100644 packages/babel-helpers/test/helpers/define-helper.js delete mode 100644 packages/babel-helpers/test/index.js create mode 100644 packages/csx/cfg/.babelrc create mode 100644 packages/csx/cfg/build.js create mode 100644 packages/csx/cfg/config.js create mode 100644 packages/csx/cfg/log-bundle.js create mode 100644 packages/csx/cfg/register.js create mode 100644 packages/csx/cfg/watch.js delete mode 100644 packages/csx/rollup.config.js diff --git a/.idea/misc.xml b/.idea/misc.xml index 28a804d..24eb271 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/webResources.xml b/.idea/webResources.xml index 6c89cf5..0dd4c9f 100644 --- a/.idea/webResources.xml +++ b/.idea/webResources.xml @@ -16,6 +16,8 @@ + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef456fd --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +TODO the root build scripts are yet to be updated (building/watching and serving examples...) \ No newline at end of file diff --git a/tests/.babelrc b/examples/.babelrc similarity index 100% rename from tests/.babelrc rename to examples/.babelrc diff --git a/tests/basic/index.html b/examples/basic/index.html similarity index 100% rename from tests/basic/index.html rename to examples/basic/index.html diff --git a/tests/basic/index.jsx b/examples/basic/index.jsx similarity index 100% rename from tests/basic/index.jsx rename to examples/basic/index.jsx diff --git a/tests/basic/index.scss b/examples/basic/index.scss similarity index 100% rename from tests/basic/index.scss rename to examples/basic/index.scss diff --git a/tests/basic/page.jsx b/examples/basic/page.jsx similarity index 100% rename from tests/basic/page.jsx rename to examples/basic/page.jsx diff --git a/tests/cfg/.babelrc b/examples/cfg/.babelrc similarity index 100% rename from tests/cfg/.babelrc rename to examples/cfg/.babelrc diff --git a/tests/cfg/rollup-build.js b/examples/cfg/rollup-build.js similarity index 98% rename from tests/cfg/rollup-build.js rename to examples/cfg/rollup-build.js index 4e2c56a..e250877 100644 --- a/tests/cfg/rollup-build.js +++ b/examples/cfg/rollup-build.js @@ -15,7 +15,7 @@ import postcss from "rollup-plugin-postcss"; import { terser } from 'rollup-plugin-terser'; /** @type {Host} */ -const srcDir = host.from("tests"); +const srcDir = host.from("examples"); /** @type {Host} */ const distDir = host.from("public"); const assetsGlob = `**/*.@(${[ @@ -70,7 +70,7 @@ function logBundle(output, duration){ } /** - * Build the tests + * Build the examples * @returns {Promise} */ async function build(){ diff --git a/tests/index.html b/examples/index.html similarity index 100% rename from tests/index.html rename to examples/index.html diff --git a/tests/index.jsx b/examples/index.jsx similarity index 100% rename from tests/index.jsx rename to examples/index.jsx diff --git a/tests/pdf/assets/fonts/DINPro-Black.otf b/examples/pdf/assets/fonts/DINPro-Black.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-Black.otf rename to examples/pdf/assets/fonts/DINPro-Black.otf diff --git a/tests/pdf/assets/fonts/DINPro-BlackItalic.otf b/examples/pdf/assets/fonts/DINPro-BlackItalic.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-BlackItalic.otf rename to examples/pdf/assets/fonts/DINPro-BlackItalic.otf diff --git a/tests/pdf/assets/fonts/DINPro-Bold.otf b/examples/pdf/assets/fonts/DINPro-Bold.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-Bold.otf rename to examples/pdf/assets/fonts/DINPro-Bold.otf diff --git a/tests/pdf/assets/fonts/DINPro-BoldItalic.otf b/examples/pdf/assets/fonts/DINPro-BoldItalic.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-BoldItalic.otf rename to examples/pdf/assets/fonts/DINPro-BoldItalic.otf diff --git a/tests/pdf/assets/fonts/DINPro-Cond.otf b/examples/pdf/assets/fonts/DINPro-Cond.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-Cond.otf rename to examples/pdf/assets/fonts/DINPro-Cond.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondBlack.otf b/examples/pdf/assets/fonts/DINPro-CondBlack.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondBlack.otf rename to examples/pdf/assets/fonts/DINPro-CondBlack.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondBlackIta.otf b/examples/pdf/assets/fonts/DINPro-CondBlackIta.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondBlackIta.otf rename to examples/pdf/assets/fonts/DINPro-CondBlackIta.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondBold.otf b/examples/pdf/assets/fonts/DINPro-CondBold.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondBold.otf rename to examples/pdf/assets/fonts/DINPro-CondBold.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondBoldIta.otf b/examples/pdf/assets/fonts/DINPro-CondBoldIta.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondBoldIta.otf rename to examples/pdf/assets/fonts/DINPro-CondBoldIta.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondIta.otf b/examples/pdf/assets/fonts/DINPro-CondIta.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondIta.otf rename to examples/pdf/assets/fonts/DINPro-CondIta.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondLight.otf b/examples/pdf/assets/fonts/DINPro-CondLight.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondLight.otf rename to examples/pdf/assets/fonts/DINPro-CondLight.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondLightIta.otf b/examples/pdf/assets/fonts/DINPro-CondLightIta.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondLightIta.otf rename to examples/pdf/assets/fonts/DINPro-CondLightIta.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondMediIta.otf b/examples/pdf/assets/fonts/DINPro-CondMediIta.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondMediIta.otf rename to examples/pdf/assets/fonts/DINPro-CondMediIta.otf diff --git a/tests/pdf/assets/fonts/DINPro-CondMedium.otf b/examples/pdf/assets/fonts/DINPro-CondMedium.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-CondMedium.otf rename to examples/pdf/assets/fonts/DINPro-CondMedium.otf diff --git a/tests/pdf/assets/fonts/DINPro-Italic.otf b/examples/pdf/assets/fonts/DINPro-Italic.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-Italic.otf rename to examples/pdf/assets/fonts/DINPro-Italic.otf diff --git a/tests/pdf/assets/fonts/DINPro-Light.otf b/examples/pdf/assets/fonts/DINPro-Light.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro-Light.otf rename to examples/pdf/assets/fonts/DINPro-Light.otf diff --git a/tests/pdf/assets/fonts/DINPro.otf b/examples/pdf/assets/fonts/DINPro.otf similarity index 100% rename from tests/pdf/assets/fonts/DINPro.otf rename to examples/pdf/assets/fonts/DINPro.otf diff --git a/tests/pdf/assets/logo.svg b/examples/pdf/assets/logo.svg similarity index 100% rename from tests/pdf/assets/logo.svg rename to examples/pdf/assets/logo.svg diff --git a/tests/pdf/fonts.pcss b/examples/pdf/fonts.pcss similarity index 100% rename from tests/pdf/fonts.pcss rename to examples/pdf/fonts.pcss diff --git a/tests/pdf/index.html b/examples/pdf/index.html similarity index 100% rename from tests/pdf/index.html rename to examples/pdf/index.html diff --git a/tests/pdf/index.jsx b/examples/pdf/index.jsx similarity index 100% rename from tests/pdf/index.jsx rename to examples/pdf/index.jsx diff --git a/tests/pdf/index.pcss b/examples/pdf/index.pcss similarity index 100% rename from tests/pdf/index.pcss rename to examples/pdf/index.pcss diff --git a/tests/postcss.config.js b/examples/postcss.config.js similarity index 100% rename from tests/postcss.config.js rename to examples/postcss.config.js diff --git a/tests/svg/index.html b/examples/svg/index.html similarity index 100% rename from tests/svg/index.html rename to examples/svg/index.html diff --git a/tests/svg/index.jsx b/examples/svg/index.jsx similarity index 100% rename from tests/svg/index.jsx rename to examples/svg/index.jsx diff --git a/tests/svg/index.scss b/examples/svg/index.scss similarity index 100% rename from tests/svg/index.scss rename to examples/svg/index.scss diff --git a/tests/svg/svg-loader.jsx b/examples/svg/svg-loader.jsx similarity index 100% rename from tests/svg/svg-loader.jsx rename to examples/svg/svg-loader.jsx diff --git a/tests/svg/svg-loader.shadow.scss b/examples/svg/svg-loader.shadow.scss similarity index 100% rename from tests/svg/svg-loader.shadow.scss rename to examples/svg/svg-loader.shadow.scss diff --git a/tests/svg/svg-tester-two.jsx b/examples/svg/svg-tester-two.jsx similarity index 100% rename from tests/svg/svg-tester-two.jsx rename to examples/svg/svg-tester-two.jsx diff --git a/tests/svg/svg-tester.jsx b/examples/svg/svg-tester.jsx similarity index 100% rename from tests/svg/svg-tester.jsx rename to examples/svg/svg-tester.jsx diff --git a/tests/table/index.html b/examples/table/index.html similarity index 100% rename from tests/table/index.html rename to examples/table/index.html diff --git a/tests/table/index.jsx b/examples/table/index.jsx similarity index 100% rename from tests/table/index.jsx rename to examples/table/index.jsx diff --git a/tests/table/index.scss b/examples/table/index.scss similarity index 100% rename from tests/table/index.scss rename to examples/table/index.scss diff --git a/tests/table/table-component.jsx b/examples/table/table-component.jsx similarity index 100% rename from tests/table/table-component.jsx rename to examples/table/table-component.jsx diff --git a/tests/table/table-component.scss b/examples/table/table-component.scss similarity index 100% rename from tests/table/table-component.scss rename to examples/table/table-component.scss diff --git a/tests/todos-mvc/components/my-todo.jsx b/examples/todos-mvc/components/my-todo.jsx similarity index 100% rename from tests/todos-mvc/components/my-todo.jsx rename to examples/todos-mvc/components/my-todo.jsx diff --git a/tests/todos-mvc/components/my-todo.scss b/examples/todos-mvc/components/my-todo.scss similarity index 100% rename from tests/todos-mvc/components/my-todo.scss rename to examples/todos-mvc/components/my-todo.scss diff --git a/tests/todos-mvc/components/todo-input.jsx b/examples/todos-mvc/components/todo-input.jsx similarity index 100% rename from tests/todos-mvc/components/todo-input.jsx rename to examples/todos-mvc/components/todo-input.jsx diff --git a/tests/todos-mvc/components/todo-input.scss b/examples/todos-mvc/components/todo-input.scss similarity index 100% rename from tests/todos-mvc/components/todo-input.scss rename to examples/todos-mvc/components/todo-input.scss diff --git a/tests/todos-mvc/components/todo-item.jsx b/examples/todos-mvc/components/todo-item.jsx similarity index 100% rename from tests/todos-mvc/components/todo-item.jsx rename to examples/todos-mvc/components/todo-item.jsx diff --git a/tests/todos-mvc/components/todo-item.scss b/examples/todos-mvc/components/todo-item.scss similarity index 100% rename from tests/todos-mvc/components/todo-item.scss rename to examples/todos-mvc/components/todo-item.scss diff --git a/tests/todos-mvc/index.html b/examples/todos-mvc/index.html similarity index 100% rename from tests/todos-mvc/index.html rename to examples/todos-mvc/index.html diff --git a/tests/todos-mvc/index.jsx b/examples/todos-mvc/index.jsx similarity index 100% rename from tests/todos-mvc/index.jsx rename to examples/todos-mvc/index.jsx diff --git a/tests/todos-mvc/index.scss b/examples/todos-mvc/index.scss similarity index 100% rename from tests/todos-mvc/index.scss rename to examples/todos-mvc/index.scss diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..38fb54f --- /dev/null +++ b/jest.config.js @@ -0,0 +1,13 @@ +let path = require("path"); + +module.exports = { + moduleNameMapper: { + "@cerxes/csx": path.resolve(__dirname, 'packages/csx/dist/index.cjs.js'), + }, + testEnvironment: "jest-environment-jsdom-sixteen", + setupFiles: [ + ], + setupFilesAfterEnv: [ + ], + /*maxConcurrency: 1*/ +}; \ No newline at end of file diff --git a/jest/.babelrc b/jest/.babelrc new file mode 100644 index 0000000..b3a1150 --- /dev/null +++ b/jest/.babelrc @@ -0,0 +1,23 @@ +{ + "presets": [ + ["@babel/preset-env", { + "targets": { + "node": "current" + } + }] + ], + "plugins": [ + [ "@babel/plugin-proposal-decorators", { "legacy": true }], + [ "@babel/plugin-proposal-class-properties", { "loose": true } ], + [ "@babel/plugin-proposal-private-methods", {"loose": true } ], + [ "@babel/plugin-proposal-optional-chaining" ], + [ "@babel/plugin-proposal-nullish-coalescing-operator" ], + [ "@babel/plugin-proposal-export-namespace-from" ], + [ "@babel/plugin-proposal-export-default-from" ], + [ "../packages/babel-plugin-transform-csx/dist", { + //"pragma": "render", + //"pragmaFrag": "render", + "throwIfNamespace": false + }] + ] +} \ No newline at end of file diff --git a/jest/README.md b/jest/README.md new file mode 100644 index 0000000..c4ed4d6 --- /dev/null +++ b/jest/README.md @@ -0,0 +1,4 @@ +TODO: + - Test key-properties behaving as it should (This is a known bug) + - Test ref-properties + - Test overriden prop/state (this is a suspected bug) \ No newline at end of file diff --git a/jest/components/basic.test.js b/jest/components/basic.test.js new file mode 100644 index 0000000..a76ac05 --- /dev/null +++ b/jest/components/basic.test.js @@ -0,0 +1,111 @@ +import { render, CustomElement, Host, defineElement, state, prop } from "@cerxes/csx"; +import { testContainer } from "../utils/test-container"; +import { nextAnimationFrame } from "../utils/next-animation-frame"; + +describe("Basic tests", () => { + /** + * Assert that a basic component renders as expected + */ + test("Simple example-component", async () => { + @defineElement('basic-component') + class BasicComponent extends CustomElement{ + render(){ + return ( +
+

This page is an example!

+

+ These are the contents.
+

+
+ ) + } + } + + let container = testContainer( + render() + ); + document.body.appendChild(container);// Components need to be added to the DOM or their connectecCallback will not be called + + expect( + container.innerHTML + ).toBe([ + ``, + `

This page is an example!

These are the contents.

`, + `
`, + ].join('')); + + document.body.removeChild(container); + }); + + /** + * Assert that a component rerenders when one of it's state variables changes + */ + test("Component state", async () => { + @defineElement('state-test') + class StateComponent extends CustomElement{ + @state() + loading = false; + + render(){ + return ( + {this.loading? "loading" : "not-loading"} + ) + } + } + + let component = render(); + let container = testContainer(component); + document.body.appendChild(container);// Components need to be added to the DOM or their connectecCallback will not be called + + // Initial + expect(container.innerHTML).toBe(`not-loading`); + + // Change state and wait for the next animation frame to passs + component.loading = true; + await nextAnimationFrame(); + + // Updated by state + expect(container.innerHTML).toBe(`loading`); + + document.body.removeChild(container); + }); + + /** + * Assert that a component rerenders when one of it's properties changes, and in doing so, that it's properties can be set + * through the CSX render function + */ + test("Component properties", async () => { + @defineElement('prop-test') + class PropComponent extends CustomElement{ + @prop() + title = "Default title"; + + render(){ + return ( +

{this.title}

+
) + } + } + + let initialVSpec = ; + let component = render(initialVSpec); + let container = testContainer(component); + document.body.appendChild(container);// Components need to be added to the DOM or their connectecCallback will not be called + + // Initial + expect(container.innerHTML).toBe(`

Default title

`); + + // Change the prop through CSX and verify that it has been set + let updatedVSpec = ; + render(updatedVSpec, {host: component, old: initialVSpec}); + expect(component.title).toBe(`Updated title`); + + // Wait for the next animation frame for the changes to be rendered + await nextAnimationFrame(); + + // Updated by state + expect(container.innerHTML).toBe(`

Updated title

`); + + document.body.removeChild(container); + }); +}); \ No newline at end of file diff --git a/jest/postcss.config.js b/jest/postcss.config.js new file mode 100644 index 0000000..a2b8318 --- /dev/null +++ b/jest/postcss.config.js @@ -0,0 +1,9 @@ +module.exports = { + plugins: [ + //require('autoprefixer'), + require('postcss-import'), + require('postcss-preset-env')({ + stage: 1, + }) + ] +}; \ No newline at end of file diff --git a/jest/render/basic-render.test.js b/jest/render/basic-render.test.js new file mode 100644 index 0000000..e32fe96 --- /dev/null +++ b/jest/render/basic-render.test.js @@ -0,0 +1,215 @@ +import { render } from "@cerxes/csx"; +import { testContainer } from "../utils/test-container"; + +describe("Basic elements", () => { + test("Single element", async () => { + expect( + testContainer( + render( + ` + ); + }); + + test("With text-contents", async () => { + expect( + testContainer( + render( +
Simple test
+ ) + ).innerHTML + ).toBe( + `
Simple test
` + ); + }); + + // TODO once added: fragments +}); + +describe("Native Attributes", () => { + test("Button-type", async () => { + expect( + testContainer( + render( + + ) + ).innerHTML + ).toBe( + `` + ); + }); + + test("Image-src", async () => { + expect( + testContainer( + render( + + ) + ).innerHTML + ).toBe( + `` + ); + }); + + // We're testing for native functionality of class here, not className + test("Class", async () => { + expect( + testContainer( + render( +
+ ) + ).innerHTML + ).toBe( + `
` + ); + }); + + // We're testing for native functionality of style here, which should always directly set style as an attribute + // when passed in as a string + test("Style", async () => { + expect( + testContainer( + render( +
+ ) + ).innerHTML + ).toBe( + `
` + ); + }); +}); + +describe("Basic Events", () => { + test("Click-event", async () => { + let clicked = false; + let clickHandler = (ev)=>{ + clicked = true; + + // TODO test on properties that should be on a native click event + }; + /** @type {HTMLButtonElement} */ + let button = render(); + + document.body.append(button); + button.click(); + expect(clicked).toBe(true); + document.body.removeChild(button); + }); + + test("Focus-event", async () => { + // This test exists just to have a second event to test, ideally we would have used two-part word event + // like focusin, but unfortunatily, it does not seem to be working. (probably JSDOM related?) + let focused = false; + let focusHandler = (ev)=>{ + focused = true; + }; + /** @type {HTMLButtonElement} */ + let input = render(); + + document.body.append(input); + input.focus(); + expect(focused).toBe(true); + document.body.removeChild(input); + }); +}); + +describe("Children", () => { + test("3 levels", async () => { + expect( + testContainer( + render( +
+ +
+ ) + ).innerHTML + ).toBe( + `
` + ); + }); + + test("Multiple children", async () => { + expect( + testContainer( + render( +
+

Title

+

+ Contents +

+ +
+ ) + ).innerHTML + ).toBe([ + `
`, + `

Title

`, + `

Contents

`, + ``, + `
` + ].join('')); + }); + + test("Prerendered element", async () => { + let element = render(

Title

); + + expect( + testContainer( + render( +
+ {element} +
+ ) + ).innerHTML + ).toBe([ + `
`, + `

Title

`, + `
` + ].join('')); + }); + + test("Prerendered text", async () => { + // TODO: CSX doesn't support fragments yet (<>I am text) + let text = document.createTextNode(`I am text!`); + + expect( + testContainer( + render( +
+ {text} +
+ ) + ).innerHTML + ).toBe([ + `
`, + `I am text!`, + `
` + ].join('')); + }); + + test("Nulls are ignored", async () => { + expect( + testContainer( + render( +
+

Title

+ {null} + +
+ ) + ).innerHTML + ).toBe([ + `
`, + `

Title

`, + ``, + `
` + ].join('')); + }); +}); \ No newline at end of file diff --git a/jest/render/key-property.test.js b/jest/render/key-property.test.js new file mode 100644 index 0000000..9624320 --- /dev/null +++ b/jest/render/key-property.test.js @@ -0,0 +1,61 @@ +import { render } from "@cerxes/csx"; +import { testContainer } from "../utils/test-container"; + +describe("Key-property tests", () => { + test("Keyed list", async () => { + let renderedIndexes = []; + let initIndexes = [0, 1, 2, 3]; + + let makeSpec = (targetList, indexes)=>( +
    + { + indexes.map(index => ( +
  • targetList[ index ] = el}> + {index} +
  • + )) + } +
+ ); + + let initialVSpec = makeSpec(renderedIndexes, initIndexes); + + let rendered = render(initialVSpec); + let container = testContainer(rendered); + + expect(container.innerHTML).toBe( + [ + `
    `, + ...initIndexes.map(index=>`
  • ${index}
  • `), + `
` + ].join('') + ); + + expect(renderedIndexes.length).toBe(4); + for(let rendered of renderedIndexes){ + expect(rendered).not.toBeUndefined(); + } + + let reorderedIndexes = [3,2,1,0]; + let rerenderedIndexes = renderedIndexes.slice(); + let updatedVSpec = makeSpec(rerenderedIndexes, reorderedIndexes); + render(updatedVSpec, {host: rendered, old: initialVSpec});// Is this host right? it seems inconsistent and the source of our bug (as it is probably also misused in custom-elements) + + // Updated + expect(container.innerHTML).toBe( + [ + `
    `, + ...reorderedIndexes.map(index=>`
  • ${index}
  • `), + `
` + ].join('') + ); + + // Validate that items were merely re-arranged and not re-created + expect(rerenderedIndexes.length).toBe(4); + for(let i=0; i<4; ++i){ + let initRendered = renderedIndexes[i]; + let reorderedRendered = rerenderedIndexes[i]; + expect(initRendered === reorderedRendered).toBe(true); // These should've remained the same + } + }); +}); \ No newline at end of file diff --git a/jest/render/ref-property.test.js b/jest/render/ref-property.test.js new file mode 100644 index 0000000..dc6dc4d --- /dev/null +++ b/jest/render/ref-property.test.js @@ -0,0 +1,17 @@ +import { render, Host } from "@cerxes/csx"; +import { testContainer } from "../utils/test-container"; + +describe("Ref-property tests", () => { + test("Simple ref", async () => { + let targetVar = null; + let refHandler = (el)=>targetVar = el; + let container = testContainer(render(
)); + + expect(container.innerHTML).toBe( + `
` + ); + + expect(targetVar).not.toBe(null); + expect(targetVar.id).toBe('test-div') + }); +}); \ No newline at end of file diff --git a/jest/render/render-opts.test.js b/jest/render/render-opts.test.js new file mode 100644 index 0000000..0610ee9 --- /dev/null +++ b/jest/render/render-opts.test.js @@ -0,0 +1,44 @@ +import { render, Host } from "@cerxes/csx"; +import { testContainer } from "../utils/test-container"; + +describe("Basic render-options", () => { + test("opts.host", async () => { + let startElement = render(
); + let container = testContainer([startElement]); + + render(Contents, {host: startElement}); + + expect(container.innerHTML).toBe( + `
Contents
` + ); + }); + + test("opts.vnode", async () => { + let container = testContainer(); + + let initialVSpec = ( + +

Initial title

+
+ ); + + let updatedVSpec = ( + +

Updated title

+
+ ); + render(initialVSpec, {host: container}); + + // Initial + expect(container.innerHTML).toBe( + `

Initial title

` + ); + + render(updatedVSpec, {host: container, old: initialVSpec}); + + // Updated + expect(container.innerHTML).toBe( + `

Updated title

` + ); + }); +}); \ No newline at end of file diff --git a/jest/utils/next-animation-frame.js b/jest/utils/next-animation-frame.js new file mode 100644 index 0000000..c03cad7 --- /dev/null +++ b/jest/utils/next-animation-frame.js @@ -0,0 +1,7 @@ +/** + * @returns {Promise} + */ +export async function nextAnimationFrame(inFrame){ + // Await the next animation frame + await new Promise((resolve,reject)=>requestAnimationFrame(()=>resolve())); +} \ No newline at end of file diff --git a/jest/utils/test-container.js b/jest/utils/test-container.js new file mode 100644 index 0000000..8e0395a --- /dev/null +++ b/jest/utils/test-container.js @@ -0,0 +1,13 @@ +/** + * @returns {HTMLDivElement} + */ +export function testContainer(elements){ + let container = document.createElement('div'); + if(elements){ + if(!(elements instanceof Array)){ + elements = [elements]; + } + container.append(...elements); + } + return container; +} \ No newline at end of file diff --git a/package.json b/package.json index 6640234..3208498 100644 --- a/package.json +++ b/package.json @@ -29,18 +29,21 @@ "postcss-preset-env": "latest", "postcss-import": "latest", "serve": "latest", - "npm-run-all": "latest" + "npm-run-all": "latest", + "jest-environment-jsdom-sixteen": "latest", + "jest": "latest" }, "scripts": { - "dev": "npm-run-all -p watch:babel-transform-csx watch:csx watch:tests serve:tests", - "build": "npm-run-all -s build:babel-transform-csx build:csx build:tests", - "watch": "npm-run-all -p watch:babel-transform-csx watch:csx watch:tests", - "build:tests": "node -r @babel/register ./tests/cfg/rollup-build.js build", - "watch:tests": "node -r @babel/register ./tests/cfg/rollup-build.js watch", - "serve:tests": "serve public", + "test": "jest", + "dev": "npm-run-all -p watch:babel-transform-csx watch:csx watch:examples serve:examples", + "build": "npm-run-all -s build:babel-transform-csx build:csx build:examples", + "watch": "npm-run-all -p watch:babel-transform-csx watch:csx watch:examples", + "build:examples": "node -r @babel/register examples/cfg/rollup-build.js build", + "watch:examples": "node -r @babel/register examples/cfg/rollup-build.js watch", + "serve:examples": "serve public", "build:babel-transform-csx": "cd packages/babel-plugin-transform-csx && npm run build", "build:csx": "cd packages/csx && npm run build", "watch:babel-transform-csx": "cd packages/babel-plugin-transform-csx && npm run watch", - "watch:csx": "cd packages/csx && npm run watch-es6" + "watch:csx": "cd packages/csx && npm run watch" } } diff --git a/packages/babel-helpers/.npmignore b/packages/babel-helpers/.npmignore deleted file mode 100644 index f980694..0000000 --- a/packages/babel-helpers/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -src -test -*.log diff --git a/packages/babel-helpers/README.md b/packages/babel-helpers/README.md deleted file mode 100644 index 537d8e4..0000000 --- a/packages/babel-helpers/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# @babel/helpers - -> Collection of helper functions used by Babel transforms. - -See our website [@babel/helpers](https://babeljs.io/docs/en/next/babel-helpers.html) for more information. - -## Install - -Using npm: - -```sh -npm install --save-dev @babel/helpers -``` - -or using yarn: - -```sh -yarn add @babel/helpers --dev -``` diff --git a/packages/babel-helpers/lib/helpers.js b/packages/babel-helpers/lib/helpers.js deleted file mode 100644 index 88b4d60..0000000 --- a/packages/babel-helpers/lib/helpers.js +++ /dev/null @@ -1,1919 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _template = _interopRequireDefault(require("@babel/template")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const helpers = Object.create(null); -var _default = helpers; -exports.default = _default; - -const helper = minVersion => tpl => ({ - minVersion, - ast: () => _template.default.program.ast(tpl) -}); - -helpers.typeof = helper("7.0.0-beta.0")` - export default function _typeof(obj) { - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { return typeof obj; }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype - ? "symbol" - : typeof obj; - }; - } - - return _typeof(obj); - } -`; -helpers.jsx = helper("7.0.0-beta.0")` - var REACT_ELEMENT_TYPE; - - export default function _createRawReactElement(type, props, key, children) { - if (!REACT_ELEMENT_TYPE) { - REACT_ELEMENT_TYPE = ( - typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") - ) || 0xeac7; - } - - var defaultProps = type && type.defaultProps; - var childrenLength = arguments.length - 3; - - if (!props && childrenLength !== 0) { - // If we're going to assign props.children, we create a new object now - // to avoid mutating defaultProps. - props = { - children: void 0, - }; - } - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = new Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 3]; - } - props.children = childArray; - } - - if (props && defaultProps) { - for (var propName in defaultProps) { - if (props[propName] === void 0) { - props[propName] = defaultProps[propName]; - } - } - } else if (!props) { - props = defaultProps || {}; - } - - return { - $$typeof: REACT_ELEMENT_TYPE, - type: type, - key: key === undefined ? null : '' + key, - ref: null, - props: props, - _owner: null, - }; - } -`; -helpers.asyncIterator = helper("7.0.0-beta.0")` - export default function _asyncIterator(iterable) { - var method - if (typeof Symbol !== "undefined") { - if (Symbol.asyncIterator) { - method = iterable[Symbol.asyncIterator] - if (method != null) return method.call(iterable); - } - if (Symbol.iterator) { - method = iterable[Symbol.iterator] - if (method != null) return method.call(iterable); - } - } - throw new TypeError("Object is not async iterable"); - } -`; -helpers.AwaitValue = helper("7.0.0-beta.0")` - export default function _AwaitValue(value) { - this.wrapped = value; - } -`; -helpers.AsyncGenerator = helper("7.0.0-beta.0")` - import AwaitValue from "AwaitValue"; - - export default function AsyncGenerator(gen) { - var front, back; - - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null, - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg) - var value = result.value; - var wrappedAwait = value instanceof AwaitValue; - - Promise.resolve(wrappedAwait ? value.wrapped : value).then( - function (arg) { - if (wrappedAwait) { - resume(key === "return" ? "return" : "next", arg); - return - } - - settle(result.done ? "return" : "normal", arg); - }, - function (err) { resume("throw", err); }); - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ value: value, done: true }); - break; - case "throw": - front.reject(value); - break; - default: - front.resolve({ value: value, done: false }); - break; - } - - front = front.next; - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - // Hide "return" method if generator return is not supported - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; - } - - AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; - AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; - AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; -`; -helpers.wrapAsyncGenerator = helper("7.0.0-beta.0")` - import AsyncGenerator from "AsyncGenerator"; - - export default function _wrapAsyncGenerator(fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); - }; - } -`; -helpers.awaitAsyncGenerator = helper("7.0.0-beta.0")` - import AwaitValue from "AwaitValue"; - - export default function _awaitAsyncGenerator(value) { - return new AwaitValue(value); - } -`; -helpers.asyncGeneratorDelegate = helper("7.0.0-beta.0")` - export default function _asyncGeneratorDelegate(inner, awaitWrap) { - var iter = {}, waiting = false; - - function pump(key, value) { - waiting = true; - value = new Promise(function (resolve) { resolve(inner[key](value)); }); - return { done: false, value: awaitWrap(value) }; - }; - - if (typeof Symbol === "function" && Symbol.iterator) { - iter[Symbol.iterator] = function () { return this; }; - } - - iter.next = function (value) { - if (waiting) { - waiting = false; - return value; - } - return pump("next", value); - }; - - if (typeof inner.throw === "function") { - iter.throw = function (value) { - if (waiting) { - waiting = false; - throw value; - } - return pump("throw", value); - }; - } - - if (typeof inner.return === "function") { - iter.return = function (value) { - if (waiting) { - waiting = false; - return value; - } - return pump("return", value); - }; - } - - return iter; - } -`; -helpers.asyncToGenerator = helper("7.0.0-beta.0")` - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - export default function _asyncToGenerator(fn) { - return function () { - var self = this, args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } -`; -helpers.classCallCheck = helper("7.0.0-beta.0")` - export default function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } -`; -helpers.createClass = helper("7.0.0-beta.0")` - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i ++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - export default function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } -`; -helpers.defineEnumerableProperties = helper("7.0.0-beta.0")` - export default function _defineEnumerableProperties(obj, descs) { - for (var key in descs) { - var desc = descs[key]; - desc.configurable = desc.enumerable = true; - if ("value" in desc) desc.writable = true; - Object.defineProperty(obj, key, desc); - } - - // Symbols are not enumerated over by for-in loops. If native - // Symbols are available, fetch all of the descs object's own - // symbol properties and define them on our target object too. - if (Object.getOwnPropertySymbols) { - var objectSymbols = Object.getOwnPropertySymbols(descs); - for (var i = 0; i < objectSymbols.length; i++) { - var sym = objectSymbols[i]; - var desc = descs[sym]; - desc.configurable = desc.enumerable = true; - if ("value" in desc) desc.writable = true; - Object.defineProperty(obj, sym, desc); - } - } - return obj; - } -`; -helpers.defaults = helper("7.0.0-beta.0")` - export default function _defaults(obj, defaults) { - var keys = Object.getOwnPropertyNames(defaults); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = Object.getOwnPropertyDescriptor(defaults, key); - if (value && value.configurable && obj[key] === undefined) { - Object.defineProperty(obj, key, value); - } - } - return obj; - } -`; -helpers.defineProperty = helper("7.0.0-beta.0")` - export default function _defineProperty(obj, key, value) { - // Shortcircuit the slow defineProperty path when possible. - // We are trying to avoid issues where setters defined on the - // prototype cause side effects under the fast path of simple - // assignment. By checking for existence of the property with - // the in operator, we can optimize most of this overhead away. - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; - } -`; -helpers.extends = helper("7.0.0-beta.0")` - export default function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - - return _extends.apply(this, arguments); - } -`; -helpers.objectSpread = helper("7.0.0-beta.0")` - import defineProperty from "defineProperty"; - - export default function _objectSpread(target) { - for (var i = 1; i < arguments.length; i++) { - var source = (arguments[i] != null) ? arguments[i] : {}; - var ownKeys = Object.keys(source); - if (typeof Object.getOwnPropertySymbols === 'function') { - ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { - return Object.getOwnPropertyDescriptor(source, sym).enumerable; - })); - } - ownKeys.forEach(function(key) { - defineProperty(target, key, source[key]); - }); - } - return target; - } -`; -helpers.objectSpread2 = helper("7.5.0")` - import defineProperty from "defineProperty"; - - // This function is different to "Reflect.ownKeys". The enumerableOnly - // filters on symbol properties only. Returned string properties are always - // enumerable. It is good to use in objectSpread. - - function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - return keys; - } - - export default function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = (arguments[i] != null) ? arguments[i] : {}; - if (i % 2) { - ownKeys(source, true).forEach(function (key) { - defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(source).forEach(function (key) { - Object.defineProperty( - target, - key, - Object.getOwnPropertyDescriptor(source, key) - ); - }); - } - } - return target; - } -`; -helpers.inherits = helper("7.0.0-beta.0")` - import setPrototypeOf from "setPrototypeOf"; - - export default function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) setPrototypeOf(subClass, superClass); - } -`; -helpers.inheritsLoose = helper("7.0.0-beta.0")` - export default function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; - } -`; -helpers.getPrototypeOf = helper("7.0.0-beta.0")` - export default function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf - ? Object.getPrototypeOf - : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } -`; -helpers.setPrototypeOf = helper("7.0.0-beta.0")` - export default function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - return _setPrototypeOf(o, p); - } -`; -helpers.construct = helper("7.0.0-beta.0")` - import setPrototypeOf from "setPrototypeOf"; - - function isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - - // core-js@3 - if (Reflect.construct.sham) return false; - - // Proxy can't be polyfilled. Every browser implemented - // proxies before or at the same time as Reflect.construct, - // so if they support Proxy they also support Reflect.construct. - if (typeof Proxy === "function") return true; - - // Since Reflect.construct can't be properly polyfilled, some - // implementations (e.g. core-js@2) don't set the correct internal slots. - // Those polyfills don't allow us to subclass built-ins, so we need to - // use our fallback implementation. - try { - // If the internal slots aren't set, this throws an error similar to - // TypeError: this is not a Date object. - Date.prototype.toString.call(Reflect.construct(Date, [], function() {})); - return true; - } catch (e) { - return false; - } - } - - export default function _construct(Parent, args, Class) { - if (isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - // NOTE: If Parent !== Class, the correct __proto__ is set *after* - // calling the constructor. - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - // Avoid issues with Class being present but undefined when it wasn't - // present in the original call. - return _construct.apply(null, arguments); - } -`; -helpers.isNativeFunction = helper("7.0.0-beta.0")` - export default function _isNativeFunction(fn) { - // Note: This function returns "true" for core-js functions. - return Function.toString.call(fn).indexOf("[native code]") !== -1; - } -`; -helpers.wrapNativeSuper = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; - import setPrototypeOf from "setPrototypeOf"; - import isNativeFunction from "isNativeFunction"; - import construct from "construct"; - - export default function _wrapNativeSuper(Class) { - var _cache = typeof Map === "function" ? new Map() : undefined; - - _wrapNativeSuper = function _wrapNativeSuper(Class) { - if (Class === null || !isNativeFunction(Class)) return Class; - if (typeof Class !== "function") { - throw new TypeError("Super expression must either be null or a function"); - } - if (typeof _cache !== "undefined") { - if (_cache.has(Class)) return _cache.get(Class); - _cache.set(Class, Wrapper); - } - function Wrapper() { - return construct(Class, arguments, getPrototypeOf(this).constructor) - } - Wrapper.prototype = Object.create(Class.prototype, { - constructor: { - value: Wrapper, - enumerable: false, - writable: true, - configurable: true, - } - }); - - return setPrototypeOf(Wrapper, Class); - } - - return _wrapNativeSuper(Class) - } -`; -helpers.instanceof = helper("7.0.0-beta.0")` - export default function _instanceof(left, right) { - if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { - return !!right[Symbol.hasInstance](left); - } else { - return left instanceof right; - } - } -`; -helpers.interopRequireDefault = helper("7.0.0-beta.0")` - export default function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } -`; -helpers.interopRequireWildcard = helper("7.0.0-beta.0")` - function _getRequireWildcardCache() { - if (typeof WeakMap !== "function") return null; - - var cache = new WeakMap(); - _getRequireWildcardCache = function () { return cache; }; - return cache; - } - - export default function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { - return obj; - } - - if (obj === null || (typeof obj !== "object" && typeof obj !== "function")) { - return { default: obj } - } - - var cache = _getRequireWildcardCache(); - if (cache && cache.has(obj)) { - return cache.get(obj); - } - - var newObj = {}; - var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - var desc = hasPropertyDescriptor - ? Object.getOwnPropertyDescriptor(obj, key) - : null; - if (desc && (desc.get || desc.set)) { - Object.defineProperty(newObj, key, desc); - } else { - newObj[key] = obj[key]; - } - } - } - newObj.default = obj; - if (cache) { - cache.set(obj, newObj); - } - return newObj; - } -`; -helpers.newArrowCheck = helper("7.0.0-beta.0")` - export default function _newArrowCheck(innerThis, boundThis) { - if (innerThis !== boundThis) { - throw new TypeError("Cannot instantiate an arrow function"); - } - } -`; -helpers.objectDestructuringEmpty = helper("7.0.0-beta.0")` - export default function _objectDestructuringEmpty(obj) { - if (obj == null) throw new TypeError("Cannot destructure undefined"); - } -`; -helpers.objectWithoutPropertiesLoose = helper("7.0.0-beta.0")` - export default function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - - return target; - } -`; -helpers.objectWithoutProperties = helper("7.0.0-beta.0")` - import objectWithoutPropertiesLoose from "objectWithoutPropertiesLoose"; - - export default function _objectWithoutProperties(source, excluded) { - if (source == null) return {}; - - var target = objectWithoutPropertiesLoose(source, excluded); - var key, i; - - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { - key = sourceSymbolKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; - target[key] = source[key]; - } - } - - return target; - } -`; -helpers.assertThisInitialized = helper("7.0.0-beta.0")` - export default function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - return self; - } -`; -helpers.possibleConstructorReturn = helper("7.0.0-beta.0")` - import assertThisInitialized from "assertThisInitialized"; - - export default function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - return assertThisInitialized(self); - } -`; -helpers.superPropBase = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; - - export default function _superPropBase(object, property) { - // Yes, this throws if object is null to being with, that's on purpose. - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = getPrototypeOf(object); - if (object === null) break; - } - return object; - } -`; -helpers.get = helper("7.0.0-beta.0")` - import superPropBase from "superPropBase"; - - export default function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = superPropBase(target, property); - - if (!base) return; - - var desc = Object.getOwnPropertyDescriptor(base, property); - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - return _get(target, property, receiver || target); - } -`; -helpers.set = helper("7.0.0-beta.0")` - import superPropBase from "superPropBase"; - import defineProperty from "defineProperty"; - - function set(target, property, value, receiver) { - if (typeof Reflect !== "undefined" && Reflect.set) { - set = Reflect.set; - } else { - set = function set(target, property, value, receiver) { - var base = superPropBase(target, property); - var desc; - - if (base) { - desc = Object.getOwnPropertyDescriptor(base, property); - if (desc.set) { - desc.set.call(receiver, value); - return true; - } else if (!desc.writable) { - // Both getter and non-writable fall into this. - return false; - } - } - - // Without a super that defines the property, spec boils down to - // "define on receiver" for some reason. - desc = Object.getOwnPropertyDescriptor(receiver, property); - if (desc) { - if (!desc.writable) { - // Setter, getter, and non-writable fall into this. - return false; - } - - desc.value = value; - Object.defineProperty(receiver, property, desc); - } else { - // Avoid setters that may be defined on Sub's prototype, but not on - // the instance. - defineProperty(receiver, property, value); - } - - return true; - }; - } - - return set(target, property, value, receiver); - } - - export default function _set(target, property, value, receiver, isStrict) { - var s = set(target, property, value, receiver || target); - if (!s && isStrict) { - throw new Error('failed to set property'); - } - - return value; - } -`; -helpers.taggedTemplateLiteral = helper("7.0.0-beta.0")` - export default function _taggedTemplateLiteral(strings, raw) { - if (!raw) { raw = strings.slice(0); } - return Object.freeze(Object.defineProperties(strings, { - raw: { value: Object.freeze(raw) } - })); - } -`; -helpers.taggedTemplateLiteralLoose = helper("7.0.0-beta.0")` - export default function _taggedTemplateLiteralLoose(strings, raw) { - if (!raw) { raw = strings.slice(0); } - strings.raw = raw; - return strings; - } -`; -helpers.readOnlyError = helper("7.0.0-beta.0")` - export default function _readOnlyError(name) { - throw new Error("\\"" + name + "\\" is read-only"); - } -`; -helpers.classNameTDZError = helper("7.0.0-beta.0")` - export default function _classNameTDZError(name) { - throw new Error("Class \\"" + name + "\\" cannot be referenced in computed property keys."); - } -`; -helpers.temporalUndefined = helper("7.0.0-beta.0")` - // This function isn't mean to be called, but to be used as a reference. - // We can't use a normal object because it isn't hoisted. - export default function _temporalUndefined() {} -`; -helpers.tdz = helper("7.5.5")` - export default function _tdzError(name) { - throw new ReferenceError(name + " is not defined - temporal dead zone"); - } -`; -helpers.temporalRef = helper("7.0.0-beta.0")` - import undef from "temporalUndefined"; - import err from "tdz"; - - export default function _temporalRef(val, name) { - return val === undef ? err(name) : val; - } -`; -helpers.slicedToArray = helper("7.0.0-beta.0")` - import arrayWithHoles from "arrayWithHoles"; - import iterableToArrayLimit from "iterableToArrayLimit"; - import nonIterableRest from "nonIterableRest"; - - export default function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); - } -`; -helpers.slicedToArrayLoose = helper("7.0.0-beta.0")` - import arrayWithHoles from "arrayWithHoles"; - import iterableToArrayLimitLoose from "iterableToArrayLimitLoose"; - import nonIterableRest from "nonIterableRest"; - - export default function _slicedToArrayLoose(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest(); - } -`; -helpers.toArray = helper("7.0.0-beta.0")` - import arrayWithHoles from "arrayWithHoles"; - import iterableToArray from "iterableToArray"; - import nonIterableRest from "nonIterableRest"; - - export default function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); - } -`; -helpers.toConsumableArray = helper("7.0.0-beta.0")` - import arrayWithoutHoles from "arrayWithoutHoles"; - import iterableToArray from "iterableToArray"; - import nonIterableSpread from "nonIterableSpread"; - - export default function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread(); - } -`; -helpers.arrayWithoutHoles = helper("7.0.0-beta.0")` - export default function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - } -`; -helpers.arrayWithHoles = helper("7.0.0-beta.0")` - export default function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } -`; -helpers.iterableToArray = helper("7.0.0-beta.0")` - export default function _iterableToArray(iter) { - if ( - Symbol.iterator in Object(iter) || - Object.prototype.toString.call(iter) === "[object Arguments]" - ) return Array.from(iter); - } -`; -helpers.iterableToArrayLimit = helper("7.0.0-beta.0")` - export default function _iterableToArrayLimit(arr, i) { - // this is an expanded form of \`for...of\` that properly supports abrupt completions of - // iterators etc. variable names have been minimised to reduce the size of this massive - // helper. sometimes spec compliance is annoying :( - // - // _n = _iteratorNormalCompletion - // _d = _didIteratorError - // _e = _iteratorError - // _i = _iterator - // _s = _step - if (!( - Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]" - )) { return } - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - return _arr; - } -`; -helpers.iterableToArrayLimitLoose = helper("7.0.0-beta.0")` - export default function _iterableToArrayLimitLoose(arr, i) { - if (!( - Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]" - )) { return } - var _arr = []; - for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { - _arr.push(_step.value); - if (i && _arr.length === i) break; - } - return _arr; - } -`; -helpers.nonIterableSpread = helper("7.0.0-beta.0")` - export default function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); - } -`; -helpers.nonIterableRest = helper("7.0.0-beta.0")` - export default function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } -`; -helpers.skipFirstGeneratorNext = helper("7.0.0-beta.0")` - export default function _skipFirstGeneratorNext(fn) { - return function () { - var it = fn.apply(this, arguments); - it.next(); - return it; - } - } -`; -helpers.toPrimitive = helper("7.1.5")` - export default function _toPrimitive( - input, - hint /*: "default" | "string" | "number" | void */ - ) { - if (typeof input !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (typeof res !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); - } -`; -helpers.toPropertyKey = helper("7.1.5")` - import toPrimitive from "toPrimitive"; - - export default function _toPropertyKey(arg) { - var key = toPrimitive(arg, "string"); - return typeof key === "symbol" ? key : String(key); - } -`; -helpers.initializerWarningHelper = helper("7.0.0-beta.0")` - export default function _initializerWarningHelper(descriptor, context){ - throw new Error( - 'Decorating class property failed. Please ensure that ' + - 'proposal-class-properties is enabled and runs after the decorators transform.' - ); - } -`; -helpers.initializerDefineProperty = helper("7.0.0-beta.0")` - export default function _initializerDefineProperty(target, property, descriptor, context) { - if (!descriptor) return; - - // Apply the initializer - if(descriptor.initializer){ - if(descriptor.set){ - descriptor.set.call(context, descriptor.initializer.call(context)); - }else{ - descriptor.value = descriptor.initializer.call(context); - } - delete descriptor.initializer; - } - - Object.defineProperty(target, property, descriptor); - } -`; -helpers.applyDecoratedDescriptor = helper("7.0.0-beta.0")` - export default function _applyDecoratedDescriptor(target, property, decorators, descriptor, context){ - var desc = {}; - Object.keys(descriptor).forEach(function(key){ - desc[key] = descriptor[key]; - }); - desc.enumerable = !!desc.enumerable; - desc.configurable = !!desc.configurable; - if ('value' in desc || desc.initializer){ - desc.writable = true; - } - - desc = decorators.slice().reverse().reduce(function(desc, decorator){ - return decorator(target, property, desc) || desc; - }, desc); - - if (context && desc.initializer !== void 0){ - desc.value = desc.initializer ? desc.initializer.call(context) : void 0; - desc.initializer = undefined; - } - - if (desc.initializer === void 0){ - // This is a hack to avoid this being processed by 'transform-runtime'. - // See issue #9. - Object.defineProperty(target, property, desc); - desc = null; - } - - return desc; - } -`; -helpers.classPrivateFieldLooseKey = helper("7.0.0-beta.0")` - var id = 0; - export default function _classPrivateFieldKey(name) { - return "__private_" + (id++) + "_" + name; - } -`; -helpers.classPrivateFieldLooseBase = helper("7.0.0-beta.0")` - export default function _classPrivateFieldBase(receiver, privateKey) { - if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { - throw new TypeError("attempted to use private field on non-instance"); - } - return receiver; - } -`; -helpers.classPrivateFieldGet = helper("7.0.0-beta.0")` - export default function _classPrivateFieldGet(receiver, privateMap) { - var descriptor = privateMap.get(receiver); - if (!descriptor) { - throw new TypeError("attempted to get private field on non-instance"); - } - if (descriptor.get) { - return descriptor.get.call(receiver); - } - return descriptor.value; - } -`; -helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` - export default function _classPrivateFieldSet(receiver, privateMap, value) { - var descriptor = privateMap.get(receiver); - if (!descriptor) { - throw new TypeError("attempted to set private field on non-instance"); - } - if (descriptor.set) { - descriptor.set.call(receiver, value); - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - - descriptor.value = value; - } - - return value; - } -`; -helpers.classPrivateFieldDestructureSet = helper("7.4.4")` - export default function _classPrivateFieldDestructureSet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - var descriptor = privateMap.get(receiver); - if (descriptor.set) { - if (!("__destrObj" in descriptor)) { - descriptor.__destrObj = { - set value(v) { - descriptor.set.call(receiver, v) - }, - }; - } - return descriptor.__destrObj; - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - - return descriptor; - } - } -`; -helpers.classStaticPrivateFieldSpecGet = helper("7.0.2")` - export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (descriptor.get) { - return descriptor.get.call(receiver); - } - return descriptor.value; - } -`; -helpers.classStaticPrivateFieldSpecSet = helper("7.0.2")` - export default function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (descriptor.set) { - descriptor.set.call(receiver, value); - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - descriptor.value = value; - } - - return value; - } -`; -helpers.classStaticPrivateMethodGet = helper("7.3.2")` - export default function _classStaticPrivateMethodGet(receiver, classConstructor, method) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return method; - } -`; -helpers.classStaticPrivateMethodSet = helper("7.3.2")` - export default function _classStaticPrivateMethodSet() { - throw new TypeError("attempted to set read only static private field"); - } -`; -helpers.decorate = helper("7.1.5")` - import toArray from "toArray"; - import toPropertyKey from "toPropertyKey"; - - // These comments are stripped by @babel/template - /*:: - type PropertyDescriptor = - | { - value: any, - writable: boolean, - configurable: boolean, - enumerable: boolean, - } - | { - get?: () => any, - set?: (v: any) => void, - configurable: boolean, - enumerable: boolean, - }; - - type FieldDescriptor ={ - writable: boolean, - configurable: boolean, - enumerable: boolean, - }; - - type Placement = "static" | "prototype" | "own"; - type Key = string | symbol; // PrivateName is not supported yet. - - type ElementDescriptor = - | { - kind: "method", - key: Key, - placement: Placement, - descriptor: PropertyDescriptor - } - | { - kind: "field", - key: Key, - placement: Placement, - descriptor: FieldDescriptor, - initializer?: () => any, - }; - - // This is exposed to the user code - type ElementObjectInput = ElementDescriptor & { - [@@toStringTag]?: "Descriptor" - }; - - // This is exposed to the user code - type ElementObjectOutput = ElementDescriptor & { - [@@toStringTag]?: "Descriptor" - extras?: ElementDescriptor[], - finisher?: ClassFinisher, - }; - - // This is exposed to the user code - type ClassObject = { - [@@toStringTag]?: "Descriptor", - kind: "class", - elements: ElementDescriptor[], - }; - - type ElementDecorator = (descriptor: ElementObjectInput) => ?ElementObjectOutput; - type ClassDecorator = (descriptor: ClassObject) => ?ClassObject; - type ClassFinisher = (cl: Class) => Class; - - // Only used by Babel in the transform output, not part of the spec. - type ElementDefinition = - | { - kind: "method", - value: any, - key: Key, - static?: boolean, - decorators?: ElementDecorator[], - } - | { - kind: "field", - value: () => any, - key: Key, - static?: boolean, - decorators?: ElementDecorator[], - }; - - declare function ClassFactory(initialize: (instance: C) => void): { - F: Class, - d: ElementDefinition[] - } - - */ - - /*:: - // Various combinations with/without extras and with one or many finishers - - type ElementFinisherExtras = { - element: ElementDescriptor, - finisher?: ClassFinisher, - extras?: ElementDescriptor[], - }; - - type ElementFinishersExtras = { - element: ElementDescriptor, - finishers: ClassFinisher[], - extras: ElementDescriptor[], - }; - - type ElementsFinisher = { - elements: ElementDescriptor[], - finisher?: ClassFinisher, - }; - - type ElementsFinishers = { - elements: ElementDescriptor[], - finishers: ClassFinisher[], - }; - - */ - - /*:: - - type Placements = { - static: Key[], - prototype: Key[], - own: Key[], - }; - - */ - - // ClassDefinitionEvaluation (Steps 26-*) - export default function _decorate( - decorators /*: ClassDecorator[] */, - factory /*: ClassFactory */, - superClass /*: ?Class<*> */, - mixins /*: ?Array */, - ) /*: Class<*> */ { - var api = _getDecoratorsApi(); - if (mixins) { - for (var i = 0; i < mixins.length; i++) { - api = mixins[i](api); - } - } - - var r = factory(function initialize(O) { - api.initializeInstanceElements(O, decorated.elements); - }, superClass); - var decorated = api.decorateClass( - _coalesceClassElements(r.d.map(_createElementDescriptor)), - decorators, - ); - - api.initializeClassElements(r.F, decorated.elements); - - return api.runClassFinishers(r.F, decorated.finishers); - } - - function _getDecoratorsApi() { - _getDecoratorsApi = function() { - return api; - }; - - var api = { - elementsDefinitionOrder: [["method"], ["field"]], - - // InitializeInstanceElements - initializeInstanceElements: function( - /*::*/ O /*: C */, - elements /*: ElementDescriptor[] */, - ) { - ["method", "field"].forEach(function(kind) { - elements.forEach(function(element /*: ElementDescriptor */) { - if (element.kind === kind && element.placement === "own") { - this.defineClassElement(O, element); - } - }, this); - }, this); - }, - - // InitializeClassElements - initializeClassElements: function( - /*::*/ F /*: Class */, - elements /*: ElementDescriptor[] */, - ) { - var proto = F.prototype; - - ["method", "field"].forEach(function(kind) { - elements.forEach(function(element /*: ElementDescriptor */) { - var placement = element.placement; - if ( - element.kind === kind && - (placement === "static" || placement === "prototype") - ) { - var receiver = placement === "static" ? F : proto; - this.defineClassElement(receiver, element); - } - }, this); - }, this); - }, - - // DefineClassElement - defineClassElement: function( - /*::*/ receiver /*: C | Class */, - element /*: ElementDescriptor */, - ) { - var descriptor /*: PropertyDescriptor */ = element.descriptor; - if (element.kind === "field") { - var initializer = element.initializer; - descriptor = { - enumerable: descriptor.enumerable, - writable: descriptor.writable, - configurable: descriptor.configurable, - value: initializer === void 0 ? void 0 : initializer.call(receiver), - }; - } - Object.defineProperty(receiver, element.key, descriptor); - }, - - // DecorateClass - decorateClass: function( - elements /*: ElementDescriptor[] */, - decorators /*: ClassDecorator[] */, - ) /*: ElementsFinishers */ { - var newElements /*: ElementDescriptor[] */ = []; - var finishers /*: ClassFinisher[] */ = []; - var placements /*: Placements */ = { - static: [], - prototype: [], - own: [], - }; - - elements.forEach(function(element /*: ElementDescriptor */) { - this.addElementPlacement(element, placements); - }, this); - - elements.forEach(function(element /*: ElementDescriptor */) { - if (!_hasDecorators(element)) return newElements.push(element); - - var elementFinishersExtras /*: ElementFinishersExtras */ = this.decorateElement( - element, - placements, - ); - newElements.push(elementFinishersExtras.element); - newElements.push.apply(newElements, elementFinishersExtras.extras); - finishers.push.apply(finishers, elementFinishersExtras.finishers); - }, this); - - if (!decorators) { - return { elements: newElements, finishers: finishers }; - } - - var result /*: ElementsFinishers */ = this.decorateConstructor( - newElements, - decorators, - ); - finishers.push.apply(finishers, result.finishers); - result.finishers = finishers; - - return result; - }, - - // AddElementPlacement - addElementPlacement: function( - element /*: ElementDescriptor */, - placements /*: Placements */, - silent /*: boolean */, - ) { - var keys = placements[element.placement]; - if (!silent && keys.indexOf(element.key) !== -1) { - throw new TypeError("Duplicated element (" + element.key + ")"); - } - keys.push(element.key); - }, - - // DecorateElement - decorateElement: function( - element /*: ElementDescriptor */, - placements /*: Placements */, - ) /*: ElementFinishersExtras */ { - var extras /*: ElementDescriptor[] */ = []; - var finishers /*: ClassFinisher[] */ = []; - - for ( - var decorators = element.decorators, i = decorators.length - 1; - i >= 0; - i-- - ) { - // (inlined) RemoveElementPlacement - var keys = placements[element.placement]; - keys.splice(keys.indexOf(element.key), 1); - - var elementObject /*: ElementObjectInput */ = this.fromElementDescriptor( - element, - ); - var elementFinisherExtras /*: ElementFinisherExtras */ = this.toElementFinisherExtras( - (0, decorators[i])(elementObject) /*: ElementObjectOutput */ || - elementObject, - ); - - element = elementFinisherExtras.element; - this.addElementPlacement(element, placements); - - if (elementFinisherExtras.finisher) { - finishers.push(elementFinisherExtras.finisher); - } - - var newExtras /*: ElementDescriptor[] | void */ = - elementFinisherExtras.extras; - if (newExtras) { - for (var j = 0; j < newExtras.length; j++) { - this.addElementPlacement(newExtras[j], placements); - } - extras.push.apply(extras, newExtras); - } - } - - return { element: element, finishers: finishers, extras: extras }; - }, - - // DecorateConstructor - decorateConstructor: function( - elements /*: ElementDescriptor[] */, - decorators /*: ClassDecorator[] */, - ) /*: ElementsFinishers */ { - var finishers /*: ClassFinisher[] */ = []; - - for (var i = decorators.length - 1; i >= 0; i--) { - var obj /*: ClassObject */ = this.fromClassDescriptor(elements); - var elementsAndFinisher /*: ElementsFinisher */ = this.toClassDescriptor( - (0, decorators[i])(obj) /*: ClassObject */ || obj, - ); - - if (elementsAndFinisher.finisher !== undefined) { - finishers.push(elementsAndFinisher.finisher); - } - - if (elementsAndFinisher.elements !== undefined) { - elements = elementsAndFinisher.elements; - - for (var j = 0; j < elements.length - 1; j++) { - for (var k = j + 1; k < elements.length; k++) { - if ( - elements[j].key === elements[k].key && - elements[j].placement === elements[k].placement - ) { - throw new TypeError( - "Duplicated element (" + elements[j].key + ")", - ); - } - } - } - } - } - - return { elements: elements, finishers: finishers }; - }, - - // FromElementDescriptor - fromElementDescriptor: function( - element /*: ElementDescriptor */, - ) /*: ElementObject */ { - var obj /*: ElementObject */ = { - kind: element.kind, - key: element.key, - placement: element.placement, - descriptor: element.descriptor, - }; - - var desc = { - value: "Descriptor", - configurable: true, - }; - Object.defineProperty(obj, Symbol.toStringTag, desc); - - if (element.kind === "field") obj.initializer = element.initializer; - - return obj; - }, - - // ToElementDescriptors - toElementDescriptors: function( - elementObjects /*: ElementObject[] */, - ) /*: ElementDescriptor[] */ { - if (elementObjects === undefined) return; - return toArray(elementObjects).map(function(elementObject) { - var element = this.toElementDescriptor(elementObject); - this.disallowProperty(elementObject, "finisher", "An element descriptor"); - this.disallowProperty(elementObject, "extras", "An element descriptor"); - return element; - }, this); - }, - - // ToElementDescriptor - toElementDescriptor: function( - elementObject /*: ElementObject */, - ) /*: ElementDescriptor */ { - var kind = String(elementObject.kind); - if (kind !== "method" && kind !== "field") { - throw new TypeError( - 'An element descriptor\\'s .kind property must be either "method" or' + - ' "field", but a decorator created an element descriptor with' + - ' .kind "' + - kind + - '"', - ); - } - - var key = toPropertyKey(elementObject.key); - - var placement = String(elementObject.placement); - if ( - placement !== "static" && - placement !== "prototype" && - placement !== "own" - ) { - throw new TypeError( - 'An element descriptor\\'s .placement property must be one of "static",' + - ' "prototype" or "own", but a decorator created an element descriptor' + - ' with .placement "' + - placement + - '"', - ); - } - - var descriptor /*: PropertyDescriptor */ = elementObject.descriptor; - - this.disallowProperty(elementObject, "elements", "An element descriptor"); - - var element /*: ElementDescriptor */ = { - kind: kind, - key: key, - placement: placement, - descriptor: Object.assign({}, descriptor), - }; - - if (kind !== "field") { - this.disallowProperty(elementObject, "initializer", "A method descriptor"); - } else { - this.disallowProperty( - descriptor, - "get", - "The property descriptor of a field descriptor", - ); - this.disallowProperty( - descriptor, - "set", - "The property descriptor of a field descriptor", - ); - this.disallowProperty( - descriptor, - "value", - "The property descriptor of a field descriptor", - ); - - element.initializer = elementObject.initializer; - } - - return element; - }, - - toElementFinisherExtras: function( - elementObject /*: ElementObject */, - ) /*: ElementFinisherExtras */ { - var element /*: ElementDescriptor */ = this.toElementDescriptor( - elementObject, - ); - var finisher /*: ClassFinisher */ = _optionalCallableProperty( - elementObject, - "finisher", - ); - var extras /*: ElementDescriptors[] */ = this.toElementDescriptors( - elementObject.extras, - ); - - return { element: element, finisher: finisher, extras: extras }; - }, - - // FromClassDescriptor - fromClassDescriptor: function( - elements /*: ElementDescriptor[] */, - ) /*: ClassObject */ { - var obj = { - kind: "class", - elements: elements.map(this.fromElementDescriptor, this), - }; - - var desc = { value: "Descriptor", configurable: true }; - Object.defineProperty(obj, Symbol.toStringTag, desc); - - return obj; - }, - - // ToClassDescriptor - toClassDescriptor: function( - obj /*: ClassObject */, - ) /*: ElementsFinisher */ { - var kind = String(obj.kind); - if (kind !== "class") { - throw new TypeError( - 'A class descriptor\\'s .kind property must be "class", but a decorator' + - ' created a class descriptor with .kind "' + - kind + - '"', - ); - } - - this.disallowProperty(obj, "key", "A class descriptor"); - this.disallowProperty(obj, "placement", "A class descriptor"); - this.disallowProperty(obj, "descriptor", "A class descriptor"); - this.disallowProperty(obj, "initializer", "A class descriptor"); - this.disallowProperty(obj, "extras", "A class descriptor"); - - var finisher = _optionalCallableProperty(obj, "finisher"); - var elements = this.toElementDescriptors(obj.elements); - - return { elements: elements, finisher: finisher }; - }, - - // RunClassFinishers - runClassFinishers: function( - constructor /*: Class<*> */, - finishers /*: ClassFinisher[] */, - ) /*: Class<*> */ { - for (var i = 0; i < finishers.length; i++) { - var newConstructor /*: ?Class<*> */ = (0, finishers[i])(constructor); - if (newConstructor !== undefined) { - // NOTE: This should check if IsConstructor(newConstructor) is false. - if (typeof newConstructor !== "function") { - throw new TypeError("Finishers must return a constructor."); - } - constructor = newConstructor; - } - } - return constructor; - }, - - disallowProperty: function(obj, name, objectType) { - if (obj[name] !== undefined) { - throw new TypeError(objectType + " can't have a ." + name + " property."); - } - } - }; - - return api; - } - - // ClassElementEvaluation - function _createElementDescriptor( - def /*: ElementDefinition */, - ) /*: ElementDescriptor */ { - var key = toPropertyKey(def.key); - - var descriptor /*: PropertyDescriptor */; - if (def.kind === "method") { - descriptor = { - value: def.value, - writable: true, - configurable: true, - enumerable: false, - }; - } else if (def.kind === "get") { - descriptor = { get: def.value, configurable: true, enumerable: false }; - } else if (def.kind === "set") { - descriptor = { set: def.value, configurable: true, enumerable: false }; - } else if (def.kind === "field") { - descriptor = { configurable: true, writable: true, enumerable: true }; - } - - var element /*: ElementDescriptor */ = { - kind: def.kind === "field" ? "field" : "method", - key: key, - placement: def.static - ? "static" - : def.kind === "field" - ? "own" - : "prototype", - descriptor: descriptor, - }; - if (def.decorators) element.decorators = def.decorators; - if (def.kind === "field") element.initializer = def.value; - - return element; - } - - // CoalesceGetterSetter - function _coalesceGetterSetter( - element /*: ElementDescriptor */, - other /*: ElementDescriptor */, - ) { - if (element.descriptor.get !== undefined) { - other.descriptor.get = element.descriptor.get; - } else { - other.descriptor.set = element.descriptor.set; - } - } - - // CoalesceClassElements - function _coalesceClassElements( - elements /*: ElementDescriptor[] */, - ) /*: ElementDescriptor[] */ { - var newElements /*: ElementDescriptor[] */ = []; - - var isSameElement = function( - other /*: ElementDescriptor */, - ) /*: boolean */ { - return ( - other.kind === "method" && - other.key === element.key && - other.placement === element.placement - ); - }; - - for (var i = 0; i < elements.length; i++) { - var element /*: ElementDescriptor */ = elements[i]; - var other /*: ElementDescriptor */; - - if ( - element.kind === "method" && - (other = newElements.find(isSameElement)) - ) { - if ( - _isDataDescriptor(element.descriptor) || - _isDataDescriptor(other.descriptor) - ) { - if (_hasDecorators(element) || _hasDecorators(other)) { - throw new ReferenceError( - "Duplicated methods (" + element.key + ") can't be decorated.", - ); - } - other.descriptor = element.descriptor; - } else { - if (_hasDecorators(element)) { - if (_hasDecorators(other)) { - throw new ReferenceError( - "Decorators can't be placed on different accessors with for " + - "the same property (" + - element.key + - ").", - ); - } - other.decorators = element.decorators; - } - _coalesceGetterSetter(element, other); - } - } else { - newElements.push(element); - } - } - - return newElements; - } - - function _hasDecorators(element /*: ElementDescriptor */) /*: boolean */ { - return element.decorators && element.decorators.length; - } - - function _isDataDescriptor(desc /*: PropertyDescriptor */) /*: boolean */ { - return ( - desc !== undefined && - !(desc.value === undefined && desc.writable === undefined) - ); - } - - function _optionalCallableProperty /*::*/( - obj /*: T */, - name /*: $Keys */, - ) /*: ?Function */ { - var value = obj[name]; - if (value !== undefined && typeof value !== "function") { - throw new TypeError("Expected '" + name + "' to be a function"); - } - return value; - } - -`; -helpers.classPrivateMethodGet = helper("7.1.6")` - export default function _classPrivateMethodGet(receiver, privateSet, fn) { - if (!privateSet.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return fn; - } -`; -helpers.classPrivateMethodSet = helper("7.1.6")` - export default function _classPrivateMethodSet() { - throw new TypeError("attempted to reassign private method"); - } -`; -helpers.wrapRegExp = helper("7.2.6")` - import wrapNativeSuper from "wrapNativeSuper"; - import getPrototypeOf from "getPrototypeOf"; - import possibleConstructorReturn from "possibleConstructorReturn"; - import inherits from "inherits"; - - export default function _wrapRegExp(re, groups) { - _wrapRegExp = function(re, groups) { - return new BabelRegExp(re, undefined, groups); - }; - - var _RegExp = wrapNativeSuper(RegExp); - var _super = RegExp.prototype; - var _groups = new WeakMap(); - - function BabelRegExp(re, flags, groups) { - var _this = _RegExp.call(this, re, flags); - // if the regex is recreated with 'g' flag - _groups.set(_this, groups || _groups.get(re)); - return _this; - } - inherits(BabelRegExp, _RegExp); - - BabelRegExp.prototype.exec = function(str) { - var result = _super.exec.call(this, str); - if (result) result.groups = buildGroups(result, this); - return result; - }; - BabelRegExp.prototype[Symbol.replace] = function(str, substitution) { - if (typeof substitution === "string") { - var groups = _groups.get(this); - return _super[Symbol.replace].call( - this, - str, - substitution.replace(/\\$<([^>]+)>/g, function(_, name) { - return "$" + groups[name]; - }) - ); - } else if (typeof substitution === "function") { - var _this = this; - return _super[Symbol.replace].call( - this, - str, - function() { - var args = []; - args.push.apply(args, arguments); - if (typeof args[args.length - 1] !== "object") { - // Modern engines already pass result.groups as the last arg. - args.push(buildGroups(args, _this)); - } - return substitution.apply(this, args); - } - ); - } else { - return _super[Symbol.replace].call(this, str, substitution); - } - } - - function buildGroups(result, re) { - // NOTE: This function should return undefined if there are no groups, - // but in that case Babel doesn't add the wrapper anyway. - - var g = _groups.get(re); - return Object.keys(g).reduce(function(groups, name) { - groups[name] = result[g[name]]; - return groups; - }, Object.create(null)); - } - - return _wrapRegExp.apply(this, arguments); - } -`; \ No newline at end of file diff --git a/packages/babel-helpers/lib/index.js b/packages/babel-helpers/lib/index.js deleted file mode 100644 index 75387e2..0000000 --- a/packages/babel-helpers/lib/index.js +++ /dev/null @@ -1,276 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.get = get; -exports.minVersion = minVersion; -exports.getDependencies = getDependencies; -exports.ensure = ensure; -exports.default = exports.list = void 0; - -var _traverse = _interopRequireDefault(require("@babel/traverse")); - -var t = _interopRequireWildcard(require("@babel/types")); - -var _helpers = _interopRequireDefault(require("./helpers")); - -function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function makePath(path) { - const parts = []; - - for (; path.parentPath; path = path.parentPath) { - parts.push(path.key); - if (path.inList) parts.push(path.listKey); - } - - return parts.reverse().join("."); -} - -function getHelperMetadata(file) { - const globals = new Set(); - const localBindingNames = new Set(); - const dependencies = new Map(); - let exportName; - let exportPath; - const exportBindingAssignments = []; - const importPaths = []; - const importBindingsReferences = []; - (0, _traverse.default)(file, { - ImportDeclaration(child) { - const name = child.node.source.value; - - if (!_helpers.default[name]) { - throw child.buildCodeFrameError(`Unknown helper ${name}`); - } - - if (child.get("specifiers").length !== 1 || !child.get("specifiers.0").isImportDefaultSpecifier()) { - throw child.buildCodeFrameError("Helpers can only import a default value"); - } - - const bindingIdentifier = child.node.specifiers[0].local; - dependencies.set(bindingIdentifier, name); - importPaths.push(makePath(child)); - }, - - ExportDefaultDeclaration(child) { - const decl = child.get("declaration"); - - if (decl.isFunctionDeclaration()) { - if (!decl.node.id) { - throw decl.buildCodeFrameError("Helpers should give names to their exported func declaration"); - } - - exportName = decl.node.id.name; - } - - exportPath = makePath(child); - }, - - ExportAllDeclaration(child) { - throw child.buildCodeFrameError("Helpers can only export default"); - }, - - ExportNamedDeclaration(child) { - throw child.buildCodeFrameError("Helpers can only export default"); - }, - - Statement(child) { - if (child.isModuleDeclaration()) return; - child.skip(); - } - - }); - (0, _traverse.default)(file, { - Program(path) { - const bindings = path.scope.getAllBindings(); - Object.keys(bindings).forEach(name => { - if (name === exportName) return; - if (dependencies.has(bindings[name].identifier)) return; - localBindingNames.add(name); - }); - }, - - ReferencedIdentifier(child) { - const name = child.node.name; - const binding = child.scope.getBinding(name, true); - - if (!binding) { - globals.add(name); - } else if (dependencies.has(binding.identifier)) { - importBindingsReferences.push(makePath(child)); - } - }, - - AssignmentExpression(child) { - const left = child.get("left"); - if (!(exportName in left.getBindingIdentifiers())) return; - - if (!left.isIdentifier()) { - throw left.buildCodeFrameError("Only simple assignments to exports are allowed in helpers"); - } - - const binding = child.scope.getBinding(exportName); - - if (binding && binding.scope.path.isProgram()) { - exportBindingAssignments.push(makePath(child)); - } - } - - }); - if (!exportPath) throw new Error("Helpers must default-export something."); - exportBindingAssignments.reverse(); - return { - globals: Array.from(globals), - localBindingNames: Array.from(localBindingNames), - dependencies, - exportBindingAssignments, - exportPath, - exportName, - importBindingsReferences, - importPaths - }; -} - -function permuteHelperAST(file, metadata, id, localBindings, getDependency) { - if (localBindings && !id) { - throw new Error("Unexpected local bindings for module-based helpers."); - } - - if (!id) return; - const { - localBindingNames, - dependencies, - exportBindingAssignments, - exportPath, - exportName, - importBindingsReferences, - importPaths - } = metadata; - const dependenciesRefs = {}; - dependencies.forEach((name, id) => { - dependenciesRefs[id.name] = typeof getDependency === "function" && getDependency(name) || id; - }); - const toRename = {}; - const bindings = new Set(localBindings || []); - localBindingNames.forEach(name => { - let newName = name; - - while (bindings.has(newName)) newName = "_" + newName; - - if (newName !== name) toRename[name] = newName; - }); - - if (id.type === "Identifier" && exportName !== id.name) { - toRename[exportName] = id.name; - } - - (0, _traverse.default)(file, { - Program(path) { - const exp = path.get(exportPath); - const imps = importPaths.map(p => path.get(p)); - const impsBindingRefs = importBindingsReferences.map(p => path.get(p)); - const decl = exp.get("declaration"); - - if (id.type === "Identifier") { - if (decl.isFunctionDeclaration()) { - exp.replaceWith(decl); - } else { - exp.replaceWith(t.variableDeclaration("var", [t.variableDeclarator(id, decl.node)])); - } - } else if (id.type === "MemberExpression") { - if (decl.isFunctionDeclaration()) { - exportBindingAssignments.forEach(assignPath => { - const assign = path.get(assignPath); - assign.replaceWith(t.assignmentExpression("=", id, assign.node)); - }); - exp.replaceWith(decl); - path.pushContainer("body", t.expressionStatement(t.assignmentExpression("=", id, t.identifier(exportName)))); - } else { - exp.replaceWith(t.expressionStatement(t.assignmentExpression("=", id, decl.node))); - } - } else { - throw new Error("Unexpected helper format."); - } - - Object.keys(toRename).forEach(name => { - path.scope.rename(name, toRename[name]); - }); - - for (const path of imps) path.remove(); - - for (const path of impsBindingRefs) { - const node = t.cloneNode(dependenciesRefs[path.node.name]); - path.replaceWith(node); - } - - path.stop(); - } - - }); -} - -const helperData = Object.create(null); - -function loadHelper(name) { - if (!helperData[name]) { - const helper = _helpers.default[name]; - - if (!helper) { - throw Object.assign(new ReferenceError(`Unknown helper ${name}`), { - code: "BABEL_HELPER_UNKNOWN", - helper: name - }); - } - - const fn = () => { - return t.file(helper.ast()); - }; - - const metadata = getHelperMetadata(fn()); - helperData[name] = { - build(getDependency, id, localBindings) { - const file = fn(); - permuteHelperAST(file, metadata, id, localBindings, getDependency); - return { - nodes: file.program.body, - globals: metadata.globals - }; - }, - - minVersion() { - return helper.minVersion; - }, - - dependencies: metadata.dependencies - }; - } - - return helperData[name]; -} - -function get(name, getDependency, id, localBindings) { - return loadHelper(name).build(getDependency, id, localBindings); -} - -function minVersion(name) { - return loadHelper(name).minVersion(); -} - -function getDependencies(name) { - return Array.from(loadHelper(name).dependencies.values()); -} - -function ensure(name) { - loadHelper(name); -} - -const list = Object.keys(_helpers.default).map(name => name.replace(/^_/, "")).filter(name => name !== "__esModule"); -exports.list = list; -var _default = get; -exports.default = _default; \ No newline at end of file diff --git a/packages/babel-helpers/package.json b/packages/babel-helpers/package.json deleted file mode 100644 index 31ff1ee..0000000 --- a/packages/babel-helpers/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@babel/helpers", - "version": "7.7.0", - "description": "Collection of helper functions used by Babel transforms.", - "author": "Sebastian McKenzie ", - "homepage": "https://babeljs.io/", - "license": "MIT", - "publishConfig": { - "access": "public" - }, - "repository": "https://github.com/babel/babel/tree/master/packages/babel-helpers", - "main": "lib/index.js", - "dependencies": { - "@babel/template": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0" - }, - "devDependencies": { - "@babel/helper-plugin-test-runner": "^7.0.0" - } -} diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js deleted file mode 100644 index 272936f..0000000 --- a/packages/babel-helpers/src/helpers.js +++ /dev/null @@ -1,1997 +0,0 @@ -// @flow - -import template from "@babel/template"; - -const helpers = Object.create(null); -export default helpers; - -const helper = (minVersion: string) => tpl => ({ - minVersion, - ast: () => template.program.ast(tpl), -}); - -helpers.typeof = helper("7.0.0-beta.0")` - export default function _typeof(obj) { - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { return typeof obj; }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype - ? "symbol" - : typeof obj; - }; - } - - return _typeof(obj); - } -`; - -// "for" is a reserved keyword in ES3 so escaping it here for backward compatibility -helpers.jsx = helper("7.0.0-beta.0")` - var REACT_ELEMENT_TYPE; - - export default function _createRawReactElement(type, props, key, children) { - if (!REACT_ELEMENT_TYPE) { - REACT_ELEMENT_TYPE = ( - typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") - ) || 0xeac7; - } - - var defaultProps = type && type.defaultProps; - var childrenLength = arguments.length - 3; - - if (!props && childrenLength !== 0) { - // If we're going to assign props.children, we create a new object now - // to avoid mutating defaultProps. - props = { - children: void 0, - }; - } - - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = new Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 3]; - } - props.children = childArray; - } - - if (props && defaultProps) { - for (var propName in defaultProps) { - if (props[propName] === void 0) { - props[propName] = defaultProps[propName]; - } - } - } else if (!props) { - props = defaultProps || {}; - } - - return { - $$typeof: REACT_ELEMENT_TYPE, - type: type, - key: key === undefined ? null : '' + key, - ref: null, - props: props, - _owner: null, - }; - } -`; - -helpers.asyncIterator = helper("7.0.0-beta.0")` - export default function _asyncIterator(iterable) { - var method - if (typeof Symbol !== "undefined") { - if (Symbol.asyncIterator) { - method = iterable[Symbol.asyncIterator] - if (method != null) return method.call(iterable); - } - if (Symbol.iterator) { - method = iterable[Symbol.iterator] - if (method != null) return method.call(iterable); - } - } - throw new TypeError("Object is not async iterable"); - } -`; - -helpers.AwaitValue = helper("7.0.0-beta.0")` - export default function _AwaitValue(value) { - this.wrapped = value; - } -`; - -helpers.AsyncGenerator = helper("7.0.0-beta.0")` - import AwaitValue from "AwaitValue"; - - export default function AsyncGenerator(gen) { - var front, back; - - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null, - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg) - var value = result.value; - var wrappedAwait = value instanceof AwaitValue; - - Promise.resolve(wrappedAwait ? value.wrapped : value).then( - function (arg) { - if (wrappedAwait) { - resume(key === "return" ? "return" : "next", arg); - return - } - - settle(result.done ? "return" : "normal", arg); - }, - function (err) { resume("throw", err); }); - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ value: value, done: true }); - break; - case "throw": - front.reject(value); - break; - default: - front.resolve({ value: value, done: false }); - break; - } - - front = front.next; - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - // Hide "return" method if generator return is not supported - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; - } - - AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; - AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; - AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; -`; - -helpers.wrapAsyncGenerator = helper("7.0.0-beta.0")` - import AsyncGenerator from "AsyncGenerator"; - - export default function _wrapAsyncGenerator(fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); - }; - } -`; - -helpers.awaitAsyncGenerator = helper("7.0.0-beta.0")` - import AwaitValue from "AwaitValue"; - - export default function _awaitAsyncGenerator(value) { - return new AwaitValue(value); - } -`; - -helpers.asyncGeneratorDelegate = helper("7.0.0-beta.0")` - export default function _asyncGeneratorDelegate(inner, awaitWrap) { - var iter = {}, waiting = false; - - function pump(key, value) { - waiting = true; - value = new Promise(function (resolve) { resolve(inner[key](value)); }); - return { done: false, value: awaitWrap(value) }; - }; - - if (typeof Symbol === "function" && Symbol.iterator) { - iter[Symbol.iterator] = function () { return this; }; - } - - iter.next = function (value) { - if (waiting) { - waiting = false; - return value; - } - return pump("next", value); - }; - - if (typeof inner.throw === "function") { - iter.throw = function (value) { - if (waiting) { - waiting = false; - throw value; - } - return pump("throw", value); - }; - } - - if (typeof inner.return === "function") { - iter.return = function (value) { - if (waiting) { - waiting = false; - return value; - } - return pump("return", value); - }; - } - - return iter; - } -`; - -helpers.asyncToGenerator = helper("7.0.0-beta.0")` - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - export default function _asyncToGenerator(fn) { - return function () { - var self = this, args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } -`; - -helpers.classCallCheck = helper("7.0.0-beta.0")` - export default function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } -`; - -helpers.createClass = helper("7.0.0-beta.0")` - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i ++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - export default function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } -`; - -helpers.defineEnumerableProperties = helper("7.0.0-beta.0")` - export default function _defineEnumerableProperties(obj, descs) { - for (var key in descs) { - var desc = descs[key]; - desc.configurable = desc.enumerable = true; - if ("value" in desc) desc.writable = true; - Object.defineProperty(obj, key, desc); - } - - // Symbols are not enumerated over by for-in loops. If native - // Symbols are available, fetch all of the descs object's own - // symbol properties and define them on our target object too. - if (Object.getOwnPropertySymbols) { - var objectSymbols = Object.getOwnPropertySymbols(descs); - for (var i = 0; i < objectSymbols.length; i++) { - var sym = objectSymbols[i]; - var desc = descs[sym]; - desc.configurable = desc.enumerable = true; - if ("value" in desc) desc.writable = true; - Object.defineProperty(obj, sym, desc); - } - } - return obj; - } -`; - -helpers.defaults = helper("7.0.0-beta.0")` - export default function _defaults(obj, defaults) { - var keys = Object.getOwnPropertyNames(defaults); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = Object.getOwnPropertyDescriptor(defaults, key); - if (value && value.configurable && obj[key] === undefined) { - Object.defineProperty(obj, key, value); - } - } - return obj; - } -`; - -helpers.defineProperty = helper("7.0.0-beta.0")` - export default function _defineProperty(obj, key, value) { - // Shortcircuit the slow defineProperty path when possible. - // We are trying to avoid issues where setters defined on the - // prototype cause side effects under the fast path of simple - // assignment. By checking for existence of the property with - // the in operator, we can optimize most of this overhead away. - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - return obj; - } -`; - -helpers.extends = helper("7.0.0-beta.0")` - export default function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - - return _extends.apply(this, arguments); - } -`; - -// This old helper can be removed in babel v8 -helpers.objectSpread = helper("7.0.0-beta.0")` - import defineProperty from "defineProperty"; - - export default function _objectSpread(target) { - for (var i = 1; i < arguments.length; i++) { - var source = (arguments[i] != null) ? arguments[i] : {}; - var ownKeys = Object.keys(source); - if (typeof Object.getOwnPropertySymbols === 'function') { - ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { - return Object.getOwnPropertyDescriptor(source, sym).enumerable; - })); - } - ownKeys.forEach(function(key) { - defineProperty(target, key, source[key]); - }); - } - return target; - } -`; - -helpers.objectSpread2 = helper("7.5.0")` - import defineProperty from "defineProperty"; - - // This function is different to "Reflect.ownKeys". The enumerableOnly - // filters on symbol properties only. Returned string properties are always - // enumerable. It is good to use in objectSpread. - - function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - keys.push.apply(keys, symbols); - } - return keys; - } - - export default function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = (arguments[i] != null) ? arguments[i] : {}; - if (i % 2) { - ownKeys(source, true).forEach(function (key) { - defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(source).forEach(function (key) { - Object.defineProperty( - target, - key, - Object.getOwnPropertyDescriptor(source, key) - ); - }); - } - } - return target; - } -`; - -helpers.inherits = helper("7.0.0-beta.0")` - import setPrototypeOf from "setPrototypeOf"; - - export default function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) setPrototypeOf(subClass, superClass); - } -`; - -helpers.inheritsLoose = helper("7.0.0-beta.0")` - export default function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - subClass.__proto__ = superClass; - } -`; - -helpers.getPrototypeOf = helper("7.0.0-beta.0")` - export default function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf - ? Object.getPrototypeOf - : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } -`; - -helpers.setPrototypeOf = helper("7.0.0-beta.0")` - export default function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - return _setPrototypeOf(o, p); - } -`; - -helpers.construct = helper("7.0.0-beta.0")` - import setPrototypeOf from "setPrototypeOf"; - - function isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - - // core-js@3 - if (Reflect.construct.sham) return false; - - // Proxy can't be polyfilled. Every browser implemented - // proxies before or at the same time as Reflect.construct, - // so if they support Proxy they also support Reflect.construct. - if (typeof Proxy === "function") return true; - - // Since Reflect.construct can't be properly polyfilled, some - // implementations (e.g. core-js@2) don't set the correct internal slots. - // Those polyfills don't allow us to subclass built-ins, so we need to - // use our fallback implementation. - try { - // If the internal slots aren't set, this throws an error similar to - // TypeError: this is not a Date object. - Date.prototype.toString.call(Reflect.construct(Date, [], function() {})); - return true; - } catch (e) { - return false; - } - } - - export default function _construct(Parent, args, Class) { - if (isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - // NOTE: If Parent !== Class, the correct __proto__ is set *after* - // calling the constructor. - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - // Avoid issues with Class being present but undefined when it wasn't - // present in the original call. - return _construct.apply(null, arguments); - } -`; - -helpers.isNativeFunction = helper("7.0.0-beta.0")` - export default function _isNativeFunction(fn) { - // Note: This function returns "true" for core-js functions. - return Function.toString.call(fn).indexOf("[native code]") !== -1; - } -`; - -// Based on https://github.com/WebReflection/babel-plugin-transform-builtin-classes -helpers.wrapNativeSuper = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; - import setPrototypeOf from "setPrototypeOf"; - import isNativeFunction from "isNativeFunction"; - import construct from "construct"; - - export default function _wrapNativeSuper(Class) { - var _cache = typeof Map === "function" ? new Map() : undefined; - - _wrapNativeSuper = function _wrapNativeSuper(Class) { - if (Class === null || !isNativeFunction(Class)) return Class; - if (typeof Class !== "function") { - throw new TypeError("Super expression must either be null or a function"); - } - if (typeof _cache !== "undefined") { - if (_cache.has(Class)) return _cache.get(Class); - _cache.set(Class, Wrapper); - } - function Wrapper() { - return construct(Class, arguments, getPrototypeOf(this).constructor) - } - Wrapper.prototype = Object.create(Class.prototype, { - constructor: { - value: Wrapper, - enumerable: false, - writable: true, - configurable: true, - } - }); - - return setPrototypeOf(Wrapper, Class); - } - - return _wrapNativeSuper(Class) - } -`; - -helpers.instanceof = helper("7.0.0-beta.0")` - export default function _instanceof(left, right) { - if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { - return !!right[Symbol.hasInstance](left); - } else { - return left instanceof right; - } - } -`; - -helpers.interopRequireDefault = helper("7.0.0-beta.0")` - export default function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { default: obj }; - } -`; - -helpers.interopRequireWildcard = helper("7.0.0-beta.0")` - function _getRequireWildcardCache() { - if (typeof WeakMap !== "function") return null; - - var cache = new WeakMap(); - _getRequireWildcardCache = function () { return cache; }; - return cache; - } - - export default function _interopRequireWildcard(obj) { - if (obj && obj.__esModule) { - return obj; - } - - if (obj === null || (typeof obj !== "object" && typeof obj !== "function")) { - return { default: obj } - } - - var cache = _getRequireWildcardCache(); - if (cache && cache.has(obj)) { - return cache.get(obj); - } - - var newObj = {}; - var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - var desc = hasPropertyDescriptor - ? Object.getOwnPropertyDescriptor(obj, key) - : null; - if (desc && (desc.get || desc.set)) { - Object.defineProperty(newObj, key, desc); - } else { - newObj[key] = obj[key]; - } - } - } - newObj.default = obj; - if (cache) { - cache.set(obj, newObj); - } - return newObj; - } -`; - -helpers.newArrowCheck = helper("7.0.0-beta.0")` - export default function _newArrowCheck(innerThis, boundThis) { - if (innerThis !== boundThis) { - throw new TypeError("Cannot instantiate an arrow function"); - } - } -`; - -helpers.objectDestructuringEmpty = helper("7.0.0-beta.0")` - export default function _objectDestructuringEmpty(obj) { - if (obj == null) throw new TypeError("Cannot destructure undefined"); - } -`; - -helpers.objectWithoutPropertiesLoose = helper("7.0.0-beta.0")` - export default function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - - return target; - } -`; - -helpers.objectWithoutProperties = helper("7.0.0-beta.0")` - import objectWithoutPropertiesLoose from "objectWithoutPropertiesLoose"; - - export default function _objectWithoutProperties(source, excluded) { - if (source == null) return {}; - - var target = objectWithoutPropertiesLoose(source, excluded); - var key, i; - - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { - key = sourceSymbolKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; - target[key] = source[key]; - } - } - - return target; - } -`; - -helpers.assertThisInitialized = helper("7.0.0-beta.0")` - export default function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - return self; - } -`; - -helpers.possibleConstructorReturn = helper("7.0.0-beta.0")` - import assertThisInitialized from "assertThisInitialized"; - - export default function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - return assertThisInitialized(self); - } -`; - -helpers.superPropBase = helper("7.0.0-beta.0")` - import getPrototypeOf from "getPrototypeOf"; - - export default function _superPropBase(object, property) { - // Yes, this throws if object is null to being with, that's on purpose. - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = getPrototypeOf(object); - if (object === null) break; - } - return object; - } -`; - -helpers.get = helper("7.0.0-beta.0")` - import superPropBase from "superPropBase"; - - export default function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = superPropBase(target, property); - - if (!base) return; - - var desc = Object.getOwnPropertyDescriptor(base, property); - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - return _get(target, property, receiver || target); - } -`; - -helpers.set = helper("7.0.0-beta.0")` - import superPropBase from "superPropBase"; - import defineProperty from "defineProperty"; - - function set(target, property, value, receiver) { - if (typeof Reflect !== "undefined" && Reflect.set) { - set = Reflect.set; - } else { - set = function set(target, property, value, receiver) { - var base = superPropBase(target, property); - var desc; - - if (base) { - desc = Object.getOwnPropertyDescriptor(base, property); - if (desc.set) { - desc.set.call(receiver, value); - return true; - } else if (!desc.writable) { - // Both getter and non-writable fall into this. - return false; - } - } - - // Without a super that defines the property, spec boils down to - // "define on receiver" for some reason. - desc = Object.getOwnPropertyDescriptor(receiver, property); - if (desc) { - if (!desc.writable) { - // Setter, getter, and non-writable fall into this. - return false; - } - - desc.value = value; - Object.defineProperty(receiver, property, desc); - } else { - // Avoid setters that may be defined on Sub's prototype, but not on - // the instance. - defineProperty(receiver, property, value); - } - - return true; - }; - } - - return set(target, property, value, receiver); - } - - export default function _set(target, property, value, receiver, isStrict) { - var s = set(target, property, value, receiver || target); - if (!s && isStrict) { - throw new Error('failed to set property'); - } - - return value; - } -`; - -helpers.taggedTemplateLiteral = helper("7.0.0-beta.0")` - export default function _taggedTemplateLiteral(strings, raw) { - if (!raw) { raw = strings.slice(0); } - return Object.freeze(Object.defineProperties(strings, { - raw: { value: Object.freeze(raw) } - })); - } -`; - -helpers.taggedTemplateLiteralLoose = helper("7.0.0-beta.0")` - export default function _taggedTemplateLiteralLoose(strings, raw) { - if (!raw) { raw = strings.slice(0); } - strings.raw = raw; - return strings; - } -`; - -helpers.readOnlyError = helper("7.0.0-beta.0")` - export default function _readOnlyError(name) { - throw new Error("\\"" + name + "\\" is read-only"); - } -`; - -helpers.classNameTDZError = helper("7.0.0-beta.0")` - export default function _classNameTDZError(name) { - throw new Error("Class \\"" + name + "\\" cannot be referenced in computed property keys."); - } -`; - -helpers.temporalUndefined = helper("7.0.0-beta.0")` - // This function isn't mean to be called, but to be used as a reference. - // We can't use a normal object because it isn't hoisted. - export default function _temporalUndefined() {} -`; - -helpers.tdz = helper("7.5.5")` - export default function _tdzError(name) { - throw new ReferenceError(name + " is not defined - temporal dead zone"); - } -`; - -helpers.temporalRef = helper("7.0.0-beta.0")` - import undef from "temporalUndefined"; - import err from "tdz"; - - export default function _temporalRef(val, name) { - return val === undef ? err(name) : val; - } -`; - -helpers.slicedToArray = helper("7.0.0-beta.0")` - import arrayWithHoles from "arrayWithHoles"; - import iterableToArrayLimit from "iterableToArrayLimit"; - import nonIterableRest from "nonIterableRest"; - - export default function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); - } -`; - -helpers.slicedToArrayLoose = helper("7.0.0-beta.0")` - import arrayWithHoles from "arrayWithHoles"; - import iterableToArrayLimitLoose from "iterableToArrayLimitLoose"; - import nonIterableRest from "nonIterableRest"; - - export default function _slicedToArrayLoose(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest(); - } -`; - -helpers.toArray = helper("7.0.0-beta.0")` - import arrayWithHoles from "arrayWithHoles"; - import iterableToArray from "iterableToArray"; - import nonIterableRest from "nonIterableRest"; - - export default function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); - } -`; - -helpers.toConsumableArray = helper("7.0.0-beta.0")` - import arrayWithoutHoles from "arrayWithoutHoles"; - import iterableToArray from "iterableToArray"; - import nonIterableSpread from "nonIterableSpread"; - - export default function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread(); - } -`; - -helpers.arrayWithoutHoles = helper("7.0.0-beta.0")` - export default function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - } -`; - -helpers.arrayWithHoles = helper("7.0.0-beta.0")` - export default function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } -`; - -helpers.iterableToArray = helper("7.0.0-beta.0")` - export default function _iterableToArray(iter) { - if ( - Symbol.iterator in Object(iter) || - Object.prototype.toString.call(iter) === "[object Arguments]" - ) return Array.from(iter); - } -`; - -helpers.iterableToArrayLimit = helper("7.0.0-beta.0")` - export default function _iterableToArrayLimit(arr, i) { - // this is an expanded form of \`for...of\` that properly supports abrupt completions of - // iterators etc. variable names have been minimised to reduce the size of this massive - // helper. sometimes spec compliance is annoying :( - // - // _n = _iteratorNormalCompletion - // _d = _didIteratorError - // _e = _iteratorError - // _i = _iterator - // _s = _step - if (!( - Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]" - )) { return } - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - return _arr; - } -`; - -helpers.iterableToArrayLimitLoose = helper("7.0.0-beta.0")` - export default function _iterableToArrayLimitLoose(arr, i) { - if (!( - Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]" - )) { return } - var _arr = []; - for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { - _arr.push(_step.value); - if (i && _arr.length === i) break; - } - return _arr; - } -`; - -helpers.nonIterableSpread = helper("7.0.0-beta.0")` - export default function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); - } -`; - -helpers.nonIterableRest = helper("7.0.0-beta.0")` - export default function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } -`; - -helpers.skipFirstGeneratorNext = helper("7.0.0-beta.0")` - export default function _skipFirstGeneratorNext(fn) { - return function () { - var it = fn.apply(this, arguments); - it.next(); - return it; - } - } -`; - -helpers.toPrimitive = helper("7.1.5")` - export default function _toPrimitive( - input, - hint /*: "default" | "string" | "number" | void */ - ) { - if (typeof input !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (typeof res !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); - } -`; - -helpers.toPropertyKey = helper("7.1.5")` - import toPrimitive from "toPrimitive"; - - export default function _toPropertyKey(arg) { - var key = toPrimitive(arg, "string"); - return typeof key === "symbol" ? key : String(key); - } -`; - -/** - * Add a helper that will throw a useful error if the transform fails to detect the class - * property assignment, so users know something failed. - */ -helpers.initializerWarningHelper = helper("7.0.0-beta.0")` - export default function _initializerWarningHelper(descriptor, context){ - throw new Error( - 'Decorating class property failed. Please ensure that ' + - 'proposal-class-properties is enabled and runs after the decorators transform.' - ); - } -`; - -/** - * Add a helper to call as a replacement for class property definition. - */ -helpers.initializerDefineProperty = helper("7.0.0-beta.0")` - export default function _initializerDefineProperty(target, property, descriptor, context) { - if (!descriptor) return; - - // Apply the initializer - if(descriptor.initializer){ - if(descriptor.set){ - descriptor.set.call(context, descriptor.initializer.call(context)); - }else{ - descriptor.value = descriptor.initializer.call(context); - } - delete descriptor.initializer; - } - - Object.defineProperty(target, property, descriptor); - } -`; - -/** - * Add a helper to take an initial descriptor, apply some decorators to it, and optionally - * define the property. - */ -helpers.applyDecoratedDescriptor = helper("7.0.0-beta.0")` - export default function _applyDecoratedDescriptor(target, property, decorators, descriptor, context){ - var desc = {}; - Object.keys(descriptor).forEach(function(key){ - desc[key] = descriptor[key]; - }); - desc.enumerable = !!desc.enumerable; - desc.configurable = !!desc.configurable; - if ('value' in desc || desc.initializer){ - desc.writable = true; - } - - desc = decorators.slice().reverse().reduce(function(desc, decorator){ - return decorator(target, property, desc) || desc; - }, desc); - - if (context && desc.initializer !== void 0){ - desc.value = desc.initializer ? desc.initializer.call(context) : void 0; - desc.initializer = undefined; - } - - if (desc.initializer === void 0){ - // This is a hack to avoid this being processed by 'transform-runtime'. - // See issue #9. - Object.defineProperty(target, property, desc); - desc = null; - } - - return desc; - } -`; - -helpers.classPrivateFieldLooseKey = helper("7.0.0-beta.0")` - var id = 0; - export default function _classPrivateFieldKey(name) { - return "__private_" + (id++) + "_" + name; - } -`; - -helpers.classPrivateFieldLooseBase = helper("7.0.0-beta.0")` - export default function _classPrivateFieldBase(receiver, privateKey) { - if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { - throw new TypeError("attempted to use private field on non-instance"); - } - return receiver; - } -`; - -helpers.classPrivateFieldGet = helper("7.0.0-beta.0")` - export default function _classPrivateFieldGet(receiver, privateMap) { - var descriptor = privateMap.get(receiver); - if (!descriptor) { - throw new TypeError("attempted to get private field on non-instance"); - } - if (descriptor.get) { - return descriptor.get.call(receiver); - } - return descriptor.value; - } -`; - -helpers.classPrivateFieldSet = helper("7.0.0-beta.0")` - export default function _classPrivateFieldSet(receiver, privateMap, value) { - var descriptor = privateMap.get(receiver); - if (!descriptor) { - throw new TypeError("attempted to set private field on non-instance"); - } - if (descriptor.set) { - descriptor.set.call(receiver, value); - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - - descriptor.value = value; - } - - return value; - } -`; - -helpers.classPrivateFieldDestructureSet = helper("7.4.4")` - export default function _classPrivateFieldDestructureSet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - var descriptor = privateMap.get(receiver); - if (descriptor.set) { - if (!("__destrObj" in descriptor)) { - descriptor.__destrObj = { - set value(v) { - descriptor.set.call(receiver, v) - }, - }; - } - return descriptor.__destrObj; - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - - return descriptor; - } - } -`; - -helpers.classStaticPrivateFieldSpecGet = helper("7.0.2")` - export default function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (descriptor.get) { - return descriptor.get.call(receiver); - } - return descriptor.value; - } -`; - -helpers.classStaticPrivateFieldSpecSet = helper("7.0.2")` - export default function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (descriptor.set) { - descriptor.set.call(receiver, value); - } else { - if (!descriptor.writable) { - // This should only throw in strict mode, but class bodies are - // always strict and private fields can only be used inside - // class bodies. - throw new TypeError("attempted to set read only private field"); - } - descriptor.value = value; - } - - return value; - } -`; - -helpers.classStaticPrivateMethodGet = helper("7.3.2")` - export default function _classStaticPrivateMethodGet(receiver, classConstructor, method) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return method; - } -`; - -helpers.classStaticPrivateMethodSet = helper("7.3.2")` - export default function _classStaticPrivateMethodSet() { - throw new TypeError("attempted to set read only static private field"); - } -`; - -helpers.decorate = helper("7.1.5")` - import toArray from "toArray"; - import toPropertyKey from "toPropertyKey"; - - // These comments are stripped by @babel/template - /*:: - type PropertyDescriptor = - | { - value: any, - writable: boolean, - configurable: boolean, - enumerable: boolean, - } - | { - get?: () => any, - set?: (v: any) => void, - configurable: boolean, - enumerable: boolean, - }; - - type FieldDescriptor ={ - writable: boolean, - configurable: boolean, - enumerable: boolean, - }; - - type Placement = "static" | "prototype" | "own"; - type Key = string | symbol; // PrivateName is not supported yet. - - type ElementDescriptor = - | { - kind: "method", - key: Key, - placement: Placement, - descriptor: PropertyDescriptor - } - | { - kind: "field", - key: Key, - placement: Placement, - descriptor: FieldDescriptor, - initializer?: () => any, - }; - - // This is exposed to the user code - type ElementObjectInput = ElementDescriptor & { - [@@toStringTag]?: "Descriptor" - }; - - // This is exposed to the user code - type ElementObjectOutput = ElementDescriptor & { - [@@toStringTag]?: "Descriptor" - extras?: ElementDescriptor[], - finisher?: ClassFinisher, - }; - - // This is exposed to the user code - type ClassObject = { - [@@toStringTag]?: "Descriptor", - kind: "class", - elements: ElementDescriptor[], - }; - - type ElementDecorator = (descriptor: ElementObjectInput) => ?ElementObjectOutput; - type ClassDecorator = (descriptor: ClassObject) => ?ClassObject; - type ClassFinisher = (cl: Class) => Class; - - // Only used by Babel in the transform output, not part of the spec. - type ElementDefinition = - | { - kind: "method", - value: any, - key: Key, - static?: boolean, - decorators?: ElementDecorator[], - } - | { - kind: "field", - value: () => any, - key: Key, - static?: boolean, - decorators?: ElementDecorator[], - }; - - declare function ClassFactory(initialize: (instance: C) => void): { - F: Class, - d: ElementDefinition[] - } - - */ - - /*:: - // Various combinations with/without extras and with one or many finishers - - type ElementFinisherExtras = { - element: ElementDescriptor, - finisher?: ClassFinisher, - extras?: ElementDescriptor[], - }; - - type ElementFinishersExtras = { - element: ElementDescriptor, - finishers: ClassFinisher[], - extras: ElementDescriptor[], - }; - - type ElementsFinisher = { - elements: ElementDescriptor[], - finisher?: ClassFinisher, - }; - - type ElementsFinishers = { - elements: ElementDescriptor[], - finishers: ClassFinisher[], - }; - - */ - - /*:: - - type Placements = { - static: Key[], - prototype: Key[], - own: Key[], - }; - - */ - - // ClassDefinitionEvaluation (Steps 26-*) - export default function _decorate( - decorators /*: ClassDecorator[] */, - factory /*: ClassFactory */, - superClass /*: ?Class<*> */, - mixins /*: ?Array */, - ) /*: Class<*> */ { - var api = _getDecoratorsApi(); - if (mixins) { - for (var i = 0; i < mixins.length; i++) { - api = mixins[i](api); - } - } - - var r = factory(function initialize(O) { - api.initializeInstanceElements(O, decorated.elements); - }, superClass); - var decorated = api.decorateClass( - _coalesceClassElements(r.d.map(_createElementDescriptor)), - decorators, - ); - - api.initializeClassElements(r.F, decorated.elements); - - return api.runClassFinishers(r.F, decorated.finishers); - } - - function _getDecoratorsApi() { - _getDecoratorsApi = function() { - return api; - }; - - var api = { - elementsDefinitionOrder: [["method"], ["field"]], - - // InitializeInstanceElements - initializeInstanceElements: function( - /*::*/ O /*: C */, - elements /*: ElementDescriptor[] */, - ) { - ["method", "field"].forEach(function(kind) { - elements.forEach(function(element /*: ElementDescriptor */) { - if (element.kind === kind && element.placement === "own") { - this.defineClassElement(O, element); - } - }, this); - }, this); - }, - - // InitializeClassElements - initializeClassElements: function( - /*::*/ F /*: Class */, - elements /*: ElementDescriptor[] */, - ) { - var proto = F.prototype; - - ["method", "field"].forEach(function(kind) { - elements.forEach(function(element /*: ElementDescriptor */) { - var placement = element.placement; - if ( - element.kind === kind && - (placement === "static" || placement === "prototype") - ) { - var receiver = placement === "static" ? F : proto; - this.defineClassElement(receiver, element); - } - }, this); - }, this); - }, - - // DefineClassElement - defineClassElement: function( - /*::*/ receiver /*: C | Class */, - element /*: ElementDescriptor */, - ) { - var descriptor /*: PropertyDescriptor */ = element.descriptor; - if (element.kind === "field") { - var initializer = element.initializer; - descriptor = { - enumerable: descriptor.enumerable, - writable: descriptor.writable, - configurable: descriptor.configurable, - value: initializer === void 0 ? void 0 : initializer.call(receiver), - }; - } - Object.defineProperty(receiver, element.key, descriptor); - }, - - // DecorateClass - decorateClass: function( - elements /*: ElementDescriptor[] */, - decorators /*: ClassDecorator[] */, - ) /*: ElementsFinishers */ { - var newElements /*: ElementDescriptor[] */ = []; - var finishers /*: ClassFinisher[] */ = []; - var placements /*: Placements */ = { - static: [], - prototype: [], - own: [], - }; - - elements.forEach(function(element /*: ElementDescriptor */) { - this.addElementPlacement(element, placements); - }, this); - - elements.forEach(function(element /*: ElementDescriptor */) { - if (!_hasDecorators(element)) return newElements.push(element); - - var elementFinishersExtras /*: ElementFinishersExtras */ = this.decorateElement( - element, - placements, - ); - newElements.push(elementFinishersExtras.element); - newElements.push.apply(newElements, elementFinishersExtras.extras); - finishers.push.apply(finishers, elementFinishersExtras.finishers); - }, this); - - if (!decorators) { - return { elements: newElements, finishers: finishers }; - } - - var result /*: ElementsFinishers */ = this.decorateConstructor( - newElements, - decorators, - ); - finishers.push.apply(finishers, result.finishers); - result.finishers = finishers; - - return result; - }, - - // AddElementPlacement - addElementPlacement: function( - element /*: ElementDescriptor */, - placements /*: Placements */, - silent /*: boolean */, - ) { - var keys = placements[element.placement]; - if (!silent && keys.indexOf(element.key) !== -1) { - throw new TypeError("Duplicated element (" + element.key + ")"); - } - keys.push(element.key); - }, - - // DecorateElement - decorateElement: function( - element /*: ElementDescriptor */, - placements /*: Placements */, - ) /*: ElementFinishersExtras */ { - var extras /*: ElementDescriptor[] */ = []; - var finishers /*: ClassFinisher[] */ = []; - - for ( - var decorators = element.decorators, i = decorators.length - 1; - i >= 0; - i-- - ) { - // (inlined) RemoveElementPlacement - var keys = placements[element.placement]; - keys.splice(keys.indexOf(element.key), 1); - - var elementObject /*: ElementObjectInput */ = this.fromElementDescriptor( - element, - ); - var elementFinisherExtras /*: ElementFinisherExtras */ = this.toElementFinisherExtras( - (0, decorators[i])(elementObject) /*: ElementObjectOutput */ || - elementObject, - ); - - element = elementFinisherExtras.element; - this.addElementPlacement(element, placements); - - if (elementFinisherExtras.finisher) { - finishers.push(elementFinisherExtras.finisher); - } - - var newExtras /*: ElementDescriptor[] | void */ = - elementFinisherExtras.extras; - if (newExtras) { - for (var j = 0; j < newExtras.length; j++) { - this.addElementPlacement(newExtras[j], placements); - } - extras.push.apply(extras, newExtras); - } - } - - return { element: element, finishers: finishers, extras: extras }; - }, - - // DecorateConstructor - decorateConstructor: function( - elements /*: ElementDescriptor[] */, - decorators /*: ClassDecorator[] */, - ) /*: ElementsFinishers */ { - var finishers /*: ClassFinisher[] */ = []; - - for (var i = decorators.length - 1; i >= 0; i--) { - var obj /*: ClassObject */ = this.fromClassDescriptor(elements); - var elementsAndFinisher /*: ElementsFinisher */ = this.toClassDescriptor( - (0, decorators[i])(obj) /*: ClassObject */ || obj, - ); - - if (elementsAndFinisher.finisher !== undefined) { - finishers.push(elementsAndFinisher.finisher); - } - - if (elementsAndFinisher.elements !== undefined) { - elements = elementsAndFinisher.elements; - - for (var j = 0; j < elements.length - 1; j++) { - for (var k = j + 1; k < elements.length; k++) { - if ( - elements[j].key === elements[k].key && - elements[j].placement === elements[k].placement - ) { - throw new TypeError( - "Duplicated element (" + elements[j].key + ")", - ); - } - } - } - } - } - - return { elements: elements, finishers: finishers }; - }, - - // FromElementDescriptor - fromElementDescriptor: function( - element /*: ElementDescriptor */, - ) /*: ElementObject */ { - var obj /*: ElementObject */ = { - kind: element.kind, - key: element.key, - placement: element.placement, - descriptor: element.descriptor, - }; - - var desc = { - value: "Descriptor", - configurable: true, - }; - Object.defineProperty(obj, Symbol.toStringTag, desc); - - if (element.kind === "field") obj.initializer = element.initializer; - - return obj; - }, - - // ToElementDescriptors - toElementDescriptors: function( - elementObjects /*: ElementObject[] */, - ) /*: ElementDescriptor[] */ { - if (elementObjects === undefined) return; - return toArray(elementObjects).map(function(elementObject) { - var element = this.toElementDescriptor(elementObject); - this.disallowProperty(elementObject, "finisher", "An element descriptor"); - this.disallowProperty(elementObject, "extras", "An element descriptor"); - return element; - }, this); - }, - - // ToElementDescriptor - toElementDescriptor: function( - elementObject /*: ElementObject */, - ) /*: ElementDescriptor */ { - var kind = String(elementObject.kind); - if (kind !== "method" && kind !== "field") { - throw new TypeError( - 'An element descriptor\\'s .kind property must be either "method" or' + - ' "field", but a decorator created an element descriptor with' + - ' .kind "' + - kind + - '"', - ); - } - - var key = toPropertyKey(elementObject.key); - - var placement = String(elementObject.placement); - if ( - placement !== "static" && - placement !== "prototype" && - placement !== "own" - ) { - throw new TypeError( - 'An element descriptor\\'s .placement property must be one of "static",' + - ' "prototype" or "own", but a decorator created an element descriptor' + - ' with .placement "' + - placement + - '"', - ); - } - - var descriptor /*: PropertyDescriptor */ = elementObject.descriptor; - - this.disallowProperty(elementObject, "elements", "An element descriptor"); - - var element /*: ElementDescriptor */ = { - kind: kind, - key: key, - placement: placement, - descriptor: Object.assign({}, descriptor), - }; - - if (kind !== "field") { - this.disallowProperty(elementObject, "initializer", "A method descriptor"); - } else { - this.disallowProperty( - descriptor, - "get", - "The property descriptor of a field descriptor", - ); - this.disallowProperty( - descriptor, - "set", - "The property descriptor of a field descriptor", - ); - this.disallowProperty( - descriptor, - "value", - "The property descriptor of a field descriptor", - ); - - element.initializer = elementObject.initializer; - } - - return element; - }, - - toElementFinisherExtras: function( - elementObject /*: ElementObject */, - ) /*: ElementFinisherExtras */ { - var element /*: ElementDescriptor */ = this.toElementDescriptor( - elementObject, - ); - var finisher /*: ClassFinisher */ = _optionalCallableProperty( - elementObject, - "finisher", - ); - var extras /*: ElementDescriptors[] */ = this.toElementDescriptors( - elementObject.extras, - ); - - return { element: element, finisher: finisher, extras: extras }; - }, - - // FromClassDescriptor - fromClassDescriptor: function( - elements /*: ElementDescriptor[] */, - ) /*: ClassObject */ { - var obj = { - kind: "class", - elements: elements.map(this.fromElementDescriptor, this), - }; - - var desc = { value: "Descriptor", configurable: true }; - Object.defineProperty(obj, Symbol.toStringTag, desc); - - return obj; - }, - - // ToClassDescriptor - toClassDescriptor: function( - obj /*: ClassObject */, - ) /*: ElementsFinisher */ { - var kind = String(obj.kind); - if (kind !== "class") { - throw new TypeError( - 'A class descriptor\\'s .kind property must be "class", but a decorator' + - ' created a class descriptor with .kind "' + - kind + - '"', - ); - } - - this.disallowProperty(obj, "key", "A class descriptor"); - this.disallowProperty(obj, "placement", "A class descriptor"); - this.disallowProperty(obj, "descriptor", "A class descriptor"); - this.disallowProperty(obj, "initializer", "A class descriptor"); - this.disallowProperty(obj, "extras", "A class descriptor"); - - var finisher = _optionalCallableProperty(obj, "finisher"); - var elements = this.toElementDescriptors(obj.elements); - - return { elements: elements, finisher: finisher }; - }, - - // RunClassFinishers - runClassFinishers: function( - constructor /*: Class<*> */, - finishers /*: ClassFinisher[] */, - ) /*: Class<*> */ { - for (var i = 0; i < finishers.length; i++) { - var newConstructor /*: ?Class<*> */ = (0, finishers[i])(constructor); - if (newConstructor !== undefined) { - // NOTE: This should check if IsConstructor(newConstructor) is false. - if (typeof newConstructor !== "function") { - throw new TypeError("Finishers must return a constructor."); - } - constructor = newConstructor; - } - } - return constructor; - }, - - disallowProperty: function(obj, name, objectType) { - if (obj[name] !== undefined) { - throw new TypeError(objectType + " can't have a ." + name + " property."); - } - } - }; - - return api; - } - - // ClassElementEvaluation - function _createElementDescriptor( - def /*: ElementDefinition */, - ) /*: ElementDescriptor */ { - var key = toPropertyKey(def.key); - - var descriptor /*: PropertyDescriptor */; - if (def.kind === "method") { - descriptor = { - value: def.value, - writable: true, - configurable: true, - enumerable: false, - }; - } else if (def.kind === "get") { - descriptor = { get: def.value, configurable: true, enumerable: false }; - } else if (def.kind === "set") { - descriptor = { set: def.value, configurable: true, enumerable: false }; - } else if (def.kind === "field") { - descriptor = { configurable: true, writable: true, enumerable: true }; - } - - var element /*: ElementDescriptor */ = { - kind: def.kind === "field" ? "field" : "method", - key: key, - placement: def.static - ? "static" - : def.kind === "field" - ? "own" - : "prototype", - descriptor: descriptor, - }; - if (def.decorators) element.decorators = def.decorators; - if (def.kind === "field") element.initializer = def.value; - - return element; - } - - // CoalesceGetterSetter - function _coalesceGetterSetter( - element /*: ElementDescriptor */, - other /*: ElementDescriptor */, - ) { - if (element.descriptor.get !== undefined) { - other.descriptor.get = element.descriptor.get; - } else { - other.descriptor.set = element.descriptor.set; - } - } - - // CoalesceClassElements - function _coalesceClassElements( - elements /*: ElementDescriptor[] */, - ) /*: ElementDescriptor[] */ { - var newElements /*: ElementDescriptor[] */ = []; - - var isSameElement = function( - other /*: ElementDescriptor */, - ) /*: boolean */ { - return ( - other.kind === "method" && - other.key === element.key && - other.placement === element.placement - ); - }; - - for (var i = 0; i < elements.length; i++) { - var element /*: ElementDescriptor */ = elements[i]; - var other /*: ElementDescriptor */; - - if ( - element.kind === "method" && - (other = newElements.find(isSameElement)) - ) { - if ( - _isDataDescriptor(element.descriptor) || - _isDataDescriptor(other.descriptor) - ) { - if (_hasDecorators(element) || _hasDecorators(other)) { - throw new ReferenceError( - "Duplicated methods (" + element.key + ") can't be decorated.", - ); - } - other.descriptor = element.descriptor; - } else { - if (_hasDecorators(element)) { - if (_hasDecorators(other)) { - throw new ReferenceError( - "Decorators can't be placed on different accessors with for " + - "the same property (" + - element.key + - ").", - ); - } - other.decorators = element.decorators; - } - _coalesceGetterSetter(element, other); - } - } else { - newElements.push(element); - } - } - - return newElements; - } - - function _hasDecorators(element /*: ElementDescriptor */) /*: boolean */ { - return element.decorators && element.decorators.length; - } - - function _isDataDescriptor(desc /*: PropertyDescriptor */) /*: boolean */ { - return ( - desc !== undefined && - !(desc.value === undefined && desc.writable === undefined) - ); - } - - function _optionalCallableProperty /*::*/( - obj /*: T */, - name /*: $Keys */, - ) /*: ?Function */ { - var value = obj[name]; - if (value !== undefined && typeof value !== "function") { - throw new TypeError("Expected '" + name + "' to be a function"); - } - return value; - } - -`; - -helpers.classPrivateMethodGet = helper("7.1.6")` - export default function _classPrivateMethodGet(receiver, privateSet, fn) { - if (!privateSet.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return fn; - } -`; - -helpers.classPrivateMethodSet = helper("7.1.6")` - export default function _classPrivateMethodSet() { - throw new TypeError("attempted to reassign private method"); - } -`; - -helpers.wrapRegExp = helper("7.2.6")` - import wrapNativeSuper from "wrapNativeSuper"; - import getPrototypeOf from "getPrototypeOf"; - import possibleConstructorReturn from "possibleConstructorReturn"; - import inherits from "inherits"; - - export default function _wrapRegExp(re, groups) { - _wrapRegExp = function(re, groups) { - return new BabelRegExp(re, undefined, groups); - }; - - var _RegExp = wrapNativeSuper(RegExp); - var _super = RegExp.prototype; - var _groups = new WeakMap(); - - function BabelRegExp(re, flags, groups) { - var _this = _RegExp.call(this, re, flags); - // if the regex is recreated with 'g' flag - _groups.set(_this, groups || _groups.get(re)); - return _this; - } - inherits(BabelRegExp, _RegExp); - - BabelRegExp.prototype.exec = function(str) { - var result = _super.exec.call(this, str); - if (result) result.groups = buildGroups(result, this); - return result; - }; - BabelRegExp.prototype[Symbol.replace] = function(str, substitution) { - if (typeof substitution === "string") { - var groups = _groups.get(this); - return _super[Symbol.replace].call( - this, - str, - substitution.replace(/\\$<([^>]+)>/g, function(_, name) { - return "$" + groups[name]; - }) - ); - } else if (typeof substitution === "function") { - var _this = this; - return _super[Symbol.replace].call( - this, - str, - function() { - var args = []; - args.push.apply(args, arguments); - if (typeof args[args.length - 1] !== "object") { - // Modern engines already pass result.groups as the last arg. - args.push(buildGroups(args, _this)); - } - return substitution.apply(this, args); - } - ); - } else { - return _super[Symbol.replace].call(this, str, substitution); - } - } - - function buildGroups(result, re) { - // NOTE: This function should return undefined if there are no groups, - // but in that case Babel doesn't add the wrapper anyway. - - var g = _groups.get(re); - return Object.keys(g).reduce(function(groups, name) { - groups[name] = result[g[name]]; - return groups; - }, Object.create(null)); - } - - return _wrapRegExp.apply(this, arguments); - } -`; diff --git a/packages/babel-helpers/src/index.js b/packages/babel-helpers/src/index.js deleted file mode 100644 index 9dc87ce..0000000 --- a/packages/babel-helpers/src/index.js +++ /dev/null @@ -1,291 +0,0 @@ -import traverse from "@babel/traverse"; -import * as t from "@babel/types"; -import helpers from "./helpers"; - -function makePath(path) { - const parts = []; - - for (; path.parentPath; path = path.parentPath) { - parts.push(path.key); - if (path.inList) parts.push(path.listKey); - } - - return parts.reverse().join("."); -} - -/** - * Given a file AST for a given helper, get a bunch of metadata about it so that Babel can quickly render - * the helper is whatever context it is needed in. - */ -function getHelperMetadata(file) { - const globals = new Set(); - const localBindingNames = new Set(); - // Maps imported identifier -> helper name - const dependencies = new Map(); - - let exportName; - let exportPath; - const exportBindingAssignments = []; - const importPaths = []; - const importBindingsReferences = []; - - traverse(file, { - ImportDeclaration(child) { - const name = child.node.source.value; - if (!helpers[name]) { - throw child.buildCodeFrameError(`Unknown helper ${name}`); - } - if ( - child.get("specifiers").length !== 1 || - !child.get("specifiers.0").isImportDefaultSpecifier() - ) { - throw child.buildCodeFrameError( - "Helpers can only import a default value", - ); - } - const bindingIdentifier = child.node.specifiers[0].local; - dependencies.set(bindingIdentifier, name); - importPaths.push(makePath(child)); - }, - ExportDefaultDeclaration(child) { - const decl = child.get("declaration"); - - if (decl.isFunctionDeclaration()) { - if (!decl.node.id) { - throw decl.buildCodeFrameError( - "Helpers should give names to their exported func declaration", - ); - } - - exportName = decl.node.id.name; - } - exportPath = makePath(child); - }, - ExportAllDeclaration(child) { - throw child.buildCodeFrameError("Helpers can only export default"); - }, - ExportNamedDeclaration(child) { - throw child.buildCodeFrameError("Helpers can only export default"); - }, - Statement(child) { - if (child.isModuleDeclaration()) return; - - child.skip(); - }, - }); - - traverse(file, { - Program(path) { - const bindings = path.scope.getAllBindings(); - - Object.keys(bindings).forEach(name => { - if (name === exportName) return; - if (dependencies.has(bindings[name].identifier)) return; - - localBindingNames.add(name); - }); - }, - ReferencedIdentifier(child) { - const name = child.node.name; - const binding = child.scope.getBinding(name, /* noGlobal */ true); - if (!binding) { - globals.add(name); - } else if (dependencies.has(binding.identifier)) { - importBindingsReferences.push(makePath(child)); - } - }, - AssignmentExpression(child) { - const left = child.get("left"); - - if (!(exportName in left.getBindingIdentifiers())) return; - - if (!left.isIdentifier()) { - throw left.buildCodeFrameError( - "Only simple assignments to exports are allowed in helpers", - ); - } - - const binding = child.scope.getBinding(exportName); - - if (binding && binding.scope.path.isProgram()) { - exportBindingAssignments.push(makePath(child)); - } - }, - }); - - if (!exportPath) throw new Error("Helpers must default-export something."); - - // Process these in reverse so that mutating the references does not invalidate any later paths in - // the list. - exportBindingAssignments.reverse(); - - return { - globals: Array.from(globals), - localBindingNames: Array.from(localBindingNames), - dependencies, - exportBindingAssignments, - exportPath, - exportName, - importBindingsReferences, - importPaths, - }; -} - -/** - * Given a helper AST and information about how it will be used, update the AST to match the usage. - */ -function permuteHelperAST(file, metadata, id, localBindings, getDependency) { - if (localBindings && !id) { - throw new Error("Unexpected local bindings for module-based helpers."); - } - - if (!id) return; - - const { - localBindingNames, - dependencies, - exportBindingAssignments, - exportPath, - exportName, - importBindingsReferences, - importPaths, - } = metadata; - - const dependenciesRefs = {}; - dependencies.forEach((name, id) => { - dependenciesRefs[id.name] = - (typeof getDependency === "function" && getDependency(name)) || id; - }); - - const toRename = {}; - const bindings = new Set(localBindings || []); - localBindingNames.forEach(name => { - let newName = name; - while (bindings.has(newName)) newName = "_" + newName; - - if (newName !== name) toRename[name] = newName; - }); - - if (id.type === "Identifier" && exportName !== id.name) { - toRename[exportName] = id.name; - } - - traverse(file, { - Program(path) { - // We need to compute these in advance because removing nodes would - // invalidate the paths. - const exp = path.get(exportPath); - const imps = importPaths.map(p => path.get(p)); - const impsBindingRefs = importBindingsReferences.map(p => path.get(p)); - - const decl = exp.get("declaration"); - if (id.type === "Identifier") { - if (decl.isFunctionDeclaration()) { - exp.replaceWith(decl); - } else { - exp.replaceWith( - t.variableDeclaration("var", [t.variableDeclarator(id, decl.node)]), - ); - } - } else if (id.type === "MemberExpression") { - if (decl.isFunctionDeclaration()) { - exportBindingAssignments.forEach(assignPath => { - const assign = path.get(assignPath); - assign.replaceWith(t.assignmentExpression("=", id, assign.node)); - }); - exp.replaceWith(decl); - path.pushContainer( - "body", - t.expressionStatement( - t.assignmentExpression("=", id, t.identifier(exportName)), - ), - ); - } else { - exp.replaceWith( - t.expressionStatement(t.assignmentExpression("=", id, decl.node)), - ); - } - } else { - throw new Error("Unexpected helper format."); - } - - Object.keys(toRename).forEach(name => { - path.scope.rename(name, toRename[name]); - }); - - for (const path of imps) path.remove(); - for (const path of impsBindingRefs) { - const node = t.cloneNode(dependenciesRefs[path.node.name]); - path.replaceWith(node); - } - - // We only use "traverse" for all the handy scoping helpers, so we can stop immediately without - // actually doing the traversal. - path.stop(); - }, - }); -} - -const helperData = Object.create(null); -function loadHelper(name) { - if (!helperData[name]) { - const helper = helpers[name]; - if (!helper) { - throw Object.assign(new ReferenceError(`Unknown helper ${name}`), { - code: "BABEL_HELPER_UNKNOWN", - helper: name, - }); - } - - const fn = () => { - return t.file(helper.ast()); - }; - - const metadata = getHelperMetadata(fn()); - - helperData[name] = { - build(getDependency, id, localBindings) { - const file = fn(); - permuteHelperAST(file, metadata, id, localBindings, getDependency); - - return { - nodes: file.program.body, - globals: metadata.globals, - }; - }, - minVersion() { - return helper.minVersion; - }, - dependencies: metadata.dependencies, - }; - } - - return helperData[name]; -} - -export function get( - name, - getDependency?: string => ?t.Expression, - id?, - localBindings?: string[], -) { - return loadHelper(name).build(getDependency, id, localBindings); -} - -export function minVersion(name: string) { - return loadHelper(name).minVersion(); -} - -export function getDependencies(name: string): $ReadOnlyArray { - return Array.from(loadHelper(name).dependencies.values()); -} - -export function ensure(name: string) { - loadHelper(name); -} - -export const list = Object.keys(helpers) - .map(name => name.replace(/^_/, "")) - .filter(name => name !== "__esModule"); - -export default get; diff --git a/packages/babel-helpers/test/fixtures/dependencies/basic/input.js b/packages/babel-helpers/test/fixtures/dependencies/basic/input.js deleted file mode 100644 index 087837e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/basic/input.js +++ /dev/null @@ -1 +0,0 @@ -REPLACE_ME; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/basic/options.json b/packages/babel-helpers/test/fixtures/dependencies/basic/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/basic/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/basic/output.js b/packages/babel-helpers/test/fixtures/dependencies/basic/output.js deleted file mode 100644 index 7daadf6..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/basic/output.js +++ /dev/null @@ -1,5 +0,0 @@ -function _$_basic_main() { return _$_basic_dependency(); } - -function _$_basic_dependency() {} - -_$_basic_main; diff --git a/packages/babel-helpers/test/fixtures/dependencies/basic/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/basic/plugin.js deleted file mode 100644 index bdb4974..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/basic/plugin.js +++ /dev/null @@ -1,25 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependency = defineHelper(__dirname, "dependency", ` - export default function fn() {} -`); - -const main = defineHelper(__dirname, "main", ` - import dep from "${dependency}"; - - export default function helper() { - return dep(); - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/deep/input.js b/packages/babel-helpers/test/fixtures/dependencies/deep/input.js deleted file mode 100644 index 087837e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/deep/input.js +++ /dev/null @@ -1 +0,0 @@ -REPLACE_ME; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/deep/options.json b/packages/babel-helpers/test/fixtures/dependencies/deep/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/deep/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/deep/output.js b/packages/babel-helpers/test/fixtures/dependencies/deep/output.js deleted file mode 100644 index b5653a3..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/deep/output.js +++ /dev/null @@ -1,7 +0,0 @@ -function _$_deep_main() { return _$_deep_dependency(); } - -function _$_deep_dependency() { return _$_deep_dependencyDeep; } - -function _$_deep_dependencyDeep() {} - -_$_deep_main; diff --git a/packages/babel-helpers/test/fixtures/dependencies/deep/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/deep/plugin.js deleted file mode 100644 index d377b1e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/deep/plugin.js +++ /dev/null @@ -1,30 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependencyDeep = defineHelper(__dirname, "dependencyDeep", ` - export default function fn() {} -`) - -const dependency = defineHelper(__dirname, "dependency", ` - import f from "${dependencyDeep}"; - export default function fn() { return f; } -`); - -const main = defineHelper(__dirname, "main", ` - import dep from "${dependency}"; - - export default function helper() { - return dep(); - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/missing/input.js b/packages/babel-helpers/test/fixtures/dependencies/missing/input.js deleted file mode 100644 index 087837e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/missing/input.js +++ /dev/null @@ -1 +0,0 @@ -REPLACE_ME; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/missing/options.json b/packages/babel-helpers/test/fixtures/dependencies/missing/options.json deleted file mode 100644 index b2b3715..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/missing/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "plugins": ["./plugin"], - "throws": " " -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/missing/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/missing/plugin.js deleted file mode 100644 index e0bec01..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/missing/plugin.js +++ /dev/null @@ -1,21 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const main = defineHelper(__dirname, "main", ` - import dep from "(!!!)%-..a,4892 missing"; - - export default function helper() { - return dep(); - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/multiple/input.js b/packages/babel-helpers/test/fixtures/dependencies/multiple/input.js deleted file mode 100644 index 087837e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/multiple/input.js +++ /dev/null @@ -1 +0,0 @@ -REPLACE_ME; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/multiple/options.json b/packages/babel-helpers/test/fixtures/dependencies/multiple/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/multiple/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/multiple/output.js b/packages/babel-helpers/test/fixtures/dependencies/multiple/output.js deleted file mode 100644 index c382e48..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/multiple/output.js +++ /dev/null @@ -1,7 +0,0 @@ -function _$_multiple_main() { return _$_multiple_dependency() + _$_multiple_dependency2(); } - -function _$_multiple_dependency2() { 1; } - -function _$_multiple_dependency() { 0; } - -_$_multiple_main; diff --git a/packages/babel-helpers/test/fixtures/dependencies/multiple/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/multiple/plugin.js deleted file mode 100644 index b74542b..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/multiple/plugin.js +++ /dev/null @@ -1,30 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependency1 = defineHelper(__dirname, "dependency1", ` - export default function fn() { 0; } -`); - -const dependency2 = defineHelper(__dirname, "dependency2", ` - export default function fn() { 1; } -`); - -const main = defineHelper(__dirname, "main", ` - import dep1 from "${dependency1}"; - import dep2 from "${dependency2}"; - - export default function helper() { - return dep1() + dep2(); - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/input.js b/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/input.js deleted file mode 100644 index 087837e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/input.js +++ /dev/null @@ -1 +0,0 @@ -REPLACE_ME; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/options.json b/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/output.js b/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/output.js deleted file mode 100644 index 60b76e6..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/output.js +++ /dev/null @@ -1,9 +0,0 @@ -let _foo = "main"; - -function _$_renameBindingEqual_main() { return _$_renameBindingEqual_dependency() + _foo; } - -let foo = "dependency"; - -function _$_renameBindingEqual_dependency() { return foo; } - -_$_renameBindingEqual_main; diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/plugin.js deleted file mode 100644 index 0a48f05..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-binding-equal/plugin.js +++ /dev/null @@ -1,28 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependency = defineHelper(__dirname, "dependency", ` - let foo = "dependency"; - export default function fn() { return foo } -`); - -const main = defineHelper(__dirname, "main", ` - import dep from "${dependency}"; - - let foo = "main"; - - export default function helper() { - return dep() + foo; - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/input.js b/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/input.js deleted file mode 100644 index 0efdb14..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/input.js +++ /dev/null @@ -1,3 +0,0 @@ -REPLACE_ME; - -let Promise = "I will be a good guy!"; diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/options.json b/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/output.js b/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/output.js deleted file mode 100644 index dfcc10c..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/output.js +++ /dev/null @@ -1,6 +0,0 @@ -function _$_renameDeepGlobal_main() { return _$_renameDeepGlobal_dependency() || Promise; } - -function _$_renameDeepGlobal_dependency() { return Promise; } - -_$_renameDeepGlobal_main; -let _Promise = "I will be a good guy!"; diff --git a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/plugin.js deleted file mode 100644 index adfe64c..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/rename-deep-global/plugin.js +++ /dev/null @@ -1,27 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependency = defineHelper(__dirname, "dependency", ` - export default function fn() { - return Promise; - } -`); - -const main = defineHelper(__dirname, "main", ` - import dep from "${dependency}"; - - export default function helper() { - return dep() || Promise; - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/input.js b/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/input.js deleted file mode 100644 index c26cd9e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/input.js +++ /dev/null @@ -1,2 +0,0 @@ -REPLACE_ME_1; -REPLACE_ME_2; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/options.json b/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/output.js b/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/output.js deleted file mode 100644 index c7de896..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/output.js +++ /dev/null @@ -1,6 +0,0 @@ -function _$_reuseDependency_main() { return _$_reuseDependency_dependency(); } - -function _$_reuseDependency_dependency() { 0; } - -_$_reuseDependency_main; -_$_reuseDependency_dependency; diff --git a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/plugin.js deleted file mode 100644 index c8a843c..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/reuse-dependency/plugin.js +++ /dev/null @@ -1,29 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependency = defineHelper(__dirname, "dependency", ` - export default function fn() { 0; } -`); - -const main = defineHelper(__dirname, "main", ` - import dep from "${dependency}"; - - export default function helper() { - return dep(); - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name === "REPLACE_ME_1") { - const mainHelper = this.addHelper(main); - path.replaceWith(mainHelper); - } else if (path.node.name === "REPLACE_ME_2") { - const dependencyHelper = this.addHelper(dependency); - path.replaceWith(dependencyHelper); - } - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/input.js b/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/input.js deleted file mode 100644 index 087837e..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/input.js +++ /dev/null @@ -1 +0,0 @@ -REPLACE_ME; \ No newline at end of file diff --git a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/options.json b/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/options.json deleted file mode 100644 index 14af0e5..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "plugins": ["./plugin"] -} diff --git a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/output.js b/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/output.js deleted file mode 100644 index db7d1ec..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/output.js +++ /dev/null @@ -1,5 +0,0 @@ -function _$_variableSameNameDependency_main() { let x = _$_variableSameNameDependency_dependency; return function (dep) { return x() + dep; }; } - -function _$_variableSameNameDependency_dependency() {} - -_$_variableSameNameDependency_main; diff --git a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/plugin.js b/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/plugin.js deleted file mode 100644 index ec87ede..0000000 --- a/packages/babel-helpers/test/fixtures/dependencies/variable-same-name-dependency/plugin.js +++ /dev/null @@ -1,28 +0,0 @@ -const defineHelper = require("../../../helpers/define-helper").default; - -const dependency = defineHelper(__dirname, "dependency", ` - export default function fn() {} -`); - -const main = defineHelper(__dirname, "main", ` - import dep from "${dependency}"; - - export default function helper() { - let x = dep; - return function (dep) { - return x() + dep; - } - } -`); - -module.exports = function() { - return { - visitor: { - Identifier(path) { - if (path.node.name !== "REPLACE_ME") return; - const helper = this.addHelper(main); - path.replaceWith(helper); - }, - }, - }; -}; diff --git a/packages/babel-helpers/test/helpers/define-helper.js b/packages/babel-helpers/test/helpers/define-helper.js deleted file mode 100644 index 712eae4..0000000 --- a/packages/babel-helpers/test/helpers/define-helper.js +++ /dev/null @@ -1,26 +0,0 @@ -import path from "path"; -import template from "@babel/template"; -import helpers from "../../lib/helpers"; - -function getHelperId(dir, name) { - const testName = path.basename(dir); - return `_$_${testName}_${name}`; -} - -export default function defineHelper( - dir: string, - name: string, - code: string, -): string { - const id = getHelperId(dir, name); - if (id in helpers) { - throw new Error(`The ${id} helper is already defined.`); - } - Object.defineProperty(helpers, id, { - value: { - minVersion: "7.0.0-beta.0", - ast: template.program(code), - }, - }); - return id; -} diff --git a/packages/babel-helpers/test/index.js b/packages/babel-helpers/test/index.js deleted file mode 100644 index 1b534b8..0000000 --- a/packages/babel-helpers/test/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import runner from "@babel/helper-plugin-test-runner"; - -runner(__dirname); diff --git a/packages/csx/cfg/.babelrc b/packages/csx/cfg/.babelrc new file mode 100644 index 0000000..008ab1c --- /dev/null +++ b/packages/csx/cfg/.babelrc @@ -0,0 +1,19 @@ +{ + "sourceMaps": "both", + "presets": [ + ["@babel/preset-env", { + "targets": { + "node": "current" + } + }] + ], + "plugins": [ + [ "@babel/plugin-proposal-decorators", { "legacy": true }], + [ "@babel/plugin-proposal-class-properties", { "loose": true } ], + [ "@babel/plugin-proposal-private-methods", {"loose": true } ], + [ "@babel/plugin-proposal-optional-chaining" ], + [ "@babel/plugin-proposal-nullish-coalescing-operator" ], + [ "@babel/plugin-proposal-export-namespace-from" ], + [ "@babel/plugin-proposal-export-default-from" ] + ] +} \ No newline at end of file diff --git a/packages/csx/cfg/build.js b/packages/csx/cfg/build.js new file mode 100644 index 0000000..0d0cd1c --- /dev/null +++ b/packages/csx/cfg/build.js @@ -0,0 +1,54 @@ +// Build configuration +import { CsxConfig, runArgs } from "./config"; +import { logBundle } from './log-bundle'; + +// Rollup and plugins +import * as rollup from 'rollup'; + +/** + * Build CSX + * @param {CsxConfig} cfg - Configuration on how to build + * @param {boolean} clean - Clean the dist and lib-dirs first + * @returns {Promise} + */ +async function build(cfg, clean){ + let {src, dist, lib, root, sourceGlob} = cfg; + root = root.from('');// This is a bug in @cerxes/host! + + // Clean host + if(clean!==false){ + await Promise.all([ + dist.remove('', {recursive: true}), + lib.remove('', {recursive: true}), + ]); + console.log("Output-dirs cleaned!"); + } + + let appStart = new Date(); + let sources = await src.glob(sourceGlob); + let targets = cfg.configureTargets(sources); + + let builds = targets.map(async target=>{ + return await Promise.all( + target.sources.map(async source=>{ + let bundle = await rollup.rollup(source.config); + let written = await bundle.write(source.config.output); + let stats = await root.stat(source.config.output.file); + logBundle(root.relative(source.config.output.file), (new Date()).getTime()-appStart.getTime(), stats); + return {bundle, written}; + }) + ); + }) + + let results = await Promise.all(builds); + + console.log("CSX built"); + return results +} + +// Execute self if script is run as entry (e.g. "node build.js") +if(require.main === module) { + // Run ! + build(new CsxConfig()); +} + diff --git a/packages/csx/cfg/config.js b/packages/csx/cfg/config.js new file mode 100644 index 0000000..0666fe9 --- /dev/null +++ b/packages/csx/cfg/config.js @@ -0,0 +1,170 @@ +// @cerxes +import { host, Host } from "@cerxes/host"; + +// Rollup and plugins +import babel from 'rollup-plugin-babel'; +import resolve from 'rollup-plugin-node-resolve'; +import { terser } from 'rollup-plugin-terser'; + +// Proc args (this is weird to be here, but it is the same for build/watch, and should be kept in sync as much as possible +import process from "process"; +import * as rollup from "rollup"; +import { logBundle } from "./log-bundle"; +let args = process.argv.slice(2); +const runArgSeperator = args.indexOf('--'); +export let buildTargets = ['lib-es', 'lib-cjs', 'dist-es', 'dist-es-min', 'dist-cjs', 'dist-cjs-min']; +if (runArgSeperator >= 0) { + buildTargets = args.slice(runArgSeperator + 1); + args = args.slice(0, runArgSeperator); +} + +export class CsxConfig { + constructor({ + src, + dist, + root, + opts + } = {}) { + const { watch } = opts || {}; + + this.root = root ? host.from(root) : host.from('.');// (This host.from('.') would not've been necessary if @cerxes/host did not have a bug on this one) + this.src = this.root.from(src || 'src'); + this.dist = this.root.from(dist || 'dist'); + this.lib = this.root.from(dist || 'lib'); + } + + /** @type {Host} */ + src; + /** + * Directory to use for dist output (single bundle) + * @type {Host} */ + dist; + /** + * Directory to use for library output (transpiled, file by file) + * @type {Host} */ + lib; + + /** @type {string} */ + sourceGlob = "**/*.@(*.js|js)"; + + /** + * Get rollup-config to compile a source file + * @param {string} file + * @param {string} out + * @param {object} [opts] + * @param {boolean} [opts.es] - Export in es6 format (or cjs when false) + * @param {boolean} [opts.single] - Compile single file (e.g. don't follow imports) + * @param {boolean} [opts.sourcemap] - Include sourcemaps + * @param {boolean} [opts.minified] - Minify the output (e.g. Terser-plugin) + * @returns {{output: {file: string, sourcemap: boolean, plugins: Array, format: string}, input: string, plugins: ...*[]}} + */ + srcCfg = (file, out = undefined, opts) => { + let inputFile = this.src.resolve(file); + let outputFile = this.dist.resolve(out || file); + return ({ + // Compile the actual app + input: inputFile, + output: { + file: outputFile, + format: opts?.es? 'es' : 'cjs', // NodeJS + sourcemap: opts?.sourcemap ?? true, + }, + external: (id, parentId, isResolved) => { + if (!id || id[0] === '\0') return false;// Special cases + else { + let split = (id || "").split('/'); + let first = id[0] === '@' ? split.slice(0, 2).join('/') : split[0]; + let absId = first === '..' || first === '.' ? this.src.resolve(parentId, id) : id; + if (absId) { + if(absId.indexOf(this.src.workingDirectory) >= 0 && opts?.single) return true; // Own source-file => external when single mode enabled + } + // Any other unresolved identifier(which should be resolved further) + return false; // The light, inline them + } + }, + treeshake: !opts?.single, + plugins: [ + // babel + babel({ + babelrc: true, + }), + // NodeJS-style resolving (Its a shame this is not a Rollup-default, we need this for index.js files to work!) + resolve({ + extensions: ['.mjs', '.js', '.jsx', '.json'], + preferBuiltins: true, mainFields: ['browser'] + }), + opts?.minified ? terser() : null + ].filter(t=>t) + }) + }; + + /** + * @param {string} sources + * @returns {TargetConfig[]} + */ + configureTargets = (sources)=>{ + return buildTargets.map(target=>{ + let {lib,dist,root} = this; + let [type, format, minified] = target.split("-"); + let inputs = type==='lib'? sources : ['index.js']; + let srcOpts = { + es: format==='es', + single: type==='lib', + sourcemap: true,// Just always there for now + minified: !!minified + }; + let outDir = type==='lib'? lib : dist; + + return new TargetConfig({ + target, + sources: inputs.map(input=>{ + let outName = input.replace( + /\.js$/, + `.${[ + type==='dist'? srcOpts.es?'es':'cjs' : null, + srcOpts.minified?'min':null, + 'js' + ].filter(x=>x).join('.')}`); + if(type==='lib') outName = [srcOpts.es?'es':'cjs',outName].join('/'); + + return new SourceConfig({ + source: input, + config: this.srcCfg(input, outDir.resolve(outName), srcOpts) + }); + }) + }); + }); + } +} + +/** + * Configure a source-file for build (single target) + */ +export class SourceConfig{ + /** @param {SourceConfig} c */ + constructor(c){ + this.source = c.source; + this.config = c.config; + } + /** @type {string} */ + source; + + /** @type {RollupOptions} */ + config; +} + +/** + * Represent the configuration for a specific build target (e.g. lib-es, dist-cjs, ...) + */ +export class TargetConfig{ + /** @param {TargetConfig} c */ + constructor(c){ + this.target = c.target; + this.sources = c.sources; + } + /** @type {string} */ + target; + + /** @type {SourceConfig[]} */ + sources; +} diff --git a/packages/csx/cfg/log-bundle.js b/packages/csx/cfg/log-bundle.js new file mode 100644 index 0000000..15a896d --- /dev/null +++ b/packages/csx/cfg/log-bundle.js @@ -0,0 +1,25 @@ +export function logBundle(file, duration, stats){ + let paddedFileName = file; + while(paddedFileName.length<40){ paddedFileName += ' ';} + + let paddedDuration = (Math.round(duration/10)/100).toFixed(2)+"s"; + let durationAnsi = (duration/1000)<10? '' // GREEN is <10sec + : (duration/1000)<60? "" // YELLOW if >10sec + : ""; // RED if >60sec + while(paddedDuration.length<8){ paddedDuration = ' '+paddedDuration;} + + let fileSize = stats.size; + let paddedSize = fileSize/1024; + let unit = 'kb'; + if(paddedSize>1024){ + paddedSize /= 1024; + unit = 'mb'; + } + paddedSize = (Math.round(paddedSize*10)/10).toFixed(1)+unit; + while(paddedSize.length<8){ paddedSize = ' ' + paddedSize;} + let sizeAnsi = (fileSize/1024)<50? '' // GREEN is <50kb + : (fileSize/1024)<500? "" // YELLOW if >50kb + : ""; // RED if >500kb + + console.log([paddedFileName, `${durationAnsi}${paddedDuration}`, `${sizeAnsi}${paddedSize}`].join('\t')) +} \ No newline at end of file diff --git a/packages/csx/cfg/register.js b/packages/csx/cfg/register.js new file mode 100644 index 0000000..7e4d55d --- /dev/null +++ b/packages/csx/cfg/register.js @@ -0,0 +1,4 @@ +// Configure babel-register (as this currently contains no special configuration, this could be removed, but it is here for extendability later on) +require('@babel/register')({ + babelrc: true +}); \ No newline at end of file diff --git a/packages/csx/cfg/watch.js b/packages/csx/cfg/watch.js new file mode 100644 index 0000000..01b66b1 --- /dev/null +++ b/packages/csx/cfg/watch.js @@ -0,0 +1,93 @@ +// TODO this is yet to be updated! + +// Observables +import {Observable} from "zen-observable/lib/Observable"; +import {merge, combineLatest, zip} from "zen-observable/lib/extras"; + +// Rollup and plugins +import * as rollup from 'rollup'; + +// Build configuration +import { CsxConfig, runArgs } from "./config"; +import { logBundle } from "./log-bundle"; + +/** + * Watch the CSX-sourcecode and rebuild as needed + * + * @param {CsxConfig} cfg - Configuration on how to build + * @param {boolean} clean - Clean the dist-dir first + * @returns {Promise} + */ +async function watch(cfg, clean) { + + let { src, dist, lib, sourceGlob, root } = cfg; + + // Clean host + if (clean !== false) { + await Promise.all([ + dist.remove('', {recursive: true}), + lib.remove('', {recursive: true}), + ]); + console.log("Output-dirs cleaned!"); + } + + let discovered = false; + let appObservable = src.watch().glob(sourceGlob).map((event)=>{ + let updateStart = new Date(); + let deletedFiles = event.changes.filter(t=>t.event === 'removed').map(t=>t.file); + let modifiedFiles = event.changes.filter(t=>t.event !== 'removed').map(t=>t.file); + + // somehow this runs twice now, TODO FIX PROPERLY! + if(event.type==='discovery') { + if (discovered) return; + else discovered = true; + } + + let targets = cfg.configureTargets(event.files); + + let builds = targets.map(async target=>{ + return {target, sources: await Promise.all( + target.sources.map(async source=>{ + let fileStart = new Date(); + let bundle = await rollup.rollup(source.config); + let written = await bundle.write(source.config.output); + let stats = await root.stat(source.config.output.file); + logBundle(root.relative(source.config.output.file), (new Date()).getTime()-fileStart.getTime(), stats); + return {bundle, written, source, stats}; + }) + )}; + }) + + return (async()=>{ + let results = await Promise.all(builds); + return { + files: event.files, + duration: ((new Date()).getTime()-updateStart.getTime()), + initialBuild: event.type==='discovery', + results: results + }; + })(); + }); + + appObservable.subscribe( async (buildOp)=>{ + let {results, files, duration, initialBuild} = await buildOp; + console.log(`CSX ${initialBuild?'build':'updated'} in ${duration/1000}s: ${(new Date()).toUTCString()}`); + + }); + return appObservable; +} + + +// Execute self if script is run as entry (e.g. "node watch.js") +if (require.main === module) { + // Run ! + watch(new CsxConfig({ + opts: { watch: true } + })).then( + (obs) => { + obs.subscribe(() => { + //console.log(`Server updated: ${(new Date()).toUTCString()}`); + }) + } + ); +} diff --git a/packages/csx/package.json b/packages/csx/package.json index e3efee9..8d011d0 100644 --- a/packages/csx/package.json +++ b/packages/csx/package.json @@ -1,6 +1,6 @@ { "name": "@cerxes/csx", - "version": "0.0.10", + "version": "0.0.11", "author": "Miel Truyen ", "description": "CSX is a minimalistic UI-framework inspired by React+JSX for usage with WebComponents.", "repository": { @@ -26,17 +26,13 @@ "rollup-plugin-terser": "5.1.2", "rollup-plugin-json": "4.0.0", "acorn-private-class-elements": "0.1.2", - "npm-run-all": "latest" + "@cerxes/host": "latest" }, "scripts": { - "build": "npm-run-all -p build-cjs build-es6", - "watch": "npm-run-all -p watch-cjs watch-es6", - "build-cjs": "rollup -c", - "watch-cjs": "rollup -c -w", - "build-es6": "npx babel ./src --out-dir=lib", - "watch-es6": "npx babel ./src --out-dir=lib -w", + "build": "node -r ./cfg/register ./cfg/build.js", + "watch": "node -r ./cfg/register ./cfg/watch.js", "npm-publish": "npm run build && npm publish --registry https://npm.cerxes.net --tag latest" }, - "module": "./lib/index.js", - "main": "./dist/index.js" + "module": "./lib/es/index.js", + "main": "./dist/index.cjs.js" } diff --git a/packages/csx/rollup.config.js b/packages/csx/rollup.config.js deleted file mode 100644 index b1f5192..0000000 --- a/packages/csx/rollup.config.js +++ /dev/null @@ -1,27 +0,0 @@ -import babel from 'rollup-plugin-babel'; -import resolve from 'rollup-plugin-node-resolve'; -import commonjs from 'rollup-plugin-commonjs'; -import { terser } from 'rollup-plugin-terser'; -import json from "rollup-plugin-json"; -// `npm run build` -> `production` is true -// `npm run dev` -> `production` is false -const production = !process.env.ROLLUP_WATCH; - -export default { - input: 'src/index.js', - output: { - file: 'dist/index.js', - format: 'cjs', // immediately-invoked function expression — suitable for