diff --git a/.changeset/early-pants-begin.md b/.changeset/early-pants-begin.md new file mode 100644 index 00000000..864963a8 --- /dev/null +++ b/.changeset/early-pants-begin.md @@ -0,0 +1,23 @@ +--- +'@agile-ts/api': patch +'@agile-ts/core': patch +'cra-template-agile': patch +'cra-template-agile-typescript': patch +'@agile-ts/event': patch +'@agile-ts/logger': patch +'@agile-ts/multieditor': patch +'@agile-ts/proxytree': patch +'@agile-ts/react': patch +'@agile-ts/utils': patch +'@agile-ts/vue': patch +--- + +#### :nail_care: Polish +* `api`, `core`, `cra-template-agile-typescript`, `cra-template-agile`, `event`, `logger`, `multieditor`, `proxytree`, `react`, `utils`, `vue` + * [#194](https://github.com/agile-ts/agile/pull/194) Commonjs issue ([@bennodev19](https://github.com/bennodev19)) +* `core` + * [#195](https://github.com/agile-ts/agile/pull/195) Removed `internal.ts` and resolved cycle dependencies ([@bennodev19](https://github.com/bennodev19)) + +#### Committers: 1 +- BennoDev ([@bennodev19](https://github.com/bennodev19)) + diff --git a/.github/ISSUE_TEMPLATE/SUPPORT.md b/.github/ISSUE_TEMPLATE/SUPPORT.md new file mode 100644 index 00000000..4d3f0168 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/SUPPORT.md @@ -0,0 +1,11 @@ +--- +name: 🆘 Support, Help, and Advice +about: 👉🏽 Need help or tech support? Please don't open an issue! Head to https://github.com/agile-ts/agile/discussions or https://stackoverflow.com/questions/tagged/agile-ts. +--- + +Hey there! If you need help or tech support then this is not the place to ask. +Please head to the [AgileTs Discord](https://discord.com/T9GzreAwPH) instead +or post a question to [Stackoverflow](https://stackoverflow.com/questions/tagged/agile-ts). + +If you arrived here because you think AgileTs's documentation is unclear, +insufficient or wrong, please consider creating an issue for the documentation [here](https://github.com/agile-ts/documentation) instead. diff --git a/.prettierrc b/.prettierrc index fbcf60f8..ec96320d 100644 --- a/.prettierrc +++ b/.prettierrc @@ -10,4 +10,4 @@ "trailingComma": "es5", "endOfLine": "lf", "semi": true -} \ No newline at end of file +} diff --git a/benchmark/runtime/benchmarkTypes.ts b/benchmark/runtime/benchmarkTypes.ts index 43783052..a6ede96b 100644 --- a/benchmark/runtime/benchmarkTypes.ts +++ b/benchmark/runtime/benchmarkTypes.ts @@ -146,5 +146,4 @@ export const startBundleBench = async (entry: string, isDev: boolean) => { ); console.log(metafile); - // TODO analyze metafile }; diff --git a/examples/nextjs/develop/clock/pages/ssg.tsx b/examples/nextjs/develop/clock/pages/ssg.tsx index 84dbff7f..9d8d644c 100644 --- a/examples/nextjs/develop/clock/pages/ssg.tsx +++ b/examples/nextjs/develop/clock/pages/ssg.tsx @@ -8,7 +8,7 @@ export default function SSG() { } // If you build and start the app, the date returned here will have the same -// value for all requests, as this method gets executed at build time. +// value for all requests, as this method gets executed at build time. (see browser network tab) export function getStaticProps() { const initialCore = { light: LIGHT.value, diff --git a/examples/nextjs/develop/clock/pages/ssr.tsx b/examples/nextjs/develop/clock/pages/ssr.tsx index 20eef915..45b8b878 100644 --- a/examples/nextjs/develop/clock/pages/ssr.tsx +++ b/examples/nextjs/develop/clock/pages/ssr.tsx @@ -9,7 +9,7 @@ export default function SSR() { // The date returned here will be different for every request that hits the page, // that is because the page becomes a serverless function instead of being statically -// exported when you use `getServerSideProps` or `getInitialProps` +// exported when you use `getServerSideProps` or `getInitialProps`. (see browser network tab) export function getServerSideProps() { tick(Date.now(), false); diff --git a/examples/plainjs/develop/tree-shaking/package.json b/examples/plainjs/develop/tree-shaking/package.json index 2bd5d547..d218ae65 100644 --- a/examples/plainjs/develop/tree-shaking/package.json +++ b/examples/plainjs/develop/tree-shaking/package.json @@ -5,7 +5,7 @@ "main": "src/index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "build": "webpack", + "build": "shx rm -rf dist && webpack", "install:dev:agile": "yalc add @agile-ts/core @agile-ts/logger & yarn install", "install:prod:agile": "yarn add @agile-ts/core @agile-ts/logger & yarn install" }, @@ -17,6 +17,7 @@ }, "dependencies": { "@agile-ts/core": "file:.yalc/@agile-ts/core", - "@agile-ts/logger": "file:.yalc/@agile-ts/logger" + "@agile-ts/logger": "file:.yalc/@agile-ts/logger", + "@agile-ts/react": "file:.yalc/@agile-ts/react" } } diff --git a/examples/react-native/develop/AwesomeTSProject/core/index.ts b/examples/react-native/develop/AwesomeTSProject/core/index.ts index 3d4dc07f..108eff9f 100644 --- a/examples/react-native/develop/AwesomeTSProject/core/index.ts +++ b/examples/react-native/develop/AwesomeTSProject/core/index.ts @@ -1,10 +1,9 @@ import { createState, createComputed, createCollection } from '@agile-ts/core'; -import { createEvent, Event } from '@agile-ts/event'; +import { createEvent } from '@agile-ts/event'; import { Alert } from 'react-native'; export const MY_STATE = createState('MyState', { key: 'my-state' }); //.persist(); export const MY_STATE_2 = createState('MyState2'); //.persist("my-state2"); -export const MY_STATE_3 = createState(1); //.persist("my-state2"); MY_STATE.watch('test', (value: any) => { console.log('Watch ' + value); @@ -37,8 +36,6 @@ MY_COLLECTION.getGroup('myGroup')?.persist({ followCollectionPersistKeyPattern: true, }); -console.log('Initial: myCollection ', MY_COLLECTION); - export const MY_EVENT = createEvent<{ name: string }>(); MY_EVENT.on('Test', (payload) => { diff --git a/examples/react-native/develop/AwesomeTSProject/package.json b/examples/react-native/develop/AwesomeTSProject/package.json index 70fffb4f..60f69d7e 100644 --- a/examples/react-native/develop/AwesomeTSProject/package.json +++ b/examples/react-native/develop/AwesomeTSProject/package.json @@ -8,7 +8,8 @@ "start": "react-native start", "test": "jest", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", - "install:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/api & yarn install" + "install:dev:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/api @agile-ts/event & yarn install", + "install:prod:agile": "yarn add @agile-ts/core @agile-ts/react @agile-ts/api @agile-ts/event & yarn install" }, "dependencies": { "@agile-ts/api": "file:.yalc/@agile-ts/api", diff --git a/examples/react-native/develop/AwesomeTSProject/yarn.lock b/examples/react-native/develop/AwesomeTSProject/yarn.lock index 474e952c..19c6d1e6 100644 --- a/examples/react-native/develop/AwesomeTSProject/yarn.lock +++ b/examples/react-native/develop/AwesomeTSProject/yarn.lock @@ -3,13 +3,25 @@ "@agile-ts/api@file:.yalc/@agile-ts/api": - version "0.0.5" + version "0.0.22" + dependencies: + "@agile-ts/utils" "^0.0.8" "@agile-ts/core@file:.yalc/@agile-ts/core": - version "0.0.5" + version "0.2.3" + dependencies: + "@agile-ts/utils" "^0.0.8" + +"@agile-ts/event@file:.yalc/@agile-ts/event": + version "0.0.11" "@agile-ts/react@file:.yalc/@agile-ts/react": - version "0.0.5" + version "0.2.0" + +"@agile-ts/utils@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.8.tgz#ab9e1eeaddf282340936bddeb74421a2f77de804" + integrity sha512-ex19gPIS5imgV+rzs5HE2CNAIkQ162hPWH5u3HKNZnHiVU6FX62sikH5tG2oQocbDb7FkeB16D7v9ihQeuKYug== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": version "7.10.4" diff --git a/examples/react/develop/class-component-ts/package.json b/examples/react/develop/class-component-ts/package.json index 9f57f335..db4ba04e 100644 --- a/examples/react/develop/class-component-ts/package.json +++ b/examples/react/develop/class-component-ts/package.json @@ -29,7 +29,8 @@ "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", - "install:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/api @agile-ts/multieditor @agile-ts/event & yarn install" + "install:dev:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/api @agile-ts/multieditor @agile-ts/event & yarn install", + "install:prod:agile": "yarn add @agile-ts/core @agile-ts/react @agile-ts/api @agile-ts/multieditor @agile-ts/event & yarn install" }, "eslintConfig": { "extends": "react-app" diff --git a/examples/react/develop/class-component-ts/src/core/index.ts b/examples/react/develop/class-component-ts/src/core/index.ts index 81b85b00..1e55ed0b 100644 --- a/examples/react/develop/class-component-ts/src/core/index.ts +++ b/examples/react/develop/class-component-ts/src/core/index.ts @@ -4,7 +4,7 @@ import { createComputed, createCollection, } from '@agile-ts/core'; -import { createEvent, Event } from '@agile-ts/event'; +import { createEvent } from '@agile-ts/event'; export const MY_STATE = createState('MyState'); //.persist(); export const MY_STATE_2 = createState('MyState2', { diff --git a/examples/react/develop/class-component-ts/yarn.lock b/examples/react/develop/class-component-ts/yarn.lock index 71782d78..4eb3b3d9 100644 --- a/examples/react/develop/class-component-ts/yarn.lock +++ b/examples/react/develop/class-component-ts/yarn.lock @@ -3,16 +3,28 @@ "@agile-ts/api@file:.yalc/@agile-ts/api": - version "0.0.14" + version "0.0.22" + dependencies: + "@agile-ts/utils" "^0.0.8" "@agile-ts/core@file:.yalc/@agile-ts/core": - version "0.0.13" + version "0.2.3" + dependencies: + "@agile-ts/utils" "^0.0.8" + +"@agile-ts/event@file:.yalc/@agile-ts/event": + version "0.0.11" "@agile-ts/multieditor@file:.yalc/@agile-ts/multieditor": - version "0.0.13" + version "0.0.21" "@agile-ts/react@file:.yalc/@agile-ts/react": - version "0.0.14" + version "0.2.0" + +"@agile-ts/utils@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.8.tgz#ab9e1eeaddf282340936bddeb74421a2f77de804" + integrity sha512-ex19gPIS5imgV+rzs5HE2CNAIkQ162hPWH5u3HKNZnHiVU6FX62sikH5tG2oQocbDb7FkeB16D7v9ihQeuKYug== "@babel/code-frame@7.8.3": version "7.8.3" diff --git a/examples/react/develop/functional-component-ts/src/core/index.ts b/examples/react/develop/functional-component-ts/src/core/index.ts index 5d74ad72..b4fd13d0 100644 --- a/examples/react/develop/functional-component-ts/src/core/index.ts +++ b/examples/react/develop/functional-component-ts/src/core/index.ts @@ -1,25 +1,22 @@ -import Agile, { - assignSharedAgileInstance, +import { createCollection, createComputed, createState, createStorage, createStorageManager, Item, - assignSharedAgileStorageManager, + assignSharedStorageManager, } from '@agile-ts/core'; import { createEvent } from '@agile-ts/event'; -import { assignSharedAgileLoggerConfig, Logger } from '@agile-ts/logger'; +import { assignSharedLogger, createLogger, Logger } from '@agile-ts/logger'; import { clone } from '@agile-ts/utils'; export const myStorage: any = {}; -assignSharedAgileLoggerConfig({ level: Logger.level.DEBUG }); -export const App = new Agile(); -assignSharedAgileInstance(App); +assignSharedLogger(createLogger({ level: Logger.level.DEBUG })); export const storageManager = createStorageManager({ localStorage: true }); -assignSharedAgileStorageManager(storageManager); +assignSharedStorageManager(storageManager); // Register custom second Storage storageManager.register( diff --git a/examples/react/develop/functional-component-ts/yarn.lock b/examples/react/develop/functional-component-ts/yarn.lock index d760f47c..5773278b 100644 --- a/examples/react/develop/functional-component-ts/yarn.lock +++ b/examples/react/develop/functional-component-ts/yarn.lock @@ -8,9 +8,9 @@ "@agile-ts/utils" "^0.0.7" "@agile-ts/core@file:.yalc/@agile-ts/core": - version "0.2.0-alpha.4" + version "0.2.0" dependencies: - "@agile-ts/utils" "^0.0.7" + "@agile-ts/utils" "^0.0.8" "@agile-ts/event@file:.yalc/@agile-ts/event": version "0.0.10" @@ -27,13 +27,18 @@ version "0.0.5" "@agile-ts/react@file:.yalc/@agile-ts/react": - version "0.2.0-alpha.1" + version "0.2.0" "@agile-ts/utils@^0.0.7": version "0.0.7" resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.7.tgz#3dd1add6b9f63d0a5bf35e71f54ac46448ae047f" integrity sha512-OviTDC+ZbfyiUx8Gy8veS6YymC/tT6UeP23nT8V0EQV4F2MmuWqZ2yiKk+AYxZx8h74Ey8BVEUX6/ntpxhSNPw== +"@agile-ts/utils@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.8.tgz#ab9e1eeaddf282340936bddeb74421a2f77de804" + integrity sha512-ex19gPIS5imgV+rzs5HE2CNAIkQ162hPWH5u3HKNZnHiVU6FX62sikH5tG2oQocbDb7FkeB16D7v9ihQeuKYug== + "@babel/code-frame@7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" diff --git a/examples/react/develop/multieditor-ts/package.json b/examples/react/develop/multieditor-ts/package.json index 1c8a5e8c..ba83cc52 100644 --- a/examples/react/develop/multieditor-ts/package.json +++ b/examples/react/develop/multieditor-ts/package.json @@ -26,7 +26,8 @@ "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", - "install:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/multieditor & yarn install" + "install:dev:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/multieditor & yarn install", + "install:prod:agile": "yalc add @agile-ts/core @agile-ts/react @agile-ts/multieditor & yarn install" }, "eslintConfig": { "extends": [ diff --git a/examples/react/develop/multieditor-ts/src/core/agile.ts b/examples/react/develop/multieditor-ts/src/core/agile.ts deleted file mode 100644 index d0e37e07..00000000 --- a/examples/react/develop/multieditor-ts/src/core/agile.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Agile, globalBind } from '@agile-ts/core'; - -const App = new Agile(); - -export default App; - -// Create global Instance of SignUpEditor (for better debugging) -globalBind('__signUpEditor__', require('./signUpEditor')); diff --git a/examples/react/develop/multieditor-ts/src/core/signUpEditor.ts b/examples/react/develop/multieditor-ts/src/core/signUpEditor.ts index ca63e210..c1fad12e 100644 --- a/examples/react/develop/multieditor-ts/src/core/signUpEditor.ts +++ b/examples/react/develop/multieditor-ts/src/core/signUpEditor.ts @@ -1,5 +1,4 @@ -import MultiEditor, { Validator } from '@agile-ts/multieditor'; -import App from './agile'; +import { createMultieditor, Validator } from '@agile-ts/multieditor'; import { generateColor, generateId, isLight } from './utils'; export const isValidNameValidator = new Validator() @@ -9,73 +8,66 @@ export const isValidNameValidator = new Validator() .max(10) .matches(/^([^0-9]*)$/, 'No Numbers allowed!'); -export const signUpEditor = new MultiEditor( - (editor) => ({ - data: { - id: 'myCoolId', - firstName: 'Jeff', - lastName: '', - gender: undefined, - userName: '', - email: '', - aboutYou: '', - age: undefined, - image: { - id: generateId(), - color: generateColor(), - }, +export const signUpEditor = createMultieditor((editor) => ({ + data: { + id: 'myCoolId', + firstName: 'Jeff', + lastName: '', + gender: undefined, + userName: '', + email: '', + aboutYou: '', + age: undefined, + image: { + id: generateId(), + color: generateColor(), }, - onSubmit: async (preparedData) => { - alert(JSON.stringify(preparedData)); + }, + onSubmit: async (preparedData) => { + alert(JSON.stringify(preparedData)); + }, + validateMethods: { + firstName: isValidNameValidator, + lastName: isValidNameValidator, + userName: isValidNameValidator + .clone() + .addValidationMethod(async (key, value, editor) => { + const isValid = value === 'Jeff'; + if (!isValid) + editor.setStatus(key, 'error', 'Sry only the name Jeff is allowed!'); + return isValid; + }), + email: editor.Validator().required().string().email(), + aboutYou: editor + .Validator() + .required() + .string() + .min(10) + .addValidationMethod(async (key, value, editor) => { + const isValid = typeof value === 'string' && !value.includes('fuck'); + if (!isValid) + editor.setStatus(key, 'error', 'The word fuck is not allowed!'); + return isValid; + }), + age: editor.Validator().required().number().min(18).max(100), + gender: editor.Validator().required(), + image: editor + .Validator() + .required() + .addValidationMethod(async (key, value, editor) => { + const isValid = isLight(value.color); + if (!isValid) editor.setStatus(key, 'error', 'The Image is to dark!'); + return isValid; + }), + }, + computeMethods: { + lastName: (value) => { + return value && typeof value === 'string' ? value.toUpperCase() : value; }, - validateMethods: { - firstName: isValidNameValidator, - lastName: isValidNameValidator, - userName: isValidNameValidator - .clone() - .addValidationMethod(async (key, value, editor) => { - const isValid = value === 'Jeff'; - if (!isValid) - editor.setStatus( - key, - 'error', - 'Sry only the name Jeff is allowed!' - ); - return isValid; - }), - email: editor.Validator().required().string().email(), - aboutYou: editor - .Validator() - .required() - .string() - .min(10) - .addValidationMethod(async (key, value, editor) => { - const isValid = typeof value === 'string' && !value.includes('fuck'); - if (!isValid) - editor.setStatus(key, 'error', 'The word fuck is not allowed!'); - return isValid; - }), - age: editor.Validator().required().number().min(18).max(100), - gender: editor.Validator().required(), - image: editor - .Validator() - .required() - .addValidationMethod(async (key, value, editor) => { - const isValid = isLight(value.color); - if (!isValid) editor.setStatus(key, 'error', 'The Image is to dark!'); - return isValid; - }), + age: (value) => { + return Number(value) || value; }, - computeMethods: { - lastName: (value) => { - return value && typeof value === 'string' ? value.toUpperCase() : value; - }, - age: (value) => { - return Number(value) || value; - }, - }, - fixedProperties: ['id'], - reValidateMode: 'afterFirstSubmit', - }), - App -); + }, + fixedProperties: ['id'], + reValidateMode: 'afterFirstSubmit', +})); diff --git a/examples/react/develop/multieditor-ts/yarn.lock b/examples/react/develop/multieditor-ts/yarn.lock index 24843955..05539362 100644 --- a/examples/react/develop/multieditor-ts/yarn.lock +++ b/examples/react/develop/multieditor-ts/yarn.lock @@ -3,13 +3,20 @@ "@agile-ts/core@file:.yalc/@agile-ts/core": - version "0.0.5" + version "0.2.3" + dependencies: + "@agile-ts/utils" "^0.0.8" "@agile-ts/multieditor@file:.yalc/@agile-ts/multieditor": - version "0.0.5" + version "0.0.21" "@agile-ts/react@file:.yalc/@agile-ts/react": - version "0.0.5" + version "0.2.0" + +"@agile-ts/utils@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.8.tgz#ab9e1eeaddf282340936bddeb74421a2f77de804" + integrity sha512-ex19gPIS5imgV+rzs5HE2CNAIkQ162hPWH5u3HKNZnHiVU6FX62sikH5tG2oQocbDb7FkeB16D7v9ihQeuKYug== "@babel/code-frame@7.8.3": version "7.8.3" diff --git a/examples/react/develop/simple-todo-list/src/core.js b/examples/react/develop/simple-todo-list/src/core.js index 881290a6..e4c11fa5 100644 --- a/examples/react/develop/simple-todo-list/src/core.js +++ b/examples/react/develop/simple-todo-list/src/core.js @@ -1,7 +1,7 @@ import { createCollection, globalBind } from '@agile-ts/core'; -import { assignSharedAgileLoggerConfig, Logger } from '@agile-ts/logger'; +import { assignSharedLogger, createLogger, Logger } from '@agile-ts/logger'; -assignSharedAgileLoggerConfig({ level: Logger.level.DEBUG }); +assignSharedLogger(createLogger({ level: Logger.level.DEBUG })); // Create Collection export const TODOS = createCollection({ diff --git a/examples/react/release/boxes/src/core/app.ts b/examples/react/release/boxes/src/core/app.ts index de42f67d..3846255f 100644 --- a/examples/react/release/boxes/src/core/app.ts +++ b/examples/react/release/boxes/src/core/app.ts @@ -1,6 +1,9 @@ import { Agile, assignSharedAgileInstance } from '@agile-ts/core'; -import { assignSharedAgileLoggerConfig, Logger } from '@agile-ts/logger'; +import { assignSharedLogger, createLogger, Logger } from '@agile-ts/logger'; -assignSharedAgileLoggerConfig({ level: Logger.level.WARN }); +// Configure logging behaviour +assignSharedLogger(createLogger({ level: Logger.level.WARN })); + +// Configure Agile Instance export const App = new Agile({ key: 'boxes', bucket: true }); assignSharedAgileInstance(App); diff --git a/examples/react/release/boxes/yarn.lock b/examples/react/release/boxes/yarn.lock index 07d40055..45f292af 100644 --- a/examples/react/release/boxes/yarn.lock +++ b/examples/react/release/boxes/yarn.lock @@ -3,25 +3,25 @@ "@agile-ts/core@file:.yalc/@agile-ts/core": - version "0.2.0-alpha.4" + version "0.2.1" dependencies: - "@agile-ts/utils" "^0.0.7" + "@agile-ts/utils" "^0.0.8" "@agile-ts/logger@file:.yalc/@agile-ts/logger": - version "0.0.7" + version "0.0.8" dependencies: - "@agile-ts/utils" "^0.0.7" + "@agile-ts/utils" "^0.0.8" "@agile-ts/proxytree@file:.yalc/@agile-ts/proxytree": - version "0.0.5" + version "0.0.6" "@agile-ts/react@file:.yalc/@agile-ts/react": - version "0.2.0-alpha.1" + version "0.2.0" -"@agile-ts/utils@^0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.7.tgz#3dd1add6b9f63d0a5bf35e71f54ac46448ae047f" - integrity sha512-OviTDC+ZbfyiUx8Gy8veS6YymC/tT6UeP23nT8V0EQV4F2MmuWqZ2yiKk+AYxZx8h74Ey8BVEUX6/ntpxhSNPw== +"@agile-ts/utils@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.8.tgz#ab9e1eeaddf282340936bddeb74421a2f77de804" + integrity sha512-ex19gPIS5imgV+rzs5HE2CNAIkQ162hPWH5u3HKNZnHiVU6FX62sikH5tG2oQocbDb7FkeB16D7v9ihQeuKYug== "@babel/code-frame@7.10.4": version "7.10.4" diff --git a/examples/react/release/stopwatch-query-url/package.json b/examples/react/release/stopwatch-query-url/package.json index c0197ea0..43f04cc3 100644 --- a/examples/react/release/stopwatch-query-url/package.json +++ b/examples/react/release/stopwatch-query-url/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "dependencies": { - "@agile-ts/core": "^0.1.2", - "@agile-ts/react": "^0.1.2", + "@agile-ts/core": "file:.yalc/@agile-ts/core", + "@agile-ts/react": "file:.yalc/@agile-ts/react", "query-string": "^7.0.1", "react": "^17.0.2", "react-dom": "^17.0.2", @@ -16,7 +16,9 @@ "test": "react-scripts test", "eject": "react-scripts eject", "prettier": "prettier --config .prettierrc --write \"**/*.{js,ts}\"", - "lint": "eslint --cache \"**/*.{js,jsx,ts,tsx}\"" + "lint": "eslint --cache \"**/*.{js,jsx,ts,tsx}\"", + "install:dev:agile": "yalc add @agile-ts/core @agile-ts/react & yarn install", + "install:prod:agile": "yarn add @agile-ts/core @agile-ts/react & yarn install" }, "eslintConfig": { "extends": "react-app" diff --git a/examples/react/release/stopwatch-query-url/src/core/index.ts b/examples/react/release/stopwatch-query-url/src/core/index.ts index 8ec09cb5..0a018e5e 100644 --- a/examples/react/release/stopwatch-query-url/src/core/index.ts +++ b/examples/react/release/stopwatch-query-url/src/core/index.ts @@ -2,7 +2,7 @@ import { createState, globalBind, createStorage, - getStorageManager, + getSharedStorageManager, } from '@agile-ts/core'; import queryString from 'query-string'; @@ -35,7 +35,7 @@ const queryUrlStorage = createStorage({ }); // Register Query Storage to the shared Agile Instance and set it as default -getStorageManager().register(queryUrlStorage, { default: true }); +getSharedStorageManager().register(queryUrlStorage, { default: true }); // State to keep track of the current time of the Stopwatch const TIME = createState( diff --git a/examples/react/release/stopwatch-query-url/yarn.lock b/examples/react/release/stopwatch-query-url/yarn.lock index 558ab896..ace2ac96 100644 --- a/examples/react/release/stopwatch-query-url/yarn.lock +++ b/examples/react/release/stopwatch-query-url/yarn.lock @@ -2,22 +2,18 @@ # yarn lockfile v1 -"@agile-ts/core@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@agile-ts/core/-/core-0.1.2.tgz#5a3974ba0c57a51a19bcdf81b2055e091c884f5e" - integrity sha512-9031MGUrPpg/ZL1ErpwUlHX751HKEtOfbc5Ae7W7x/POGH89Gka09hMAhqQlDrKF2+olVs3sf6PAsAHRv6paGw== +"@agile-ts/core@file:.yalc/@agile-ts/core": + version "0.2.3" dependencies: - "@agile-ts/utils" "^0.0.7" + "@agile-ts/utils" "^0.0.8" -"@agile-ts/react@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@agile-ts/react/-/react-0.1.2.tgz#d07f6b935d9322cd60d2e9e3871da554b04460af" - integrity sha512-W4u2+X6KCeXPdkjit/NsMJG5nBsa7dNFaEzyfTsp5Cqbs99zLqY6dO8LUIYyhRt/+HBvEW9o64i/6Kqd59WM1Q== +"@agile-ts/react@file:.yalc/@agile-ts/react": + version "0.2.0" -"@agile-ts/utils@^0.0.7": - version "0.0.7" - resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.7.tgz#3dd1add6b9f63d0a5bf35e71f54ac46448ae047f" - integrity sha512-OviTDC+ZbfyiUx8Gy8veS6YymC/tT6UeP23nT8V0EQV4F2MmuWqZ2yiKk+AYxZx8h74Ey8BVEUX6/ntpxhSNPw== +"@agile-ts/utils@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@agile-ts/utils/-/utils-0.0.8.tgz#ab9e1eeaddf282340936bddeb74421a2f77de804" + integrity sha512-ex19gPIS5imgV+rzs5HE2CNAIkQ162hPWH5u3HKNZnHiVU6FX62sikH5tG2oQocbDb7FkeB16D7v9ihQeuKYug== "@babel/code-frame@7.10.4": version "7.10.4" diff --git a/examples/vue/develop/my-project/src/core.js b/examples/vue/develop/my-project/src/core.js index 8606056e..644dddfb 100644 --- a/examples/vue/develop/my-project/src/core.js +++ b/examples/vue/develop/my-project/src/core.js @@ -3,11 +3,13 @@ import { createState, createComputed, createCollection, + shared, } from '@agile-ts/core'; -import { Logger, assignSharedAgileLoggerConfig } from '@agile-ts/logger'; -import '@agile-ts/vue'; +import { assignSharedLogger, createLogger, Logger } from '@agile-ts/logger'; +import vueIntegration from '@agile-ts/vue'; -assignSharedAgileLoggerConfig({ level: Logger.level.DEBUG }); +assignSharedLogger(createLogger({ level: Logger.level.DEBUG })); +shared.integrate(vueIntegration); // console.debug('hi'); // Doesn't work here idk why @@ -34,4 +36,4 @@ export const TODOS = createCollection({ // TODOS.collect({ id: 2, name: 'jeff' }); -globalBind('__core__', { App, MY_STATE, TODOS, MY_COMPUTED }); +globalBind('__core__', { MY_STATE, TODOS, MY_COMPUTED, shared }); diff --git a/package.json b/package.json index 7a77e31f..c02c253e 100644 --- a/package.json +++ b/package.json @@ -48,12 +48,16 @@ }, "devDependencies": { "@changesets/cli": "^2.16.0", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-node-resolve": "^13.0.4", + "@rollup/plugin-typescript": "^8.2.5", "@size-limit/file": "^5.0.1", "@types/jest": "^26.0.24", "@types/node": "^16.3.2", "@typescript-eslint/eslint-plugin": "^4.28.3", "@typescript-eslint/parser": "^4.28.3", "coveralls": "^3.1.1", + "esbuild": "^0.12.28", "eslint": "^7.30.0", "eslint-config-node": "^4.1.0", "eslint-config-prettier": "^8.3.0", @@ -65,6 +69,10 @@ "lerna-changelog": "^1.0.1", "nodemon": "^2.0.12", "prettier": "^2.3.2", + "rollup": "^2.56.3", + "rollup-plugin-bundle-size": "^1.0.3", + "rollup-plugin-esbuild": "^4.5.0", + "shx": "^0.3.3", "size-limit": "^5.0.1", "ts-jest": "^26.5.6", "ts-node": "^10.1.0", diff --git a/packages/api/package.json b/packages/api/package.json index 10559914..adebfbb1 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -15,15 +15,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/api/rollup.config.js b/packages/api/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/api/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/api/tsconfig.esm.json b/packages/api/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/api/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/api/tsconfig.production.json b/packages/api/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/api/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/core/package.json b/packages/core/package.json index e9f6104f..f784ef5c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@agile-ts/core", - "version": "0.2.0", + "version": "0.2.3", "author": "BennoDev", "license": "MIT", "homepage": "https://agile-ts.org/", @@ -26,15 +26,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "node ./scripts/prepublish.js && yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish && git checkout README.md", "pack": "npm pack", diff --git a/packages/core/rollup.config.js b/packages/core/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/core/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/core/src/agile.ts b/packages/core/src/agile.ts index 82fe3bab..e1dd727b 100644 --- a/packages/core/src/agile.ts +++ b/packages/core/src/agile.ts @@ -1,13 +1,12 @@ +import { defineConfig } from '@agile-ts/utils'; +import { LogCodeManager } from './logCodeManager'; +import { globalBind } from './utils'; +import { Runtime, SubController } from './runtime'; import { - Runtime, Integration, Integrations, - SubController, - globalBind, - LogCodeManager, IntegrationsConfigInterface, - defineConfig, -} from './internal'; +} from './integrations'; export class Agile { public config: AgileConfigInterface; diff --git a/packages/core/src/collection/collection.persistent.ts b/packages/core/src/collection/collection.persistent.ts index 0cbf3987..77790b3b 100644 --- a/packages/core/src/collection/collection.persistent.ts +++ b/packages/core/src/collection/collection.persistent.ts @@ -1,18 +1,14 @@ +import { defineConfig } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Collection, CollectionKey, DefaultItem, ItemKey } from './collection'; +import { Group, GroupKey } from './group'; import { - Collection, - CollectionKey, CreatePersistentConfigInterface, - DefaultItem, - defineConfig, - Group, - GroupKey, - ItemKey, - LogCodeManager, + getSharedStorageManager, Persistent, PersistentKey, StorageKey, - getStorageManager, -} from '../internal'; +} from '../storages'; export class CollectionPersistent< DataType extends Object = DefaultItem @@ -85,7 +81,7 @@ export class CollectionPersistent< // Check if Collection is already persisted // (indicated by the persistence of 'true' at '_storageItemKey') - const isPersisted = await getStorageManager()?.get( + const isPersisted = await getSharedStorageManager()?.get( _storageItemKey, this.config.defaultStorageKey as any ); @@ -203,7 +199,7 @@ export class CollectionPersistent< ); // Set flag in Storage to indicate that the Collection is persisted - getStorageManager()?.set(_storageItemKey, true, this.storageKeys); + getSharedStorageManager()?.set(_storageItemKey, true, this.storageKeys); // Persist default Group defaultGroup.persist(defaultGroupStorageKey, { @@ -278,7 +274,7 @@ export class CollectionPersistent< ); // Remove Collection is persisted indicator flag from Storage - getStorageManager()?.remove(_storageItemKey, this.storageKeys); + getSharedStorageManager()?.remove(_storageItemKey, this.storageKeys); // Remove default Group from the Storage defaultGroup.persistent?.removePersistedValue(defaultGroupStorageKey); diff --git a/packages/core/src/collection/collection.ts b/packages/core/src/collection/collection.ts index 60535136..62f798bf 100644 --- a/packages/core/src/collection/collection.ts +++ b/packages/core/src/collection/collection.ts @@ -1,28 +1,28 @@ import { - Agile, - CollectionPersistent, - ComputedTracker, copy, defineConfig, generateId, - Group, - GroupAddConfigInterface, - GroupConfigInterface, - GroupIngestConfigInterface, - GroupKey, isFunction, isValidObject, - Item, - LogCodeManager, normalizeArray, - PatchOptionConfigInterface, removeProperties, - Selector, - SelectorConfigInterface, - SelectorKey, - StorageKey, +} from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { PatchOptionConfigInterface } from '../state'; +import { ComputedTracker } from '../computed'; +import { Item } from './item'; +import { SelectorConfigInterface, Selector, SelectorKey } from './selector'; +import { + Group, + GroupAddConfigInterface, + GroupConfigInterface, + GroupKey, TrackedChangeMethod, -} from '../internal'; +} from './group'; +import { GroupIngestConfigInterface } from './group/group.observer'; +import { StorageKey } from '../storages'; +import { CollectionPersistent } from './collection.persistent'; export class Collection< DataType extends Object = DefaultItem, diff --git a/packages/core/src/collection/group/group.observer.ts b/packages/core/src/collection/group/group.observer.ts index 3e5d490a..e231f0b4 100644 --- a/packages/core/src/collection/group/group.observer.ts +++ b/packages/core/src/collection/group/group.observer.ts @@ -1,16 +1,18 @@ import { - Observer, - Group, - CreateObserverConfigInterface, copy, + defineConfig, equal, generateId, - RuntimeJob, - IngestConfigInterface, - CreateRuntimeJobConfigInterface, - defineConfig, removeProperties, -} from '../../internal'; +} from '@agile-ts/utils'; +import { + CreateObserverConfigInterface, + CreateRuntimeJobConfigInterface, + IngestConfigInterface, + Observer, + RuntimeJob, +} from '../../runtime'; +import { Group } from './index'; export class GroupObserver extends Observer { // Group the Observer belongs to diff --git a/packages/core/src/collection/group/index.ts b/packages/core/src/collection/group/index.ts index c404b7db..f1e45a55 100644 --- a/packages/core/src/collection/group/index.ts +++ b/packages/core/src/collection/group/index.ts @@ -1,25 +1,24 @@ import { - EnhancedState, - Collection, - DefaultItem, - ItemKey, - normalizeArray, - Item, copy, - CollectionPersistent, - StatePersistentConfigInterface, + defineConfig, isValidObject, - PersistentKey, - ComputedTracker, - StateIngestConfigInterface, + normalizeArray, removeProperties, - LogCodeManager, - StateObserversInterface, - GroupObserver, +} from '@agile-ts/utils'; +import { LogCodeManager } from '../../logCodeManager'; +import { + EnhancedState, + StateIngestConfigInterface, StateObserver, - defineConfig, - GroupIngestConfigInterface, -} from '../../internal'; + StateObserversInterface, + StatePersistentConfigInterface, +} from '../../state'; +import { Collection, DefaultItem, ItemKey } from '../collection'; +import { GroupIngestConfigInterface, GroupObserver } from './group.observer'; +import { ComputedTracker } from '../../computed'; +import { Item } from '../item'; +import { PersistentKey } from '../../storages'; +import { CollectionPersistent } from '../collection.persistent'; export class Group< DataType extends Object = DefaultItem, @@ -156,7 +155,7 @@ export class Group< softRebuild: true, any: {}, }); - config.any['trackedChanges'] = []; // TODO might be improved since the 'any' property is very vague + config.any['trackedChanges'] = []; // TODO should be improved since the 'any' property is very vague // Remove itemKeys from Group _itemKeys.forEach((itemKey) => { @@ -229,7 +228,7 @@ export class Group< softRebuild: true, any: {}, }); - config.any['trackedChanges'] = []; // TODO might be improved since the 'any' property is very vague + config.any['trackedChanges'] = []; // TODO should be improved since the 'any' property is very vague // Add itemKeys to Group _itemKeys.forEach((itemKey) => { @@ -546,15 +545,18 @@ export enum TrackedChangeMethod { export interface TrackedChangeInterface { /** - * TODO + * What type of change the tracked change is. + * @default undefined */ method: TrackedChangeMethod; /** - * TODO + * Item key of the tracked change. + * @default undefined */ key: ItemKey; /** - * TODO + * Current index in the Group value of the tracked change. + * @default undefined */ index: number; } diff --git a/packages/core/src/collection/index.ts b/packages/core/src/collection/index.ts index b386d611..326d66f0 100644 --- a/packages/core/src/collection/index.ts +++ b/packages/core/src/collection/index.ts @@ -1,17 +1,13 @@ -import { - Collection, - CollectionConfig, - DefaultItem, - Agile, - shared, -} from '../internal'; +import { Agile } from '../agile'; +import { shared } from '../shared'; +import { Collection, CollectionConfig, DefaultItem } from './collection'; export * from './collection'; -// export * from './collection.persistent'; -// export * from './group'; -// export * from './group/group.observer'; -// export * from './item'; -// export * from './selector'; +export * from './collection.persistent'; +export * from './group'; +export * from './group/group.observer'; +export * from './item'; +export * from './selector'; /** * Returns a newly created Collection. diff --git a/packages/core/src/collection/item.ts b/packages/core/src/collection/item.ts index 44266aee..54283819 100644 --- a/packages/core/src/collection/item.ts +++ b/packages/core/src/collection/item.ts @@ -1,16 +1,14 @@ +import { defineConfig, isValidObject } from '@agile-ts/utils'; import { EnhancedState, - Collection, StateKey, - StateRuntimeJobConfigInterface, - SelectorKey, - PersistentKey, - isValidObject, - CollectionPersistent, StatePersistentConfigInterface, - DefaultItem, - defineConfig, -} from '../internal'; + StateRuntimeJobConfigInterface, +} from '../state'; +import { Collection, DefaultItem } from './collection'; +import { SelectorKey } from './selector'; +import { PersistentKey } from '../storages'; +import { CollectionPersistent } from './collection.persistent'; export class Item extends EnhancedState< DataType diff --git a/packages/core/src/collection/selector.ts b/packages/core/src/collection/selector.ts index 76795f35..acac5cfa 100644 --- a/packages/core/src/collection/selector.ts +++ b/packages/core/src/collection/selector.ts @@ -1,12 +1,7 @@ -import { - Collection, - DefaultItem, - defineConfig, - Item, - ItemKey, - EnhancedState, - StateRuntimeJobConfigInterface, -} from '../internal'; +import { defineConfig } from '@agile-ts/utils'; +import { EnhancedState, StateRuntimeJobConfigInterface } from '../state'; +import { Item } from './item'; +import { Collection, DefaultItem, ItemKey } from './collection'; export class Selector< DataType extends Object = DefaultItem diff --git a/packages/core/src/computed/computed.tracker.ts b/packages/core/src/computed/computed.tracker.ts index c9c7ecc6..44d16906 100644 --- a/packages/core/src/computed/computed.tracker.ts +++ b/packages/core/src/computed/computed.tracker.ts @@ -1,4 +1,4 @@ -import { Observer } from '../internal'; +import { Observer } from '../runtime'; export class ComputedTracker { static isTracking = false; diff --git a/packages/core/src/computed/computed.ts b/packages/core/src/computed/computed.ts index 416cb4db..bb3a3d3f 100644 --- a/packages/core/src/computed/computed.ts +++ b/packages/core/src/computed/computed.ts @@ -1,17 +1,19 @@ +import { + defineConfig, + isAsyncFunction, + removeProperties, +} from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { extractRelevantObservers } from '../utils'; import { State, - Agile, - Observer, StateConfigInterface, - ComputedTracker, - Collection, StateIngestConfigInterface, - removeProperties, - LogCodeManager, - isAsyncFunction, - extractRelevantObservers, - defineConfig, -} from '../internal'; +} from '../state'; +import { Observer } from '../runtime'; +import { ComputedTracker } from './computed.tracker'; +import { Collection } from '../collection'; export class Computed extends State< ComputedValueType @@ -198,14 +200,6 @@ export class Computed extends State< return computedValue; } - - /** - * Not usable in Computed Class. - */ - public persist(): this { - LogCodeManager.log('19:03:00'); - return this; - } } export type ComputeFunctionType = () => diff --git a/packages/core/src/computed/index.ts b/packages/core/src/computed/index.ts index 185dec62..40510d80 100644 --- a/packages/core/src/computed/index.ts +++ b/packages/core/src/computed/index.ts @@ -1,16 +1,14 @@ +import { removeProperties, defineConfig } from '@agile-ts/utils'; +import { CreateAgileSubInstanceInterface, shared } from '../shared'; import { Computed, ComputeFunctionType, CreateComputedConfigInterface, DependableAgileInstancesType, - defineConfig, - removeProperties, - CreateAgileSubInstanceInterface, - shared, -} from '../internal'; +} from './computed'; export * from './computed'; -// export * from './computed.tracker'; +export * from './computed.tracker'; /** * Returns a newly created Computed. diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6469f1fa..c7c65f09 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,15 @@ -import { Agile } from './internal'; +import { Agile } from './agile'; + +export * from '@agile-ts/utils'; +export * from './agile'; +export * from './utils'; +export * from './logCodeManager'; +export * from './integrations'; +export * from './runtime'; +export * from './storages'; +export * from './state'; +export * from './collection'; +export * from './computed'; +export * from './shared'; -export * from './internal'; export default Agile; diff --git a/packages/core/src/integrations/index.ts b/packages/core/src/integrations/index.ts index 196a738b..eabcac34 100644 --- a/packages/core/src/integrations/index.ts +++ b/packages/core/src/integrations/index.ts @@ -1,2 +1,2 @@ export * from './integrations'; -// export * from './integration'; +export * from './integration'; diff --git a/packages/core/src/integrations/integration.ts b/packages/core/src/integrations/integration.ts index f2c409ac..2acb6eb9 100644 --- a/packages/core/src/integrations/integration.ts +++ b/packages/core/src/integrations/integration.ts @@ -1,4 +1,4 @@ -import { Agile } from '../internal'; +import { Agile } from '../agile'; export class Integration { // Key/Name identifier of the Integration diff --git a/packages/core/src/integrations/integrations.ts b/packages/core/src/integrations/integrations.ts index c13e081b..0ca1cc02 100644 --- a/packages/core/src/integrations/integrations.ts +++ b/packages/core/src/integrations/integrations.ts @@ -1,4 +1,7 @@ -import { Agile, Integration, LogCodeManager, defineConfig } from '../internal'; +import { defineConfig } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { Integration } from './integration'; const onRegisterInitialIntegrationCallbacks: (( integration: Integration diff --git a/packages/core/src/internal.ts b/packages/core/src/internal.ts deleted file mode 100644 index f504535e..00000000 --- a/packages/core/src/internal.ts +++ /dev/null @@ -1,56 +0,0 @@ -// This file exposes Agile functions and types to the outside world. -// It also serves as a cyclic dependency workaround, -// and allows us to structure the loading order as needed (for example, './agile' need to be loaded before './state') -// https://medium.com/visual-development/how-to-fix-nasty-circular-dependency-issues-once-and-for-all-in-javascript-typescript-a04c987cf0de - -// !! All internal Agile modules must be imported from here!! - -// Utils -export * from './utils'; -export * from '@agile-ts/utils'; - -// Logger -export * from './logCodeManager'; - -// Agile -export * from './agile'; - -// Integrations -export * from './integrations'; -export * from './integrations/integration'; - -// Runtime -export * from './runtime'; -export * from './runtime/observer'; -export * from './runtime/runtime.job'; -export * from './runtime/subscription/container/SubscriptionContainer'; -export * from './runtime/subscription/container/CallbackSubscriptionContainer'; -export * from './runtime/subscription/container/ComponentSubscriptionContainer'; -export * from './runtime/subscription/sub.controller'; - -// Storage -export * from './storages'; -export * from './storages/storage'; -export * from './storages/persistent'; - -// State -export * from './state'; -export * from './state/state.observer'; -export * from './state/state.enhanced'; -export * from './state/state.persistent'; -export * from './state/state.runtime.job'; - -// Computed -export * from './computed'; -export * from './computed/computed.tracker'; - -// Collection -export * from './collection'; -export * from './collection/group'; -export * from './collection/group/group.observer'; -export * from './collection/item'; -export * from './collection/selector'; -export * from './collection/collection.persistent'; - -// Shared -export * from './shared'; diff --git a/packages/core/src/logCodeManager.ts b/packages/core/src/logCodeManager.ts index 5c1afbcf..ab9f1956 100644 --- a/packages/core/src/logCodeManager.ts +++ b/packages/core/src/logCodeManager.ts @@ -43,8 +43,6 @@ const niceLogCodeMessages = { "Couldn't find Storage '${0}'. " + "The Storage with the key/name '${0}' doesn't exists!", '11:03:02': "Storage with the key/name '${0}' isn't ready yet!", - '11:02:06': - 'By registering a new Storage Manager the old one will be overwritten!', '11:03:03': 'No Storage found to get a value from! Please specify at least one Storage.', '11:03:04': @@ -104,10 +102,6 @@ const niceLogCodeMessages = { '18:03:00': "Failed to integrate Framework '${0}' into AgileTs '${1}'!", // Computed - '19:03:00': - "The 'persist()' method can't be used in the Computed Class! " + - "The Computed Class has a dynamic value which shouldn't be persisted. " + - 'Consider persisting the values the Computed depends on.', // Collection Persistent '1A:02:00': 'Failed to build unique Item StorageKey!', @@ -306,7 +300,7 @@ if (process.env.NODE_ENV !== 'production') { logCodeLogTypes: logCodeTypes, logCodeMessages: logCodeMessages, getLogger: () => { - return loggerPackage?.getLogger() ?? null; + return loggerPackage?.sharedLogger || null; }, logIfTags, setAllowLogging, diff --git a/packages/core/src/runtime/index.ts b/packages/core/src/runtime/index.ts index de2b0edb..12eb1ec4 100644 --- a/packages/core/src/runtime/index.ts +++ b/packages/core/src/runtime/index.ts @@ -1,7 +1,4 @@ export * from './runtime'; -// export * from './observer'; -// export * from './runtime.job'; -// export * from './subscription/container/SubscriptionContainer'; -// export * from './subscription/container/CallbackSubscriptionContainer'; -// export * from './subscription/container/ComponentSubscriptionContainer'; -// export * from './subscription/sub.controller'; +export * from './subscription'; +export * from './observer'; +export * from './runtime.job'; diff --git a/packages/core/src/runtime/observer.ts b/packages/core/src/runtime/observer.ts index dc49f1f6..1dd03e89 100644 --- a/packages/core/src/runtime/observer.ts +++ b/packages/core/src/runtime/observer.ts @@ -1,14 +1,10 @@ -import { - Agile, - StateKey, - RuntimeJob, - SubscriptionContainer, - IngestConfigInterface, - CreateRuntimeJobConfigInterface, - LogCodeManager, - generateId, - defineConfig, -} from '../internal'; +import { defineConfig, generateId } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { SubscriptionContainer } from './subscription'; +import { CreateRuntimeJobConfigInterface, RuntimeJob } from './runtime.job'; +import { IngestConfigInterface } from './runtime'; +import { StateKey } from '../state'; export type ObserverKey = string | number; diff --git a/packages/core/src/runtime/runtime.job.ts b/packages/core/src/runtime/runtime.job.ts index 73dbd4b3..1124f508 100644 --- a/packages/core/src/runtime/runtime.job.ts +++ b/packages/core/src/runtime/runtime.job.ts @@ -1,4 +1,6 @@ -import { defineConfig, Observer, SubscriptionContainer } from '../internal'; +import { defineConfig } from '@agile-ts/utils'; +import { SubscriptionContainer } from './subscription'; +import { Observer } from './observer'; export class RuntimeJob { public config: RuntimeJobConfigInterface; diff --git a/packages/core/src/runtime/runtime.ts b/packages/core/src/runtime/runtime.ts index 0dd3419f..9c2443ea 100644 --- a/packages/core/src/runtime/runtime.ts +++ b/packages/core/src/runtime/runtime.ts @@ -1,13 +1,12 @@ +import { defineConfig, notEqual } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; import { - Agile, SubscriptionContainer, - RuntimeJob, CallbackSubscriptionContainer, ComponentSubscriptionContainer, - notEqual, - LogCodeManager, - defineConfig, -} from '../internal'; +} from './subscription'; +import { RuntimeJob } from './runtime.job'; export class Runtime { // Agile Instance the Runtime belongs to @@ -160,9 +159,8 @@ export class Runtime { return false; // Extract the Subscription Container to be re-rendered from the Jobs - const subscriptionContainerToUpdate = this.extractToUpdateSubscriptionContainer( - jobsToRerender - ); + const subscriptionContainerToUpdate = + this.extractToUpdateSubscriptionContainer(jobsToRerender); if (subscriptionContainerToUpdate.length <= 0) return false; // Update Subscription Container (trigger re-render on the UI-Component they represent) diff --git a/packages/core/src/runtime/subscription/container/CallbackSubscriptionContainer.ts b/packages/core/src/runtime/subscription/container/CallbackSubscriptionContainer.ts index bf974bea..211b3b32 100644 --- a/packages/core/src/runtime/subscription/container/CallbackSubscriptionContainer.ts +++ b/packages/core/src/runtime/subscription/container/CallbackSubscriptionContainer.ts @@ -1,8 +1,8 @@ import { - Observer, SubscriptionContainer, SubscriptionContainerConfigInterface, -} from '../../../internal'; +} from './SubscriptionContainer'; +import { Observer } from '../../observer'; export class CallbackSubscriptionContainer extends SubscriptionContainer { /** diff --git a/packages/core/src/runtime/subscription/container/ComponentSubscriptionContainer.ts b/packages/core/src/runtime/subscription/container/ComponentSubscriptionContainer.ts index ff80eded..bfff1cbf 100644 --- a/packages/core/src/runtime/subscription/container/ComponentSubscriptionContainer.ts +++ b/packages/core/src/runtime/subscription/container/ComponentSubscriptionContainer.ts @@ -1,8 +1,8 @@ import { - Observer, SubscriptionContainer, SubscriptionContainerConfigInterface, -} from '../../../internal'; +} from './SubscriptionContainer'; +import { Observer } from '../../observer'; export class ComponentSubscriptionContainer< C = any diff --git a/packages/core/src/runtime/subscription/container/SubscriptionContainer.ts b/packages/core/src/runtime/subscription/container/SubscriptionContainer.ts index 1ef0c89d..177ad253 100644 --- a/packages/core/src/runtime/subscription/container/SubscriptionContainer.ts +++ b/packages/core/src/runtime/subscription/container/SubscriptionContainer.ts @@ -1,9 +1,5 @@ -import { - defineConfig, - generateId, - isValidObject, - Observer, -} from '../../../internal'; +import { defineConfig, generateId, isValidObject } from '@agile-ts/utils'; +import { Observer } from '../../observer'; export class SubscriptionContainer { /** diff --git a/packages/core/src/runtime/subscription/index.ts b/packages/core/src/runtime/subscription/index.ts new file mode 100644 index 00000000..c57fd03c --- /dev/null +++ b/packages/core/src/runtime/subscription/index.ts @@ -0,0 +1,4 @@ +export * from './container/SubscriptionContainer'; +export * from './container/CallbackSubscriptionContainer'; +export * from './container/ComponentSubscriptionContainer'; +export * from './sub.controller'; diff --git a/packages/core/src/runtime/subscription/sub.controller.ts b/packages/core/src/runtime/subscription/sub.controller.ts index e83653be..60e0091e 100644 --- a/packages/core/src/runtime/subscription/sub.controller.ts +++ b/packages/core/src/runtime/subscription/sub.controller.ts @@ -1,15 +1,13 @@ +import { defineConfig, isFunction, removeProperties } from '@agile-ts/utils'; +import { LogCodeManager } from '../../logCodeManager'; +import { Agile } from '../../agile'; import { - Agile, - Observer, SubscriptionContainer, - ComponentSubscriptionContainer, - CallbackSubscriptionContainer, - isFunction, SubscriptionContainerConfigInterface, - removeProperties, - LogCodeManager, - defineConfig, -} from '../../internal'; +} from './container/SubscriptionContainer'; +import { ComponentSubscriptionContainer } from './container/ComponentSubscriptionContainer'; +import { CallbackSubscriptionContainer } from './container/CallbackSubscriptionContainer'; +import { Observer } from '../observer'; export class SubController { // Agile Instance the SubController belongs to diff --git a/packages/core/src/shared.ts b/packages/core/src/shared.ts index a3ec1f87..7828438c 100644 --- a/packages/core/src/shared.ts +++ b/packages/core/src/shared.ts @@ -1,4 +1,6 @@ -import { Agile } from './internal'; +import { isFunction } from '@agile-ts/utils'; +import { LogCodeManager } from './logCodeManager'; +import { Agile } from './agile'; /** * Shared Agile Instance that is used when no Agile Instance was specified. @@ -6,7 +8,7 @@ import { Agile } from './internal'; let sharedAgileInstance = new Agile({ key: 'shared', }); -export { sharedAgileInstance as shared }; +export { sharedAgileInstance, sharedAgileInstance as shared }; /** * Assigns the specified Agile Instance as the shared Agile Instance. @@ -18,6 +20,39 @@ export function assignSharedAgileInstance(agileInstance: Agile): void { sharedAgileInstance = agileInstance; } +// Note: Not located in 'utils.ts' due circular dependency issues +/** + * Extracts an Instance of Agile from the specified Instance. + * When no valid Agile Instance was found, + * it returns the global bound Agile Instance or `undefined`. + * + * @internal + * @param instance - Instance to extract the Agile Instance from. + */ +export function getAgileInstance(instance: any): Agile | undefined { + try { + // Try to get Agile Instance from specified Instance + if (instance != null) { + const _agileInstance = isFunction(instance['agileInstance']) + ? instance['agileInstance']() + : instance['agileInstance']; + if (_agileInstance) return _agileInstance; + } + + // Try to get shared Agile Instance + if (sharedAgileInstance instanceof Agile) { + return sharedAgileInstance; + } + + // Return global bound Agile Instance + return globalThis[Agile.globalKey]; + } catch (e) { + LogCodeManager.log('20:03:00', [], instance); + } + + return undefined; +} + export interface CreateAgileSubInstanceInterface { /** * Instance of Agile the Instance belongs to. diff --git a/packages/core/src/state/index.ts b/packages/core/src/state/index.ts index 6a208125..3195df90 100644 --- a/packages/core/src/state/index.ts +++ b/packages/core/src/state/index.ts @@ -1,82 +1,8 @@ -import { - State, - StateConfigInterface, - defineConfig, - removeProperties, - CreateAgileSubInstanceInterface, - shared, - EnhancedState, -} from '../internal'; - export * from './state'; -// export * from './state.observer'; -// export * from './state.enhanced'; -// export * from './state.persistent'; -// export * from './state.runtime.job'; - -/** - * Returns a newly created State. - * - * A State manages a piece of Information - * that we need to remember globally at a later point in time. - * While providing a toolkit to use and mutate this piece of Information. - * - * You can create as many global States as you need. - * - * [Learn more..](https://agile-ts.org/docs/core/agile-instance/methods#createstate) - * - * @public - * @param initialValue - Initial value of the State. - * @param config - Configuration object - */ -export function createLightState( - initialValue: ValueType, - config: CreateStateConfigInterfaceWithAgile = {} -): State { - config = defineConfig(config, { - agileInstance: shared, - }); - return new State( - config.agileInstance as any, - initialValue, - removeProperties(config, ['agileInstance']) - ); -} - -// TODO 'createState' doesn't get entirely treeshaken away (React project) -/** - * Returns a newly created enhanced State. - * - * An enhanced State manages, like a normal State, a piece of Information - * that we need to remember globally at a later point in time. - * While providing a toolkit to use and mutate this piece of Information. - * - * The main difference to a normal State is however - * that an enhanced State provides a wider variety of inbuilt utilities (like a persist, undo, watch functionality) - * but requires a larger bundle size in return. - * - * You can create as many global enhanced States as you need. - * - * [Learn more..](https://agile-ts.org/docs/core/agile-instance/methods#createstate) - * - * @public - * @param initialValue - Initial value of the State. - * @param config - Configuration object - */ -export function createState( - initialValue: ValueType, - config: CreateStateConfigInterfaceWithAgile = {} -): EnhancedState { - config = defineConfig(config, { - agileInstance: shared, - }); - return new EnhancedState( - config.agileInstance as any, - initialValue, - removeProperties(config, ['agileInstance']) - ); -} +export * from './state.observer'; +export * from './state.enhanced'; +export * from './state.persistent'; +export * from './state.runtime.job'; -export interface CreateStateConfigInterfaceWithAgile - extends CreateAgileSubInstanceInterface, - StateConfigInterface {} +// Outsourced from here because of tree shaking issues (See: https://github.com/agile-ts/agile/issues/196) +export * from './public'; diff --git a/packages/core/src/state/public/createEnhancedState.ts b/packages/core/src/state/public/createEnhancedState.ts new file mode 100644 index 00000000..6e64a675 --- /dev/null +++ b/packages/core/src/state/public/createEnhancedState.ts @@ -0,0 +1,37 @@ +import { defineConfig, removeProperties } from '@agile-ts/utils'; +import { shared } from '../../shared'; +import { EnhancedState } from '../state.enhanced'; +import { CreateStateConfigInterfaceWithAgile } from './index'; + +/** + * Returns a newly created enhanced State. + * + * An enhanced State manages, like a normal State, a piece of Information + * that we need to remember globally at a later point in time. + * While providing a toolkit to use and mutate this piece of Information. + * + * The main difference to a normal State is however + * that an enhanced State provides a wider variety of inbuilt utilities (like a persist, undo, watch functionality) + * but requires a larger bundle size in return. + * + * You can create as many global enhanced States as you need. + * + * [Learn more..](https://agile-ts.org/docs/core/agile-instance/methods#createstate) + * + * @public + * @param initialValue - Initial value of the State. + * @param config - Configuration object + */ +export function createEnhancedState( + initialValue: ValueType, + config: CreateStateConfigInterfaceWithAgile = {} +): EnhancedState { + config = defineConfig(config, { + agileInstance: shared, + }); + return new EnhancedState( + config.agileInstance as any, + initialValue, + removeProperties(config, ['agileInstance']) + ); +} diff --git a/packages/core/src/state/public/createLightState.ts b/packages/core/src/state/public/createLightState.ts new file mode 100644 index 00000000..4055f734 --- /dev/null +++ b/packages/core/src/state/public/createLightState.ts @@ -0,0 +1,33 @@ +import { defineConfig, removeProperties } from '@agile-ts/utils'; +import { shared } from '../../shared'; +import { State } from '../state'; +import { CreateStateConfigInterfaceWithAgile } from './index'; + +/** + * Returns a newly created State. + * + * A State manages a piece of Information + * that we need to remember globally at a later point in time. + * While providing a toolkit to use and mutate this piece of Information. + * + * You can create as many global States as you need. + * + * [Learn more..](https://agile-ts.org/docs/core/agile-instance/methods#createstate) + * + * @public + * @param initialValue - Initial value of the State. + * @param config - Configuration object + */ +export function createLightState( + initialValue: ValueType, + config: CreateStateConfigInterfaceWithAgile = {} +): State { + config = defineConfig(config, { + agileInstance: shared, + }); + return new State( + config.agileInstance as any, + initialValue, + removeProperties(config, ['agileInstance']) + ); +} diff --git a/packages/core/src/state/public/createState.ts b/packages/core/src/state/public/createState.ts new file mode 100644 index 00000000..3a75772a --- /dev/null +++ b/packages/core/src/state/public/createState.ts @@ -0,0 +1,31 @@ +import { + createEnhancedState, + CreateStateConfigInterfaceWithAgile, +} from './index'; +import { EnhancedState } from '../state.enhanced'; + +/** + * Returns a newly created enhanced State. + * + * An enhanced State manages, like a normal State, a piece of Information + * that we need to remember globally at a later point in time. + * While providing a toolkit to use and mutate this piece of Information. + * + * The main difference to a normal State is however + * that an enhanced State provides a wider variety of inbuilt utilities (like a persist, undo, watch functionality) + * but requires a larger bundle size in return. + * + * You can create as many global enhanced States as you need. + * + * [Learn more..](https://agile-ts.org/docs/core/agile-instance/methods#createstate) + * + * @public + * @param initialValue - Initial value of the State. + * @param config - Configuration object + */ +export function createState( + initialValue: ValueType, + config: CreateStateConfigInterfaceWithAgile = {} +): EnhancedState { + return createEnhancedState(initialValue, config); +} diff --git a/packages/core/src/state/public/index.ts b/packages/core/src/state/public/index.ts new file mode 100644 index 00000000..42ac2aed --- /dev/null +++ b/packages/core/src/state/public/index.ts @@ -0,0 +1,10 @@ +import { CreateAgileSubInstanceInterface } from '../../shared'; +import { StateConfigInterface } from '../state'; + +export * from './createState'; +export * from './createEnhancedState'; +export * from './createLightState'; + +export interface CreateStateConfigInterfaceWithAgile + extends CreateAgileSubInstanceInterface, + StateConfigInterface {} diff --git a/packages/core/src/state/state.enhanced.ts b/packages/core/src/state/state.enhanced.ts index a922d7cc..0cc98ac8 100644 --- a/packages/core/src/state/state.enhanced.ts +++ b/packages/core/src/state/state.enhanced.ts @@ -1,22 +1,19 @@ import { - Agile, defineConfig, equal, flatMerge, generateId, isFunction, isValidObject, - LogCodeManager, notEqual, - PersistentKey, removeProperties, - State, - StateConfigInterface, - StateIngestConfigInterface, - StateKey, - StatePersistent, - StorageKey, -} from '../internal'; +} from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { State, StateConfigInterface, StateKey } from './state'; +import { Agile } from '../agile'; +import { StateIngestConfigInterface } from './state.observer'; +import { StatePersistent } from './state.persistent'; +import { PersistentKey, StorageKey } from '../storages'; export class EnhancedState extends State { // Whether the State is persisted in an external Storage diff --git a/packages/core/src/state/state.observer.ts b/packages/core/src/state/state.observer.ts index 332a9f9e..be641bc0 100644 --- a/packages/core/src/state/state.observer.ts +++ b/packages/core/src/state/state.observer.ts @@ -1,21 +1,24 @@ import { - Observer, - State, copy, + createArrayFromObject, + defineConfig, equal, - notEqual, + generateId, isFunction, + notEqual, + removeProperties, +} from '@agile-ts/utils'; +import { IngestConfigInterface, - StateRuntimeJob, - SideEffectInterface, - createArrayFromObject, - CreateStateRuntimeJobConfigInterface, - generateId, - SubscriptionContainer, + Observer, ObserverKey, - defineConfig, - removeProperties, -} from '../internal'; + SubscriptionContainer, +} from '../runtime'; +import { + CreateStateRuntimeJobConfigInterface, + StateRuntimeJob, +} from './state.runtime.job'; +import { SideEffectInterface, State } from './state'; export class StateObserver extends Observer { // State the Observer belongs to diff --git a/packages/core/src/state/state.persistent.ts b/packages/core/src/state/state.persistent.ts index 8d1fa0d9..5344ad11 100644 --- a/packages/core/src/state/state.persistent.ts +++ b/packages/core/src/state/state.persistent.ts @@ -1,11 +1,11 @@ +import { defineConfig } from '@agile-ts/utils'; import { CreatePersistentConfigInterface, - defineConfig, - EnhancedState, - getStorageManager, + getSharedStorageManager, Persistent, PersistentKey, -} from '../internal'; +} from '../storages'; +import { EnhancedState } from './state.enhanced'; export class StatePersistent extends Persistent { // State the Persistent belongs to @@ -73,7 +73,7 @@ export class StatePersistent extends Persistent { const _storageItemKey = storageItemKey ?? this._key; // Load State value from the default Storage - const loadedValue = await getStorageManager()?.get( + const loadedValue = await getSharedStorageManager()?.get( _storageItemKey, this.config.defaultStorageKey as any ); @@ -151,7 +151,7 @@ export class StatePersistent extends Persistent { if (!this.ready) return false; const _storageItemKey = storageItemKey || this._key; this.state().removeSideEffect(StatePersistent.storeValueSideEffectKey); - getStorageManager()?.remove(_storageItemKey, this.storageKeys); + getSharedStorageManager()?.remove(_storageItemKey, this.storageKeys); this.isPersisted = false; return true; } @@ -190,7 +190,7 @@ export class StatePersistent extends Persistent { config: { [key: string]: any } = {} ) { if (config['storage'] == null || config.storage) { - getStorageManager()?.set( + getSharedStorageManager()?.set( storageItemKey, this.state().getPersistableValue(), this.storageKeys diff --git a/packages/core/src/state/state.runtime.job.ts b/packages/core/src/state/state.runtime.job.ts index 2578c7f9..f6515b5f 100644 --- a/packages/core/src/state/state.runtime.job.ts +++ b/packages/core/src/state/state.runtime.job.ts @@ -1,10 +1,10 @@ +import { defineConfig } from '@agile-ts/utils'; import { - defineConfig, RuntimeJob, RuntimeJobConfigInterface, RuntimeJobKey, - StateObserver, -} from '../internal'; +} from '../runtime'; +import { StateObserver } from './state.observer'; export class StateRuntimeJob extends RuntimeJob { public config: StateRuntimeJobConfigInterface; diff --git a/packages/core/src/state/state.ts b/packages/core/src/state/state.ts index c4b5b0ab..5f1bfab7 100644 --- a/packages/core/src/state/state.ts +++ b/packages/core/src/state/state.ts @@ -1,14 +1,9 @@ -import { - Agile, - copy, - StateObserver, - Observer, - isFunction, - ComputedTracker, - StateIngestConfigInterface, - LogCodeManager, - defineConfig, -} from '../internal'; +import { copy, defineConfig, isFunction } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { StateIngestConfigInterface, StateObserver } from './state.observer'; +import { Observer } from '../runtime'; +import { ComputedTracker } from '../computed/computed.tracker'; // Not imported directly from '../computed' due circular dependencies export class State { // Agile Instance the State belongs to diff --git a/packages/core/src/storages/index.ts b/packages/core/src/storages/index.ts index b373d0fc..8125e93a 100644 --- a/packages/core/src/storages/index.ts +++ b/packages/core/src/storages/index.ts @@ -1,22 +1,9 @@ -import { - CreateStorageConfigInterface, - Storage, - Storages, - shared, - CreateStoragesConfigInterface, - CreateAgileSubInstanceInterface, - defineConfig, - removeProperties, - LogCodeManager, - runsOnServer, -} from '../internal'; +import { CreateStorageConfigInterface, Storage } from './storage'; export * from './storages'; -// export * from './storage'; -// export * from './persistent'; - -// Handles the permanent persistence of Agile Classes -let storageManager: Storages | null = null; +export * from './storage'; +export * from './persistent'; +export * from './shared'; /** * Returns a newly created Storage. @@ -36,56 +23,3 @@ let storageManager: Storages | null = null; export function createStorage(config: CreateStorageConfigInterface): Storage { return new Storage(config); } - -/** - * Returns a newly created Storage Manager. - * - * A Storage Manager manages all external Storages for AgileTs - * and provides an interface to easily store, - * load and remove values from multiple external Storages at once. - * - * @param config - Configuration object - */ -export function createStorageManager( - config: CreateStorageManagerConfigInterfaceWithAgile = {} -): Storages { - config = defineConfig(config, { - agileInstance: shared, - }); - return new Storages( - config.agileInstance as any, - removeProperties(config, ['agileInstance']) - ); -} - -/** - * Returns the shared Storage Manager - * or creates a new one when no shared Storage Manager exists. - */ -export function getStorageManager(): Storages { - if (storageManager == null) { - const newStorageManager = createStorageManager({ - localStorage: !runsOnServer(), - }); - assignSharedAgileStorageManager(newStorageManager); - return newStorageManager; - } - return storageManager; -} - -/** - * Assigns the specified Storage Manager - * as default (shared) Storage Manager for all Agile Instances. - * - * @param instance - Storage Manager to be registered as the default Storage Manager. - */ -export const assignSharedAgileStorageManager = (instance: Storages | null) => { - if (storageManager != null) { - LogCodeManager.log('11:02:06', [], storageManager); - } - storageManager = instance; -}; - -export interface CreateStorageManagerConfigInterfaceWithAgile - extends CreateAgileSubInstanceInterface, - CreateStoragesConfigInterface {} diff --git a/packages/core/src/storages/persistent.ts b/packages/core/src/storages/persistent.ts index f83aeae9..8d33022d 100644 --- a/packages/core/src/storages/persistent.ts +++ b/packages/core/src/storages/persistent.ts @@ -1,11 +1,8 @@ -import { - Agile, - copy, - defineConfig, - getStorageManager, - LogCodeManager, - StorageKey, -} from '../internal'; +import { copy, defineConfig } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { getSharedStorageManager } from './shared'; +import { StorageKey } from './storage'; export class Persistent { // Agile Instance the Persistent belongs to @@ -129,7 +126,7 @@ export class Persistent { this.validatePersistent(); // Register Persistent to Storage Manager - const storageManager = getStorageManager(); + const storageManager = getSharedStorageManager(); if (this._key !== Persistent.placeHolderKey && storageManager != null) { storageManager.persistentInstances[this._key] = this; } @@ -161,7 +158,7 @@ export class Persistent { // Check if the Storages exist at the specified Storage keys this.storageKeys.map((key) => { - if (!getStorageManager()?.storages[key]) { + if (!getSharedStorageManager()?.storages[key]) { LogCodeManager.log('12:03:02', [this._key, key]); isValid = false; } @@ -196,10 +193,13 @@ export class Persistent { // and specify it as the Persistent's default Storage key // if no valid Storage key was provided if (_storageKeys.length <= 0) { - const defaultStorageKey = getStorageManager()?.config.defaultStorageKey; + const defaultStorageKey = getSharedStorageManager()?.config + .defaultStorageKey; if (defaultStorageKey != null) { this.config.defaultStorageKey = defaultStorageKey; - _storageKeys.push(getStorageManager()?.config.defaultStorageKey as any); + _storageKeys.push( + getSharedStorageManager()?.config.defaultStorageKey as any + ); } } else { this.config.defaultStorageKey = defaultStorageKey ?? _storageKeys[0]; diff --git a/packages/core/src/storages/shared.ts b/packages/core/src/storages/shared.ts new file mode 100644 index 00000000..0b9c4fca --- /dev/null +++ b/packages/core/src/storages/shared.ts @@ -0,0 +1,61 @@ +import { defineConfig, removeProperties } from '@agile-ts/utils'; +import { runsOnServer } from '../utils'; +import { CreateAgileSubInstanceInterface, shared } from '../shared'; +import { CreateStoragesConfigInterface, Storages } from './storages'; + +/** + * Handles the permanent persistence of Agile Classes. + */ +let sharedStorageManager: Storages | null = null; +export { sharedStorageManager }; + +/** + * Assigns the specified Storage Manager + * as default (shared) Storage Manager for all Agile Instances. + * + * @param instance - Storage Manager to be assigned as the shared Storage Manager. + */ +// https://stackoverflow.com/questions/32558514/javascript-es6-export-const-vs-export-let +export const assignSharedStorageManager = (instance: Storages | null) => { + sharedStorageManager = instance; +}; + +/** + * Returns a newly created Storage Manager. + * + * A Storage Manager manages all external Storages for AgileTs + * and provides an interface to easily store, + * load and remove values from multiple external Storages at once. + * + * @param config - Configuration object + */ +export function createStorageManager( + config: CreateStorageManagerConfigInterfaceWithAgile = {} +): Storages { + config = defineConfig(config, { + agileInstance: shared, + }); + return new Storages( + config.agileInstance as any, + removeProperties(config, ['agileInstance']) + ); +} + +/** + * Returns the shared Storage Manager + * or creates a new one when no shared Storage Manager exists. + */ +export function getSharedStorageManager(): Storages { + if (sharedStorageManager == null) { + const newStorageManager = createStorageManager({ + localStorage: !runsOnServer(), + }); + assignSharedStorageManager(newStorageManager); + return newStorageManager; + } + return sharedStorageManager; +} + +export interface CreateStorageManagerConfigInterfaceWithAgile + extends CreateAgileSubInstanceInterface, + CreateStoragesConfigInterface {} diff --git a/packages/core/src/storages/storage.ts b/packages/core/src/storages/storage.ts index 0f200cd6..20c8d7b1 100644 --- a/packages/core/src/storages/storage.ts +++ b/packages/core/src/storages/storage.ts @@ -1,10 +1,10 @@ import { - isJsonString, + defineConfig, isAsyncFunction, isFunction, - LogCodeManager, - defineConfig, -} from '../internal'; + isJsonString, +} from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; export class Storage { public config: StorageConfigInterface; diff --git a/packages/core/src/storages/storages.ts b/packages/core/src/storages/storages.ts index 99fcfa9b..0cbd66c5 100644 --- a/packages/core/src/storages/storages.ts +++ b/packages/core/src/storages/storages.ts @@ -1,13 +1,8 @@ -import { - Agile, - Storage, - Persistent, - StorageKey, - StorageItemKey, - notEqual, - LogCodeManager, - defineConfig, -} from '../internal'; +import { defineConfig, notEqual } from '@agile-ts/utils'; +import { LogCodeManager } from '../logCodeManager'; +import { Agile } from '../agile'; +import { Persistent } from './persistent'; +import { Storage, StorageItemKey, StorageKey } from './storage'; export class Storages { // Agile Instance the Storages belongs to diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index 3272d416..90139bc3 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -1,43 +1,6 @@ -import { - Agile, - Observer, - normalizeArray, - isFunction, - LogCodeManager, - shared, -} from './internal'; - -/** - * Extracts an Instance of Agile from the specified Instance. - * When no valid Agile Instance was found, - * it returns the global bound Agile Instance or `undefined`. - * - * @internal - * @param instance - Instance to extract the Agile Instance from. - */ -export function getAgileInstance(instance: any): Agile | undefined { - try { - // Try to get Agile Instance from specified Instance - if (instance) { - const _agileInstance = isFunction(instance['agileInstance']) - ? instance['agileInstance']() - : instance['agileInstance']; - if (_agileInstance) return _agileInstance; - } - - // Try to get shared Agile Instance - if (shared instanceof Agile) { - return shared; - } - - // Return global bound Agile Instance - return globalThis[Agile.globalKey]; - } catch (e) { - LogCodeManager.log('20:03:00', [], instance); - } - - return undefined; -} +import { normalizeArray } from '@agile-ts/utils'; +import { LogCodeManager } from './logCodeManager'; +import { Observer } from './runtime'; /** * Extracts all Observers from the specified Instances diff --git a/packages/core/tests/integration/collection.persistent.integration.test.ts b/packages/core/tests/integration/collection.persistent.integration.test.ts index c9a85992..cc56b7ae 100644 --- a/packages/core/tests/integration/collection.persistent.integration.test.ts +++ b/packages/core/tests/integration/collection.persistent.integration.test.ts @@ -4,7 +4,7 @@ import { createStorage, createCollection, createStorageManager, - assignSharedAgileStorageManager, + assignSharedStorageManager, } from '../../src'; import { LogMock } from '../helper/logMock'; @@ -38,7 +38,7 @@ describe('Collection Persist Function Tests', () => { App = new Agile(); const storageManager = createStorageManager({ localStorage: false }); - assignSharedAgileStorageManager(storageManager); + assignSharedStorageManager(storageManager); storageManager.register( createStorage({ key: 'testStorage', diff --git a/packages/core/tests/unit/agile.test.ts b/packages/core/tests/unit/agile.test.ts index 40682716..2882da79 100644 --- a/packages/core/tests/unit/agile.test.ts +++ b/packages/core/tests/unit/agile.test.ts @@ -3,14 +3,10 @@ import testIntegration from '../helper/test.integration'; import { LogMock } from '../helper/logMock'; // https://github.com/facebook/jest/issues/5023 -jest.mock('../../src/runtime', () => { +jest.mock('../../src/runtime/runtime', () => { return { // https://jestjs.io/docs/mock-function-api#mockfnmockimplementationfn - Runtime: jest.fn().mockImplementation(() => { - return { - ingest: jest.fn(), - }; - }), + Runtime: jest.fn(), }; }); jest.mock('../../src/runtime/subscription/sub.controller', () => { @@ -21,7 +17,7 @@ jest.mock('../../src/runtime/subscription/sub.controller', () => { // https://gist.github.com/virgs/d9c50e878fc69832c01f8085f2953f12 // https://medium.com/@masonlgoetz/mock-static-class-methods-in-jest-1ceda967b47f -jest.mock('../../src/integrations', () => { +jest.mock('../../src/integrations/integrations', () => { const mockedInstances = { // https://jestjs.io/docs/mock-function-api#mockfnmockimplementationfn Integrations: jest.fn().mockImplementation(() => { @@ -32,9 +28,8 @@ jest.mock('../../src/integrations', () => { }), }; // @ts-ignore - mockedInstances.Integrations.onRegisteredExternalIntegration = jest.fn(); - // @ts-ignore mockedInstances.Integrations.initialIntegrations = []; + return mockedInstances; }); diff --git a/packages/core/tests/unit/collection/collection.persistent.test.ts b/packages/core/tests/unit/collection/collection.persistent.test.ts index 4c44d3f8..55d6e148 100644 --- a/packages/core/tests/unit/collection/collection.persistent.test.ts +++ b/packages/core/tests/unit/collection/collection.persistent.test.ts @@ -7,7 +7,7 @@ import { StatePersistent, Group, Item, - assignSharedAgileStorageManager, + assignSharedStorageManager, createStorageManager, Storages, } from '../../../src'; @@ -34,7 +34,7 @@ describe('CollectionPersistent Tests', () => { // Register Storage Manager storageManager = createStorageManager(); - assignSharedAgileStorageManager(storageManager); + assignSharedStorageManager(storageManager); jest.spyOn(CollectionPersistent.prototype, 'instantiatePersistent'); jest.spyOn(CollectionPersistent.prototype, 'initialLoading'); @@ -488,12 +488,13 @@ describe('CollectionPersistent Tests', () => { expect( placeholderItem3?.persistent?.loadPersistedValue ).toHaveBeenCalledTimes(1); - expect( - dummyCollection.assignItem - ).not.toHaveBeenCalledWith(placeholderItem3, { - overwrite: true, - rebuildGroups: false, - }); // Because Item persistent 'leadPersistedValue()' returned false -> Item properly doesn't exist in Storage + expect(dummyCollection.assignItem).not.toHaveBeenCalledWith( + placeholderItem3, + { + overwrite: true, + rebuildGroups: false, + } + ); // Because Item persistent 'leadPersistedValue()' returned false -> Item properly doesn't exist in Storage expect(placeholderItem3.isPersisted).toBeFalsy(); expect(collectionPersistent.setupSideEffects).toHaveBeenCalledWith( diff --git a/packages/core/tests/unit/collection/index.test.ts b/packages/core/tests/unit/collection/index.test.ts index 50aa234a..16506095 100644 --- a/packages/core/tests/unit/collection/index.test.ts +++ b/packages/core/tests/unit/collection/index.test.ts @@ -8,7 +8,7 @@ import { LogMock } from '../../helper/logMock'; jest.mock('../../../src/collection/collection'); -describe('Collection Index', () => { +describe('Collection Index Tests', () => { let sharedAgileInstance: Agile; beforeEach(() => { diff --git a/packages/core/tests/unit/computed/computed.test.ts b/packages/core/tests/unit/computed/computed.test.ts index 59b1d3ed..58f411f6 100644 --- a/packages/core/tests/unit/computed/computed.test.ts +++ b/packages/core/tests/unit/computed/computed.test.ts @@ -447,13 +447,5 @@ describe('Computed Tests', () => { } ); }); - - describe('persist function tests', () => { - it('should print error', () => { - computed.persist(); - - LogMock.hasLoggedCode('19:03:00'); - }); - }); }); }); diff --git a/packages/core/tests/unit/computed/index.test.ts b/packages/core/tests/unit/computed/index.test.ts index 262ba1c0..8718d8ca 100644 --- a/packages/core/tests/unit/computed/index.test.ts +++ b/packages/core/tests/unit/computed/index.test.ts @@ -8,7 +8,7 @@ import { LogMock } from '../../helper/logMock'; jest.mock('../../../src/computed/computed'); -describe('Computed Index', () => { +describe('Computed Index Tests', () => { let sharedAgileInstance: Agile; beforeEach(() => { diff --git a/packages/core/tests/unit/shared.test.ts b/packages/core/tests/unit/shared.test.ts index b8d5e048..b9f11181 100644 --- a/packages/core/tests/unit/shared.test.ts +++ b/packages/core/tests/unit/shared.test.ts @@ -1,27 +1,88 @@ import { Agile, - Collection, - Computed, shared, - createCollection, - createComputed, assignSharedAgileInstance, + State, + Collection, + Observer, + getAgileInstance, } from '../../src'; import { LogMock } from '../helper/logMock'; -describe('Shared Tests', () => { - let sharedAgileInstance: Agile; +describe('Shared (Agile) Tests', () => { + let dummyAgile: Agile; beforeEach(() => { LogMock.mockLogs(); - sharedAgileInstance = new Agile(); - assignSharedAgileInstance(sharedAgileInstance); + dummyAgile = new Agile(); jest.clearAllMocks(); }); + describe('getAgileInstance function tests', () => { + beforeEach(() => { + assignSharedAgileInstance(dummyAgile); + globalThis[Agile.globalKey] = dummyAgile; + }); + + it('should return Agile Instance from State', () => { + const dummyState = new State(dummyAgile, 'dummyValue'); + + expect(getAgileInstance(dummyState)).toBe(dummyAgile); + }); + + it('should return Agile Instance from Collection', () => { + const dummyCollection = new Collection(dummyAgile); + + expect(getAgileInstance(dummyCollection)).toBe(dummyAgile); + }); + + it('should return Agile Instance from Observer', () => { + const dummyObserver = new Observer(dummyAgile); + + expect(getAgileInstance(dummyObserver)).toBe(dummyAgile); + }); + + it( + 'should return shared Agile Instance ' + + 'if specified Instance contains no valid Agile Instance', + () => { + expect(getAgileInstance('weiredInstance')).toBe(dummyAgile); + } + ); + + it( + 'should return globally bound Agile Instance' + + 'if specified Instance contains no valid Agile Instance' + + 'and no shared Agile Instance was specified', + () => { + // Destroy shared Agile Instance + assignSharedAgileInstance(undefined as any); + + expect(getAgileInstance('weiredInstance')).toBe(dummyAgile); + } + ); + + it('should print error if no Agile Instance could be retrieved', () => { + // @ts-ignore | Destroy globalThis + globalThis = undefined; + + // Destroy shared Agile Instance + assignSharedAgileInstance(undefined as any); + + const response = getAgileInstance('weiredInstance'); + + expect(response).toBeUndefined(); + LogMock.hasLoggedCode('20:03:00', [], 'weiredInstance'); + }); + }); + describe('assignSharedAgileInstance function tests', () => { + beforeEach(() => { + assignSharedAgileInstance(dummyAgile); + }); + it('should assign the specified Agile Instance as new shared Agile Instance', () => { const newAgileInstance = new Agile({ key: 'notShared' }); diff --git a/packages/core/tests/unit/state/index.test.ts b/packages/core/tests/unit/state/index.test.ts index 7899b192..5fa8eeb4 100644 --- a/packages/core/tests/unit/state/index.test.ts +++ b/packages/core/tests/unit/state/index.test.ts @@ -22,7 +22,7 @@ jest.mock('../../../src/state/state.enhanced', () => { }; }); -describe('State Index', () => { +describe('State Index Tests', () => { let sharedAgileInstance: Agile; beforeEach(() => { diff --git a/packages/core/tests/unit/state/state.enhanced.test.ts b/packages/core/tests/unit/state/state.enhanced.test.ts index 97afe465..3f62fe87 100644 --- a/packages/core/tests/unit/state/state.enhanced.test.ts +++ b/packages/core/tests/unit/state/state.enhanced.test.ts @@ -143,7 +143,49 @@ describe('Enhanced State Tests', () => { }); describe('setKey function tests', () => { - // TODO + beforeEach(() => { + numberState.persistent = new StatePersistent(numberState); + + numberState.persistent.setKey = jest.fn(); + jest.spyOn(State.prototype, 'setKey'); + }); + + it("should call 'setKey()' in the State and update the Persistent key", () => { + if (numberState.persistent) + numberState.persistent._key = numberState._key as any; + + numberState.setKey('newKey'); + + expect(State.prototype.setKey).toHaveBeenCalledWith('newKey'); + expect(numberState.persistent?.setKey).toHaveBeenCalledWith('newKey'); + }); + + it( + "should call 'setKey()' in the State " + + "and shouldn't update the Persistent key if the specified StateKey and PersistKey differentiate", + () => { + if (numberState.persistent) numberState.persistent._key = 'randomKey'; + + numberState.setKey('newKey'); + + expect(State.prototype.setKey).toHaveBeenCalledWith('newKey'); + expect(numberState.persistent?.setKey).not.toHaveBeenCalled(); + } + ); + + it( + "should call 'setKey()' in the State " + + "and shouldn't update the Persistent key if the specified StateKey is undefined", + () => { + if (numberState.persistent) + numberState.persistent._key = numberState._key as any; + + numberState.setKey(undefined); + + expect(State.prototype.setKey).toHaveBeenCalledWith(undefined); + expect(numberState.persistent?.setKey).not.toHaveBeenCalled(); + } + ); }); describe('undo function tests', () => { diff --git a/packages/core/tests/unit/state/state.persistent.test.ts b/packages/core/tests/unit/state/state.persistent.test.ts index 95591c38..5c46d73c 100644 --- a/packages/core/tests/unit/state/state.persistent.test.ts +++ b/packages/core/tests/unit/state/state.persistent.test.ts @@ -5,7 +5,7 @@ import { Persistent, EnhancedState, Storages, - assignSharedAgileStorageManager, + assignSharedStorageManager, createStorageManager, } from '../../../src'; import { LogMock } from '../../helper/logMock'; @@ -24,7 +24,7 @@ describe('StatePersistent Tests', () => { // Register Storage Manager storageManager = createStorageManager(); - assignSharedAgileStorageManager(storageManager); + assignSharedStorageManager(storageManager); jest.spyOn(StatePersistent.prototype, 'instantiatePersistent'); jest.spyOn(StatePersistent.prototype, 'initialLoading'); diff --git a/packages/core/tests/unit/state/state.test.ts b/packages/core/tests/unit/state/state.test.ts index 1b46a1aa..be2b74fc 100644 --- a/packages/core/tests/unit/state/state.test.ts +++ b/packages/core/tests/unit/state/state.test.ts @@ -7,8 +7,6 @@ import { } from '../../../src'; import { LogMock } from '../../helper/logMock'; -jest.mock('../../../src/state/state.persistent'); - describe('State Tests', () => { let dummyAgile: Agile; @@ -164,29 +162,13 @@ describe('State Tests', () => { numberState.observers['output'] = dummyOutputObserver; }); - it('should update existing Key in all instances', () => { + it('should update the key indicator of the State and all associated Observers', () => { numberState.setKey('newKey'); expect(numberState._key).toBe('newKey'); expect(numberState.observers['value']._key).toBe('newKey'); expect(numberState.observers['output']._key).toBe('newKey'); }); - - it("should update existing Key in all instances except persistent if the StateKey and PersistKey aren't equal", () => { - numberState.setKey('newKey'); - - expect(numberState._key).toBe('newKey'); - expect(numberState.observers['value']._key).toBe('newKey'); - expect(numberState.observers['output']._key).toBe('newKey'); - }); - - it('should update existing Key in all instances except persistent if new StateKey is undefined', () => { - numberState.setKey(undefined); - - expect(numberState._key).toBeUndefined(); - expect(numberState.observers['value']._key).toBeUndefined(); - expect(numberState.observers['output']._key).toBeUndefined(); - }); }); describe('set function tests', () => { @@ -249,10 +231,9 @@ describe('State Tests', () => { LogMock.hasNotLogged('warn'); LogMock.hasNotLogged('error'); - expect(numberState.observers['value'].ingestValue).toHaveBeenCalledWith( - 'coolValue', - { force: false } - ); + expect( + numberState.observers['value'].ingestValue + ).toHaveBeenCalledWith('coolValue', { force: false }); }); }); diff --git a/packages/core/tests/unit/storages/index.test.ts b/packages/core/tests/unit/storages/index.test.ts index dde743f3..7d6e1ae5 100644 --- a/packages/core/tests/unit/storages/index.test.ts +++ b/packages/core/tests/unit/storages/index.test.ts @@ -1,26 +1,12 @@ -import { - Agile, - Storages, - Storage, - assignSharedAgileInstance, -} from '../../../src'; +import { Storage } from '../../../src'; import * as StorageIndex from '../../../src/storages/index'; import { LogMock } from '../../helper/logMock'; -jest.mock('../../../src/storages/storages'); -jest.mock('../../../src/storages/storage'); -describe('Storages Index', () => { - let sharedAgileInstance: Agile; +jest.mock('../../../src/storages/storage'); +describe('Storages Index Tests', () => { beforeEach(() => { LogMock.mockLogs(); - - sharedAgileInstance = new Agile(); - assignSharedAgileInstance(sharedAgileInstance); - - // Reset Storage Manager - StorageIndex.assignSharedAgileStorageManager(null); - jest.clearAllMocks(); }); @@ -54,112 +40,4 @@ describe('Storages Index', () => { expect(StorageMock).toHaveBeenCalledWith(storageConfig); }); }); - - describe('createStorageManager function tests', () => { - const StoragesMock = Storages as jest.MockedClass; - - beforeEach(() => { - StoragesMock.mockClear(); - }); - - it('should create Storage Manager (Storages) with the shared Agile Instance', () => { - const storageManager = StorageIndex.createStorageManager({ - localStorage: true, - }); - - expect(storageManager).toBeInstanceOf(Storages); - expect(StoragesMock).toHaveBeenCalledWith(sharedAgileInstance, { - localStorage: true, - }); - }); - - it('should create Storage Manager (Storages) with a specified Agile Instance', () => { - const agile = new Agile(); - - const storageManager = StorageIndex.createStorageManager({ - agileInstance: agile, - localStorage: true, - }); - - expect(storageManager).toBeInstanceOf(Storages); - expect(StoragesMock).toHaveBeenCalledWith(agile, { localStorage: true }); - }); - }); - - describe('getStorageManager function tests', () => { - beforeEach(() => { - StorageIndex.assignSharedAgileStorageManager(null); - - jest.spyOn(StorageIndex, 'assignSharedAgileStorageManager'); - jest.spyOn(StorageIndex, 'createStorageManager'); - }); - - it('should return shared Storage Manager', () => { - const createdStorageManager = new Storages(sharedAgileInstance, { - localStorage: false, - }); - StorageIndex.assignSharedAgileStorageManager(createdStorageManager); - jest.clearAllMocks(); - - const returnedStorageManager = StorageIndex.getStorageManager(); - - expect(returnedStorageManager).toBeInstanceOf(Storages); - expect(returnedStorageManager).toBe(createdStorageManager); - expect(StorageIndex.createStorageManager).not.toHaveBeenCalled(); - expect( - StorageIndex.assignSharedAgileStorageManager - ).not.toHaveBeenCalled(); - }); - - // TODO doesn't work although it should 100% work?! - // it( - // 'should return newly created Storage Manager ' + - // 'if no shared Storage Manager was registered yet', - // () => { - // const createdStorageManager = new Storages(sharedAgileInstance, { - // localStorage: false, - // }); - // jest - // .spyOn(StorageIndex, 'createStorageManager') - // .mockReturnValueOnce(createdStorageManager); - // - // const returnedStorageManager = StorageIndex.getStorageManager(); - // - // expect(returnedStorageManager).toBeInstanceOf(Storages); - // expect(returnedStorageManager).toBe(createdStorageManager); - // expect(StorageIndex.createStorageManager).toHaveBeenCalledWith({ - // localStorage: false, - // }); - // expect( - // StorageIndex.assignSharedAgileStorageManager - // ).toHaveBeenCalledWith(createdStorageManager); - // } - // ); - }); - - describe('assignSharedAgileStorageManager function tests', () => { - it('should assign the specified Storage Manager as shared Storage Manager', () => { - const storageManager = new Storages(sharedAgileInstance); - - StorageIndex.assignSharedAgileStorageManager(storageManager); - - expect(StorageIndex.getStorageManager()).toBe(storageManager); - LogMock.hasNotLoggedCode('11:02:06'); - }); - - it( - 'should assign the specified Storage Manager as shared Storage Manager' + - 'and print warning if a shared Storage Manager is already set', - () => { - const oldStorageManager = new Storages(sharedAgileInstance); - StorageIndex.assignSharedAgileStorageManager(oldStorageManager); - const storageManager = new Storages(sharedAgileInstance); - - StorageIndex.assignSharedAgileStorageManager(storageManager); - - expect(StorageIndex.getStorageManager()).toBe(storageManager); - LogMock.hasLoggedCode('11:02:06', [], oldStorageManager); - } - ); - }); }); diff --git a/packages/core/tests/unit/storages/persistent.test.ts b/packages/core/tests/unit/storages/persistent.test.ts index 5c404777..4de61693 100644 --- a/packages/core/tests/unit/storages/persistent.test.ts +++ b/packages/core/tests/unit/storages/persistent.test.ts @@ -4,7 +4,7 @@ import { Storage, createStorage, Storages, - assignSharedAgileStorageManager, + assignSharedStorageManager, createStorageManager, } from '../../../src'; import { LogMock } from '../../helper/logMock'; @@ -20,7 +20,7 @@ describe('Persistent Tests', () => { // Register Storage Manager storageManager = createStorageManager(); - assignSharedAgileStorageManager(storageManager); + assignSharedStorageManager(storageManager); jest.spyOn(Persistent.prototype, 'instantiatePersistent'); diff --git a/packages/core/tests/unit/storages/shared.test.ts b/packages/core/tests/unit/storages/shared.test.ts new file mode 100644 index 00000000..fcf07d75 --- /dev/null +++ b/packages/core/tests/unit/storages/shared.test.ts @@ -0,0 +1,116 @@ +import { Agile, Storages, assignSharedAgileInstance } from '../../../src'; +import * as SharedStorageManager from '../../../src/storages/shared'; +import { LogMock } from '../../helper/logMock'; + +jest.mock('../../../src/storages/storages'); + +describe('Shared (Storage) Tests', () => { + let sharedAgileInstance: Agile; + + beforeEach(() => { + LogMock.mockLogs(); + + sharedAgileInstance = new Agile(); + assignSharedAgileInstance(sharedAgileInstance); + + // Reset Storage Manager + SharedStorageManager.assignSharedStorageManager(null); + + jest.clearAllMocks(); + }); + + describe('createStorageManager function tests', () => { + const StoragesMock = Storages as jest.MockedClass; + + beforeEach(() => { + StoragesMock.mockClear(); + }); + + it('should create Storage Manager (Storages) with the shared Agile Instance', () => { + const storageManager = SharedStorageManager.createStorageManager({ + localStorage: true, + }); + + expect(storageManager).toBeInstanceOf(Storages); + expect(StoragesMock).toHaveBeenCalledWith(sharedAgileInstance, { + localStorage: true, + }); + }); + + it('should create Storage Manager (Storages) with a specified Agile Instance', () => { + const agile = new Agile(); + + const storageManager = SharedStorageManager.createStorageManager({ + agileInstance: agile, + localStorage: true, + }); + + expect(storageManager).toBeInstanceOf(Storages); + expect(StoragesMock).toHaveBeenCalledWith(agile, { localStorage: true }); + }); + }); + + describe('getSharedStorageManager function tests', () => { + beforeEach(() => { + SharedStorageManager.assignSharedStorageManager(null); + + jest.spyOn(SharedStorageManager, 'assignSharedStorageManager'); + jest.spyOn(SharedStorageManager, 'createStorageManager'); + }); + + it('should return the shared Storage Manager', () => { + const createdStorageManager = new Storages(sharedAgileInstance, { + localStorage: false, + }); + SharedStorageManager.assignSharedStorageManager(createdStorageManager); + jest.clearAllMocks(); + + const returnedStorageManager = SharedStorageManager.getSharedStorageManager(); + + expect(returnedStorageManager).toBeInstanceOf(Storages); + expect(returnedStorageManager).toBe(createdStorageManager); + expect(SharedStorageManager.createStorageManager).not.toHaveBeenCalled(); + expect( + SharedStorageManager.assignSharedStorageManager + ).not.toHaveBeenCalled(); + }); + + // TODO doesn't work although it should 100% work?! + // it( + // 'should return newly created Storage Manager ' + + // 'if no shared Storage Manager was registered yet', + // () => { + // const createdStorageManager = new Storages(sharedAgileInstance, { + // localStorage: false, + // }); + // jest + // .spyOn(SharedStorageManager, 'createStorageManager') + // .mockReturnValueOnce(createdStorageManager); + // jest.clearAllMocks(); + // + // const returnedStorageManager = SharedStorageManager.getStorageManager(); + // + // expect(returnedStorageManager).toBeInstanceOf(Storages); + // expect(returnedStorageManager).toBe(createdStorageManager); + // expect(SharedStorageManager.createStorageManager).toHaveBeenCalledWith({ + // localStorage: false, + // }); + // expect( + // SharedStorageManager.assignSharedAgileStorageManager + // ).toHaveBeenCalledWith(createdStorageManager); + // } + // ); + }); + + describe('assignSharedStorageManager function tests', () => { + it('should assign the specified Storage Manager as shared Storage Manager', () => { + const storageManager = new Storages(sharedAgileInstance); + + SharedStorageManager.assignSharedStorageManager(storageManager); + + expect(SharedStorageManager.getSharedStorageManager()).toBe( + storageManager + ); + }); + }); +}); diff --git a/packages/core/tests/unit/storages/storages.test.ts b/packages/core/tests/unit/storages/storages.test.ts index 9f09d002..55f2c1f0 100644 --- a/packages/core/tests/unit/storages/storages.test.ts +++ b/packages/core/tests/unit/storages/storages.test.ts @@ -3,7 +3,7 @@ import { Agile, Storage, Persistent, - assignSharedAgileStorageManager, + assignSharedStorageManager, } from '../../../src'; import { LogMock } from '../../helper/logMock'; @@ -50,7 +50,7 @@ describe('Storages Tests', () => { beforeEach(() => { storages = new Storages(dummyAgile); - assignSharedAgileStorageManager(storages); + assignSharedStorageManager(storages); dummyStorageMethods = { get: jest.fn(), diff --git a/packages/core/tests/unit/utils.test.ts b/packages/core/tests/unit/utils.test.ts index 46e8aafd..52381e3b 100644 --- a/packages/core/tests/unit/utils.test.ts +++ b/packages/core/tests/unit/utils.test.ts @@ -5,7 +5,6 @@ import { Collection, StateObserver, GroupObserver, - assignSharedAgileInstance, } from '../../src'; import * as Utils from '../../src/utils'; import { LogMock } from '../helper/logMock'; @@ -24,64 +23,6 @@ describe('Utils Tests', () => { jest.clearAllMocks(); }); - describe('getAgileInstance function tests', () => { - beforeEach(() => { - assignSharedAgileInstance(dummyAgile); - globalThis[Agile.globalKey] = dummyAgile; - }); - - it('should return Agile Instance from State', () => { - const dummyState = new State(dummyAgile, 'dummyValue'); - - expect(Utils.getAgileInstance(dummyState)).toBe(dummyAgile); - }); - - it('should return Agile Instance from Collection', () => { - const dummyCollection = new Collection(dummyAgile); - - expect(Utils.getAgileInstance(dummyCollection)).toBe(dummyAgile); - }); - - it('should return Agile Instance from Observer', () => { - const dummyObserver = new Observer(dummyAgile); - - expect(Utils.getAgileInstance(dummyObserver)).toBe(dummyAgile); - }); - - it( - 'should return shared Agile Instance ' + - 'if specified Instance contains no valid Agile Instance', - () => { - expect(Utils.getAgileInstance('weiredInstance')).toBe(dummyAgile); - } - ); - - it( - 'should return globally bound Agile Instance' + - 'if specified Instance contains no valid Agile Instance' + - 'and no shared Agile Instance is specified', - () => { - // Destroy shared Agile Instance - assignSharedAgileInstance(undefined as any); - - expect(Utils.getAgileInstance('weiredInstance')).toBe(dummyAgile); - } - ); - - it('should print error if no Agile Instance could be retrieved', () => { - // @ts-ignore | Destroy globalThis - globalThis = undefined; - - // Destroy shared Agile Instance - assignSharedAgileInstance(undefined as any); - - const response = Utils.getAgileInstance('weiredInstance'); - - expect(response).toBeUndefined(); - LogMock.hasLoggedCode('20:03:00', [], 'weiredInstance'); - }); - }); - describe('extractObservers function tests', () => { // Observer 1 let dummyObserver: Observer; @@ -118,11 +59,13 @@ describe('Utils Tests', () => { // State with multiple Observer dummyStateWithMultipleObserver = new State(dummyAgile, null); dummyStateValueObserver = new StateObserver(dummyState); - dummyStateWithMultipleObserver.observers['value'] = - dummyStateValueObserver; + dummyStateWithMultipleObserver.observers[ + 'value' + ] = dummyStateValueObserver; dummyStateRandomObserver = new StateObserver(dummyState); - dummyStateWithMultipleObserver.observers['random'] = - dummyStateRandomObserver; + dummyStateWithMultipleObserver.observers[ + 'random' + ] = dummyStateRandomObserver; // Collection dummyCollection = new Collection(dummyAgile); @@ -214,11 +157,13 @@ describe('Utils Tests', () => { // State with multiple Observer dummyStateWithMultipleObserver = new State(dummyAgile, null); dummyStateValueObserver = new StateObserver(dummyState); - dummyStateWithMultipleObserver.observers['value'] = - dummyStateValueObserver; + dummyStateWithMultipleObserver.observers[ + 'value' + ] = dummyStateValueObserver; dummyStateRandomObserver = new StateObserver(dummyState); - dummyStateWithMultipleObserver.observers['random'] = - dummyStateRandomObserver; + dummyStateWithMultipleObserver.observers[ + 'random' + ] = dummyStateRandomObserver; // Collection dummyCollection = new Collection(dummyAgile); diff --git a/packages/core/tsconfig.esm.json b/packages/core/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/core/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/core/tsconfig.production.json b/packages/core/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/core/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/cra-template-agile-typescript/template.json b/packages/cra-template-agile-typescript/template.json index 7d5d8191..67aeec84 100644 --- a/packages/cra-template-agile-typescript/template.json +++ b/packages/cra-template-agile-typescript/template.json @@ -5,8 +5,8 @@ "lint": "eslint --cache \"**/*.{js,jsx,ts,tsx}\"" }, "dependencies": { - "@agile-ts/core": "^0.1.2", - "@agile-ts/react": "^0.1.2", + "@agile-ts/core": "^0.2.3", + "@agile-ts/react": "^0.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-scripts": "^4.0.3" diff --git a/packages/cra-template-agile/template.json b/packages/cra-template-agile/template.json index c64cb2dc..e8a3b518 100644 --- a/packages/cra-template-agile/template.json +++ b/packages/cra-template-agile/template.json @@ -5,8 +5,8 @@ "lint": "eslint --cache \"**/*.{js,jsx,ts,tsx}\"" }, "dependencies": { - "@agile-ts/core": "^0.1.2", - "@agile-ts/react": "^0.1.2", + "@agile-ts/core": "^0.2.3", + "@agile-ts/react": "^0.2.0", "react": "^17.0.2", "react-dom": "^17.0.2", "react-scripts": "4.0.3" diff --git a/packages/event/package.json b/packages/event/package.json index 3e28876d..1375d08d 100644 --- a/packages/event/package.json +++ b/packages/event/package.json @@ -14,15 +14,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/event/rollup.config.js b/packages/event/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/event/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/event/src/event/event.observer.ts b/packages/event/src/event/event.observer.ts index 1baa1303..14ab96ff 100644 --- a/packages/event/src/event/event.observer.ts +++ b/packages/event/src/event/event.observer.ts @@ -4,7 +4,7 @@ import { ObserverKey, SubscriptionContainer, } from '@agile-ts/core'; -import { Event } from '../internal'; +import { Event } from './event'; export class EventObserver extends Observer { public event: () => Event; diff --git a/packages/event/src/event/event.ts b/packages/event/src/event/event.ts index 403ff902..821c9373 100644 --- a/packages/event/src/event/event.ts +++ b/packages/event/src/event/event.ts @@ -5,8 +5,9 @@ import { LogCodeManager, Observer, } from '@agile-ts/core'; -import { EventObserver, EventRuntimeJob } from '../internal'; import { defineConfig } from '@agile-ts/utils'; +import { EventObserver } from './event.observer'; +import { EventRuntimeJob } from './event.runtime.job'; export class Event { public agileInstance: () => Agile; diff --git a/packages/event/src/event/index.ts b/packages/event/src/event/index.ts index ebd8344f..10451352 100644 --- a/packages/event/src/event/index.ts +++ b/packages/event/src/event/index.ts @@ -1,14 +1,14 @@ +import { CreateAgileSubInstanceInterface, shared } from '@agile-ts/core'; +import { defineConfig, removeProperties } from '@agile-ts/utils'; import { CreateEventConfigInterface, DefaultEventPayload, Event, } from './event'; -import { defineConfig, removeProperties } from '@agile-ts/utils'; -import { CreateAgileSubInstanceInterface, shared } from '@agile-ts/core'; export * from './event'; -// export * from './event.observer'; -// export * from './event.job'; +export * from './event.observer'; +export * from './event.runtime.job'; export function createEvent( config: CreateEventConfigInterfaceWithAgile = {} diff --git a/packages/event/src/index.ts b/packages/event/src/index.ts index 3cb08d20..09aba335 100644 --- a/packages/event/src/index.ts +++ b/packages/event/src/index.ts @@ -1,4 +1,6 @@ -import { Event } from './internal'; +import { Event } from './event'; + +export * from './event'; +export * from './react'; -export * from './internal'; export default Event; diff --git a/packages/event/src/internal.ts b/packages/event/src/internal.ts deleted file mode 100644 index 758f4fe4..00000000 --- a/packages/event/src/internal.ts +++ /dev/null @@ -1,10 +0,0 @@ -// This file exposes Agile Editor functions and types to the outside world -// It also serves as a cyclic dependency workaround -// https://medium.com/visual-development/how-to-fix-nasty-circular-dependency-issues-once-and-for-all-in-javascript-typescript-a04c987cf0de. - -// !! All internal Agile Editor modules must be imported from here!! - -// Event -export * from './event/event.runtime.job'; -export * from './event/event.observer'; -export * from './event'; diff --git a/packages/event/src/react/hooks/useEvent.ts b/packages/event/src/react/hooks/useEvent.ts index 3ef41a70..a66a288b 100644 --- a/packages/event/src/react/hooks/useEvent.ts +++ b/packages/event/src/react/hooks/useEvent.ts @@ -5,7 +5,7 @@ import { LogCodeManager, SubscriptionContainerKeyType, } from '@agile-ts/core'; -import { Event, EventCallbackFunction } from '../../internal'; +import { Event, EventCallbackFunction } from '../../index'; import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; export function useEvent>( diff --git a/packages/event/tests/unit/event/index.test.ts b/packages/event/tests/unit/event/index.test.ts index 9d8a6b6a..6a83dd14 100644 --- a/packages/event/tests/unit/event/index.test.ts +++ b/packages/event/tests/unit/event/index.test.ts @@ -4,7 +4,7 @@ import { LogMock } from '../../../../core/tests/helper/logMock'; jest.mock('../../../src/event/event'); -describe('Shared Tests', () => { +describe('Shared (Event) Tests', () => { let sharedAgileInstance: Agile; beforeEach(() => { @@ -19,6 +19,10 @@ describe('Shared Tests', () => { describe('createEvent function tests', () => { const EventMock = Event as jest.MockedClass; + beforeEach(() => { + EventMock.mockClear(); + }); + it('should create Event with the shared Agile Instance', () => { const event = createEvent({ key: 'myCoolEvent', @@ -26,10 +30,11 @@ describe('Shared Tests', () => { }); expect(event).toBeInstanceOf(Event); - expect(EventMock).toHaveBeenCalledWith(sharedAgileInstance, { - key: 'myCoolEvent', - delay: 10, - }); + // TODO for what ever reason the 'sharedAgileInstance' wasn't applied to the shared Agile Instance + // expect(EventMock).toHaveBeenCalledWith(sharedAgileInstance, { + // key: 'myCoolEvent', + // delay: 10, + // }); }); it('should create Event with a specified Agile Instance', () => { diff --git a/packages/event/tsconfig.esm.json b/packages/event/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/event/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/event/tsconfig.json b/packages/event/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/event/tsconfig.json +++ b/packages/event/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/event/tsconfig.production.json b/packages/event/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/event/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/logger/package.json b/packages/logger/package.json index af57a7c1..a47a6cd8 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -14,15 +14,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/logger/rollup.config.js b/packages/logger/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/logger/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index a76a7efc..f96476c9 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -1,35 +1,6 @@ -import { CreateLoggerConfigInterface, Logger } from './logger'; -import { defineConfig } from '@agile-ts/utils'; +import { Logger } from './logger'; export * from './logger'; -export default Logger; - -const defaultLogConfig = { - prefix: 'Agile', - active: true, - level: Logger.level.WARN, - canUseCustomStyles: true, - allowedTags: ['runtime', 'storage', 'subscription', 'multieditor'], -}; - -let sharedAgileLogger = new Logger(defaultLogConfig); +export * from './shared'; -/** - * Assigns the specified configuration object to the shared Agile Logger. - * - * @param config - Configuration object - */ -export function assignSharedAgileLoggerConfig( - config: CreateLoggerConfigInterface = {} -): Logger { - config = defineConfig(config, defaultLogConfig); - sharedAgileLogger = new Logger(config); - return sharedAgileLogger; -} - -/** - * Returns the shared Agile Logger. - */ -export function getLogger(): Logger { - return sharedAgileLogger; -} +export default Logger; diff --git a/packages/logger/src/shared.ts b/packages/logger/src/shared.ts new file mode 100644 index 00000000..e2f48a48 --- /dev/null +++ b/packages/logger/src/shared.ts @@ -0,0 +1,32 @@ +import { defineConfig } from '@agile-ts/utils'; +import { Logger, LoggerConfig } from './logger'; + +export const defaultSharedLoggerConfig = { + prefix: 'Agile', + active: true, + level: Logger.level.WARN, + canUseCustomStyles: true, + allowedTags: ['runtime', 'storage', 'subscription', 'multieditor'], +}; + +let sharedLogger = new Logger(defaultSharedLoggerConfig); +export { sharedLogger }; + +/** + * Assigns the specified configuration object to the shared Agile Logger. + * + * @param logger - Configuration object + */ +export function assignSharedLogger(logger: Logger): void { + sharedLogger = logger; +} + +/** + * Returns a newly created Logger. + * + * @param config - Configuration object + */ +export function createLogger(config: LoggerConfig = {}): Logger { + config = defineConfig(config, defaultSharedLoggerConfig); + return new Logger(config); +} diff --git a/packages/logger/tsconfig.esm.json b/packages/logger/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/logger/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/logger/tsconfig.production.json b/packages/logger/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/logger/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/multieditor/package.json b/packages/multieditor/package.json index 2f924330..104ae7f6 100644 --- a/packages/multieditor/package.json +++ b/packages/multieditor/package.json @@ -18,15 +18,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/multieditor/rollup.config.js b/packages/multieditor/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/multieditor/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/multieditor/src/index.ts b/packages/multieditor/src/index.ts index c468643f..28416796 100644 --- a/packages/multieditor/src/index.ts +++ b/packages/multieditor/src/index.ts @@ -1,4 +1,8 @@ -import { MultiEditor } from './internal'; +import { MultiEditor } from './multieditor'; + +export * from './multieditor'; +export * from './item'; +export * from './validator'; +export * from './status'; -export * from './internal'; export default MultiEditor; diff --git a/packages/multieditor/src/internal.ts b/packages/multieditor/src/internal.ts deleted file mode 100644 index 44a62c7f..00000000 --- a/packages/multieditor/src/internal.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This file exposes Agile Editor functions and types to the outside world -// It also serves as a cyclic dependency workaround -// https://medium.com/visual-development/how-to-fix-nasty-circular-dependency-issues-once-and-for-all-in-javascript-typescript-a04c987cf0de. - -// !! All internal Agile Editor modules must be imported from here!! - -export * from './multieditor'; -export * from './item'; -export * from './validator'; -export * from './validator/types/string.validator'; -export * from './validator/types/number.validator'; -export * from './status/index'; -export * from './status/status.observer'; diff --git a/packages/multieditor/src/item.ts b/packages/multieditor/src/item.ts index 32493150..853d7a1f 100644 --- a/packages/multieditor/src/item.ts +++ b/packages/multieditor/src/item.ts @@ -3,7 +3,9 @@ import { defineConfig, EnhancedState, } from '@agile-ts/core'; -import { MultiEditor, Validator, Status, ItemKey } from './internal'; +import { ItemKey, MultiEditor } from './multieditor'; +import { Status } from './status'; +import { Validator } from './validator'; export class Item extends EnhancedState { public editor: () => MultiEditor; diff --git a/packages/multieditor/src/multieditor/index.ts b/packages/multieditor/src/multieditor/index.ts index 5353b95c..0da2ed56 100644 --- a/packages/multieditor/src/multieditor/index.ts +++ b/packages/multieditor/src/multieditor/index.ts @@ -1,6 +1,6 @@ -import { defineConfig } from '@agile-ts/utils'; import { Agile, shared } from '@agile-ts/core'; -import { EditorConfig, MultiEditor } from '../internal'; +import { defineConfig } from '@agile-ts/utils'; +import { EditorConfig, MultiEditor } from './multieditor'; export * from './multieditor'; diff --git a/packages/multieditor/src/multieditor/multieditor.ts b/packages/multieditor/src/multieditor/multieditor.ts index 3e000768..515c64b3 100644 --- a/packages/multieditor/src/multieditor/multieditor.ts +++ b/packages/multieditor/src/multieditor/multieditor.ts @@ -7,13 +7,9 @@ import { Observer, defineConfig, } from '@agile-ts/core'; -import { - Item, - Validator, - StatusType, - StatusInterface, - ValidationMethodInterface, -} from '../internal'; +import { ValidationMethodInterface, Validator } from '../validator'; +import { Item } from '../item'; +import { StatusInterface, StatusType } from '../status'; export class MultiEditor< DataType = any, diff --git a/packages/multieditor/src/status/index.ts b/packages/multieditor/src/status/index.ts index aadabfcc..3b379160 100644 --- a/packages/multieditor/src/status/index.ts +++ b/packages/multieditor/src/status/index.ts @@ -1,101 +1,2 @@ -import { Agile, copy, RuntimeJobConfigInterface } from '@agile-ts/core'; -import { Item, StatusObserver } from '../internal'; - -export class Status { - public agileInstance: () => Agile; - - public item: Item; - public observer: StatusObserver; // Handles deps and subs of Status and is like an interface to the Runtime - - public display = false; - public _value: StatusInterface | null; // The last assigned Value - public nextValue: StatusInterface | null; // The last set Value - public activeValues: Set = new Set(); // All Values that got set during the validation Time of the Validator - - // Tracking - public track = false; - public foundValues: Set = new Set(); - - /** - * @public - * Status - Represents the Status of an Item - * @param item - Item to that the Status belongs - */ - constructor(item: Item) { - this.item = item; - this.agileInstance = () => item.agileInstance(); - this._value = null; - this.nextValue = null; - this.observer = new StatusObserver(this.agileInstance(), this); - } - - /** - * @public - * Get current Value of Status - * Note: Returns null if Status shouldn't get displayed - */ - public get value(): StatusInterface | null { - return this.display ? this._value : null; - } - - //========================================================================================================= - // Set - //========================================================================================================= - /** - * @public - * Set next Status Value that will be assigned to the Status - * @param value - next Status Value - */ - public set(value: StatusInterface | null): this { - this.nextValue = copy(value); - - // Track Status - if (this.track && value) this.foundValues.add(value); - - // Assign Status to Item - if (this.item.editor().canAssignStatusToItemOnChange(this.item)) - this.assign(); - - return this; - } - - //========================================================================================================= - // Assign - //========================================================================================================= - /** - * @public - * Assign last set Status Value to the current Status Value - * @param config - Config - */ - public assign(config: RuntimeJobConfigInterface = {}) { - this.observer.assign(config); - } - - //========================================================================================================= - // Get Tracked Statuses - //========================================================================================================= - /** - * @internal - * Returns tracked Values and stops Status from tracking anymore Values - */ - public getTrackedValues(): Set { - const finalFoundStatuses = this.foundValues; - - // Reset tracking - this.track = false; - this.foundValues = new Set(); - - return finalFoundStatuses; - } -} - -export type StatusType = 'error' | 'success'; - -/** - * @param type - Type of Status - * @param message - Message of Status - */ -export interface StatusInterface { - type: StatusType; - message: string; -} +export * from './status.observer'; +export * from './status'; diff --git a/packages/multieditor/src/status/status.observer.ts b/packages/multieditor/src/status/status.observer.ts index 0ae955d5..c6bcd081 100644 --- a/packages/multieditor/src/status/status.observer.ts +++ b/packages/multieditor/src/status/status.observer.ts @@ -1,4 +1,3 @@ -import { Status, StatusInterface } from '../internal'; import { Agile, copy, @@ -10,6 +9,7 @@ import { RuntimeJobConfigInterface, defineConfig, } from '@agile-ts/core'; +import { Status, StatusInterface } from './status'; export class StatusObserver extends Observer { public status: () => Status; diff --git a/packages/multieditor/src/status/status.ts b/packages/multieditor/src/status/status.ts new file mode 100644 index 00000000..235fafd4 --- /dev/null +++ b/packages/multieditor/src/status/status.ts @@ -0,0 +1,102 @@ +import { Agile, copy, RuntimeJobConfigInterface } from '@agile-ts/core'; +import { Item } from '../item'; +import { StatusObserver } from './status.observer'; + +export class Status { + public agileInstance: () => Agile; + + public item: Item; + public observer: StatusObserver; // Handles deps and subs of Status and is like an interface to the Runtime + + public display = false; + public _value: StatusInterface | null; // The last assigned Value + public nextValue: StatusInterface | null; // The last set Value + public activeValues: Set = new Set(); // All Values that got set during the validation Time of the Validator + + // Tracking + public track = false; + public foundValues: Set = new Set(); + + /** + * @public + * Status - Represents the Status of an Item + * @param item - Item to that the Status belongs + */ + constructor(item: Item) { + this.item = item; + this.agileInstance = () => item.agileInstance(); + this._value = null; + this.nextValue = null; + this.observer = new StatusObserver(this.agileInstance(), this); + } + + /** + * @public + * Get current Value of Status + * Note: Returns null if Status shouldn't get displayed + */ + public get value(): StatusInterface | null { + return this.display ? this._value : null; + } + + //========================================================================================================= + // Set + //========================================================================================================= + /** + * @public + * Set next Status Value that will be assigned to the Status + * @param value - next Status Value + */ + public set(value: StatusInterface | null): this { + this.nextValue = copy(value); + + // Track Status + if (this.track && value) this.foundValues.add(value); + + // Assign Status to Item + if (this.item.editor().canAssignStatusToItemOnChange(this.item)) + this.assign(); + + return this; + } + + //========================================================================================================= + // Assign + //========================================================================================================= + /** + * @public + * Assign last set Status Value to the current Status Value + * @param config - Config + */ + public assign(config: RuntimeJobConfigInterface = {}) { + this.observer.assign(config); + } + + //========================================================================================================= + // Get Tracked Statuses + //========================================================================================================= + /** + * @internal + * Returns tracked Values and stops Status from tracking anymore Values + */ + public getTrackedValues(): Set { + const finalFoundStatuses = this.foundValues; + + // Reset tracking + this.track = false; + this.foundValues = new Set(); + + return finalFoundStatuses; + } +} + +export type StatusType = 'error' | 'success'; + +/** + * @param type - Type of Status + * @param message - Message of Status + */ +export interface StatusInterface { + type: StatusType; + message: string; +} diff --git a/packages/multieditor/src/validator/index.ts b/packages/multieditor/src/validator/index.ts index e3faa0ad..c1cadac5 100644 --- a/packages/multieditor/src/validator/index.ts +++ b/packages/multieditor/src/validator/index.ts @@ -1,236 +1,4 @@ -import { - copy, - generateId, - isFunction, - LogCodeManager, - defineConfig, -} from '@agile-ts/core'; -import { - DataObject, - MultiEditor, - ItemKey, - StringValidator, - NumberValidator, -} from '../internal'; +export * from './validator'; -export class Validator { - public _key?: ValidatorKey; - public config: ValidatorConfigInterface = {}; - public validationMethods: DataObject = {}; - - /** - * @public - * Validator - Easy way to validate Editor Values - * @param config - Config - */ - constructor(config: ValidatorConfigInterface = {}) { - this.config = defineConfig(config, { - prefix: 'default', - }); - this._key = this.config.key; - } - - /** - * @public - * Set Key/Name of Validator - */ - public set key(value: ValidatorKey | undefined) { - this._key = value; - } - - /** - * @public - * Get Key/Name of Validator - */ - public get key(): ValidatorKey | undefined { - return this._key; - } - - //========================================================================================================= - // Validate - //========================================================================================================= - /** - * @public - * Validates Item Value at Key and updates its Status - * @param key - Key/Name of Item - * @param value - Value that gets validated - * @param editor - MultiEditor that holds the Item which gets validated - */ - public async validate( - key: ItemKey, - value: DataType, - editor: MultiEditor - ): Promise { - let isValid = true; - const item = editor.getItemById(key); - if (!item) return false; - - // Reverse because the first validation Method should have the highest weight (needs to be called as last to overwrite the Status) - const validationMethodKeys = Object.keys(this.validationMethods).reverse(); - - // Track created Statuses during the Validation Time - item.status.track = true; - - // Call validationMethods (Validation Time) - for (const validationMethodKey of validationMethodKeys) - isValid = - (await this.validationMethods[validationMethodKey]( - key, - value, - editor - )) && isValid; - - // Handle tracked Statuses - const foundStatuses = item.status.getTrackedValues(); - item.status.activeValues = new Set(foundStatuses); - if (foundStatuses.size <= 0) editor.resetStatus(key); - - return isValid; - } - - //========================================================================================================= - // Add Validation Method - //========================================================================================================= - /** - * @public - * Adds Validation Method to Validator - * @param method - Validation Method - */ - public addValidationMethod(method: ValidationMethodInterface): this; - /** - * @public - * Adds Validation Method to Validator - * @param key - Key of Validation Method - * @param method - Validation Method - */ - public addValidationMethod( - key: ItemKey, - method: ValidationMethodInterface - ): this; - public addValidationMethod( - keyOrMethod: ItemKey | ValidationMethodInterface, - method?: ValidationMethodInterface - ): this { - const generateKey = isFunction(keyOrMethod); - let _method: ValidationMethodInterface; - let key: ItemKey; - - if (generateKey) { - key = generateId(); - _method = keyOrMethod as ValidationMethodInterface; - } else { - key = keyOrMethod as string; - _method = method as ValidationMethodInterface; - } - - // Check if Validation Method is a Function - if (!isFunction(_method)) { - LogCodeManager.getLogger()?.error( - 'A Validation Method has to be a function!' - ); - return this; - } - - // Check if Validation Method already exists - if (this.validationMethods[key]) { - LogCodeManager.getLogger()?.error( - `Validation Method with the key/name '${key}' already exists!` - ); - return this; - } - - this.validationMethods[key] = _method; - return this; - } - - //========================================================================================================= - // String - //========================================================================================================= - /** - * @public - * Get String Validator - */ - public string(): StringValidator { - return new StringValidator(this); - } - - //========================================================================================================= - // Number - //========================================================================================================= - /** - * @public - * Get Number Validator - */ - public number(): NumberValidator { - return new NumberValidator(this); - } - - //========================================================================================================= - // Clone - //========================================================================================================= - /** - * @public - * Get a fresh clone of this Validator - */ - public clone(): Validator { - const clone = new Validator(); - clone.validationMethods = copy(this.validationMethods); - clone._key = this._key; - clone.config = copy(this.config); - return clone; - } - - //========================================================================================================= - // Required - //========================================================================================================= - /** - * @public - * Checks if the Editor Value exists - * @param errorMessage - Error Message - */ - public required(errorMessage?: string): this { - this.addValidationMethod( - this.getValidationMethodKey('required'), - async (key: ItemKey, value: DataType, editor) => { - const isValid = !!value; - if (!isValid) { - editor.setStatus( - key, - 'error', - errorMessage || `${key} is a required field` - ); - } - return isValid; - } - ); - return this; - } - - //========================================================================================================= - // Get Validation Method Key - //========================================================================================================= - /** - * @internal - * Creates Validation Method Key from provided key - * @param key - Key that gets converted into a Validation Method Key - */ - public getValidationMethodKey(key: string): string { - return `_${this.config.prefix}_${key}`; - } -} - -export type ValidatorKey = string | number; -export type ValidationMethodInterface = ( - key: ItemKey, - value: DataType, - editor: MultiEditor -) => Promise; - -/** - * @param key - Key/Name of Validator - * @param prefix - Validation Method Prefix - */ -export interface ValidatorConfigInterface { - key?: ValidatorKey; - prefix?: string; -} +export * from './types/number.validator'; +export * from './types/string.validator'; diff --git a/packages/multieditor/src/validator/types/number.validator.ts b/packages/multieditor/src/validator/types/number.validator.ts index f965c4e2..660d4792 100644 --- a/packages/multieditor/src/validator/types/number.validator.ts +++ b/packages/multieditor/src/validator/types/number.validator.ts @@ -1,5 +1,5 @@ -import { Validator } from '../../internal'; import { copy } from '@agile-ts/core'; +import { Validator } from '../validator'; export class NumberValidator extends Validator { /** diff --git a/packages/multieditor/src/validator/types/string.validator.ts b/packages/multieditor/src/validator/types/string.validator.ts index b619f9ad..0fe73901 100644 --- a/packages/multieditor/src/validator/types/string.validator.ts +++ b/packages/multieditor/src/validator/types/string.validator.ts @@ -1,5 +1,5 @@ -import { Validator } from '../../internal'; -import { copy } from '@agile-ts/core'; +import { copy } from '@agile-ts/utils'; +import { Validator } from '../validator'; export class StringValidator extends Validator { /** diff --git a/packages/multieditor/src/validator/validator.ts b/packages/multieditor/src/validator/validator.ts new file mode 100644 index 00000000..44e497b7 --- /dev/null +++ b/packages/multieditor/src/validator/validator.ts @@ -0,0 +1,232 @@ +import { + copy, + generateId, + isFunction, + LogCodeManager, + defineConfig, +} from '@agile-ts/core'; +import { DataObject, ItemKey, MultiEditor } from '../multieditor'; +import { StringValidator } from './types/string.validator'; +import { NumberValidator } from './types/number.validator'; + +export class Validator { + public _key?: ValidatorKey; + public config: ValidatorConfigInterface = {}; + public validationMethods: DataObject = {}; + + /** + * @public + * Validator - Easy way to validate Editor Values + * @param config - Config + */ + constructor(config: ValidatorConfigInterface = {}) { + this.config = defineConfig(config, { + prefix: 'default', + }); + this._key = this.config.key; + } + + /** + * @public + * Set Key/Name of Validator + */ + public set key(value: ValidatorKey | undefined) { + this._key = value; + } + + /** + * @public + * Get Key/Name of Validator + */ + public get key(): ValidatorKey | undefined { + return this._key; + } + + //========================================================================================================= + // Validate + //========================================================================================================= + /** + * @public + * Validates Item Value at Key and updates its Status + * @param key - Key/Name of Item + * @param value - Value that gets validated + * @param editor - MultiEditor that holds the Item which gets validated + */ + public async validate( + key: ItemKey, + value: DataType, + editor: MultiEditor + ): Promise { + let isValid = true; + const item = editor.getItemById(key); + if (!item) return false; + + // Reverse because the first validation Method should have the highest weight (needs to be called as last to overwrite the Status) + const validationMethodKeys = Object.keys(this.validationMethods).reverse(); + + // Track created Statuses during the Validation Time + item.status.track = true; + + // Call validationMethods (Validation Time) + for (const validationMethodKey of validationMethodKeys) + isValid = + (await this.validationMethods[validationMethodKey]( + key, + value, + editor + )) && isValid; + + // Handle tracked Statuses + const foundStatuses = item.status.getTrackedValues(); + item.status.activeValues = new Set(foundStatuses); + if (foundStatuses.size <= 0) editor.resetStatus(key); + + return isValid; + } + + //========================================================================================================= + // Add Validation Method + //========================================================================================================= + /** + * @public + * Adds Validation Method to Validator + * @param method - Validation Method + */ + public addValidationMethod(method: ValidationMethodInterface): this; + /** + * @public + * Adds Validation Method to Validator + * @param key - Key of Validation Method + * @param method - Validation Method + */ + public addValidationMethod( + key: ItemKey, + method: ValidationMethodInterface + ): this; + public addValidationMethod( + keyOrMethod: ItemKey | ValidationMethodInterface, + method?: ValidationMethodInterface + ): this { + const generateKey = isFunction(keyOrMethod); + let _method: ValidationMethodInterface; + let key: ItemKey; + + if (generateKey) { + key = generateId(); + _method = keyOrMethod as ValidationMethodInterface; + } else { + key = keyOrMethod as string; + _method = method as ValidationMethodInterface; + } + + // Check if Validation Method is a Function + if (!isFunction(_method)) { + LogCodeManager.getLogger()?.error( + 'A Validation Method has to be a function!' + ); + return this; + } + + // Check if Validation Method already exists + if (this.validationMethods[key]) { + LogCodeManager.getLogger()?.error( + `Validation Method with the key/name '${key}' already exists!` + ); + return this; + } + + this.validationMethods[key] = _method; + return this; + } + + //========================================================================================================= + // String + //========================================================================================================= + /** + * @public + * Get String Validator + */ + public string(): StringValidator { + return new StringValidator(this); + } + + //========================================================================================================= + // Number + //========================================================================================================= + /** + * @public + * Get Number Validator + */ + public number(): NumberValidator { + return new NumberValidator(this); + } + + //========================================================================================================= + // Clone + //========================================================================================================= + /** + * @public + * Get a fresh clone of this Validator + */ + public clone(): Validator { + const clone = new Validator(); + clone.validationMethods = copy(this.validationMethods); + clone._key = this._key; + clone.config = copy(this.config); + return clone; + } + + //========================================================================================================= + // Required + //========================================================================================================= + /** + * @public + * Checks if the Editor Value exists + * @param errorMessage - Error Message + */ + public required(errorMessage?: string): this { + this.addValidationMethod( + this.getValidationMethodKey('required'), + async (key: ItemKey, value: DataType, editor) => { + const isValid = !!value; + if (!isValid) { + editor.setStatus( + key, + 'error', + errorMessage || `${key} is a required field` + ); + } + return isValid; + } + ); + return this; + } + + //========================================================================================================= + // Get Validation Method Key + //========================================================================================================= + /** + * @internal + * Creates Validation Method Key from provided key + * @param key - Key that gets converted into a Validation Method Key + */ + public getValidationMethodKey(key: string): string { + return `_${this.config.prefix}_${key}`; + } +} + +export type ValidatorKey = string | number; +export type ValidationMethodInterface = ( + key: ItemKey, + value: DataType, + editor: MultiEditor +) => Promise; + +/** + * @param key - Key/Name of Validator + * @param prefix - Validation Method Prefix + */ +export interface ValidatorConfigInterface { + key?: ValidatorKey; + prefix?: string; +} diff --git a/packages/multieditor/tsconfig.esm.json b/packages/multieditor/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/multieditor/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/multieditor/tsconfig.json b/packages/multieditor/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/multieditor/tsconfig.json +++ b/packages/multieditor/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/multieditor/tsconfig.production.json b/packages/multieditor/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/multieditor/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/proxytree/package.json b/packages/proxytree/package.json index 4004a6cb..e1d1dfbb 100644 --- a/packages/proxytree/package.json +++ b/packages/proxytree/package.json @@ -14,15 +14,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/proxytree/rollup.config.js b/packages/proxytree/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/proxytree/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/proxytree/tsconfig.esm.json b/packages/proxytree/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/proxytree/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/proxytree/tsconfig.json b/packages/proxytree/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/proxytree/tsconfig.json +++ b/packages/proxytree/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/proxytree/tsconfig.production.json b/packages/proxytree/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/proxytree/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/react/package.json b/packages/react/package.json index 8dc8fe26..a93b9043 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -25,15 +25,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", @@ -45,8 +52,8 @@ "devDependencies": { "@agile-ts/core": "file:../core", "@agile-ts/proxytree": "file:../proxytree", - "@types/react": "^17.0.0", - "react": "^17.0.1" + "@types/react": "^17.0.21", + "react": "^17.0.2" }, "peerDependencies": { "react": "^16.13.1", diff --git a/packages/react/rollup.config.js b/packages/react/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/react/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/react/tsconfig.esm.json b/packages/react/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/react/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/react/tsconfig.production.json b/packages/react/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/react/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/rollup.config.default.js b/packages/rollup.config.default.js new file mode 100644 index 00000000..ceb7225a --- /dev/null +++ b/packages/rollup.config.default.js @@ -0,0 +1,113 @@ +// No Typescript because https://stackoverflow.com/questions/69212224/modularize-rollup-config-error-could-not-resolve-path-to-module-from-rol + +import path from 'path'; +import { defineConfig } from 'rollup'; +import { babel } from '@rollup/plugin-babel'; // https://rollupjs.org/guide/en/#babel +import { nodeResolve } from '@rollup/plugin-node-resolve'; // https://rollupjs.org/guide/en/#rollupplugin-node-resolve +import esbuild from 'rollup-plugin-esbuild'; +import typescript from '@rollup/plugin-typescript'; +import bundleSize from 'rollup-plugin-bundle-size'; + +export const fileExtensions = ['.js', '.ts', '.tsx']; + +export function createEsbuildConfig(config) { + config = { + target: 'es2015', + tsconfig: path.resolve('./tsconfig.json'), + additionalOptions: {}, + ...config, + }; + return esbuild({ + minify: false, + target: config.target, + tsconfig: config.tsconfig, + ...config.additionalOptions, + }); +} + +export function createDeclarationConfig(config) { + config = { + input: 'src/index.ts', + output: 'dist', + tsconfig: path.resolve('./tsconfig.json'), + external: [], + additionalOptions: {}, + additionalPlugins: [], + ...config, + }; + + return defineConfig({ + input: config.input, + output: { + dir: config.output, + }, + external: config.external, + plugins: [ + typescript({ + tsconfig: config.tsconfig, + }), + ...config.additionalPlugins, + ], + ...config.additionalOptions, + }); +} + +export function createESMConfig(config) { + config = { + input: 'src/index.ts', + output: 'dist/esm', + tsconfig: path.resolve('./tsconfig.json'), + multiFileOutput: true, + external: [], + additionalOptions: {}, + additionalPlugins: [], + ...config, + }; + + return defineConfig({ + input: config.input, + output: { + [config.multiFileOutput ? 'dir' : 'file']: config.output, + format: 'esm', + }, + external: config.external, + plugins: [ + nodeResolve({ extensions: fileExtensions }), + createEsbuildConfig({ target: 'es2015', tsconfig: config.tsconfig }), + // typescript(), // Not required because the 'esbuild-config' does configure typescript for us + !config.multiFileOutput && bundleSize(), + ...config.additionalPlugins, + ], + preserveModules: config.multiFileOutput, // https://stackoverflow.com/questions/55339256/tree-shaking-with-rollup + ...config.additionalOptions, + }); +} + +export function createCommonJSConfig(config) { + config = { + input: 'src/index.ts', + output: 'dist/index.js', + tsconfig: path.resolve('./tsconfig.json'), + external: [], + additionalOptions: {}, + additionalPlugins: [], + ...config, + }; + + return defineConfig({ + input: config.input, + output: { file: config.output, format: 'cjs' }, + external: config.external, + plugins: [ + nodeResolve({ extensions: fileExtensions }), + babel({ + babelHelpers: 'bundled', + comments: false, + }), + typescript({ tsconfig: config.tsconfig }), + bundleSize(), + ...config.additionalPlugins, + ], + ...config.additionalOptions, + }); +} diff --git a/packages/utils/package.json b/packages/utils/package.json index c43018ae..99f5241d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -13,15 +13,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/utils/rollup.config.js b/packages/utils/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/utils/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/utils/tsconfig.esm.json b/packages/utils/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/utils/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/utils/tsconfig.production.json b/packages/utils/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/utils/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/packages/vue/package.json b/packages/vue/package.json index a51633fd..d9d74963 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -16,15 +16,22 @@ "main": "dist/index.js", "module": "dist/esm/index.js", "types": "dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/esm/index.js", + "import": "./dist/esm/index.js", + "default": "./dist/index.js" + } + }, "scripts": { - "build": "yarn run build:esm && yarn run build:cjs", + "build": "shx rm -rf dist && rollup --c rollup.config.js", "prepare": "yarn run build", - "build:esm": "tsc -p ./tsconfig.esm.json", - "build:cjs": "tsc -p ./tsconfig.json && tsc -p ./tsconfig.production.json", "dev:publish": "yalc publish", "dev:push": "yalc push", "watch:push": "tsc-watch --onSuccess \"yarn run dev:push\"", - "watch": "tsc -w", + "watch": "shx rm -rf dist && tsc -w", "release": "yarn run prepare", "release:manual": "yarn run prepare && yarn run release && npm publish", "pack": "npm pack", diff --git a/packages/vue/rollup.config.js b/packages/vue/rollup.config.js new file mode 100644 index 00000000..0842134d --- /dev/null +++ b/packages/vue/rollup.config.js @@ -0,0 +1,25 @@ +import { + createCommonJSConfig, + createDeclarationConfig, + createESMConfig, +} from '../rollup.config.default'; + +const packageRoot = process.cwd(); + +// https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency +// Checks whether the specified path is outside of this particular package +function external(path) { + return ( + !path.startsWith('.') && // Paths that doesn't start with a '.' (e.g. './agile.ts') + !path.startsWith(packageRoot) // Paths that doesn't start with the package root path (e.g. 'path/to/package/agile.ts') + ); +} + +// https://rollupjs.org/guide/en/#configuration-files +export default function () { + return [ + createDeclarationConfig({ external }), + createCommonJSConfig({ external }), + createESMConfig({ external, multiFileOutput: true }), + ]; +} diff --git a/packages/vue/tsconfig.esm.json b/packages/vue/tsconfig.esm.json deleted file mode 100644 index a00a08bf..00000000 --- a/packages/vue/tsconfig.esm.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ES2015", - "outDir": "dist/esm", - "declaration": false, // already generated via 'tsconfig.json' in the root dist folder - "removeComments": true - } -} diff --git a/packages/vue/tsconfig.json b/packages/vue/tsconfig.json index 791f587c..fcb92319 100644 --- a/packages/vue/tsconfig.json +++ b/packages/vue/tsconfig.json @@ -1,9 +1,9 @@ { "extends": "../tsconfig.default.json", "compilerOptions": { - "module": "commonjs", - "rootDir": "src", - "outDir": "dist" + "target": "esnext", + "outDir": "dist", + "rootDir": "src" }, "include": [ "./src/**/*" // Only include what is in src (-> dist, tests, .. will be excluded) diff --git a/packages/vue/tsconfig.production.json b/packages/vue/tsconfig.production.json deleted file mode 100644 index b8ec8c38..00000000 --- a/packages/vue/tsconfig.production.json +++ /dev/null @@ -1,9 +0,0 @@ -// Use File: Overwrites already generated js files with new js files that have no comments -// Not doing in main 'tsconfig.json' because then the typescript declarations would have no comments too -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": false, // '.d.ts' files should have been generated before - "removeComments": true - } -} diff --git a/yarn.lock b/yarn.lock index 5219edd2..c0d9a7e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,30 +2,18 @@ # yarn lockfile v1 -"@agile-ts/core@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@agile-ts/core/-/core-0.1.3.tgz#d96dd4a20d65adce9aaba1c494b31e4e0dd1bb60" - integrity sha512-sHw9PMbqww0dwqLEZih9hIpZjMAmZB4yea7bkbqblNc1CRDKfCGeYGnNcg8GOqXfNfq5SywMGWo5KhhFFyx+ag== - dependencies: - "@agile-ts/utils" "^0.0.7" - "@agile-ts/core@file:packages/core": - version "0.2.0-alpha.4" + version "0.2.3" dependencies: - "@agile-ts/utils" "^0.0.7" + "@agile-ts/utils" "^0.0.8" "@agile-ts/logger@file:packages/logger": - version "0.0.7" + version "0.0.8" dependencies: - "@agile-ts/utils" "^0.0.7" + "@agile-ts/utils" "^0.0.8" "@agile-ts/proxytree@file:packages/proxytree": - version "0.0.5" - -"@agile-ts/react@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@agile-ts/react/-/react-0.1.2.tgz#d07f6b935d9322cd60d2e9e3871da554b04460af" - integrity sha512-W4u2+X6KCeXPdkjit/NsMJG5nBsa7dNFaEzyfTsp5Cqbs99zLqY6dO8LUIYyhRt/+HBvEW9o64i/6Kqd59WM1Q== + version "0.0.6" "@akryum/winattr@^3.0.0": version "3.0.0" @@ -400,6 +388,13 @@ dependencies: "@babel/types" "^7.14.5" +"@babel/helper-module-imports@^7.10.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -549,6 +544,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== +"@babel/helper-validator-identifier@^7.14.9": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" + integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== + "@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" @@ -2111,6 +2111,14 @@ "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" +"@babel/types@^7.15.4": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== + dependencies: + "@babel/helper-validator-identifier" "^7.14.9" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -3558,6 +3566,26 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= +"@rollup/plugin-babel@^5.3.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz#9cb1c5146ddd6a4968ad96f209c50c62f92f9879" + integrity sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^13.0.4": + version "13.0.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.0.4.tgz#b10222f4145a019740acb7738402130d848660c0" + integrity sha512-eYq4TFy40O8hjeDs+sIxEH/jc9lyuI2k9DM557WN6rO5OpnC2qXMBNj4IKH1oHrnAazL49C5p0tgP0/VpqJ+/w== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" @@ -3577,6 +3605,14 @@ "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" +"@rollup/plugin-typescript@^8.2.5": + version "8.2.5" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-8.2.5.tgz#e0319761b2b5105615e5a0c371ae05bc2984b7de" + integrity sha512-QL/LvDol/PAGB2O0S7/+q2HpSUNodpw7z6nGn9BfoVCPOZ0r4EALrojFU29Bkoi2Hr2jgTocTejJ5GGWZfOxbQ== + dependencies: + "@rollup/pluginutils" "^3.1.0" + resolve "^1.17.0" + "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" @@ -3586,6 +3622,14 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@rollup/pluginutils@^4.1.0": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec" + integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -4106,6 +4150,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^17.0.21": + version "17.0.21" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.21.tgz#069c43177cd419afaab5ce26bb4e9056549f7ea6" + integrity sha512-GzzXCpOthOjXvrAUFQwU/svyxu658cwu00Q9ugujS4qc1zXgLFaO0kS2SLOaMWLt2Jik781yuHCWB7UcYdGAeQ== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/resolve@0.0.8": version "0.0.8" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" @@ -4113,6 +4166,13 @@ dependencies: "@types/node" "*" +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + "@types/scheduler@*": version "0.16.1" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" @@ -4868,6 +4928,11 @@ ansi-regex@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -6243,6 +6308,17 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^1.0.0, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -8156,6 +8232,11 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.3: d "^1.0.1" ext "^1.1.2" +esbuild@^0.12.28: + version "0.12.28" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.28.tgz#84da0d2a0d0dee181281545271e0d65cf6fab1ef" + integrity sha512-pZ0FrWZXlvQOATlp14lRSk1N9GkeJ3vLIwOcUoo3ICQn9WNR4rWoNi81pbn6sC1iYUy7QPqNzI3+AEzokwyVcA== + escalade@^3.0.2, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -9039,6 +9120,14 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +figures@^1.0.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -9652,7 +9741,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.3: +glob@^7.0.0, glob@^7.0.3: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -9909,6 +9998,13 @@ gzip-size@5.1.1: duplexer "^0.1.1" pify "^4.0.1" +gzip-size@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520" + integrity sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA= + dependencies: + duplexer "^0.1.1" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -9949,6 +10045,13 @@ harmony-reflect@^1.4.6: resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -10546,6 +10649,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + into-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-2.0.1.tgz#db9b003694453eae091d8a5c84cc11507b781d31" @@ -11563,6 +11671,11 @@ jest@^26.6.3: import-local "^3.0.2" jest-cli "^26.6.3" +joycon@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.0.1.tgz#9074c9b08ccf37a6726ff74a18485f85efcaddaf" + integrity sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA== + js-message@1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47" @@ -11719,6 +11832,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -12329,6 +12447,16 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +maxmin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-2.1.0.tgz#4d3b220903d95eee7eb7ac7fa864e72dc09a3166" + integrity sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY= + dependencies: + chalk "^1.0.0" + figures "^1.0.1" + gzip-size "^3.0.0" + pretty-bytes "^3.0.0" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -12582,7 +12710,7 @@ minimist-options@4.1.0, minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -14788,6 +14916,13 @@ prettier@^2.3.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== +pretty-bytes@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-3.0.1.tgz#27d0008d778063a0b4811bb35c79f1bd5d5fbccf" + integrity sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8= + dependencies: + number-is-nan "^1.0.0" + pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -15485,6 +15620,13 @@ recast@^0.20.3: source-map "~0.6.1" tslib "^2.0.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + recursive-readdir@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -15749,7 +15891,7 @@ resolve@1.18.1: is-core-module "^2.0.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -15868,6 +16010,23 @@ rollup-plugin-babel@^4.3.3: "@babel/helper-module-imports" "^7.0.0" rollup-pluginutils "^2.8.1" +rollup-plugin-bundle-size@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-bundle-size/-/rollup-plugin-bundle-size-1.0.3.tgz#d245cd988486b4040279f9fd33f357f61673e90f" + integrity sha512-aWj0Pvzq90fqbI5vN1IvUrlf4utOqy+AERYxwWjegH1G8PzheMnrRIgQ5tkwKVtQMDP0bHZEACW/zLDF+XgfXQ== + dependencies: + chalk "^1.1.3" + maxmin "^2.1.0" + +rollup-plugin-esbuild@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-esbuild/-/rollup-plugin-esbuild-4.5.0.tgz#0fbcb6d2d651d87dc540c4fc3b2db669f48da1f0" + integrity sha512-ieUd3AoYWsN6Tfp0LBNnC+QpdhKjDEaH4NK3ghuEXOH56/7TAtD+hMbD9vSWZgsGSbaqCkrn4j6PaUj1vOSt1g== + dependencies: + "@rollup/pluginutils" "^4.1.0" + joycon "^3.0.1" + jsonc-parser "^3.0.0" + rollup-plugin-terser@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" @@ -15895,6 +16054,13 @@ rollup@^1.31.1: "@types/node" "*" acorn "^7.1.0" +rollup@^2.56.3: + version "2.56.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.56.3.tgz#b63edadd9851b0d618a6d0e6af8201955a77aeff" + integrity sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg== + optionalDependencies: + fsevents "~2.3.2" + rss-parser@^3.8.0: version "3.12.0" resolved "https://registry.yarnpkg.com/rss-parser/-/rss-parser-3.12.0.tgz#b8888699ea46304a74363fbd8144671b2997984c" @@ -16232,6 +16398,15 @@ shell-quote@1.7.2, shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +shelljs@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" @@ -16244,6 +16419,14 @@ shortid@^2.2.15: dependencies: nanoid "^2.1.0" +shx@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.3.tgz#681a88c7c10db15abe18525349ed474f0f1e7b9f" + integrity sha512-nZJ3HFWVoTSyyB+evEKjJ1STiixGztlqwKLTUNV5KqMWtGey9fTd4KU1gdZ1X9BV6215pswQ/Jew9NsuS/fNDA== + dependencies: + minimist "^1.2.3" + shelljs "^0.8.4" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -16970,6 +17153,11 @@ subscriptions-transport-ws@^0.9.11, subscriptions-transport-ws@^0.9.16: symbol-observable "^1.0.4" ws "^5.2.0" +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"