From 06dd5dd469e1897dd4e9731eed49440676403d46 Mon Sep 17 00:00:00 2001 From: andresin87 Date: Mon, 21 Nov 2022 08:30:26 +0100 Subject: [PATCH 01/59] feat(packages/sui-studio): allow packages store its component on any file and gets its documentation --- packages/sui-studio/bin/helpers/checkDepth.js | 15 ++ packages/sui-studio/bin/helpers/copy.js | 47 +----- .../sui-studio/bin/helpers/copyStaticFiles.js | 2 +- packages/sui-studio/bin/helpers/debug.js | 11 ++ .../bin/helpers/findExportedExpressions.js | 153 ++++++++++++++++++ .../sui-studio/bin/helpers/generateApiDocs.js | 14 +- packages/sui-studio/bin/helpers/remove.js | 41 +++++ .../bin/helpers/removeStaticFiles.js | 14 ++ .../sui-studio/bin/helpers/resolveFilePath.js | 25 +++ packages/sui-studio/bin/sui-studio-build.js | 2 + packages/sui-studio/bin/sui-studio.js | 2 + .../sui-studio/src/components/tryRequire.js | 4 +- 12 files changed, 281 insertions(+), 49 deletions(-) create mode 100644 packages/sui-studio/bin/helpers/checkDepth.js create mode 100644 packages/sui-studio/bin/helpers/debug.js create mode 100644 packages/sui-studio/bin/helpers/findExportedExpressions.js create mode 100644 packages/sui-studio/bin/helpers/remove.js create mode 100644 packages/sui-studio/bin/helpers/removeStaticFiles.js create mode 100644 packages/sui-studio/bin/helpers/resolveFilePath.js diff --git a/packages/sui-studio/bin/helpers/checkDepth.js b/packages/sui-studio/bin/helpers/checkDepth.js new file mode 100644 index 000000000..868cba8cb --- /dev/null +++ b/packages/sui-studio/bin/helpers/checkDepth.js @@ -0,0 +1,15 @@ +'use strict' + +const path = require('path') + +/** + * Check depth + * @param {string} filePath - path of the file + * @param {number} up - number of directories to go up + * @returns {boolean} + */ +module.exports = (filePath, up) => { + // components/atom/button + const depth = path.normalize(filePath).split(path.sep).length - 1 + return depth >= up +} diff --git a/packages/sui-studio/bin/helpers/copy.js b/packages/sui-studio/bin/helpers/copy.js index 5de175ba8..0b583f943 100644 --- a/packages/sui-studio/bin/helpers/copy.js +++ b/packages/sui-studio/bin/helpers/copy.js @@ -6,49 +6,8 @@ const path = require('path') const fs = require('fs-extra') const glob = require('fast-glob') -const {DEBUG} = process.env - -/** - * Show logging information if debug mode is enabled - * @param {...any} args - arguments to log - * @returns {void} - */ -const debug = (...args) => { - DEBUG && console.log('[copyfiles] ', ...args) -} - -/** - * Check depth - * @param {string} filePath - path of the file - * @param {number} up - number of directories to go up - * @returns {boolean} - */ -const checkDepth = (filePath, up) => { - // components/atom/button - const depth = path.normalize(filePath).split(path.sep).length - 1 - return depth >= up -} - -/** - * Resolve file path - * @param {string} filePath - path of the file - * @param {object} config - configuration object - * @param {object} config.flatten - flatten the path - * @param {number} config.up - number of directories to go up - * @returns {string} - */ -const resolveFilePath = (filePath, {flatten, up}) => { - if (flatten === true) return path.basename(filePath) - if (up === 0) return filePath - - if (!checkDepth(filePath, up)) { - throw new Error( - "The number of folders you're trying to go up are not correct. Check the path or the up config" - ) - } - - return path.join(...path.normalize(filePath).split(path.sep).slice(up)) -} +const debug = require('./debug.js') +const resolveFilePath = require('./resolveFilePath.js') module.exports = async function copyFiles(args, config = {}) { const input = args.slice() @@ -66,7 +25,7 @@ module.exports = async function copyFiles(args, config = {}) { const files = await glob(input, globOpts) if (files.length === 0) { - console.log('No files found.') + debug('No files found.') return } diff --git a/packages/sui-studio/bin/helpers/copyStaticFiles.js b/packages/sui-studio/bin/helpers/copyStaticFiles.js index 2bfa54484..c9b7644f7 100644 --- a/packages/sui-studio/bin/helpers/copyStaticFiles.js +++ b/packages/sui-studio/bin/helpers/copyStaticFiles.js @@ -10,7 +10,7 @@ module.exports = function copyStaticFiles() { 'components/README.md', 'components/*/*/README.md', 'components/*/*/CHANGELOG.md', - 'components/*/*/src/index.js', + 'components/*/*/src/**/*.js', 'components/*/*/demo/playground', DESTINATION_FOLDER ], diff --git a/packages/sui-studio/bin/helpers/debug.js b/packages/sui-studio/bin/helpers/debug.js new file mode 100644 index 000000000..1a7602c36 --- /dev/null +++ b/packages/sui-studio/bin/helpers/debug.js @@ -0,0 +1,11 @@ +const {DEBUG} = process.env + +/** + * Show logging information if debug mode is enabled + * @param {...any} args - arguments to log + * @returns {void} + */ + +module.exports = function (...args) { + DEBUG && console.log('[copyfiles] ', ...args) +} diff --git a/packages/sui-studio/bin/helpers/findExportedExpressions.js b/packages/sui-studio/bin/helpers/findExportedExpressions.js new file mode 100644 index 000000000..1a851848b --- /dev/null +++ b/packages/sui-studio/bin/helpers/findExportedExpressions.js @@ -0,0 +1,153 @@ +const swcSettings = require('@s-ui/js-compiler/swc-config.js') +const {parseSync, transformFileSync} = require('@swc/core') +const path = require('node:path') + +function findExportedExpressions(file, {isDefault = true, variableName} = {}) { + const {dir, base = 'index.js'} = path.parse(`${file}`) + + const {code: transformedCode} = transformFileSync(`${file}`, swcSettings) + + const AST = parseSync(transformedCode) + + if (typeof AST !== 'object') { + throw new Error('invalid file data') + } + const {body} = AST + const globalDeclarations = body.reduce( + ( + acc, + { + type, + source, + id, + declaration = {}, + declarations = [], + specifiers = [], + identifier = {} + } + ) => { + if (type === 'ExportNamedDeclaration' && source !== null) { + const {value, type} = source + if (type === 'StringLiteral') { + specifiers?.forEach(({type, orig, exported}) => { + if (['ExportDefaultSpecifier', 'ExportSpecifier'].includes(type)) { + acc = { + ...acc, + [exported?.value || orig?.value]: { + localName: orig?.value, + currentName: exported?.value || orig?.value, + source: + path.relative(process.cwd(), path.resolve(dir, value)) || + `${dir}/${base}` + } + } + } + }) + } + } + if (type === 'ExportDeclaration') { + const {declarations = []} = declaration + declarations.forEach(({id: {value}}) => { + acc = { + ...acc, + [value]: {localName: value, source: `${dir}/${base}`} + } + }) + } + if (type === 'VariableDeclaration') { + declarations.forEach(({id: {value}} = {id: {}}) => { + acc = {...acc, [value]: {localName: value, source: `${dir}/${base}`}} + }) + } + if (['FunctionDeclaration', 'ClassDeclaration'].includes(type)) { + const {value} = identifier + acc = {...acc, [value]: {localName: value, source: `${dir}/${base}`}} + } + if (type === 'ImportDeclaration' && source !== null) { + const {value, type} = source + if (type === 'StringLiteral') { + specifiers?.forEach(({type, local, imported}, i) => { + if (['ImportDefaultSpecifier', 'ImportSpecifier'].includes(type)) { + acc = { + ...acc, + [imported?.value || local?.value]: { + localName: local?.value, + importedName: imported?.value || local?.value, + source: + path.relative(process.cwd(), path.resolve(dir, value)) || + `${dir}/${base}` + } + } + } + }) + } + } + return acc + }, + {} + ) + + let result = body.find(({type, specifiers}) => { + if (type === 'ExportDefaultDeclaration' && isDefault) { + return true + } + if (type === 'ExportNamedDeclaration') { + specifiers?.forEach(({type, orig, exported}) => { + if (type === 'ExportSpecifier') { + const currentName = exported?.value || orig?.value + if (variableName === currentName) { + return true + } + } + }) + } + if ( + type === 'ExportDefaultExpression' && + (variableName === undefined || isDefault) + ) { + return true + } + }) + result = (({type, expression, specifiers}) => { + if (type === 'ExportDefaultDeclaration' && isDefault) { + return {route: path.resolve(dir, base), found: true, isDefault: true} + } else if (type === 'ExportNamedDeclaration') { + specifiers?.forEach(({type, orig, exported}) => { + if (type === 'ExportSpecifier') { + const currentName = exported?.value || orig?.value + if (variableName === currentName) { + return { + isDefault: false, + route: globalDeclarations[currentName].source, + found: globalDeclarations[currentName].source === file, + variableName: globalDeclarations[currentName].localName + } + } + } + }) + } else if ( + type === 'ExportDefaultExpression' && + variableName === undefined + ) { + const {value} = expression + const {source, localName} = {...(globalDeclarations[value] || {})} + return { + route: source, + found: source === file, + variableName: localName + } + } + })(result) + if (!result) { + result = {route: path.resolve(dir, base), found: false, isDefault: false} + } + if (!result.found && file !== result.route) { + result = findExportedExpressions(result.route, { + isDefault: result.isDefault, + variableName: result.variableName + }) + } + return result +} + +module.exports = findExportedExpressions diff --git a/packages/sui-studio/bin/helpers/generateApiDocs.js b/packages/sui-studio/bin/helpers/generateApiDocs.js index e7028263b..1880e042f 100644 --- a/packages/sui-studio/bin/helpers/generateApiDocs.js +++ b/packages/sui-studio/bin/helpers/generateApiDocs.js @@ -2,6 +2,7 @@ const path = require('node:path') const fg = require('fast-glob') const fs = require('fs-extra') const reactDocs = require('react-docgen') +const findExportedExpressions = require('./findExportedExpressions.js') module.exports = function generateApiDocs() { console.log('[sui-studio] Generating API documentation for components...') @@ -10,7 +11,16 @@ module.exports = function generateApiDocs() { const components = fg.sync('components/*/*/src/index.js', {deep: 4}) components.forEach(file => { - const source = fs.readFileSync(file, 'utf-8') + let docFilePath = file + const {dir} = path.parse(file) + const gen = findExportedExpressions(file) + const {route, found} = gen + if (found) { + docFilePath = route.split().join('') + } + + const source = fs.readFileSync(docFilePath, 'utf-8') + let docs = {} try { @@ -22,7 +32,7 @@ module.exports = function generateApiDocs() { console.warn(`[sui-studio] Couldn't generate API docs for ${file}`) } - const outputFile = file.replace('index.js', 'definitions.json') + const outputFile = dir.replace('src', '') + 'definitions.json' fs.writeFileSync( path.resolve(process.cwd(), `public/${outputFile}`), JSON.stringify(docs, null, 2) diff --git a/packages/sui-studio/bin/helpers/remove.js b/packages/sui-studio/bin/helpers/remove.js new file mode 100644 index 000000000..6c0dd1422 --- /dev/null +++ b/packages/sui-studio/bin/helpers/remove.js @@ -0,0 +1,41 @@ +// @ts-check + +'use strict' + +const path = require('path') +const fs = require('fs-extra') +const glob = require('fast-glob') + +const debug = require('./debug.js') +const resolveFilePath = require('./resolveFilePath.js') + +module.exports = async function removeFiles(args, config = {}) { + const input = args.slice() + const outDir = input.pop() + const globOpts = {} + + const {flatten = false, up = 0} = config + + if (config.exclude) globOpts.ignore = config.exclude + if (config.all) globOpts.dot = true + if (config.follow) globOpts.followSymbolicLinks = true + + debug(`Config for glob: `, globOpts) + + const files = await glob(input, globOpts) + + if (files.length === 0) { + debug('No files found.') + return + } + + debug(`Removing ${files.length} files from ${input} `) + + return Promise.all( + files.map(file => { + const outName = path.join(outDir, resolveFilePath(file, {flatten, up})) + debug(`Removing ${outName}`) + return fs.unlinkSync(outName) + }) + ) +} diff --git a/packages/sui-studio/bin/helpers/removeStaticFiles.js b/packages/sui-studio/bin/helpers/removeStaticFiles.js new file mode 100644 index 000000000..73f08c3b3 --- /dev/null +++ b/packages/sui-studio/bin/helpers/removeStaticFiles.js @@ -0,0 +1,14 @@ +const remove = require('./remove.js') + +const DESTINATION_FOLDER = 'public' + +module.exports = function removeStaticFiles() { + console.log('[sui-studio] Removing unnecessary static files...') + console.time('[sui-studio] Removing static files took') + + return remove(['components/*/*/src/**/*.js', DESTINATION_FOLDER], { + exclude: 'node_modules/**' + }).then(() => { + console.timeEnd('[sui-studio] Removing static files took') + }) +} diff --git a/packages/sui-studio/bin/helpers/resolveFilePath.js b/packages/sui-studio/bin/helpers/resolveFilePath.js new file mode 100644 index 000000000..6c7dd989c --- /dev/null +++ b/packages/sui-studio/bin/helpers/resolveFilePath.js @@ -0,0 +1,25 @@ +'use strict' + +const path = require('path') +const checkDepth = require('./checkDepth.js') + +/** + * Resolve file path + * @param {string} filePath - path of the file + * @param {object} config - configuration object + * @param {object} config.flatten - flatten the path + * @param {number} config.up - number of directories to go up + * @returns {string} + */ +module.exports = (filePath, {flatten, up}) => { + if (flatten === true) return path.basename(filePath) + if (up === 0) return filePath + + if (!checkDepth(filePath, up)) { + throw new Error( + "The number of folders you're trying to go up are not correct. Check the path or the up config" + ) + } + + return path.join(...path.normalize(filePath).split(path.sep).slice(up)) +} diff --git a/packages/sui-studio/bin/sui-studio-build.js b/packages/sui-studio/bin/sui-studio-build.js index 06430990b..8bf2a275a 100755 --- a/packages/sui-studio/bin/sui-studio-build.js +++ b/packages/sui-studio/bin/sui-studio-build.js @@ -9,6 +9,7 @@ const program = require('commander') const {NO_COMPONENTS_MESSAGE} = require('../config/index.js') const generateApiDocs = require('./helpers/generateApiDocs.js') const copyStaticFiles = require('./helpers/copyStaticFiles.js') +const removeStaticFiles = require('./helpers/removeStaticFiles.js') const copyGlobals = require('./helpers/copyGlobals.js') program @@ -59,6 +60,7 @@ if (needsBuild) { .then(copyStaticFiles) .then(copyGlobals) .then(generateApiDocs) + .then(removeStaticFiles) .then(() => process.exit(0)) .catch(() => process.exit(1)) } diff --git a/packages/sui-studio/bin/sui-studio.js b/packages/sui-studio/bin/sui-studio.js index 75c4309cb..19fc0f1b0 100755 --- a/packages/sui-studio/bin/sui-studio.js +++ b/packages/sui-studio/bin/sui-studio.js @@ -5,6 +5,7 @@ const path = require('path') const {getSpawnPromise} = require('@s-ui/helpers/cli') const {version} = require('../package.json') +const generateApiDocs = require('./helpers/generateApiDocs.js') const copyStaticFiles = require('./helpers/copyStaticFiles.js') const copyGlobals = require('./helpers/copyGlobals.js') @@ -18,6 +19,7 @@ program await copyGlobals() await copyStaticFiles() + await generateApiDocs() const devServerExec = require.resolve('@s-ui/bundler/bin/sui-bundler-dev') const args = ['-c', path.join(__dirname, '..', 'src')] diff --git a/packages/sui-studio/src/components/tryRequire.js b/packages/sui-studio/src/components/tryRequire.js index b18d0e0cd..d521986e6 100644 --- a/packages/sui-studio/src/components/tryRequire.js +++ b/packages/sui-studio/src/components/tryRequire.js @@ -1,6 +1,6 @@ /* global __BASE_DIR__ */ -import {safeImport} from './utils' +import {safeImport} from './utils.js' const fetchStaticFile = path => window @@ -16,7 +16,7 @@ export const fetchComponentSrcRawFile = ({category, component}) => export const fetchComponentsDefinitions = ({category, component}) => window - .fetch(`/components/${category}/${component}/src/definitions.json`) + .fetch(`/components/${category}/${component}/definitions.json`) .then(res => res.json()) export const fetchComponentsReadme = () => From 2226e463fb0578857eb45bdd82933e700ed26b5d Mon Sep 17 00:00:00 2001 From: andresin87 Date: Wed, 23 Nov 2022 15:55:40 +0100 Subject: [PATCH 02/59] feat(packages/sui-studio): add package needed --- packages/sui-studio/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/sui-studio/package.json b/packages/sui-studio/package.json index f6f14ecdc..447a993af 100644 --- a/packages/sui-studio/package.json +++ b/packages/sui-studio/package.json @@ -13,6 +13,7 @@ "@babel/cli": "7", "@s-ui/bundler": "9", "@s-ui/helpers": "1", + "@s-ui/js-compiler": "1", "@s-ui/react-context": "1", "@s-ui/react-router": "1", "@s-ui/test": "8", From ecf181b55d24c78e83a0ed5e89c83216e42023b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel=20Dur=C3=A1n?= Date: Tue, 1 Mar 2022 13:20:12 +0100 Subject: [PATCH 03/59] feat(packages/sui-js-compiler): Migrate to ESM --- packages/sui-js-compiler/swc-config.js | 2 +- packages/sui-js-compiler/test/server/index.js | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/sui-js-compiler/swc-config.js b/packages/sui-js-compiler/swc-config.js index e8b783dc0..65f0ef6a3 100644 --- a/packages/sui-js-compiler/swc-config.js +++ b/packages/sui-js-compiler/swc-config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { minify: true, jsc: { parser: { diff --git a/packages/sui-js-compiler/test/server/index.js b/packages/sui-js-compiler/test/server/index.js index 46ebb19f1..f0ad55849 100644 --- a/packages/sui-js-compiler/test/server/index.js +++ b/packages/sui-js-compiler/test/server/index.js @@ -1,8 +1,10 @@ -const promisify = require('util').promisify -const exec = promisify(require('child_process').exec) -const fs = require('fs-extra') -const {expect} = require('chai') -const path = require('path') +import {promisify} from 'node:util' +import {exec as execCallback} from 'node:child_process' +import path from 'node:path' +import fs from 'fs-extra' +import {expect} from 'chai' + +const exec = promisify(execCallback) const libPath = path.join(__dirname, 'lib') const libFilePath = path.join(libPath, 'example.js') From 0d7e0bd4baeca7b7fbf879aaacc961c0149a943a Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 12:57:56 +0200 Subject: [PATCH 04/59] fix(packages/sui-bundler): required fallback resolvers to avoid browser errors --- packages/sui-bundler/webpack.config.dev.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/sui-bundler/webpack.config.dev.js b/packages/sui-bundler/webpack.config.dev.js index 7f5bc5544..4021dbfc5 100644 --- a/packages/sui-bundler/webpack.config.dev.js +++ b/packages/sui-bundler/webpack.config.dev.js @@ -40,7 +40,10 @@ const webpackConfig = { http: require.resolve('stream-http'), https: require.resolve('https-browserify'), buffer: require.resolve('buffer/'), - url: require.resolve('url/') + url: require.resolve('url/'), + stream: false, + zlib: false, + timers: false }, modules: ['node_modules', path.resolve(process.cwd())], extensions: ['.js', '.json'] From b568898aab00ff6213efd271e01444e12c264752 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 12:58:31 +0200 Subject: [PATCH 05/59] feat(packages/sui-mock): msw wrapper sui implementation --- packages/sui-mock/.npmignore | 2 + packages/sui-mock/README.md | 149 +++++++++++++++++++++++++++++++ packages/sui-mock/package.json | 25 ++++++ packages/sui-mock/src/browser.js | 12 +++ packages/sui-mock/src/index.js | 12 +++ packages/sui-mock/src/server.js | 12 +++ 6 files changed, 212 insertions(+) create mode 100644 packages/sui-mock/.npmignore create mode 100644 packages/sui-mock/README.md create mode 100644 packages/sui-mock/package.json create mode 100644 packages/sui-mock/src/browser.js create mode 100644 packages/sui-mock/src/index.js create mode 100644 packages/sui-mock/src/server.js diff --git a/packages/sui-mock/.npmignore b/packages/sui-mock/.npmignore new file mode 100644 index 000000000..29693447a --- /dev/null +++ b/packages/sui-mock/.npmignore @@ -0,0 +1,2 @@ +src +test \ No newline at end of file diff --git a/packages/sui-mock/README.md b/packages/sui-mock/README.md new file mode 100644 index 000000000..c7b40272f --- /dev/null +++ b/packages/sui-mock/README.md @@ -0,0 +1,149 @@ +# sui-mock-provider + +## Getting Started + +### Installation + +### Usage + +#### 1. Create Request handlers +Create a `./mocks` folder in your project root and create a `index.js` file inside it. + +This index.js should export an array of [Request handlers](https://mswjs.io/docs/basics/request-handler). + +**Example:** + +Given, a provider endpoint handler + +```js +// ./mocks/exampleGateway/user/handlers.js +import {rest} from 'msw' +import {apiUrl} from '../config.js' + +const responseResolver = () => res(ctx.status(200), ctx.json({name: 'John Doe'})) + +export const getUserHandler = rest.get(`${apiUrl}/user`, responseResolver) +``` + +Then, we export a list of handlers + +```js +// ./mocks/index.js +import {getUserHandler} from './mocks/exampleGateway/user/handlers.js' + +export default [getUserHandler] +``` + +#### 2. Expose mocker from mocks folder + +We should use browser or server getMocker to create a mocker instance ready to use in our app. See how it will looks like: + +```js +// ./mocks/server.js +import {getServerMocker} from '@s-ui/mock-provider/lib/server' +import handlers from './index.js' + +export {rest} from '@s-ui/mock-provider/lib/browser' +export const mocker = getServerMocker(...handlers) +``` + +```js +// ./mocks/browser.js +import {getBrowserMocker} from '@s-ui/mock-provider/lib/browser' +import handlers from './index.js' + +export {rest} from '@s-ui/mock-provider/lib/browser' +export const mocker = getBrowserMocker(...handlers) +``` + +Given we have isomorphic tests in our project, we should create a `./mocks/isomorphicMocker.js` file that exports the mocker instance depending on the environment (browser / server). + +```js +// ./mocks/isomorphicMocker.js +import initMocker from '@s-ui/mock-provider' +import applicationHandlers from './index.js' + +export {rest} from '@s-ui/mock-provider/lib/browser' +export const getMocker = (handlers = applicationHandlers) => + initMocker(handlers) +``` + +#### 3. Use it everywhere +Use those mockers to init your mocks everywhere in your application, it means integration tests, e2e tests, component tests, etc. but also in your application code. + +Browser example: + +```js +// src/app.js +if (process.env.STAGE === 'development') { + const worker = await import('../mocks/browser.js').then( + pkg => pkg.worker + ) + worker.start({onUnhandledRequest: 'bypass'}) +} +``` + +Server example: + +```js +// src/hooks/preSSRHandler/index.js +if (process.env.STAGE === 'development') { + const worker = await import('../../../mocks/server.js').then( + pkg => pkg.worker + ) + + worker.listen() +} +``` + +Text example + +```js +// domain/test/example/exampleSpec.js +import axios from 'axios' +import {getMocker} from '../../../mocks/isomorphicMocker.js' + +describe('Example', () => { + let mocker + + before(async () => { + mocker = await getMocker() + await mocker.start() + }) + + after(() => { + mocker.stop() + }) + + it('should do something', async () => { + const result = await axios.get('/user?id=1') + expect(result).to.be.deep.equal({name: 'John Doe'}) + }) +}) +``` + +E2E example: + +```js +// test-e2e/support/setup.js +import {mocker, rest} from '../../mocks/browser.js' + +Cypress.on('test:before:run:async', async () => { + if (window.msw) return + + await mocker.start({onUnhandledRequest: 'bypass'}) + + window.msw = { + worker: mocker, + rest + } +}) +``` + +### Mockers + +- `initMocker` is isomorphic and returns all methods included in `setupWorker` and `setupServer`. Check it out [here](https://mswjs.io/docs/api/). + +- `getServerMocker` is server only and returns all methods included in `setupWorker` and `setupServer`. Check it out [here](https://mswjs.io/docs/api/setup-server). + +- `setupBrowserMocker` is browser only and returns all methods included in `setupWorker` and `setupServer`. Check it out [here](https://mswjs.io/docs/api/setup-worker). \ No newline at end of file diff --git a/packages/sui-mock/package.json b/packages/sui-mock/package.json new file mode 100644 index 000000000..0fc0bfe82 --- /dev/null +++ b/packages/sui-mock/package.json @@ -0,0 +1,25 @@ +{ + "name": "@s-ui/mock", + "version": "1.0.0-beta.5", + "main": "lib/index.js", + "description": "mock provider", + "types": "lib/index", + "scripts": { + "lib": "babel --presets sui ./src --out-dir ./lib", + "prepublishOnly": "npm run lib" + }, + "keywords": [], + "author": "", + "license": "MIT", + "dependencies": { + "msw": "0.47.4" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SUI-Components/sui.git" + }, + "bugs": { + "url": "https://github.com/SUI-Components/sui/issues" + }, + "homepage": "https://github.com/SUI-Components/sui/tree/master/packages/sui-mock-provider#readme" +} diff --git a/packages/sui-mock/src/browser.js b/packages/sui-mock/src/browser.js new file mode 100644 index 000000000..2b21b5bdf --- /dev/null +++ b/packages/sui-mock/src/browser.js @@ -0,0 +1,12 @@ +export {rest} from 'msw' + +export const getBrowserMocker = async handlers => { + const setup = await import('msw').then(pkg => pkg.setupWorker) + const worker = setup(...handlers) + + return { + ...worker, + listen: worker.start, + close: worker.stop + } +} diff --git a/packages/sui-mock/src/index.js b/packages/sui-mock/src/index.js new file mode 100644 index 000000000..d6dfc76ce --- /dev/null +++ b/packages/sui-mock/src/index.js @@ -0,0 +1,12 @@ +import {getBrowserMocker} from './browser.js' +import {getServerMocker} from './server.js' + +const isNode = + Object.prototype.toString.call( + typeof process !== 'undefined' ? process : 0 + ) === '[object process]' + +const initMocker = isNode ? getServerMocker : getBrowserMocker + +export {rest} from 'msw' +export default initMocker diff --git a/packages/sui-mock/src/server.js b/packages/sui-mock/src/server.js new file mode 100644 index 000000000..4dadf67e3 --- /dev/null +++ b/packages/sui-mock/src/server.js @@ -0,0 +1,12 @@ +export {rest} from 'msw' + +export const getServerMocker = async handlers => { + const {setupServer} = require('msw/node') + const worker = setupServer(...handlers) + + return { + ...worker, + start: worker.listen, + stop: worker.close + } +} From fd5e780884441ffecf45feb79ca08d45c2160545 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 13:41:26 +0200 Subject: [PATCH 06/59] test(packages/sui-mock): add some test coverage --- packages/sui-mock/package.json | 7 ++- packages/sui-mock/src/index.js | 7 +-- packages/sui-mock/test/browser/browserSpec.js | 1 + packages/sui-mock/test/common/indexSpec.js | 48 +++++++++++++++++++ packages/sui-mock/test/server/serverSpec.js | 1 + 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 packages/sui-mock/test/browser/browserSpec.js create mode 100644 packages/sui-mock/test/common/indexSpec.js create mode 100644 packages/sui-mock/test/server/serverSpec.js diff --git a/packages/sui-mock/package.json b/packages/sui-mock/package.json index 0fc0bfe82..3f9b44890 100644 --- a/packages/sui-mock/package.json +++ b/packages/sui-mock/package.json @@ -6,7 +6,12 @@ "types": "lib/index", "scripts": { "lib": "babel --presets sui ./src --out-dir ./lib", - "prepublishOnly": "npm run lib" + "prepublishOnly": "npm run lib", + "test": "npm run test:client && npm run test:server", + "test:browser": "npx @s-ui/test browser -P './test/browser/**/*Spec.js'", + "test:browser:watch": "npm run test:client -- --watch", + "test:server": "npx @s-ui/test server -P './test/server/**/*Spec.js'", + "test:server:watch": "npm run test:server -- --watch" }, "keywords": [], "author": "", diff --git a/packages/sui-mock/src/index.js b/packages/sui-mock/src/index.js index d6dfc76ce..849a29dc5 100644 --- a/packages/sui-mock/src/index.js +++ b/packages/sui-mock/src/index.js @@ -1,3 +1,5 @@ +import {rest} from 'msw' + import {getBrowserMocker} from './browser.js' import {getServerMocker} from './server.js' @@ -6,7 +8,6 @@ const isNode = typeof process !== 'undefined' ? process : 0 ) === '[object process]' -const initMocker = isNode ? getServerMocker : getBrowserMocker +const getMocker = isNode ? getServerMocker : getBrowserMocker -export {rest} from 'msw' -export default initMocker +export {getMocker, rest} diff --git a/packages/sui-mock/test/browser/browserSpec.js b/packages/sui-mock/test/browser/browserSpec.js new file mode 100644 index 000000000..c0c67d457 --- /dev/null +++ b/packages/sui-mock/test/browser/browserSpec.js @@ -0,0 +1 @@ +import '../common/indexSpec.js' diff --git a/packages/sui-mock/test/common/indexSpec.js b/packages/sui-mock/test/common/indexSpec.js new file mode 100644 index 000000000..6e580b328 --- /dev/null +++ b/packages/sui-mock/test/common/indexSpec.js @@ -0,0 +1,48 @@ +/* eslint-env mocha */ +import {expect} from 'chai' +import {rest} from 'msw' + +import {getMocker} from '../../src/index.js' + +describe('sui-mock-provider | getMocker', () => { + it('should init mocker without handlers', async () => { + // Given + const mocker = await getMocker() + + // Then + expect(mocker).to.not.throw + }) + + it('should init mocker with one handler', () => { + // Given + const handler = rest.get('/user/:userId', (req, res, ctx) => { + return res( + ctx.json({ + firstName: 'John', + lastName: 'Maverick' + }) + ) + }) + + // When + const mocker = getMocker([handler]) + + // Then + expect(mocker).to.not.throw + }) + + it('should has isomorphic msw api', async () => { + // Given + const mocker = await getMocker() + + // Then + expect(mocker).to.have.property('start') + expect(mocker).to.have.property('stop') + expect(mocker).to.have.property('listen') + expect(mocker).to.have.property('close') + expect(mocker).to.have.property('use') + expect(mocker).to.have.property('resetHandlers') + expect(mocker).to.have.property('restoreHandlers') + expect(mocker).to.have.property('printHandlers') + }) +}) diff --git a/packages/sui-mock/test/server/serverSpec.js b/packages/sui-mock/test/server/serverSpec.js new file mode 100644 index 000000000..c0c67d457 --- /dev/null +++ b/packages/sui-mock/test/server/serverSpec.js @@ -0,0 +1 @@ +import '../common/indexSpec.js' From 9b24bd1cf84e49cc0bcc1e9e5b0fe43d66818814 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 13:46:47 +0200 Subject: [PATCH 07/59] chore(Root): publish betas --- packages/sui-bundler/package.json | 2 +- packages/sui-mock/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sui-bundler/package.json b/packages/sui-bundler/package.json index 9ae2a0686..d2581eb44 100644 --- a/packages/sui-bundler/package.json +++ b/packages/sui-bundler/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/bundler", - "version": "9.36.0", + "version": "9.37.0-beta.0", "description": "Config-free bundler for ES6 React apps.", "bin": { "sui-bundler": "./bin/sui-bundler.js" diff --git a/packages/sui-mock/package.json b/packages/sui-mock/package.json index 3f9b44890..d0e636540 100644 --- a/packages/sui-mock/package.json +++ b/packages/sui-mock/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/mock", - "version": "1.0.0-beta.5", + "version": "1.0.0-beta.0", "main": "lib/index.js", "description": "mock provider", "types": "lib/index", From ba9ace7b296f8ed57ef1729d67a5a639452f8b02 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 14:12:32 +0200 Subject: [PATCH 08/59] fix(packages/sui-mock): improve export method name --- packages/sui-mock/src/index.js | 4 ++-- packages/sui-mock/test/common/indexSpec.js | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/sui-mock/src/index.js b/packages/sui-mock/src/index.js index 849a29dc5..8e9483b38 100644 --- a/packages/sui-mock/src/index.js +++ b/packages/sui-mock/src/index.js @@ -8,6 +8,6 @@ const isNode = typeof process !== 'undefined' ? process : 0 ) === '[object process]' -const getMocker = isNode ? getServerMocker : getBrowserMocker +const setupMocker = isNode ? getServerMocker : getBrowserMocker -export {getMocker, rest} +export {setupMocker, rest} diff --git a/packages/sui-mock/test/common/indexSpec.js b/packages/sui-mock/test/common/indexSpec.js index 6e580b328..cec046e7c 100644 --- a/packages/sui-mock/test/common/indexSpec.js +++ b/packages/sui-mock/test/common/indexSpec.js @@ -2,12 +2,12 @@ import {expect} from 'chai' import {rest} from 'msw' -import {getMocker} from '../../src/index.js' +import {setupMocker} from '../../src/index.js' -describe('sui-mock-provider | getMocker', () => { +describe('sui-mock | setupMocker', () => { it('should init mocker without handlers', async () => { // Given - const mocker = await getMocker() + const mocker = await setupMocker() // Then expect(mocker).to.not.throw @@ -25,7 +25,7 @@ describe('sui-mock-provider | getMocker', () => { }) // When - const mocker = getMocker([handler]) + const mocker = setupMocker([handler]) // Then expect(mocker).to.not.throw @@ -33,7 +33,7 @@ describe('sui-mock-provider | getMocker', () => { it('should has isomorphic msw api', async () => { // Given - const mocker = await getMocker() + const mocker = await setupMocker() // Then expect(mocker).to.have.property('start') From d0b015b88ee515f4a3bfcc73a83f0c3106bb4ddf Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 14:13:11 +0200 Subject: [PATCH 09/59] docs(packages/sui-mock): update readme --- packages/sui-mock/README.md | 49 ++++++++++++------------------------- 1 file changed, 16 insertions(+), 33 deletions(-) diff --git a/packages/sui-mock/README.md b/packages/sui-mock/README.md index c7b40272f..379831359 100644 --- a/packages/sui-mock/README.md +++ b/packages/sui-mock/README.md @@ -28,7 +28,7 @@ export const getUserHandler = rest.get(`${apiUrl}/user`, responseResolver) Then, we export a list of handlers ```js -// ./mocks/index.js +// ./mocks/handlers.js import {getUserHandler} from './mocks/exampleGateway/user/handlers.js' export default [getUserHandler] @@ -38,34 +38,15 @@ export default [getUserHandler] We should use browser or server getMocker to create a mocker instance ready to use in our app. See how it will looks like: -```js -// ./mocks/server.js -import {getServerMocker} from '@s-ui/mock-provider/lib/server' -import handlers from './index.js' - -export {rest} from '@s-ui/mock-provider/lib/browser' -export const mocker = getServerMocker(...handlers) -``` ```js -// ./mocks/browser.js -import {getBrowserMocker} from '@s-ui/mock-provider/lib/browser' -import handlers from './index.js' - -export {rest} from '@s-ui/mock-provider/lib/browser' -export const mocker = getBrowserMocker(...handlers) -``` - -Given we have isomorphic tests in our project, we should create a `./mocks/isomorphicMocker.js` file that exports the mocker instance depending on the environment (browser / server). +// ./mocks/index.js +import {setupMocker, rest} from '@s-ui/mock' +import applicationHandlers from './handlers.js' -```js -// ./mocks/isomorphicMocker.js -import initMocker from '@s-ui/mock-provider' -import applicationHandlers from './index.js' +const getMocker = (handlers = applicationHandlers) => setupMocker(handlers) -export {rest} from '@s-ui/mock-provider/lib/browser' -export const getMocker = (handlers = applicationHandlers) => - initMocker(handlers) +export {getMocker, rest} ``` #### 3. Use it everywhere @@ -76,10 +57,10 @@ Browser example: ```js // src/app.js if (process.env.STAGE === 'development') { - const worker = await import('../mocks/browser.js').then( - pkg => pkg.worker + const mocker = await import('../mocks/index.js').then(pkg => + pkg.getMocker() ) - worker.start({onUnhandledRequest: 'bypass'}) + mocker.start({onUnhandledRequest: 'bypass'}) } ``` @@ -88,11 +69,11 @@ Server example: ```js // src/hooks/preSSRHandler/index.js if (process.env.STAGE === 'development') { - const worker = await import('../../../mocks/server.js').then( - pkg => pkg.worker + const mocker = await import('../../../mocks/index.js').then(pkg => + pkg.getMocker() ) - worker.listen() + mocker.start({onUnhandledRequest: 'bypass'}) } ``` @@ -101,7 +82,7 @@ Text example ```js // domain/test/example/exampleSpec.js import axios from 'axios' -import {getMocker} from '../../../mocks/isomorphicMocker.js' +import {getMocker} from '../../../mocks/index.js' describe('Example', () => { let mocker @@ -126,11 +107,13 @@ E2E example: ```js // test-e2e/support/setup.js -import {mocker, rest} from '../../mocks/browser.js' +import {getMocker, rest} from '../../mocks/index.js' +// cypress/supports/index.js Cypress.on('test:before:run:async', async () => { if (window.msw) return + const mocker = await getMocker() await mocker.start({onUnhandledRequest: 'bypass'}) window.msw = { From b3b648c1ddb8b88e69db72d050686bd86579ca89 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 14:13:45 +0200 Subject: [PATCH 10/59] chore(packages/sui-mock): publish beta --- packages/sui-mock/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sui-mock/package.json b/packages/sui-mock/package.json index d0e636540..5c76f21a6 100644 --- a/packages/sui-mock/package.json +++ b/packages/sui-mock/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/mock", - "version": "1.0.0-beta.0", + "version": "1.0.0-beta.1", "main": "lib/index.js", "description": "mock provider", "types": "lib/index", From eddd0fe0b64673e1738fb945a27235a7d3e8e483 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 14:57:01 +0200 Subject: [PATCH 11/59] fix(packages/sui-bundler): fix config prod fallback resolvers --- packages/sui-bundler/package.json | 2 +- packages/sui-bundler/webpack.config.prod.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/sui-bundler/package.json b/packages/sui-bundler/package.json index d2581eb44..72f296b24 100644 --- a/packages/sui-bundler/package.json +++ b/packages/sui-bundler/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/bundler", - "version": "9.37.0-beta.0", + "version": "9.37.0-beta.1", "description": "Config-free bundler for ES6 React apps.", "bin": { "sui-bundler": "./bin/sui-bundler.js" diff --git a/packages/sui-bundler/webpack.config.prod.js b/packages/sui-bundler/webpack.config.prod.js index 3cf1bd8d0..239e39cf6 100644 --- a/packages/sui-bundler/webpack.config.prod.js +++ b/packages/sui-bundler/webpack.config.prod.js @@ -61,7 +61,10 @@ const webpackConfig = { fs: false, http: require.resolve('stream-http'), https: require.resolve('https-browserify'), - path: false + path: false, + stream: false, + zlib: false, + timers: false } }, entry: MAIN_ENTRY_POINT, From 83ade107c2afead2fb9b6a2fd8d2534211a6ded1 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 15:54:40 +0200 Subject: [PATCH 12/59] fix(packages/sui-test-contract): use same version of msw --- packages/sui-test-contract/package.json | 4 ++-- packages/sui-test-contract/test/server/setupSpec.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/sui-test-contract/package.json b/packages/sui-test-contract/package.json index 828d19a9d..c132d92e1 100644 --- a/packages/sui-test-contract/package.json +++ b/packages/sui-test-contract/package.json @@ -18,9 +18,9 @@ "dependencies": { "@pact-foundation/pact": "9.18.1", "@pactflow/pact-msw-adapter": "1.2.1", + "@s-ui/mock": "1", "commander": "8.3.0", - "headers-polyfill": "3.0.10", - "msw": "0.42.3" + "headers-polyfill": "3.0.10" }, "devDependencies": { "@s-ui/domain": "2" diff --git a/packages/sui-test-contract/test/server/setupSpec.js b/packages/sui-test-contract/test/server/setupSpec.js index 48bbc2bc2..f65ae9d53 100644 --- a/packages/sui-test-contract/test/server/setupSpec.js +++ b/packages/sui-test-contract/test/server/setupSpec.js @@ -1,7 +1,7 @@ import {expect} from 'chai' -import {rest} from 'msw' import {FetcherFactory} from '@s-ui/domain' +import {rest} from '@s-ui/mock' import {setupContractTests} from '../../src/index.js' import {getContractFileData, removeContractFiles} from '../utils.js' From 84b6e1ee9f576afe00e1d948523924a81393a09d Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 15:55:03 +0200 Subject: [PATCH 13/59] docs(packages/sui-mock): update deps --- packages/sui-mock/README.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/sui-mock/README.md b/packages/sui-mock/README.md index 379831359..5e81eb400 100644 --- a/packages/sui-mock/README.md +++ b/packages/sui-mock/README.md @@ -1,9 +1,20 @@ -# sui-mock-provider - -## Getting Started +# sui-mock ### Installation +```sh +npm install @s-ui/mock --save-dev +``` + +### Mockers + +#### **Request mocking with `setupMocker`** + +It returns all methods included in `setupWorker` and `setupServer`. It will work in browser and server sides. + +👉 Check `setupWorker` and `setupServer` in [MSW docs](https://mswjs.io/docs/api/). + + ### Usage #### 1. Create Request handlers @@ -122,11 +133,3 @@ Cypress.on('test:before:run:async', async () => { } }) ``` - -### Mockers - -- `initMocker` is isomorphic and returns all methods included in `setupWorker` and `setupServer`. Check it out [here](https://mswjs.io/docs/api/). - -- `getServerMocker` is server only and returns all methods included in `setupWorker` and `setupServer`. Check it out [here](https://mswjs.io/docs/api/setup-server). - -- `setupBrowserMocker` is browser only and returns all methods included in `setupWorker` and `setupServer`. Check it out [here](https://mswjs.io/docs/api/setup-worker). \ No newline at end of file From 15dbde024c192428d82b2e890116f1697164c678 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Tue, 18 Oct 2022 15:58:12 +0200 Subject: [PATCH 14/59] fix(Root): remove beta version from package jsons and avoid auto release problems --- packages/sui-bundler/package.json | 2 +- packages/sui-mock/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sui-bundler/package.json b/packages/sui-bundler/package.json index 72f296b24..9ae2a0686 100644 --- a/packages/sui-bundler/package.json +++ b/packages/sui-bundler/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/bundler", - "version": "9.37.0-beta.1", + "version": "9.36.0", "description": "Config-free bundler for ES6 React apps.", "bin": { "sui-bundler": "./bin/sui-bundler.js" diff --git a/packages/sui-mock/package.json b/packages/sui-mock/package.json index 5c76f21a6..ae312011e 100644 --- a/packages/sui-mock/package.json +++ b/packages/sui-mock/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/mock", - "version": "1.0.0-beta.1", + "version": "1.0.0", "main": "lib/index.js", "description": "mock provider", "types": "lib/index", From 10ad350eda65f4504229e85a32581a1f5c5c2c90 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Wed, 19 Oct 2022 09:48:47 +0200 Subject: [PATCH 15/59] docs(packages/sui-mock): fix readme docs after last fixes --- packages/sui-mock/README.md | 93 ++++++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/packages/sui-mock/README.md b/packages/sui-mock/README.md index 5e81eb400..7cc6ea948 100644 --- a/packages/sui-mock/README.md +++ b/packages/sui-mock/README.md @@ -1,30 +1,36 @@ # sui-mock -### Installation +It is mainly a wrapper around [Mock Service Worker (MSW)](https://mswjs.io/). +It allows mocking by intercepting requests on the network level. Seamlessly reuse the same mock definition for testing, development, and debugging. + +## Installation ```sh npm install @s-ui/mock --save-dev ``` -### Mockers +## Mockers -#### **Request mocking with `setupMocker`** +### **Request mocking with `setupMocker`** It returns all methods included in `setupWorker` and `setupServer`. It will work in browser and server sides. 👉 Check `setupWorker` and `setupServer` in [MSW docs](https://mswjs.io/docs/api/). -### Usage +## Usage + +### 1. Create Request handlers + +First of all we need to define the application request handlers. Request handler is a function that determines whether an outgoing request should be mocked, and specifies its mocked response. -#### 1. Create Request handlers -Create a `./mocks` folder in your project root and create a `index.js` file inside it. +Create a `./mocks` folder in your project root and create a `handlers.js` file inside it. -This index.js should export an array of [Request handlers](https://mswjs.io/docs/basics/request-handler). +This `handlers.js` should export an array of [Request handlers](https://mswjs.io/docs/basics/request-handler). -**Example:** +**Example: How to create a handler** -Given, a provider endpoint handler +In this case, given the request handler ([GET] `/user`) it specifies a response resolver mocked response (status 200 with body `{name: 'John Doe'}`). ```js // ./mocks/exampleGateway/user/handlers.js @@ -45,10 +51,9 @@ import {getUserHandler} from './mocks/exampleGateway/user/handlers.js' export default [getUserHandler] ``` -#### 2. Expose mocker from mocks folder - -We should use browser or server getMocker to create a mocker instance ready to use in our app. See how it will looks like: +### 2. Expose mocker from mocks folder +Once we have the handlers created, we will need to create a mocker with the handlers already defined. ```js // ./mocks/index.js @@ -60,10 +65,11 @@ const getMocker = (handlers = applicationHandlers) => setupMocker(handlers) export {getMocker, rest} ``` -#### 3. Use it everywhere -Use those mockers to init your mocks everywhere in your application, it means integration tests, e2e tests, component tests, etc. but also in your application code. +### 3. Use it everywhere + +Use this mocker everywhere in your application, it means integration tests, e2e tests, component tests, etc. but also in your application code. -Browser example: +Example of mocking in browser: ```js // src/app.js @@ -75,7 +81,7 @@ if (process.env.STAGE === 'development') { } ``` -Server example: +Example of mocking in server: ```js // src/hooks/preSSRHandler/index.js @@ -88,7 +94,7 @@ if (process.env.STAGE === 'development') { } ``` -Text example +Example of mocking in unit tests: ```js // domain/test/example/exampleSpec.js @@ -111,10 +117,61 @@ describe('Example', () => { const result = await axios.get('/user?id=1') expect(result).to.be.deep.equal({name: 'John Doe'}) }) + + it('should throw an error', async () => { + const getUserGenericErrorHandler = rest.get('/user', () => { + const error = { + errorMessage: `User '${username}' not found`, + } + + return res(ctx.status(404), ctx.json(error)) + }) + + mocker.use(getUserGenericErrorHandler) + + try { + const result = await axios.get('/user?id=1') + } catch(error) { + expect(error).to.be.an.instanceof(Error) + } + + }) }) ``` -E2E example: +Example of mocking in E2E tests: + + +```js +it("should get todo data - MSW will be overridden", () => { + cy.window().then(window => { + const { worker, rest } = window.msw; + + worker.use( + rest.get(`${API_URL}todos/1`, (req, res, ctx) => { + return res( + ctx.status(200), + ctx.json({ + id: 1, + title: "Mocked by not MSW but Cypress", + completed: true + }) + ); + }) + ); + }); + // Assert that the title is not "Mocked by MSW" + cy.contains("Mocked by not MSW but Cypress"); +}); +``` + +#### Troubleshooting + +When we run E2E test, if we start our mocker in application code it could cause a race condition and the mocker could be started before the E2E test. + +To fix that, it is recommended to avoid starting the mocker in application code and start it in E2E environment. + +Example of starting mocker in Cypress environment ```js // test-e2e/support/setup.js From 3b6ee58faedfdb8b31caf0a2aa73eda059995aea Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Wed, 19 Oct 2022 09:23:50 +0200 Subject: [PATCH 16/59] Update packages/sui-mock/README.md Co-authored-by: arnau-rius <32937662+arnau-rius@users.noreply.github.com> --- packages/sui-mock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sui-mock/README.md b/packages/sui-mock/README.md index 7cc6ea948..e31c982cd 100644 --- a/packages/sui-mock/README.md +++ b/packages/sui-mock/README.md @@ -42,7 +42,7 @@ const responseResolver = () => res(ctx.status(200), ctx.json({name: 'John Doe'}) export const getUserHandler = rest.get(`${apiUrl}/user`, responseResolver) ``` -Then, we export a list of handlers +Then, we export the list of handlers ```js // ./mocks/handlers.js From feba21447412ee6c9bc6749c83529f2c100ca0e6 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Wed, 19 Oct 2022 09:58:06 +0200 Subject: [PATCH 17/59] docs(packages/sui-mockmock): recommend sui-mock for mocking in mockmock --- packages/sui-mockmock/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/sui-mockmock/README.md b/packages/sui-mockmock/README.md index 6b58cd883..4934c46b1 100644 --- a/packages/sui-mockmock/README.md +++ b/packages/sui-mockmock/README.md @@ -2,6 +2,8 @@ > Mocking utilities for testing. +## ⚠️ It is highly recommended to use [sui-mock](https://github.com/SUI-Components/sui/tree/master/packages/sui-mock) instead of this package. It could be deprecated in the future. + ## Motivation Centralize common solutions for common mocking concerns in JavaScript. From af518c8380aa1a0865340d1c90e8807806676d4a Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Wed, 19 Oct 2022 10:56:02 +0200 Subject: [PATCH 18/59] docs(packages/sui-mock): improve docs --- packages/sui-mock/README.md | 45 +++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/packages/sui-mock/README.md b/packages/sui-mock/README.md index e31c982cd..980020c38 100644 --- a/packages/sui-mock/README.md +++ b/packages/sui-mock/README.md @@ -53,7 +53,7 @@ export default [getUserHandler] ### 2. Expose mocker from mocks folder -Once we have the handlers created, we will need to create a mocker with the handlers already defined. +Once we have the handlers created, we will need to create a mocker with **all the handlers already defined**. ```js // ./mocks/index.js @@ -61,8 +61,9 @@ import {setupMocker, rest} from '@s-ui/mock' import applicationHandlers from './handlers.js' const getMocker = (handlers = applicationHandlers) => setupMocker(handlers) +const getEmptyMocker = setupMocker -export {getMocker, rest} +export {getEmptyMocker, getMocker, rest} ``` ### 3. Use it everywhere @@ -94,7 +95,7 @@ if (process.env.STAGE === 'development') { } ``` -Example of mocking in unit tests: +Example of mocking in unit tests **with all handlers**: ```js // domain/test/example/exampleSpec.js @@ -119,6 +120,7 @@ describe('Example', () => { }) it('should throw an error', async () => { + // We also could define a handler for this case const getUserGenericErrorHandler = rest.get('/user', () => { const error = { errorMessage: `User '${username}' not found`, @@ -139,6 +141,41 @@ describe('Example', () => { }) ``` +Example of mocking in unit tests **without default handlers**: + +```js +// domain/test/example/exampleSpec.js +import axios from 'axios' +import {getEmptyMocker} from '../../../mocks/index.js' +import {getUserHandler} from '../../../mocks/userGateway/user/handlers.js' + +describe('Example', () => { + let mocker + + before(async () => { + mocker = await getEmptyMocker() + await mocker.start() + }) + + after(() => { + mocker.stop() + }) + + // This is important to restore handlers after each test + afterEach(() => { + mocker.resetHandlers() + }) + + it('should do something', async () => { + // IMPORTANT: Explicit define handlers for this test + mocker.use(getUserHandler) + + const result = await axios.get('/user?id=1') + expect(result).to.be.deep.equal({name: 'John Doe'}) + }) +}) +``` + Example of mocking in E2E tests: @@ -165,7 +202,7 @@ it("should get todo data - MSW will be overridden", () => { }); ``` -#### Troubleshooting +### 4. Make Cypress integration stable When we run E2E test, if we start our mocker in application code it could cause a race condition and the mocker could be started before the E2E test. From e780d97bba31bb0ebc63648d71796573a9d6d976 Mon Sep 17 00:00:00 2001 From: sui-bot Date: Wed, 19 Oct 2022 09:18:18 +0000 Subject: [PATCH 19/59] release(packages/sui-bundler): v9.37.0 [skip ci] --- packages/sui-bundler/CHANGELOG.md | 11 +++++++++++ packages/sui-bundler/package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/sui-bundler/CHANGELOG.md b/packages/sui-bundler/CHANGELOG.md index b5024e67f..8d36ae0f1 100644 --- a/packages/sui-bundler/CHANGELOG.md +++ b/packages/sui-bundler/CHANGELOG.md @@ -1,5 +1,16 @@ # CHANGELOG +# 9.37.0 (2022-10-19) + + +### Bug Fixes + +* **packages/sui-bundler:** fix config prod fallback resolvers ([5d9a334](https://github.com/SUI-Components/sui/commit/5d9a334ea7e11859b9b3097433560be28035c274)) +* **packages/sui-bundler:** required fallback resolvers to avoid browser errors ([f473c10](https://github.com/SUI-Components/sui/commit/f473c10bfb278295cbe6db675213964198d3b11f)) +* **Root:** remove beta version from package jsons and avoid auto release problems ([8ebb43d](https://github.com/SUI-Components/sui/commit/8ebb43d641099e4ea182dfba0bc997e66af3cac9)) + + + # 9.36.0 (2022-08-22) diff --git a/packages/sui-bundler/package.json b/packages/sui-bundler/package.json index 9ae2a0686..b8e509e10 100644 --- a/packages/sui-bundler/package.json +++ b/packages/sui-bundler/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/bundler", - "version": "9.36.0", + "version": "9.37.0", "description": "Config-free bundler for ES6 React apps.", "bin": { "sui-bundler": "./bin/sui-bundler.js" From 57075c6ce11dc174cad7aa9540fea7f437675d0e Mon Sep 17 00:00:00 2001 From: sui-bot Date: Wed, 19 Oct 2022 09:18:26 +0000 Subject: [PATCH 20/59] release(packages/sui-mock): v1.1.0 [skip ci] --- packages/sui-mock/CHANGELOG.md | 17 +++++++++++++++++ packages/sui-mock/package.json | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 packages/sui-mock/CHANGELOG.md diff --git a/packages/sui-mock/CHANGELOG.md b/packages/sui-mock/CHANGELOG.md new file mode 100644 index 000000000..ef694cfe4 --- /dev/null +++ b/packages/sui-mock/CHANGELOG.md @@ -0,0 +1,17 @@ +# CHANGELOG + +# 1.1.0 (2022-10-19) + + +### Bug Fixes + +* **packages/sui-mock:** improve export method name ([d311e3e](https://github.com/SUI-Components/sui/commit/d311e3e5bcc529367feee1c6ecd07a3a060d7dc3)) +* **Root:** remove beta version from package jsons and avoid auto release problems ([8ebb43d](https://github.com/SUI-Components/sui/commit/8ebb43d641099e4ea182dfba0bc997e66af3cac9)) + + +### Features + +* **packages/sui-mock:** msw wrapper sui implementation ([227ceda](https://github.com/SUI-Components/sui/commit/227ceda2e248aff990c7170a536d86f8c80243fe)) + + + diff --git a/packages/sui-mock/package.json b/packages/sui-mock/package.json index ae312011e..9a2a664b6 100644 --- a/packages/sui-mock/package.json +++ b/packages/sui-mock/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/mock", - "version": "1.0.0", + "version": "1.1.0", "main": "lib/index.js", "description": "mock provider", "types": "lib/index", From 386c2716100519b91e49f8eb544f9a78450df831 Mon Sep 17 00:00:00 2001 From: sui-bot Date: Wed, 19 Oct 2022 09:18:33 +0000 Subject: [PATCH 21/59] release(packages/sui-test-contract): v2.8.0 [skip ci] --- packages/sui-test-contract/CHANGELOG.md | 9 +++++++++ packages/sui-test-contract/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sui-test-contract/CHANGELOG.md b/packages/sui-test-contract/CHANGELOG.md index 281a1ac80..db708e416 100644 --- a/packages/sui-test-contract/CHANGELOG.md +++ b/packages/sui-test-contract/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +# 2.8.0 (2022-10-19) + + +### Bug Fixes + +* **packages/sui-test-contract:** use same version of msw ([0ae5861](https://github.com/SUI-Components/sui/commit/0ae5861d9b9aab8e7685180497490f133f34e7aa)) + + + # 2.7.0 (2022-09-15) diff --git a/packages/sui-test-contract/package.json b/packages/sui-test-contract/package.json index c132d92e1..6b68c9198 100644 --- a/packages/sui-test-contract/package.json +++ b/packages/sui-test-contract/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/test-contract", - "version": "2.7.0", + "version": "2.8.0", "description": "Useful tooling for defining contract tests (based on Pact) that will generate contract documents.", "license": "MIT", "main": "src/index.js", From 4613fb76e7d24844ba4527b96e1b4f33b1203854 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Thu, 20 Oct 2022 10:52:45 +0200 Subject: [PATCH 22/59] fix(packages/sui-js-compiler): fix __dirname and migrate to esm --- packages/sui-js-compiler/index.js | 13 ++++++++----- packages/sui-js-compiler/package.json | 6 ++---- packages/sui-js-compiler/test/server/index.js | 19 +++++++++++-------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/sui-js-compiler/index.js b/packages/sui-js-compiler/index.js index 2ffa9fefc..2bcc9bf67 100755 --- a/packages/sui-js-compiler/index.js +++ b/packages/sui-js-compiler/index.js @@ -1,12 +1,15 @@ #!/usr/bin/env node +/* eslint-disable no-console */ 'use strict' -const {transformFile} = require('@swc/core') -const program = require('commander') -const fg = require('fast-glob') -const fs = require('fs-extra') -const defaultConfig = require('./swc-config.js') +import program from 'commander' +import fg from 'fast-glob' +import fs from 'fs-extra' + +import {transformFile} from '@swc/core' + +import defaultConfig from './swc-config.js' const compileFile = async file => { const {code} = await transformFile(file, defaultConfig) diff --git a/packages/sui-js-compiler/package.json b/packages/sui-js-compiler/package.json index 39c44e6a7..671e78f04 100644 --- a/packages/sui-js-compiler/package.json +++ b/packages/sui-js-compiler/package.json @@ -4,13 +4,11 @@ "description": "JavaScript Compiler", "main": "index.js", "bin": { - "sui-js-compiler": "./index.js" + "sui-js-compiler": "./index.cjs" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test:server": "npx @s-ui/test server -P './test/server/*.js'" }, - "keywords": [], - "author": "", "license": "MIT", "dependencies": { "@swc/core": "1.2.194", diff --git a/packages/sui-js-compiler/test/server/index.js b/packages/sui-js-compiler/test/server/index.js index f0ad55849..ae4725970 100644 --- a/packages/sui-js-compiler/test/server/index.js +++ b/packages/sui-js-compiler/test/server/index.js @@ -1,13 +1,16 @@ -import {promisify} from 'node:util' -import {exec as execCallback} from 'node:child_process' -import path from 'node:path' -import fs from 'fs-extra' +import {fileURLToPath} from 'url' + import {expect} from 'chai' +import fs from 'fs-extra' +import {exec as execCallback} from 'node:child_process' +import {join} from 'node:path' +import {promisify} from 'node:util' const exec = promisify(execCallback) -const libPath = path.join(__dirname, 'lib') -const libFilePath = path.join(libPath, 'example.js') +const cwd = fileURLToPath(new URL('.', import.meta.url)) +const libPath = fileURLToPath(new URL('lib', import.meta.url)) +const libFilePath = join(libPath, 'example.js') describe('@s-ui/js-compiler', () => { afterEach(() => fs.remove(libPath)) @@ -15,7 +18,7 @@ describe('@s-ui/js-compiler', () => { it('compiles a /src folder with a JavaScript with JSX file and output to /lib', async () => { const {stdout} = await exec('node ../../index.js', { - cwd: __dirname + cwd }) const compiledFilenames = await fs.readdir(libPath) @@ -38,7 +41,7 @@ describe('@s-ui/js-compiler', () => { const {stdout} = await exec( 'node ../../index.js --ignore="./src/**.test.js"', { - cwd: __dirname + cwd } ) From 7fed371575ea1784bf0a19912cc303a64b63deab Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Thu, 20 Oct 2022 10:54:07 +0200 Subject: [PATCH 23/59] fix(packages/sui-js-compiler): use correct bin file extension --- packages/sui-js-compiler/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sui-js-compiler/package.json b/packages/sui-js-compiler/package.json index 671e78f04..5bbd99809 100644 --- a/packages/sui-js-compiler/package.json +++ b/packages/sui-js-compiler/package.json @@ -4,7 +4,7 @@ "description": "JavaScript Compiler", "main": "index.js", "bin": { - "sui-js-compiler": "./index.cjs" + "sui-js-compiler": "./index.js" }, "scripts": { "test:server": "npx @s-ui/test server -P './test/server/*.js'" From 243f808549ffe3ef25c4283e9e00757cd66d7abb Mon Sep 17 00:00:00 2001 From: sui-bot Date: Thu, 20 Oct 2022 12:01:00 +0000 Subject: [PATCH 24/59] release(packages/sui-js-compiler): v1.20.0 [skip ci] --- packages/sui-js-compiler/CHANGELOG.md | 12 ++++++++++++ packages/sui-js-compiler/package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/sui-js-compiler/CHANGELOG.md b/packages/sui-js-compiler/CHANGELOG.md index 98ee7b547..638290b1d 100644 --- a/packages/sui-js-compiler/CHANGELOG.md +++ b/packages/sui-js-compiler/CHANGELOG.md @@ -1,5 +1,16 @@ # CHANGELOG +# 1.20.0 (2022-10-20) + + +### Bug Fixes + +* **packages/sui-js-compiler:** add exports to package.json ([c8759a9](https://github.com/SUI-Components/sui/commit/c8759a976c866a35d37e9454a67676ea15e35dc9)) +* **packages/sui-js-compiler:** fix __dirname and migrate to esm ([f0949aa](https://github.com/SUI-Components/sui/commit/f0949aa81647701b8b1c6faeac499065a1630c6d)) +* **packages/sui-js-compiler:** use correct bin file extension ([f4f685b](https://github.com/SUI-Components/sui/commit/f4f685bb4c39b80b51a6ef1b5f8b25a3fc6ef575)) + + + # 1.19.0 (2022-05-30) @@ -43,6 +54,7 @@ ### Features * **packages/sui-js-compiler:** add ignore option ([d4cdff4](https://github.com/SUI-Components/sui/commit/d4cdff467db581bcbd08ec3a9a2543e6b76265d3)) +* **packages/sui-js-compiler:** Migrate to ESM ([32127a0](https://github.com/SUI-Components/sui/commit/32127a00ed3803fffb37ce19219774dad7391a23)) diff --git a/packages/sui-js-compiler/package.json b/packages/sui-js-compiler/package.json index 5bbd99809..0c3585b96 100644 --- a/packages/sui-js-compiler/package.json +++ b/packages/sui-js-compiler/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/js-compiler", - "version": "1.19.0", + "version": "1.20.0", "description": "JavaScript Compiler", "main": "index.js", "bin": { From c6529978ff5adb81b3cf90b1e784a53a53c3f61e Mon Sep 17 00:00:00 2001 From: sui-bot Date: Fri, 21 Oct 2022 16:09:41 +0000 Subject: [PATCH 25/59] release(packages/sui-studio): v11.29.0 [skip ci] --- packages/sui-studio/CHANGELOG.md | 9 +++++++++ packages/sui-studio/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sui-studio/CHANGELOG.md b/packages/sui-studio/CHANGELOG.md index 31e31ead1..84f4e293e 100644 --- a/packages/sui-studio/CHANGELOG.md +++ b/packages/sui-studio/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +# 11.29.0 (2022-10-21) + + +### Features + +* **packages/sui-studio:** update bottom padding in NavBar menu to 80px and reduce the sidebar heigh ([3971e52](https://github.com/SUI-Components/sui/commit/3971e527d644ec324ace3d03e07db6c04afb4892)), closes [#1501](https://github.com/SUI-Components/sui/issues/1501) + + + # 11.28.0 (2022-10-18) diff --git a/packages/sui-studio/package.json b/packages/sui-studio/package.json index 447a993af..c56288098 100644 --- a/packages/sui-studio/package.json +++ b/packages/sui-studio/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/studio", - "version": "11.28.0", + "version": "11.29.0", "description": "Develop, maintain and publish your SUI components.", "main": "index.js", "bin": { From d37c1be7ac75869fab4a88b07d8defccf347b5bd Mon Sep 17 00:00:00 2001 From: "jordi.munoz@adevinta.com" Date: Sat, 22 Oct 2022 20:16:32 +0200 Subject: [PATCH 26/59] feat(packages/sui-i18n): import node-polyglot 0.43 to our package --- packages/sui-i18n/src/adapters/polyglot.js | 312 ++++++++++++++++++++- 1 file changed, 311 insertions(+), 1 deletion(-) diff --git a/packages/sui-i18n/src/adapters/polyglot.js b/packages/sui-i18n/src/adapters/polyglot.js index 832e78288..51ddc321d 100644 --- a/packages/sui-i18n/src/adapters/polyglot.js +++ b/packages/sui-i18n/src/adapters/polyglot.js @@ -1,4 +1,314 @@ -import Polyglot from 'node-polyglot' +// (c) 2012 Airbnb, Inc. +// +// polyglot.js may be freely distributed under the terms of the BSD +// license. For all licensing information, details, and documention: +// http://airbnb.github.com/polyglot.js +// +// +// Polyglot.js is an I18n helper library written in JavaScript, made to +// work both in the browser and in Node. It provides a simple solution for +// interpolation and pluralization, based off of Airbnb's +// experience adding I18n functionality to its Backbone.js and Node apps. +// +// Polylglot is agnostic to your translation backend. It doesn't perform any +// translation; it simply gives you a way to manage translated phrases from +// your client- or server-side JavaScript application. +// + +// the string that separates the different phrase possibilities +const delimeter = '||||' + +// trims a string +const trim = str => { + const trimRe = /^\s+|\s+$/g + return str.replace(trimRe, '') +} + +// mapping from pluralization group plural logic +const pluralTypes = { + chinese: function (n) { + return 0 + }, + german: function (n) { + return n !== 1 ? 1 : 0 + }, + french: function (n) { + return n > 1 ? 1 : 0 + }, + russian: function (n) { + if (n % 10 === 1 && n % 100 !== 11) return 0 + return n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 + }, + czech: function (n) { + if (n === 1) return 0 + return n >= 2 && n <= 4 ? 1 : 2 + }, + polish: function (n) { + if (n === 1) return 0 + return n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 + }, + icelandic: function (n) { + return n % 10 !== 1 || n % 100 === 11 ? 1 : 0 + } +} + +// Mapping from pluralization group to individual locales. +const pluralTypeToLanguages = { + chinese: ['fa', 'id', 'ja', 'ko', 'lo', 'ms', 'th', 'tr', 'zh'], + german: [ + 'da', + 'de', + 'en', + 'es', + 'fi', + 'el', + 'he', + 'hu', + 'it', + 'nl', + 'no', + 'pt', + 'sv' + ], + french: ['fr', 'tl', 'pt-br'], + russian: ['hr', 'ru'], + czech: ['cs'], + polish: ['pl'], + icelandic: ['is'] +} + +// ### clone +// +// Clone an object +const clone = source => { + const ret = {} + for (const prop in source) { + ret[prop] = source[prop] + } + return ret +} + +class Polyglot { + constructor(options) { + options = options || {} + this.phrases = {} + this.extend(options.phrases || {}) + this.currentLocale = options.locale || 'en' + this.allowMissing = !!options.allowMissing + this.VERSION = '0.4.3' + } + + // ### polyglot.locale([locale]) + // + // Get or set locale. Internally, Polyglot only uses locale for pluralization. + locale(newLocale) { + if (newLocale) this.currentLocale = newLocale + return this.currentLocale + } + + // ### polyglot.extend(phrases) + // + // Use `extend` to tell Polyglot how to translate a given key. + // + // polyglot.extend({ + // "hello": "Hello", + // "hello_name": "Hello, %{name}" + // }); + // + // The key can be any string. Feel free to call `extend` multiple times; + // it will override any phrases with the same key, but leave existing phrases + // untouched. + // + // It is also possible to pass nested phrase objects, which get flattened + // into an object with the nested keys concatenated using dot notation. + // + // polyglot.extend({ + // "nav": { + // "hello": "Hello", + // "hello_name": "Hello, %{name}", + // "sidebar": { + // "welcome": "Welcome" + // } + // } + // }); + // + // console.log(polyglot.phrases); + // // { + // // 'nav.hello': 'Hello', + // // 'nav.hello_name': 'Hello, %{name}', + // // 'nav.sidebar.welcome': 'Welcome' + // // } + // + // `extend` accepts an optional second argument, `prefix`, which can be used + // to prefix every key in the phrases object with some string, using dot + // notation. + // + // polyglot.extend({ + // "hello": "Hello", + // "hello_name": "Hello, %{name}" + // }, "nav"); + // + // console.log(polyglot.phrases); + // // { + // // 'nav.hello': 'Hello', + // // 'nav.hello_name': 'Hello, %{name}' + // // } + // + // This feature is used internally to support nested phrase objects. + extend(morePhrases, prefix) { + let phrase + + for (let key in morePhrases) { + if (morePhrases.hasOwnProperty(key)) { + phrase = morePhrases[key] + if (prefix) key = prefix + '.' + key + if (typeof phrase === 'object') { + this.extend(phrase, key) + } else { + this.phrases[key] = phrase + } + } + } + } + + // ### polyglot.clear() + // + // Clears all phrases. Useful for special cases, such as freeing + // up memory if you have lots of phrases but no longer need to + // perform any translation. Also used internally by `replace`. + clear() { + this.phrases = {} + } + + // ### polyglot.replace(phrases) + // + // Completely replace the existing phrases with a new set of phrases. + // Normally, just use `extend` to add more phrases, but under certain + // circumstances, you may want to make sure no old phrases are lying around. + replace(newPhrases) { + this.clear() + this.extend(newPhrases) + } + + // ### polyglot.t(key, options) + // + // The most-used method. Provide a key, and `t` will return the + // phrase. + // + // polyglot.t("hello"); + // => "Hello" + // + // The phrase value is provided first by a call to `polyglot.extend()` or + // `polyglot.replace()`. + // + // Pass in an object as the second argument to perform interpolation. + // + // polyglot.t("hello_name", {name: "Spike"}); + // => "Hello, Spike" + // + // If you like, you can provide a default value in case the phrase is missing. + // Use the special option key "_" to specify a default. + // + // polyglot.t("i_like_to_write_in_language", { + // _: "I like to write in %{language}.", + // language: "JavaScript" + // }); + // => "I like to write in JavaScript." + // + t(key, options) { + let phrase, result + options = options == null ? {} : options + // allow number as a pluralization shortcut + if (typeof options === 'number') { + options = {smart_count: options} + } + if (typeof this.phrases[key] === 'string') { + phrase = this.phrases[key] + } else if (typeof options._ === 'string') { + phrase = options._ + } else if (this.allowMissing) { + phrase = key + } else { + // eslint-disable-next-line no-console + console.warn('Missing translation for key: "' + key + '"') + result = key + } + if (typeof phrase === 'string') { + options = clone(options) + result = this.choosePluralForm( + phrase, + this.currentLocale, + options.smart_count + ) + result = this.interpolate(result, options) + } + return result + } + + // check if polyglot has a translation for given key + has(key) { + return key in this.phrases + } + + langToTypeMap(mapping) { + let type + let langs + let l + const ret = {} + for (type in mapping) { + if (mapping.hasOwnProperty(type)) { + langs = mapping[type] + for (l in langs) { + ret[langs[l]] = type + } + } + } + return ret + } + + // based on a phrase text that contains `n` plural forms separated + // by `delimeter`, a `locale`, and a `count`, choose the correct + // plural form, or none if `count` is `null`. + choosePluralForm(text, locale, count) { + let ret, texts, chosenText + if (count != null && text) { + texts = text.split(delimeter) + chosenText = texts[this.pluralTypeIndex(locale, count)] || texts[0] + ret = trim(chosenText) + } else { + ret = text + } + return ret + } + + pluralTypeName(locale) { + const langToPluralType = this.langToTypeMap(pluralTypeToLanguages) + return langToPluralType[locale] || langToPluralType.en + } + + pluralTypeIndex(locale, count) { + return pluralTypes[this.pluralTypeName(locale)](count) + } + + // ### interpolate + // + // Does the dirty work. Creates a `RegExp` object for each + // interpolation placeholder. + interpolate(phrase, options) { + for (const arg in options) { + if (arg !== '_' && options.hasOwnProperty(arg)) { + // We create a new `RegExp` each time instead of using a more-efficient + // string replace so that the same argument can be replaced multiple times + // in the same phrase. + phrase = phrase.replace( + new RegExp('%\\{' + arg + '\\}', 'g'), + options[arg] + ) + } + } + return phrase + } +} export default class PolyglotAdapter { constructor() { From 90f3590dcf843aafcd586fa0fbabac567c4e7c78 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Mon, 24 Oct 2022 09:57:27 +0200 Subject: [PATCH 27/59] feat(packages/sui-test-contract): add custom api url for each endpoint --- packages/sui-test-contract/README.md | 4 +++- packages/sui-test-contract/src/setup/index.js | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/sui-test-contract/README.md b/packages/sui-test-contract/README.md index 7aa041c76..2da933062 100644 --- a/packages/sui-test-contract/README.md +++ b/packages/sui-test-contract/README.md @@ -55,6 +55,7 @@ setupContractTests({ providers: { 'test-provider': [ { + apirUrl: 'https://mydomain.com', endpoint: '/apples', description: 'A request for getting some apples', state: 'I have some apples', @@ -70,7 +71,7 @@ setupContractTests({ | Parameter | Required | Type | Default | Description | | ---------------- | -------- | --------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| `apiUrl` | Yes | `string` | | Complete URL where the requests should be done | +| `apiUrl` | Yes | `string` | | Complete URL where ALL the requests should be done | | `consumer` | Yes | `string` | | Name of the API consumer | | `providers` | Yes | `object` | | Object of providers containing an array of interactions (see [Provider interaction options](#provider-interaction-options)) | | `fetcher` | Yes | `Fetcher` | | Instance of a fetcher class (e.g. Axios) | @@ -84,6 +85,7 @@ setupContractTests({ | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | --------------------------------------------- | | `description` | Yes | `string` | | Description for the interaction | | `state` | Yes | `string` | | State to be matched by the provider | +| `apiUrl` | No | `string` | | Api url for current endpoint request | | `endpoint` | Yes | `string` | | Endpoint to be added in the contract document | | `query` | No | `object` | | Query params if needed in the request | | `body` | No | See possibilities for [Fetch API Body](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#body) | | Body to be sent in the request | diff --git a/packages/sui-test-contract/src/setup/index.js b/packages/sui-test-contract/src/setup/index.js index 850c3a82a..1b7b6a3e5 100644 --- a/packages/sui-test-contract/src/setup/index.js +++ b/packages/sui-test-contract/src/setup/index.js @@ -10,8 +10,8 @@ import { writerFactory } from './utils.js' -export default ({ - apiUrl, +const setupContractTests = ({ + apiUrl: defaultApiUrl, consumer, providers, fetcher, @@ -29,7 +29,7 @@ export default ({ excludeHeaders } }) - const tests = getContractTests({apiUrl, providers}) + const tests = getContractTests({apiUrl: defaultApiUrl, providers}) describe('Consumer test contracts', () => { before(async () => { @@ -58,6 +58,7 @@ export default ({ tests.forEach( ({ description, + apiUrl: endpointApiUrl, endpoint, query, body, @@ -69,7 +70,9 @@ export default ({ it(`makes ${description.toLowerCase()}`, async () => { server.use(handler) + const apiUrl = endpointApiUrl || defaultApiUrl let url = `${apiUrl}${endpoint}` + if (query) url = `${url}?${toQueryString(query)}` const {data} = body @@ -82,3 +85,5 @@ export default ({ ) }) } + +export default setupContractTests From 9c02eddd97f1fad3062ed4fa57c58aed67a8c7a8 Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Mon, 24 Oct 2022 10:24:01 +0200 Subject: [PATCH 28/59] Update packages/sui-test-contract/README.md Co-authored-by: Jordi --- packages/sui-test-contract/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sui-test-contract/README.md b/packages/sui-test-contract/README.md index 2da933062..a158503c7 100644 --- a/packages/sui-test-contract/README.md +++ b/packages/sui-test-contract/README.md @@ -55,7 +55,7 @@ setupContractTests({ providers: { 'test-provider': [ { - apirUrl: 'https://mydomain.com', + apiUrl: 'https://mydomain.com', endpoint: '/apples', description: 'A request for getting some apples', state: 'I have some apples', From 0395de83463a30c070c4dac12396c5462fc403b1 Mon Sep 17 00:00:00 2001 From: sui-bot Date: Mon, 24 Oct 2022 09:48:41 +0000 Subject: [PATCH 29/59] release(packages/sui-test-contract): v2.9.0 [skip ci] --- packages/sui-test-contract/CHANGELOG.md | 9 +++++++++ packages/sui-test-contract/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sui-test-contract/CHANGELOG.md b/packages/sui-test-contract/CHANGELOG.md index db708e416..1aaf92e5d 100644 --- a/packages/sui-test-contract/CHANGELOG.md +++ b/packages/sui-test-contract/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +# 2.9.0 (2022-10-24) + + +### Features + +* **packages/sui-test-contract:** add custom api url for each endpoint ([1b81908](https://github.com/SUI-Components/sui/commit/1b819088fe270dfb17bc86d5014177f65e92af8d)) + + + # 2.8.0 (2022-10-19) diff --git a/packages/sui-test-contract/package.json b/packages/sui-test-contract/package.json index 6b68c9198..cf1676de9 100644 --- a/packages/sui-test-contract/package.json +++ b/packages/sui-test-contract/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/test-contract", - "version": "2.8.0", + "version": "2.9.0", "description": "Useful tooling for defining contract tests (based on Pact) that will generate contract documents.", "license": "MIT", "main": "src/index.js", From 55fce04383b716483d09cc15b4d2bcebccbe3802 Mon Sep 17 00:00:00 2001 From: "jordi.munoz@adevinta.com" Date: Fri, 28 Oct 2022 13:40:47 +0200 Subject: [PATCH 30/59] feat(packages/sui-i18n): remove node-polyglot dependency --- packages/sui-i18n/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sui-i18n/package.json b/packages/sui-i18n/package.json index 6325b1c67..5303c9943 100644 --- a/packages/sui-i18n/package.json +++ b/packages/sui-i18n/package.json @@ -13,7 +13,6 @@ "author": "", "license": "MIT", "dependencies": { - "node-polyglot": "0.4.3", "@s-ui/js": "2" } } From d64cd63d777fc83ffb16678c787f5f3bc996d58c Mon Sep 17 00:00:00 2001 From: "jordi.munoz@adevinta.com" Date: Fri, 28 Oct 2022 13:42:30 +0200 Subject: [PATCH 31/59] docs(packages/sui-i18n): remove comments from polyglot js adapter --- packages/sui-i18n/src/adapters/polyglot.js | 101 --------------------- 1 file changed, 101 deletions(-) diff --git a/packages/sui-i18n/src/adapters/polyglot.js b/packages/sui-i18n/src/adapters/polyglot.js index 51ddc321d..07d652c1e 100644 --- a/packages/sui-i18n/src/adapters/polyglot.js +++ b/packages/sui-i18n/src/adapters/polyglot.js @@ -15,16 +15,13 @@ // your client- or server-side JavaScript application. // -// the string that separates the different phrase possibilities const delimeter = '||||' -// trims a string const trim = str => { const trimRe = /^\s+|\s+$/g return str.replace(trimRe, '') } -// mapping from pluralization group plural logic const pluralTypes = { chinese: function (n) { return 0 @@ -98,63 +95,11 @@ class Polyglot { this.VERSION = '0.4.3' } - // ### polyglot.locale([locale]) - // - // Get or set locale. Internally, Polyglot only uses locale for pluralization. locale(newLocale) { if (newLocale) this.currentLocale = newLocale return this.currentLocale } - // ### polyglot.extend(phrases) - // - // Use `extend` to tell Polyglot how to translate a given key. - // - // polyglot.extend({ - // "hello": "Hello", - // "hello_name": "Hello, %{name}" - // }); - // - // The key can be any string. Feel free to call `extend` multiple times; - // it will override any phrases with the same key, but leave existing phrases - // untouched. - // - // It is also possible to pass nested phrase objects, which get flattened - // into an object with the nested keys concatenated using dot notation. - // - // polyglot.extend({ - // "nav": { - // "hello": "Hello", - // "hello_name": "Hello, %{name}", - // "sidebar": { - // "welcome": "Welcome" - // } - // } - // }); - // - // console.log(polyglot.phrases); - // // { - // // 'nav.hello': 'Hello', - // // 'nav.hello_name': 'Hello, %{name}', - // // 'nav.sidebar.welcome': 'Welcome' - // // } - // - // `extend` accepts an optional second argument, `prefix`, which can be used - // to prefix every key in the phrases object with some string, using dot - // notation. - // - // polyglot.extend({ - // "hello": "Hello", - // "hello_name": "Hello, %{name}" - // }, "nav"); - // - // console.log(polyglot.phrases); - // // { - // // 'nav.hello': 'Hello', - // // 'nav.hello_name': 'Hello, %{name}' - // // } - // - // This feature is used internally to support nested phrase objects. extend(morePhrases, prefix) { let phrase @@ -171,50 +116,15 @@ class Polyglot { } } - // ### polyglot.clear() - // - // Clears all phrases. Useful for special cases, such as freeing - // up memory if you have lots of phrases but no longer need to - // perform any translation. Also used internally by `replace`. clear() { this.phrases = {} } - // ### polyglot.replace(phrases) - // - // Completely replace the existing phrases with a new set of phrases. - // Normally, just use `extend` to add more phrases, but under certain - // circumstances, you may want to make sure no old phrases are lying around. replace(newPhrases) { this.clear() this.extend(newPhrases) } - // ### polyglot.t(key, options) - // - // The most-used method. Provide a key, and `t` will return the - // phrase. - // - // polyglot.t("hello"); - // => "Hello" - // - // The phrase value is provided first by a call to `polyglot.extend()` or - // `polyglot.replace()`. - // - // Pass in an object as the second argument to perform interpolation. - // - // polyglot.t("hello_name", {name: "Spike"}); - // => "Hello, Spike" - // - // If you like, you can provide a default value in case the phrase is missing. - // Use the special option key "_" to specify a default. - // - // polyglot.t("i_like_to_write_in_language", { - // _: "I like to write in %{language}.", - // language: "JavaScript" - // }); - // => "I like to write in JavaScript." - // t(key, options) { let phrase, result options = options == null ? {} : options @@ -245,7 +155,6 @@ class Polyglot { return result } - // check if polyglot has a translation for given key has(key) { return key in this.phrases } @@ -266,9 +175,6 @@ class Polyglot { return ret } - // based on a phrase text that contains `n` plural forms separated - // by `delimeter`, a `locale`, and a `count`, choose the correct - // plural form, or none if `count` is `null`. choosePluralForm(text, locale, count) { let ret, texts, chosenText if (count != null && text) { @@ -290,16 +196,9 @@ class Polyglot { return pluralTypes[this.pluralTypeName(locale)](count) } - // ### interpolate - // - // Does the dirty work. Creates a `RegExp` object for each - // interpolation placeholder. interpolate(phrase, options) { for (const arg in options) { if (arg !== '_' && options.hasOwnProperty(arg)) { - // We create a new `RegExp` each time instead of using a more-efficient - // string replace so that the same argument can be replaced multiple times - // in the same phrase. phrase = phrase.replace( new RegExp('%\\{' + arg + '\\}', 'g'), options[arg] From d731fea174261f5709c8d4305dc9f302fe0e6d7e Mon Sep 17 00:00:00 2001 From: "jordi.munoz@adevinta.com" Date: Fri, 28 Oct 2022 13:44:24 +0200 Subject: [PATCH 32/59] refactor(packages/sui-i18n): use arrow functions for helpers --- packages/sui-i18n/src/adapters/polyglot.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/sui-i18n/src/adapters/polyglot.js b/packages/sui-i18n/src/adapters/polyglot.js index 07d652c1e..b98a6434c 100644 --- a/packages/sui-i18n/src/adapters/polyglot.js +++ b/packages/sui-i18n/src/adapters/polyglot.js @@ -23,28 +23,28 @@ const trim = str => { } const pluralTypes = { - chinese: function (n) { + chinese: n => { return 0 }, - german: function (n) { + german: n => { return n !== 1 ? 1 : 0 }, - french: function (n) { + french: n => { return n > 1 ? 1 : 0 }, - russian: function (n) { + russian: n => { if (n % 10 === 1 && n % 100 !== 11) return 0 return n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 }, - czech: function (n) { + czech: n => { if (n === 1) return 0 return n >= 2 && n <= 4 ? 1 : 2 }, - polish: function (n) { + polish: n => { if (n === 1) return 0 return n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 }, - icelandic: function (n) { + icelandic: n => { return n % 10 !== 1 || n % 100 === 11 ? 1 : 0 } } From bb5f7e3ef2ac5422b01ba38a918209e44b950e06 Mon Sep 17 00:00:00 2001 From: "jordi.munoz@adevinta.com" Date: Fri, 28 Oct 2022 14:13:58 +0200 Subject: [PATCH 33/59] docs(packages/sui-i18n): update license notice --- packages/sui-i18n/src/adapters/polyglot.js | 41 +++++++++++++--------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/sui-i18n/src/adapters/polyglot.js b/packages/sui-i18n/src/adapters/polyglot.js index b98a6434c..7afb27bcf 100644 --- a/packages/sui-i18n/src/adapters/polyglot.js +++ b/packages/sui-i18n/src/adapters/polyglot.js @@ -1,19 +1,28 @@ -// (c) 2012 Airbnb, Inc. -// -// polyglot.js may be freely distributed under the terms of the BSD -// license. For all licensing information, details, and documention: -// http://airbnb.github.com/polyglot.js -// -// -// Polyglot.js is an I18n helper library written in JavaScript, made to -// work both in the browser and in Node. It provides a simple solution for -// interpolation and pluralization, based off of Airbnb's -// experience adding I18n functionality to its Backbone.js and Node apps. -// -// Polylglot is agnostic to your translation backend. It doesn't perform any -// translation; it simply gives you a way to manage translated phrases from -// your client- or server-side JavaScript application. -// +// BSD 2-Clause License + +// Copyright (c) 2012, Airbnb +// All rights reserved. + +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: + +// 1. Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. + +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. const delimeter = '||||' From e175ad3bea437c484ed9af96381cc6a822de4af7 Mon Sep 17 00:00:00 2001 From: "jordi.munoz@adevinta.com" Date: Mon, 31 Oct 2022 09:08:37 +0100 Subject: [PATCH 34/59] refactor(packages/sui-i18n): remove no longer relevant mention to version --- packages/sui-i18n/src/adapters/polyglot.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sui-i18n/src/adapters/polyglot.js b/packages/sui-i18n/src/adapters/polyglot.js index 7afb27bcf..bed2ee50f 100644 --- a/packages/sui-i18n/src/adapters/polyglot.js +++ b/packages/sui-i18n/src/adapters/polyglot.js @@ -101,7 +101,6 @@ class Polyglot { this.extend(options.phrases || {}) this.currentLocale = options.locale || 'en' this.allowMissing = !!options.allowMissing - this.VERSION = '0.4.3' } locale(newLocale) { From 16187f965a7906b6a158a5cf6d074484fb684137 Mon Sep 17 00:00:00 2001 From: sui-bot Date: Thu, 3 Nov 2022 08:51:46 +0000 Subject: [PATCH 35/59] release(packages/sui-i18n): v1.31.0 [skip ci] --- packages/sui-i18n/CHANGELOG.md | 10 ++++++++++ packages/sui-i18n/package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/sui-i18n/CHANGELOG.md b/packages/sui-i18n/CHANGELOG.md index 45d480c88..c2fa405b9 100644 --- a/packages/sui-i18n/CHANGELOG.md +++ b/packages/sui-i18n/CHANGELOG.md @@ -1,5 +1,15 @@ # CHANGELOG +# 1.31.0 (2022-11-03) + + +### Features + +* **packages/sui-i18n:** import node-polyglot 0.43 to our package ([26d7fe1](https://github.com/SUI-Components/sui/commit/26d7fe1b008dbe3527c133ed195ad23b6f00a850)) +* **packages/sui-i18n:** remove node-polyglot dependency ([662ef8a](https://github.com/SUI-Components/sui/commit/662ef8a47e9a9506ca273b81f1a91ed3a97a9e35)) + + + # 1.30.0 (2022-08-08) diff --git a/packages/sui-i18n/package.json b/packages/sui-i18n/package.json index 5303c9943..d2349ff93 100644 --- a/packages/sui-i18n/package.json +++ b/packages/sui-i18n/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/i18n", - "version": "1.30.0", + "version": "1.31.0", "type": "module", "main": "lib/index.js", "description": "> Isomorphic i18n service for browser and node.", From 78b9df1ff9b82937f451996f39a100364091f75c Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Wed, 9 Nov 2022 09:42:45 +0100 Subject: [PATCH 36/59] feat(packages/sui-js-compiler): update swc deps --- packages/sui-js-compiler/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sui-js-compiler/package.json b/packages/sui-js-compiler/package.json index 0c3585b96..f3156fc52 100644 --- a/packages/sui-js-compiler/package.json +++ b/packages/sui-js-compiler/package.json @@ -11,8 +11,8 @@ }, "license": "MIT", "dependencies": { - "@swc/core": "1.2.194", - "@swc/helpers": "0.3.16", + "@swc/core": "1.3.14", + "@swc/helpers": "0.4.12", "commander": "8.3.0", "fast-glob": "3.2.11", "fs-extra": "10.1.0" From 61295e03b0db88cb8bba4706952395fcd673a00b Mon Sep 17 00:00:00 2001 From: Rafa Moral Date: Wed, 9 Nov 2022 10:30:06 +0100 Subject: [PATCH 37/59] test(packages/sui-js-compiler): fix swc test --- packages/sui-js-compiler/test/server/index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/sui-js-compiler/test/server/index.js b/packages/sui-js-compiler/test/server/index.js index ae4725970..513fb2efe 100644 --- a/packages/sui-js-compiler/test/server/index.js +++ b/packages/sui-js-compiler/test/server/index.js @@ -13,8 +13,8 @@ const libPath = fileURLToPath(new URL('lib', import.meta.url)) const libFilePath = join(libPath, 'example.js') describe('@s-ui/js-compiler', () => { - afterEach(() => fs.remove(libPath)) beforeEach(() => fs.remove(libPath)) + afterEach(() => fs.remove(libPath)) it('compiles a /src folder with a JavaScript with JSX file and output to /lib', async () => { const {stdout} = await exec('node ../../index.js', { @@ -29,12 +29,12 @@ describe('@s-ui/js-compiler', () => { const compiledFile = await fs.readFile(libFilePath, 'utf-8') - console.log(compiledFile) expect(compiledFile).to.contain('react/jsx-runtime') expect(compiledFile).to.contain('_jsx') + expect(compiledFile).to.contain('_async_to_generator') expect(compiledFile).to.contain('_ts_decorate') - expect(compiledFile).to.contain('regeneratorRuntime') + expect(compiledFile).to.contain('_ts_generator') }) it('when the "ignore" option exists, it exclude all the file matching the passed patterns', async () => { @@ -56,7 +56,8 @@ describe('@s-ui/js-compiler', () => { expect(compiledFile).to.contain('react/jsx-runtime') expect(compiledFile).to.contain('_jsx') + expect(compiledFile).to.contain('_async_to_generator') expect(compiledFile).to.contain('_ts_decorate') - expect(compiledFile).to.contain('regeneratorRuntime') + expect(compiledFile).to.contain('_ts_generator') }) }) From ded7ba4825fe2e4614be813b0265c6e6984f548f Mon Sep 17 00:00:00 2001 From: sui-bot Date: Thu, 10 Nov 2022 08:33:19 +0000 Subject: [PATCH 38/59] release(packages/sui-js-compiler): v1.21.0 [skip ci] --- packages/sui-js-compiler/CHANGELOG.md | 9 +++++++++ packages/sui-js-compiler/package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/sui-js-compiler/CHANGELOG.md b/packages/sui-js-compiler/CHANGELOG.md index 638290b1d..7e805114a 100644 --- a/packages/sui-js-compiler/CHANGELOG.md +++ b/packages/sui-js-compiler/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +# 1.21.0 (2022-11-10) + + +### Features + +* **packages/sui-js-compiler:** update swc deps ([efe6870](https://github.com/SUI-Components/sui/commit/efe6870fd21bb02251c53e281475d665fdfae32c)) + + + # 1.20.0 (2022-10-20) diff --git a/packages/sui-js-compiler/package.json b/packages/sui-js-compiler/package.json index f3156fc52..bef64dad2 100644 --- a/packages/sui-js-compiler/package.json +++ b/packages/sui-js-compiler/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/js-compiler", - "version": "1.20.0", + "version": "1.21.0", "description": "JavaScript Compiler", "main": "index.js", "bin": { From 1ed82242b7b3c3ecbc97ee9bcdf9ee1e8fd9f37b Mon Sep 17 00:00:00 2001 From: sui-bot Date: Fri, 11 Nov 2022 10:38:20 +0000 Subject: [PATCH 39/59] release(packages/sui-studio): v11.30.0 [skip ci] --- packages/sui-studio/CHANGELOG.md | 14 ++++++++++++++ packages/sui-studio/package.json | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/sui-studio/CHANGELOG.md b/packages/sui-studio/CHANGELOG.md index 84f4e293e..687e3e5ba 100644 --- a/packages/sui-studio/CHANGELOG.md +++ b/packages/sui-studio/CHANGELOG.md @@ -1,5 +1,19 @@ # CHANGELOG +# 11.30.0 (2022-11-11) + + +### Bug Fixes + +* **packages/sui-studio:** remove box shadow ([0808a94](https://github.com/SUI-Components/sui/commit/0808a94a2521f693576f4682d52ba109452079de)) + + +### Features + +* **packages/sui-studio:** fix styles ([3f28e2b](https://github.com/SUI-Components/sui/commit/3f28e2b06789f610e04ae62d6e7a432294a783cc)) + + + # 11.29.0 (2022-10-21) diff --git a/packages/sui-studio/package.json b/packages/sui-studio/package.json index c56288098..e6491a0d5 100644 --- a/packages/sui-studio/package.json +++ b/packages/sui-studio/package.json @@ -1,6 +1,6 @@ { "name": "@s-ui/studio", - "version": "11.29.0", + "version": "11.30.0", "description": "Develop, maintain and publish your SUI components.", "main": "index.js", "bin": { From b0a6b87890171a014dc9b459ca5e9596f14eaf50 Mon Sep 17 00:00:00 2001 From: Arturo Joaquin Lopez Sanabria Date: Fri, 11 Nov 2022 17:02:59 +0100 Subject: [PATCH 40/59] fix(packages/sui-studio): Remove h1 from SUI Studios ISSUES CLOSED: #1524 --- packages/sui-studio/src/components/layout/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/sui-studio/src/components/layout/index.js b/packages/sui-studio/src/components/layout/index.js index 0acc57f25..72acc03c9 100644 --- a/packages/sui-studio/src/components/layout/index.js +++ b/packages/sui-studio/src/components/layout/index.js @@ -54,7 +54,6 @@ export default function Layout({children}) { -

SUI Components