mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-12 14:05:16 +03:00
frontend: update nx to latest 15
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/8079 Co-authored-by: Stefano Magni <173663+NoriSte@users.noreply.github.com> GitOrigin-RevId: 46b1ed03ab225fccc9d769203d1af11a6bcdb63e
This commit is contained in:
parent
fc4aec4330
commit
f3951e1680
1
frontend/.eslintignore
Normal file
1
frontend/.eslintignore
Normal file
@ -0,0 +1 @@
|
||||
node_modules
|
@ -3,16 +3,15 @@ import { merge } from 'webpack-merge';
|
||||
|
||||
export default {
|
||||
core: {},
|
||||
stories: [],
|
||||
|
||||
addons: [
|
||||
'@storybook/addon-essentials',
|
||||
'@storybook/addon-links',
|
||||
'@storybook/addon-interactions',
|
||||
'storybook-dark-mode/register',
|
||||
'storybook-addon-console-env',
|
||||
],
|
||||
webpackFinal: async (config: any) => {
|
||||
return merge(config, {
|
||||
const finalCconfig = merge(config, {
|
||||
plugins: [
|
||||
new webpack.DefinePlugin({
|
||||
__CLIENT__: 'true',
|
||||
@ -35,5 +34,24 @@ export default {
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
finalCconfig.module.rules = finalCconfig.module.rules.map((rule: any) => {
|
||||
if (/source-map-loader/.test(rule.loader)) {
|
||||
return {
|
||||
...rule,
|
||||
exclude: /node_modules/, // we don't want source maps for vendors, because of graphiql
|
||||
};
|
||||
}
|
||||
|
||||
if (/file-loader/.test(rule.loader)) {
|
||||
return {
|
||||
...rule,
|
||||
type: 'javascript/auto', // This is fixing issue https://webpack.js.org/guides/asset-modules/
|
||||
};
|
||||
}
|
||||
|
||||
return rule;
|
||||
});
|
||||
return finalCconfig;
|
||||
},
|
||||
};
|
||||
|
@ -6,7 +6,7 @@ import * as customTasks from './src/support/tasks';
|
||||
|
||||
type ConfigOptions = Parameters<typeof defineConfig>[0];
|
||||
|
||||
const nxConfig = nxE2EPreset(__dirname);
|
||||
const nxConfig = nxE2EPreset(__filename);
|
||||
|
||||
interface MyConfigOptions extends ConfigOptions {
|
||||
useRelativeSnapshots?: boolean;
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"name": "console-ce-e2e",
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "apps/console-ce-e2e/src",
|
||||
"projectType": "application",
|
||||
|
@ -4,7 +4,7 @@ export default {
|
||||
preset: '../../jest.preset.js',
|
||||
transform: {
|
||||
'^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest',
|
||||
'^.+\\.[tj]sx?$': 'babel-jest',
|
||||
'^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/react/babel'] }],
|
||||
},
|
||||
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
||||
coverageDirectory: '../../coverage/apps/console-ce',
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"name": "console-ce",
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "apps/console-ce/src",
|
||||
"projectType": "application",
|
||||
@ -7,11 +8,11 @@
|
||||
"build-server-assets": {
|
||||
"executor": "@hasura/internal-plugin:build-server-assets",
|
||||
"inputs": ["{workspaceRoot}/dist/apps/console-ce/**"],
|
||||
"outputs": ["dist/apps/server-assets-console-ce"],
|
||||
"outputs": ["{workspaceRoot}/dist/apps/server-assets-console-ce"],
|
||||
"dependsOn": ["build"]
|
||||
},
|
||||
"build": {
|
||||
"executor": "@nrwl/web:webpack",
|
||||
"executor": "@nrwl/webpack:webpack",
|
||||
"outputs": ["{options.outputPath}"],
|
||||
"defaultConfiguration": "production",
|
||||
"options": {
|
||||
@ -32,7 +33,8 @@
|
||||
"styles": ["apps/console-ce/src/css/tailwind.css"],
|
||||
"scripts": [],
|
||||
"webpackConfig": "custom-webpack.config.js",
|
||||
"postcssConfig": "apps/console-ce/postcss.config.js"
|
||||
"postcssConfig": "apps/console-ce/postcss.config.js",
|
||||
"isolatedConfig": true
|
||||
},
|
||||
"configurations": {
|
||||
"development": {
|
||||
@ -51,7 +53,7 @@
|
||||
}
|
||||
],
|
||||
"optimization": true,
|
||||
"outputHashing": "none",
|
||||
"outputHashing": "bundles",
|
||||
"extractCss": false,
|
||||
"sourceMap": true,
|
||||
"namedChunks": true,
|
||||
@ -62,7 +64,7 @@
|
||||
}
|
||||
},
|
||||
"serve": {
|
||||
"executor": "@nrwl/web:dev-server",
|
||||
"executor": "@nrwl/webpack:dev-server",
|
||||
"defaultConfiguration": "development",
|
||||
"options": {
|
||||
"buildTarget": "console-ce:build",
|
||||
@ -87,7 +89,7 @@
|
||||
},
|
||||
"test": {
|
||||
"executor": "@nrwl/jest:jest",
|
||||
"outputs": ["coverage/apps/console-ce"],
|
||||
"outputs": ["{workspaceRoot}/coverage/apps/console-ce"],
|
||||
"options": {
|
||||
"jestConfig": "apps/console-ce/jest.config.ts",
|
||||
"passWithNoTests": true
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { defineConfig } from 'cypress';
|
||||
import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset';
|
||||
|
||||
const nxConfig = nxE2EPreset(__dirname);
|
||||
const nxConfig = nxE2EPreset(__filename);
|
||||
|
||||
export default defineConfig({
|
||||
viewportWidth: 1440,
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"name": "console-ee-e2e",
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "apps/console-ee-e2e/src",
|
||||
"projectType": "application",
|
||||
|
@ -4,7 +4,7 @@ export default {
|
||||
preset: '../../jest.preset.js',
|
||||
transform: {
|
||||
'^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest',
|
||||
'^.+\\.[tj]sx?$': 'babel-jest',
|
||||
'^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/react/babel'] }],
|
||||
},
|
||||
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
||||
coverageDirectory: '../../coverage/apps/console-ee',
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"name": "console-ee",
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "apps/console-ee/src",
|
||||
"projectType": "application",
|
||||
@ -6,11 +7,11 @@
|
||||
"build-server-assets": {
|
||||
"executor": "@hasura/internal-plugin:build-server-assets",
|
||||
"inputs": ["{workspaceRoot}/dist/apps/console-ee/**"],
|
||||
"outputs": ["dist/apps/server-assets-console-ee"],
|
||||
"outputs": ["{workspaceRoot}/dist/apps/server-assets-console-ee"],
|
||||
"dependsOn": ["build"]
|
||||
},
|
||||
"build": {
|
||||
"executor": "@nrwl/web:webpack",
|
||||
"executor": "@nrwl/webpack:webpack",
|
||||
"outputs": ["{options.outputPath}"],
|
||||
"defaultConfiguration": "production",
|
||||
"options": {
|
||||
@ -31,7 +32,8 @@
|
||||
"styles": ["apps/console-ee/src/css/tailwind.css"],
|
||||
"scripts": [],
|
||||
"webpackConfig": "custom-webpack.config.js",
|
||||
"postcssConfig": "apps/console-ee/postcss.config.js"
|
||||
"postcssConfig": "apps/console-ee/postcss.config.js",
|
||||
"isolatedConfig": true
|
||||
},
|
||||
"configurations": {
|
||||
"development": {
|
||||
@ -50,7 +52,7 @@
|
||||
}
|
||||
],
|
||||
"optimization": true,
|
||||
"outputHashing": "none",
|
||||
"outputHashing": "bundles",
|
||||
"extractCss": false,
|
||||
"sourceMap": true,
|
||||
"namedChunks": true,
|
||||
@ -61,7 +63,7 @@
|
||||
}
|
||||
},
|
||||
"serve": {
|
||||
"executor": "@nrwl/web:dev-server",
|
||||
"executor": "@nrwl/webpack:dev-server",
|
||||
"defaultConfiguration": "development",
|
||||
"options": {
|
||||
"buildTarget": "console-ee:build",
|
||||
@ -88,7 +90,7 @@
|
||||
},
|
||||
"test": {
|
||||
"executor": "@nrwl/jest:jest",
|
||||
"outputs": ["coverage/apps/console-ee"],
|
||||
"outputs": ["{workspaceRoot}/coverage/apps/console-ee"],
|
||||
"options": {
|
||||
"jestConfig": "apps/console-ee/jest.config.ts",
|
||||
"passWithNoTests": true
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"name": "nx-internal-plugin-e2e",
|
||||
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
||||
"projectType": "application",
|
||||
"sourceRoot": "apps/nx/internal-plugin-e2e/src",
|
||||
|
@ -1,194 +1,24 @@
|
||||
const DomParser = require('dom-parser');
|
||||
|
||||
const { merge } = require('webpack-merge');
|
||||
const { composePlugins, withNx, withWeb } = require('@nrwl/webpack');
|
||||
// We can't' have react fast refresh because of circular dependancies
|
||||
// That is also why the current fast refresh is flacky
|
||||
//const { withReact } = require('@nrwl/react');
|
||||
const util = require('util');
|
||||
const webpack = require('webpack');
|
||||
const { webpackPlugin } = require('unplugin-dynamic-asset-loader');
|
||||
const withConsoleTweaks = require('./tools/webpack/withConsoleTweaks');
|
||||
const withDevAssetLoader = require('./tools/webpack/withDevAssetLoader');
|
||||
const withCircularDependencyPlugin = require('./tools/webpack/withCircularDependencyPlugin');
|
||||
|
||||
// un comment this to test out the circular deps
|
||||
const CircularDependencyPlugin = require('circular-dependency-plugin');
|
||||
module.exports = composePlugins(
|
||||
// Nx plugins for webpack.
|
||||
withNx(),
|
||||
// Replace this with withReact for fast refresh once we are able to use it
|
||||
withWeb(),
|
||||
withConsoleTweaks(),
|
||||
withDevAssetLoader()
|
||||
|
||||
const log = value =>
|
||||
console.log(
|
||||
util.inspect(value, { showHidden: false, depth: null, colors: true })
|
||||
);
|
||||
/*
|
||||
withCircularDependencyPlugin({
|
||||
shouldLogEveryCircularDependency: false,
|
||||
})
|
||||
|
||||
const createCircularDependencyPlugin = () => {
|
||||
const shouldLogEveryCircularDep = false;
|
||||
let numCyclesDetected = 0;
|
||||
let filteredCircleDeps = 0;
|
||||
const depCircleFilter = undefined;
|
||||
|
||||
let storedPaths = [];
|
||||
const shouldLogMostCommonPaths = false;
|
||||
|
||||
return new CircularDependencyPlugin({
|
||||
exclude: /node_modules/,
|
||||
failOnError: false,
|
||||
onStart({ compilation }) {
|
||||
numCyclesDetected = 0;
|
||||
filteredCircleDeps = 0;
|
||||
storedPaths = [];
|
||||
},
|
||||
onDetected({
|
||||
// `paths` will be an Array of the relative module paths that make up the cycle
|
||||
paths: cyclePaths,
|
||||
compilation,
|
||||
}) {
|
||||
numCyclesDetected++;
|
||||
storedPaths = [...storedPaths, ...cyclePaths];
|
||||
const err = new Error(
|
||||
`Circular dependency detected!\n * ${cyclePaths.join('\n → ')}`
|
||||
);
|
||||
if (!shouldLogEveryCircularDep) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!depCircleFilter) {
|
||||
compilation.warnings.push(err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (cyclePaths.some(path => path.includes(depCircleFilter))) {
|
||||
filteredCircleDeps++;
|
||||
compilation.warnings.push(err);
|
||||
}
|
||||
},
|
||||
onEnd({ compilation }) {
|
||||
const warns = Array.from(
|
||||
Array(Math.round(numCyclesDetected / 100)).keys()
|
||||
)
|
||||
.map(it => '!')
|
||||
.join('');
|
||||
compilation.warnings.push(
|
||||
new Error(`Detected ${numCyclesDetected} circular dependency ` + warns)
|
||||
);
|
||||
|
||||
if (depCircleFilter) {
|
||||
const filterWarns = Array.from(
|
||||
Array(Math.round(filteredCircleDeps / 100)).keys()
|
||||
)
|
||||
.map(it => '!')
|
||||
.join('');
|
||||
compilation.warnings.push(
|
||||
new Error(
|
||||
`Detected ${filteredCircleDeps} circular dependency only for the filter "${depCircleFilter}" ${filterWarns}`
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if (shouldLogMostCommonPaths) {
|
||||
const topTenPaths = storedPaths
|
||||
.sort(
|
||||
(a, b) =>
|
||||
storedPaths.filter(v => v === a).length -
|
||||
storedPaths.filter(v => v === b).length
|
||||
)
|
||||
.slice(0, 10);
|
||||
|
||||
compilation.warnings.push(
|
||||
new Error(
|
||||
`Here are the top 10 files in the loops :\n${topTenPaths.join(
|
||||
'\n → '
|
||||
)}`
|
||||
)
|
||||
);
|
||||
}
|
||||
},
|
||||
cwd: process.cwd(),
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = (config, context) => {
|
||||
const isDevBuild = context.configuration === 'development';
|
||||
let output = merge(config, {
|
||||
output: {
|
||||
publicPath: 'auto',
|
||||
},
|
||||
plugins: [
|
||||
new webpack.DefinePlugin({
|
||||
__CLIENT__: 'true',
|
||||
__SERVER__: false,
|
||||
__DEVELOPMENT__: true,
|
||||
__DEVTOOLS__: true, // <-------- DISABLE redux-devtools HERE
|
||||
CONSOLE_ASSET_VERSION: Date.now().toString(),
|
||||
}),
|
||||
// un comment this to test out the circular deps. Left here since it can be tricky to configure
|
||||
],
|
||||
module: {
|
||||
rules: [
|
||||
/*
|
||||
Rule taken from the old codebase
|
||||
=> Do we still need the version naming ?
|
||||
|
||||
*/
|
||||
{
|
||||
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
|
||||
use: [
|
||||
{
|
||||
loader: 'url-loader',
|
||||
options: { limit: 10000, mimetype: 'image/svg+xml' },
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
fallback: {
|
||||
/*
|
||||
Used by :
|
||||
openapi-to-graphql and it's deps (graphql-upload > fs-capacitor)
|
||||
no real polyfill exists, so this turns it into an empty implementation
|
||||
*/
|
||||
fs: false,
|
||||
/*
|
||||
Used by :
|
||||
openapi-to-graphql and it's deps (graphql-upload > fs-capacitor)
|
||||
*/
|
||||
os: require.resolve('os-browserify/browser'),
|
||||
|
||||
/*
|
||||
Used by :
|
||||
openapi-to-graphql and it's deps (swagger2openapi)
|
||||
*/
|
||||
http: require.resolve('stream-http'),
|
||||
/*
|
||||
Used by :
|
||||
@graphql-codegen/typescript and it's deps (@graphql-codegen/visitor-plugin-common && parse-filepath)
|
||||
=> one usage is found, so we have to check if the usage is still relevant
|
||||
*/
|
||||
path: require.resolve('path-browserify'),
|
||||
/*
|
||||
Used by :
|
||||
jsonwebtoken deps (jwa && jws)
|
||||
=> we already have an equivalent in the codebases that don't depend on it,jwt-decode.
|
||||
Might be worth using only the latter
|
||||
*/
|
||||
crypto: require.resolve('crypto-browserify'),
|
||||
/*
|
||||
Used by :
|
||||
jsonwebtoken deps (jwa && jws)
|
||||
@graphql-tools/merge => dependanci of graphiql & graphql-codegen/core, a package upgrade might fix it
|
||||
*/
|
||||
util: require.resolve('util/'),
|
||||
/*
|
||||
Used by :
|
||||
jsonwebtoken deps (jwa && jws)
|
||||
*/
|
||||
stream: require.resolve('stream-browserify'),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (isDevBuild) {
|
||||
output = merge(output, {
|
||||
plugins: [
|
||||
// un comment this to test out the circular deps. Left here since it can be tricky to configure
|
||||
// createCircularDependencyPlugin(),
|
||||
webpackPlugin(),
|
||||
],
|
||||
});
|
||||
}
|
||||
// log(output.plugins);
|
||||
return output;
|
||||
};
|
||||
*/
|
||||
);
|
||||
|
@ -10,12 +10,15 @@ const config: StorybookConfig = {
|
||||
staticDirs: ['../../../../static'],
|
||||
|
||||
stories: [
|
||||
...rootMain.stories,
|
||||
'../src/lib/**/*.stories.mdx',
|
||||
'../src/lib/**/*.stories.@(js|jsx|ts|tsx)',
|
||||
],
|
||||
|
||||
addons: [...rootMain.addons, '@nrwl/react/plugins/storybook'],
|
||||
addons: [
|
||||
'@storybook/addon-essentials',
|
||||
...rootMain.addons,
|
||||
'@nrwl/react/plugins/storybook',
|
||||
],
|
||||
|
||||
webpackFinal: async (config: Configuration) => {
|
||||
// apply any global webpack configs that might have been specified in .storybook/main.ts
|
||||
|
@ -9,12 +9,12 @@
|
||||
"../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts",
|
||||
"../../../../node_modules/@nrwl/react/typings/image.d.ts"
|
||||
],
|
||||
|
||||
"exclude": [
|
||||
"../**/*.spec.ts",
|
||||
"../**/*.spec.js",
|
||||
"../**/*.spec.tsx",
|
||||
"../**/*.spec.jsx"
|
||||
"../**/*.spec.jsx",
|
||||
"jest.config.ts"
|
||||
],
|
||||
"include": [
|
||||
"../src/**/*.stories.ts",
|
||||
|
@ -3,7 +3,7 @@ export default {
|
||||
displayName: 'console-legacy-ce',
|
||||
preset: '../../../jest.preset.js',
|
||||
transform: {
|
||||
'^.+\\.[tj]sx?$': 'babel-jest',
|
||||
'^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/react/babel'] }],
|
||||
},
|
||||
setupFilesAfterEnv: ['<rootDir>/src/setupTests.ts'],
|
||||
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'],
|
||||
|
@ -1,4 +1,5 @@
|
||||
{
|
||||
"name": "console-legacy-ce",
|
||||
"$schema": "../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "libs/console/legacy-ce/src",
|
||||
"projectType": "library",
|
||||
@ -13,7 +14,7 @@
|
||||
},
|
||||
"test": {
|
||||
"executor": "@nrwl/jest:jest",
|
||||
"outputs": ["coverage/libs/console/legacy-ce"],
|
||||
"outputs": ["{workspaceRoot}/coverage/libs/console/legacy-ce"],
|
||||
"options": {
|
||||
"jestConfig": "libs/console/legacy-ce/jest.config.ts",
|
||||
"passWithNoTests": true
|
||||
@ -24,9 +25,7 @@
|
||||
"options": {
|
||||
"uiFramework": "@storybook/react",
|
||||
"port": 4400,
|
||||
"config": {
|
||||
"configFolder": "libs/console/legacy-ce/.storybook"
|
||||
}
|
||||
"configDir": "libs/console/legacy-ce/.storybook"
|
||||
},
|
||||
"configurations": {
|
||||
"ci": {
|
||||
@ -36,13 +35,11 @@
|
||||
},
|
||||
"build-storybook": {
|
||||
"executor": "@nrwl/storybook:build",
|
||||
"outputs": ["{options.outputPath}"],
|
||||
"outputs": ["{options.outputDir}"],
|
||||
"options": {
|
||||
"uiFramework": "@storybook/react",
|
||||
"outputPath": "dist/storybook/console/legacy-ce",
|
||||
"config": {
|
||||
"configFolder": "libs/console/legacy-ce/.storybook"
|
||||
}
|
||||
"configDir": "libs/console/legacy-ce/.storybook",
|
||||
"outputDir": "dist/storybook/console/legacy-ce"
|
||||
},
|
||||
"configurations": {
|
||||
"ci": {
|
||||
|
@ -65,6 +65,7 @@ export {
|
||||
startTracing,
|
||||
addUserProperties,
|
||||
programmaticallyTraceError,
|
||||
REDACT_EVERYTHING,
|
||||
} from './lib/features/Analytics';
|
||||
export { CloudOnboarding } from './lib/features/CloudOnboarding';
|
||||
export { prefetchSurveysData } from './lib/features/Surveys';
|
||||
|
@ -1,6 +1,25 @@
|
||||
import isObject from 'lodash.isobject';
|
||||
|
||||
export { getCurrTimeForFileName } from './jsUtils';
|
||||
// return time in format YYYY_MM_DD_hh_mm_ss_s
|
||||
export const getCurrTimeForFileName = () => {
|
||||
const currTime = new Date();
|
||||
|
||||
const year = currTime.getFullYear().toString().padStart(4, '0');
|
||||
|
||||
const month = (currTime.getMonth() + 1).toString().padStart(2, '0');
|
||||
|
||||
const day = currTime.getDate().toString().padStart(2, '0');
|
||||
|
||||
const hours = currTime.getHours().toString().padStart(2, '0');
|
||||
|
||||
const minutes = currTime.getMinutes().toString().padStart(2, '0');
|
||||
|
||||
const seconds = currTime.getSeconds().toString().padStart(2, '0');
|
||||
|
||||
const milliSeconds = currTime.getMilliseconds().toString().padStart(3, '0');
|
||||
|
||||
return [year, month, day, hours, minutes, seconds, milliSeconds].join('_');
|
||||
};
|
||||
|
||||
export function isJsonString(str: string) {
|
||||
try {
|
||||
|
@ -1,8 +1,7 @@
|
||||
import moment from 'moment';
|
||||
import { isJsonString } from './export.utils';
|
||||
|
||||
export { isJsonString } from './export.utils';
|
||||
|
||||
export { isJsonString, getCurrTimeForFileName } from './export.utils';
|
||||
// TODO: make functions from this file available without imports
|
||||
/* TYPE utils */
|
||||
|
||||
@ -340,27 +339,6 @@ export const getFileExtensionFromFilename = (filename: string) => {
|
||||
return matches ? matches[0] : null;
|
||||
};
|
||||
|
||||
// return time in format YYYY_MM_DD_hh_mm_ss_s
|
||||
export const getCurrTimeForFileName = () => {
|
||||
const currTime = new Date();
|
||||
|
||||
const year = currTime.getFullYear().toString().padStart(4, '0');
|
||||
|
||||
const month = (currTime.getMonth() + 1).toString().padStart(2, '0');
|
||||
|
||||
const day = currTime.getDate().toString().padStart(2, '0');
|
||||
|
||||
const hours = currTime.getHours().toString().padStart(2, '0');
|
||||
|
||||
const minutes = currTime.getMinutes().toString().padStart(2, '0');
|
||||
|
||||
const seconds = currTime.getSeconds().toString().padStart(2, '0');
|
||||
|
||||
const milliSeconds = currTime.getMilliseconds().toString().padStart(3, '0');
|
||||
|
||||
return [year, month, day, hours, minutes, seconds, milliSeconds].join('_');
|
||||
};
|
||||
|
||||
export const convertDateTimeToLocale = (dateTime: string | Date | number) => {
|
||||
return moment(dateTime, moment.ISO_8601).format(
|
||||
'ddd, MMM, yyyy, Do HH:mm:ss Z'
|
||||
|
@ -5,7 +5,7 @@ import { QualifiedTable } from '../../../metadata/types';
|
||||
import { Nullable } from './tsUtils';
|
||||
import { ConsoleScope } from '../../Main/ConsoleNotification';
|
||||
import { BaseTableColumn } from '../../../dataSources/types';
|
||||
import { sqlEscapeText } from '../../../dataSources/services/postgresql/sqlUtils';
|
||||
import { sqlEscapeText } from '../../../dataSources/common/sqlEscapeText';
|
||||
import { FixMe } from '../../../types';
|
||||
|
||||
export type OrderByType = 'asc' | 'desc';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { getGraphQLQueryPayload } from '../../../../../Common/utils/graphqlUtils';
|
||||
import Endpoints from '../../../../../../Endpoints';
|
||||
import { Api } from '../../../../../../hooks/apiUtils';
|
||||
import { useAppSelector } from '../../../../../../store';
|
||||
import { useAppSelector } from '../../../../../../storeHooks';
|
||||
import { getIntrospectionQuery, IntrospectionQuery } from 'graphql';
|
||||
import { useQuery, UseQueryOptions, UseQueryResult } from 'react-query';
|
||||
|
||||
|
@ -11,7 +11,7 @@ import {
|
||||
showSuccessNotification,
|
||||
showWarningNotification,
|
||||
} from './Notification';
|
||||
import { useAppDispatch } from '../../../store';
|
||||
import { useAppDispatch } from '../../../storeHooks';
|
||||
import { useFireNotification } from '../../../new-components/Notifications';
|
||||
|
||||
export default {
|
||||
@ -93,8 +93,8 @@ DirectStoreAccess.parameters = {
|
||||
source: { state: 'open' },
|
||||
description: {
|
||||
story: `This story demonstrates direct store access to trigger a notification with direct store access thanks to \`useAppDispatch\` and helper function \`showSuccessNotification\`.
|
||||
|
||||
The \`showSuccessNotification\` helper function offers all presets and a curated list of props to display a success notification.
|
||||
|
||||
The \`showSuccessNotification\` helper function offers all presets and a curated list of props to display a success notification.
|
||||
|
||||
\`showErrorNotification\`, \`showSuccessNotification\`, \`showInfoNotification\`, \`showWarningNotification,\` are also available.`,
|
||||
},
|
||||
@ -157,7 +157,7 @@ Hook.parameters = {
|
||||
source: { state: 'open' },
|
||||
description: {
|
||||
story: `This story demonstrates the use of the notification dedicated hook to trigger a notification thanks to \`useFireNotification\`.
|
||||
|
||||
|
||||
The \`useFireNotification\` offers all presets and a curated list of options to display any type of notification. .
|
||||
|
||||
👍 The store access is hidden behind the hook.`,
|
||||
@ -202,7 +202,7 @@ CustomCall.parameters = {
|
||||
source: { state: 'open' },
|
||||
description: {
|
||||
story: `This story demonstrates the use of the low level custom call a notification thanks to \`useAppDispatch\` and helper function \`showNotification\`.
|
||||
|
||||
|
||||
The \`showNotification\` function allows to define all notification properties, including the button click handler.`,
|
||||
},
|
||||
},
|
||||
|
@ -1,14 +1,17 @@
|
||||
import * as React from 'react';
|
||||
import {
|
||||
act,
|
||||
render,
|
||||
screen,
|
||||
cleanup,
|
||||
waitFor,
|
||||
fireEvent,
|
||||
} from '@testing-library/react';
|
||||
import { renderHook, act } from '@testing-library/react-hooks';
|
||||
import type { GraphQLError } from 'graphql';
|
||||
import { ExchangeTokenResponse, useNeonOAuth } from './useNeonOAuth';
|
||||
import { rest } from 'msw';
|
||||
import { setupServer } from 'msw/node';
|
||||
import 'whatwg-fetch';
|
||||
|
||||
import { NEON_CALLBACK_SEARCH } from './utils';
|
||||
|
||||
@ -84,22 +87,19 @@ Object.defineProperty(window, 'open', { value: mockPopupImpl.openPopup });
|
||||
// --------------------------------------------------
|
||||
// NETWORK MOCK
|
||||
// --------------------------------------------------
|
||||
const server = setupServer();
|
||||
server.events.on('response:mocked', () => {
|
||||
//
|
||||
jest.advanceTimersByTime(10);
|
||||
jest.runAllTicks();
|
||||
});
|
||||
|
||||
const mockHTTPResponse = (status = 200, returnBody: any) => {
|
||||
global.fetch = jest.fn().mockImplementationOnce(() => {
|
||||
return new Promise(resolve => {
|
||||
resolve({
|
||||
ok: true,
|
||||
status,
|
||||
json: () => {
|
||||
return returnBody || {};
|
||||
},
|
||||
headers: {
|
||||
get: (key: string) =>
|
||||
key === 'Content-Type' ? 'application/json' : '',
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
server.use(
|
||||
rest.all('*', (req, res, context) => {
|
||||
return res(context.json(returnBody), context.status(status));
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
// --------------------------------------------------
|
||||
@ -111,6 +111,7 @@ function closeFakePopup() {
|
||||
act(() => {
|
||||
mockPopupImpl.closePopup();
|
||||
jest.advanceTimersByTime(4000);
|
||||
jest.runAllTicks();
|
||||
});
|
||||
}
|
||||
|
||||
@ -119,39 +120,41 @@ function closeFakePopup() {
|
||||
// --------------------------------------------------
|
||||
describe('Neon', () => {
|
||||
// reset test state after each test
|
||||
beforeAll(() => {
|
||||
server.listen();
|
||||
});
|
||||
afterAll(() => {
|
||||
server.close();
|
||||
jest.useRealTimers();
|
||||
});
|
||||
beforeEach(() => {
|
||||
cleanup();
|
||||
mockLocalStorage.clear();
|
||||
mockPopupImpl.closePopup();
|
||||
|
||||
jest.useFakeTimers();
|
||||
jest.clearAllTimers();
|
||||
jest.clearAllMocks();
|
||||
jest.useFakeTimers('legacy');
|
||||
server.resetHandlers();
|
||||
});
|
||||
|
||||
it('Happy path', async () => {
|
||||
// Arrange
|
||||
await render(<TestComponent />);
|
||||
const { waitForValueToChange, result } = renderHook(() => useNeonOAuth());
|
||||
|
||||
expect(screen.getByTestId('status')).toHaveTextContent('idle');
|
||||
expect(result.current.neonOauthStatus.status).toEqual('idle');
|
||||
|
||||
// Act
|
||||
fireEvent.click(screen.getByTestId('start'));
|
||||
|
||||
// Wait for the loading state to be triggered
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('status')).toHaveTextContent('authenticating');
|
||||
act(() => {
|
||||
result.current.startNeonOAuth();
|
||||
});
|
||||
// Wait for the loading state to be triggered
|
||||
expect(result.current.neonOauthStatus.status).toEqual('authenticating');
|
||||
|
||||
// --------------------------------------------------
|
||||
// CONTROLLING TEST MOCKS
|
||||
// set search params in local storage and close popup
|
||||
// mock success exchange of token
|
||||
const oauth2State = screen.getByTestId('oauth2-state').textContent;
|
||||
mockLocalStorage.setItem(
|
||||
NEON_CALLBACK_SEARCH,
|
||||
`code=test_code&state=${oauth2State}`
|
||||
);
|
||||
|
||||
const response: ExchangeTokenResponse = {
|
||||
data: {
|
||||
neonExchangeOAuthToken: {
|
||||
@ -162,22 +165,35 @@ describe('Neon', () => {
|
||||
};
|
||||
mockHTTPResponse(200, response);
|
||||
|
||||
const oauth2State = result.current.oauth2State;
|
||||
mockLocalStorage.setItem(
|
||||
NEON_CALLBACK_SEARCH,
|
||||
`code=test_code&state=${oauth2State}`
|
||||
);
|
||||
|
||||
closeFakePopup();
|
||||
jest.runAllTicks();
|
||||
// --------------------------------------------------
|
||||
|
||||
await screen.findByText('authenticating');
|
||||
// --------------------------------------------------
|
||||
|
||||
// ALl good until here
|
||||
// Assert
|
||||
await screen.findByText('authenticated');
|
||||
expect(screen.getByTestId('email')).toHaveTextContent(
|
||||
await waitForValueToChange(() => result.current.neonOauthStatus);
|
||||
|
||||
expect(result.current.neonOauthStatus.status).toEqual('authenticated');
|
||||
|
||||
// @ts-expect-error we know better than typescript here
|
||||
expect(result.current.neonOauthStatus?.email).toEqual(
|
||||
response.data.neonExchangeOAuthToken.email
|
||||
);
|
||||
});
|
||||
|
||||
it('Renders idle state correctly', () => {
|
||||
// Arrange
|
||||
render(<TestComponent />);
|
||||
const { result } = renderHook(() => useNeonOAuth());
|
||||
// Assert
|
||||
expect(screen.getByTestId('status')).toHaveTextContent('idle');
|
||||
expect(result.current.neonOauthStatus.status).toEqual('idle');
|
||||
});
|
||||
|
||||
it('throws unexpected error when the popup is closed before the parameters are stored in localstorage', () => {
|
||||
@ -246,15 +262,17 @@ describe('Neon', () => {
|
||||
|
||||
it('Renders oauth error when there is an error exchanging the token', async () => {
|
||||
// Arrange
|
||||
render(<TestComponent />);
|
||||
const { waitForValueToChange, result } = renderHook(() => useNeonOAuth());
|
||||
|
||||
// Act
|
||||
fireEvent.click(screen.getByTestId('start'));
|
||||
act(() => {
|
||||
result.current.startNeonOAuth();
|
||||
});
|
||||
|
||||
// --------------------------------------------------
|
||||
// CONTROLLING TEST MOCKS
|
||||
// set the right in local storage along with a code
|
||||
const oauth2State = screen.getByTestId('oauth2-state').textContent;
|
||||
const oauth2State = result.current.oauth2State;
|
||||
mockLocalStorage.setItem(
|
||||
NEON_CALLBACK_SEARCH,
|
||||
`code=test_code&state=${oauth2State}`
|
||||
@ -272,13 +290,16 @@ describe('Neon', () => {
|
||||
closeFakePopup();
|
||||
// --------------------------------------------------
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('status')).toHaveTextContent('authenticating');
|
||||
});
|
||||
|
||||
// Assert
|
||||
await waitFor(() => {
|
||||
expect(screen.getByTestId('error')).toHaveTextContent('oauth api error');
|
||||
});
|
||||
|
||||
await waitForValueToChange(() => result.current.neonOauthStatus);
|
||||
console.log(result.current.neonOauthStatus);
|
||||
|
||||
expect(result.current.neonOauthStatus.status).toEqual('error');
|
||||
|
||||
// @ts-expect-error we know better than typescript here
|
||||
expect(result.current.neonOauthStatus?.error?.message).toEqual(
|
||||
'oauth api error'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
@ -1,8 +1,26 @@
|
||||
import React from 'react';
|
||||
test('Skipped tests', () => {});
|
||||
/*
|
||||
Commented out because of a the following circular dependency problem.
|
||||
|
||||
TypeError: Cannot read properties of undefined (reading 'postgres')
|
||||
|
||||
446 |
|
||||
447 | export let currentDriver: Driver = 'postgres';
|
||||
> 448 | export let dataSource: DataSourcesAPI = services[currentDriver || 'postgres'];
|
||||
| ^
|
||||
449 |
|
||||
450 | export const isFeatureSupported = (
|
||||
451 | feature: Path<DeepRequired<SupportedFeaturesType>>
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
import { fireEvent, screen } from '@testing-library/react';
|
||||
import { GraphQLFieldCustomization } from '../GraphQLFieldCustomization/GraphQLFieldCustomization';
|
||||
import { renderWithClient } from '../../../../../hooks/__tests__/common/decorator';
|
||||
|
||||
|
||||
|
||||
describe('component GraphQLFieldCustomization', () => {
|
||||
it('renders', () => {
|
||||
renderWithClient(<GraphQLFieldCustomization onChange={() => null} />);
|
||||
@ -82,3 +100,4 @@ describe('component GraphQLFieldCustomization', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
@ -1,3 +1,21 @@
|
||||
test('Skipped tests', () => {});
|
||||
|
||||
/*
|
||||
Commented out because of a the following circular dependency problem.
|
||||
|
||||
TypeError: Cannot read properties of undefined (reading 'postgres')
|
||||
|
||||
446 |
|
||||
447 | export let currentDriver: Driver = 'postgres';
|
||||
> 448 | export let dataSource: DataSourcesAPI = services[currentDriver || 'postgres'];
|
||||
| ^
|
||||
449 |
|
||||
450 | export const isFeatureSupported = (
|
||||
451 | feature: Path<DeepRequired<SupportedFeaturesType>>
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
import { getActionType } from '../GraphQLFieldCustomization/GraphQLFieldCustomizationContainer';
|
||||
import { CustomizationFieldName } from '../GraphQLFieldCustomization/types';
|
||||
|
||||
@ -35,3 +53,5 @@ describe('getActionType', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
*/
|
||||
|
@ -2,7 +2,7 @@ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
|
||||
import { Driver } from '../../../../../dataSources';
|
||||
import { ReduxState } from '../../../../../types';
|
||||
import requestAction from '../../../../../utils/requestAction';
|
||||
import { AsyncThunkConfig } from '../../../../../store';
|
||||
import type { AsyncThunkConfig } from '../../../../../store';
|
||||
import { makeMigrationCall } from '../../DataActions';
|
||||
import { getRunSqlQuery } from '../../../../Common/utils/v1QueryUtils';
|
||||
import Endpoints from '../../../../../Endpoints';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React, { useEffect } from 'react';
|
||||
import { FaGithub, FaSpinner, FaUpload } from 'react-icons/fa';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../../storeHooks';
|
||||
import {
|
||||
applyTemplate,
|
||||
fetchSchemaConfigurationByName,
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import { FaShareSquare, FaSpinner } from 'react-icons/fa';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../../storeHooks';
|
||||
import {
|
||||
fetchGlobalSchemaSharingConfiguration,
|
||||
schemaSharingSelectors,
|
||||
|
@ -18,7 +18,7 @@ import { isFeatureSupported } from '../../../dataSources';
|
||||
import { isTemplateGalleryEnabled } from './Schema/TemplateGallery/templateGalleryConfig';
|
||||
import BreadCrumb from '../../Common/Layout/BreadCrumb/BreadCrumb';
|
||||
import TemplateGallery from './Schema/TemplateGallery/TemplateGallery';
|
||||
import { useAppDispatch, useAppSelector } from '../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../storeHooks';
|
||||
|
||||
interface Props {
|
||||
dispatch: Dispatch;
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useMemo, useState } from 'react';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../storeHooks';
|
||||
import { getManualEventsTriggers } from '../../../../metadata/selector';
|
||||
import {
|
||||
adaptFormValuesToQuery,
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../storeHooks';
|
||||
import { findTable, generateTableDef } from '../../../../dataSources';
|
||||
import { setTable } from '../DataActions';
|
||||
import { fetchEnumOptions, editItem, E_ONGOING_REQ } from './EditActions';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { AppDispatch } from '../../../../store';
|
||||
import type { AppDispatch } from '../../../../store';
|
||||
import { Button } from '../../../../new-components/Button';
|
||||
import { RightContainer } from '../../../Common/Layout/RightContainer';
|
||||
import { ordinalColSort } from '../utils';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../storeHooks';
|
||||
import { useReadOnlyMode } from '../../../../hooks';
|
||||
import { useMetadata } from '../../../../features/MetadataAPI';
|
||||
import { HasuraMetadataV3 } from '../../../../metadata/types';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { AppDispatch } from '../../../../store';
|
||||
import type { AppDispatch } from '../../../../store';
|
||||
import { Button } from '../../../../new-components/Button';
|
||||
import { RightContainer } from '../../../Common/Layout/RightContainer';
|
||||
import { ordinalColSort } from '../utils';
|
||||
|
@ -7,7 +7,7 @@ import {
|
||||
getTableCustomColumnNames,
|
||||
Table,
|
||||
} from '../../../../dataSources';
|
||||
import { AppDispatch } from '../../../../store';
|
||||
import type { AppDispatch } from '../../../../store';
|
||||
import { IconTooltip } from '../../../../new-components/Tooltip';
|
||||
import { NotSupportedNote } from '../../../Common/NotSupportedNote';
|
||||
import { Button } from '../../../../new-components/Button';
|
||||
|
@ -5,7 +5,7 @@ import {
|
||||
isFeatureSupported,
|
||||
Table,
|
||||
} from '../../../../dataSources';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../../../storeHooks';
|
||||
import React, { useEffect } from 'react';
|
||||
import { getAllDataTypeMap } from '../Common/utils';
|
||||
import {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { dataSource, Table } from '../../../../../dataSources';
|
||||
import { useAppDispatch } from '../../../../../store';
|
||||
import { useAppDispatch } from '../../../../../storeHooks';
|
||||
import { useEffect } from 'react';
|
||||
import { getExistingFKConstraints } from '../../Common/Components/utils';
|
||||
import { updateSchemaInfo } from '../../DataActions';
|
||||
|
@ -6,24 +6,17 @@ import clsx from 'clsx';
|
||||
|
||||
import CollapsibleToggle from '../../../../Common/CollapsibleToggle/CollapsibleToggle';
|
||||
import { SelectPermissionsRow } from './SelectPermissionsRow';
|
||||
import {
|
||||
QueryRootPermissionType,
|
||||
SubscriptionRootPermissionType,
|
||||
RootFieldPermissionsType,
|
||||
} from './types';
|
||||
import { RootFieldPermissionsType } from './types';
|
||||
import { RootFieldsPermissionsTitle } from './RootFieldsPermissionsTitle';
|
||||
import { useRootFieldPermissions } from './useRootFieldPermissions';
|
||||
import {
|
||||
subscriptionRootPermissionFields,
|
||||
queryRootPermissionFields,
|
||||
} from './constants';
|
||||
|
||||
export type RootKeyValues = 'query_root_values' | 'subscription_root_values';
|
||||
|
||||
export const queryRootPermissionFields: QueryRootPermissionType[] = [
|
||||
'select',
|
||||
'select_by_pk',
|
||||
'select_aggregate',
|
||||
];
|
||||
|
||||
export const subscriptionRootPermissionFields: SubscriptionRootPermissionType[] =
|
||||
['select', 'select_by_pk', 'select_aggregate', 'select_stream'];
|
||||
export { subscriptionRootPermissionFields, queryRootPermissionFields };
|
||||
|
||||
export const QUERY_ROOT_VALUES = 'query_root_values';
|
||||
export const SUBSCRIPTION_ROOT_VALUES = 'subscription_root_values';
|
||||
|
@ -0,0 +1,13 @@
|
||||
import {
|
||||
QueryRootPermissionType,
|
||||
SubscriptionRootPermissionType,
|
||||
} from './types';
|
||||
|
||||
export const queryRootPermissionFields: QueryRootPermissionType[] = [
|
||||
'select',
|
||||
'select_by_pk',
|
||||
'select_aggregate',
|
||||
];
|
||||
|
||||
export const subscriptionRootPermissionFields: SubscriptionRootPermissionType[] =
|
||||
['select', 'select_by_pk', 'select_aggregate', 'select_stream'];
|
@ -1,7 +1,7 @@
|
||||
import {
|
||||
queryRootPermissionFields,
|
||||
subscriptionRootPermissionFields,
|
||||
} from './RootFieldPermissions';
|
||||
} from './constants';
|
||||
import {
|
||||
QueryRootPermissionTypes,
|
||||
SubscriptionRootPermissionTypes,
|
||||
|
@ -1,6 +1,6 @@
|
||||
import Endpoints from '../../../../../Endpoints';
|
||||
import { Api } from '../../../../../hooks/apiUtils';
|
||||
import { useAppSelector } from '../../../../../store';
|
||||
import { useAppSelector } from '../../../../../storeHooks';
|
||||
import { useQuery, UseQueryOptions } from 'react-query';
|
||||
import { CronTriggerAPIResult, ScheduledTrigger } from '../../types';
|
||||
|
||||
|
@ -56,7 +56,6 @@ export const Field: React.FC<FieldProps> = ({
|
||||
// happens only first time when the node is created
|
||||
if (
|
||||
fieldVal &&
|
||||
fieldVal !== {} &&
|
||||
Object.keys(fieldVal).length > 0 &&
|
||||
!isEmpty(fieldVal) &&
|
||||
!autoExpandInputPresets
|
||||
@ -67,12 +66,7 @@ export const Field: React.FC<FieldProps> = ({
|
||||
}, [autoExpandInputPresets]);
|
||||
|
||||
useEffect(() => {
|
||||
if (
|
||||
fieldVal &&
|
||||
fieldVal !== {} &&
|
||||
Object.keys(fieldVal).length > 0 &&
|
||||
!isEmpty(fieldVal)
|
||||
) {
|
||||
if (fieldVal && Object.keys(fieldVal).length > 0 && !isEmpty(fieldVal)) {
|
||||
context.setArgTree((argTree: Record<string, any>) => {
|
||||
const tree = i.parentName
|
||||
? {
|
||||
|
@ -0,0 +1,9 @@
|
||||
export const sqlEscapeText = (rawText: string) => {
|
||||
let text = rawText;
|
||||
|
||||
if (text) {
|
||||
text = text.replace(/'/g, "\\'");
|
||||
}
|
||||
|
||||
return `E'${text}'`;
|
||||
};
|
@ -35,7 +35,7 @@ import { supportedFeatures as BigQuerySupportedFeatures } from './services/bigqu
|
||||
import { supportedFeatures as CitusQuerySupportedFeatures } from './services/citus';
|
||||
import { supportedFeatures as CockroachQuerySupportedFeatures } from './services/cockroach';
|
||||
|
||||
export { Table, TableColumn } from './types';
|
||||
export type { Table, TableColumn } from './types';
|
||||
|
||||
export const drivers = [
|
||||
'postgres',
|
||||
@ -478,8 +478,10 @@ export const isFeatureSupportedForDriver = (
|
||||
|
||||
class DataSourceChangedEvent extends Event {
|
||||
static type = 'data-source-changed';
|
||||
constructor(public driver: Driver) {
|
||||
public driver: Driver;
|
||||
constructor(driver: Driver) {
|
||||
super(DataSourceChangedEvent.type);
|
||||
this.driver = driver;
|
||||
}
|
||||
}
|
||||
const eventTarget = new EventTarget();
|
||||
|
@ -1,7 +1,7 @@
|
||||
import React from 'react';
|
||||
import { isEnvironmentSupportMultiTenantConnectionPooling } from '../../../utils/proConsole';
|
||||
import { DeepRequired } from 'ts-essentials';
|
||||
import { ColumnsInfoResult, currentDriver, DataSourcesAPI } from '../..';
|
||||
import type { ColumnsInfoResult, DataSourcesAPI } from '../../';
|
||||
|
||||
import {
|
||||
Table,
|
||||
@ -330,10 +330,6 @@ type ColumnsInfoPayload = {
|
||||
};
|
||||
|
||||
const isColumnGenerated = (isGenerated: ColumnsInfoPayload['is_generated']) => {
|
||||
if (currentDriver === 'cockroach') {
|
||||
return isGenerated === 'YES';
|
||||
}
|
||||
|
||||
return isGenerated === 'ALWAYS';
|
||||
};
|
||||
|
||||
|
@ -1,20 +1,11 @@
|
||||
import { DataSourcesAPI } from '../..';
|
||||
import type { DataSourcesAPI } from '../..';
|
||||
import { TriggerOperation } from '../../../components/Common/FilterQuery/state';
|
||||
import { FrequentlyUsedColumn, IndexType } from '../../types';
|
||||
import { isColTypeString } from '.';
|
||||
import { FunctionState } from './types';
|
||||
import { QualifiedTable } from '../../../metadata/types';
|
||||
import { quoteDefault } from '../../../components/Services/Data/utils';
|
||||
|
||||
export const sqlEscapeText = (rawText: string) => {
|
||||
let text = rawText;
|
||||
|
||||
if (text) {
|
||||
text = text.replace(/'/g, "\\'");
|
||||
}
|
||||
|
||||
return `E'${text}'`;
|
||||
};
|
||||
import { sqlEscapeText } from '../../common/sqlEscapeText';
|
||||
|
||||
const generateWhereClause = (
|
||||
options: { schemas: string[]; tables?: QualifiedTable[] },
|
||||
|
@ -1,70 +1,22 @@
|
||||
import { dataSource, generateTableDef } from '../..';
|
||||
import { generateTableDef } from '../../common/index';
|
||||
import type { WhereClause } from '../../../components/Common/utils/v1QueryUtils';
|
||||
import {
|
||||
getRunSqlQuery,
|
||||
getSelectQuery,
|
||||
WhereClause,
|
||||
} from '../../../components/Common/utils/v1QueryUtils';
|
||||
import Endpoints, { globalCookiePolicy } from '../../../Endpoints';
|
||||
import requestAction from '../../../utils/requestAction';
|
||||
import {
|
||||
generateInsertRequestType,
|
||||
GenerateBulkDeleteRowRequest,
|
||||
GenerateDeleteRowRequest,
|
||||
} from '../../types';
|
||||
import { ReduxState } from './../../../types';
|
||||
import { getStatementTimeoutSql } from './sqlUtils';
|
||||
import { getEstimateCountQuery, getStatementTimeoutSql } from './sqlUtils';
|
||||
import { QualifiedTable, TableConfig } from '../../../metadata/types';
|
||||
|
||||
type Tables = ReduxState['tables'];
|
||||
type Headers = Tables['dataHeaders'];
|
||||
|
||||
export function getTableRowRequest({
|
||||
tables,
|
||||
headers,
|
||||
isExport = false,
|
||||
}: {
|
||||
tables: Tables;
|
||||
headers: Headers;
|
||||
isExport?: boolean;
|
||||
}) {
|
||||
const {
|
||||
currentTable: originalTable,
|
||||
currentSchema,
|
||||
currentDataSource,
|
||||
view,
|
||||
} = tables;
|
||||
const limit = isExport ? null : view.query.limit;
|
||||
const offset = isExport ? null : view.query.offset;
|
||||
const requestBody = {
|
||||
type: 'bulk',
|
||||
source: currentDataSource,
|
||||
args: [
|
||||
getSelectQuery(
|
||||
'select',
|
||||
generateTableDef(originalTable, currentSchema),
|
||||
view.query.columns,
|
||||
view.query.where,
|
||||
offset,
|
||||
limit,
|
||||
view.query.order_by,
|
||||
currentDataSource
|
||||
),
|
||||
getRunSqlQuery(
|
||||
dataSource.getEstimateCountQuery(currentSchema, originalTable),
|
||||
currentDataSource
|
||||
),
|
||||
],
|
||||
};
|
||||
const options: RequestInit = {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(requestBody),
|
||||
headers,
|
||||
credentials: globalCookiePolicy,
|
||||
};
|
||||
|
||||
return requestAction(Endpoints.query, options);
|
||||
}
|
||||
|
||||
const getTableRowRequestBody = ({
|
||||
tables,
|
||||
isExport = false,
|
||||
@ -95,7 +47,7 @@ const getTableRowRequestBody = ({
|
||||
currentDataSource
|
||||
),
|
||||
getRunSqlQuery(
|
||||
dataSource.getEstimateCountQuery(currentSchema, originalTable),
|
||||
getEstimateCountQuery(currentSchema, originalTable),
|
||||
currentDataSource,
|
||||
false,
|
||||
true
|
||||
|
@ -1,2 +1,2 @@
|
||||
export { OASGeneratorPage } from './OASGeneratorPage';
|
||||
export { GeneratedAction } from './types';
|
||||
export type { GeneratedAction } from './types';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import type { AppDispatch } from '../../../../../store';
|
||||
import React from 'react';
|
||||
import { getCurrTimeForFileName } from '../../../../../components/Common/utils/jsUtils';
|
||||
import { getCurrTimeForFileName } from '../../../../../components/Common/utils/export.utils';
|
||||
import {
|
||||
downloadObjectAsCsvFile,
|
||||
downloadObjectAsJsonFile,
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { NormalizedTable } from '../../../../../dataSources/types';
|
||||
import { Table } from '../../../../hasura-metadata-types';
|
||||
import { useAppSelector } from '../../../../../store';
|
||||
import { useAppSelector } from '../../../../../storeHooks';
|
||||
import { getTableSchemaName } from './useTableSchema.utils';
|
||||
|
||||
export const useTableSchema = (table: Table) => {
|
||||
|
@ -12,6 +12,7 @@ import { useExportRows } from './useExportRows';
|
||||
import { UseRowsPropType } from '../useRows';
|
||||
|
||||
jest.mock('../../../../components/Common/utils/export.utils', () => ({
|
||||
...jest.requireActual('../../../../components/Common/utils/export.utils'),
|
||||
downloadObjectAsCsvFile: jest.fn(),
|
||||
downloadObjectAsJsonFile: jest.fn(),
|
||||
}));
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { getCurrTimeForFileName } from '../../../../components/Common/utils/jsUtils';
|
||||
import { getCurrTimeForFileName } from '../../../../components/Common/utils/export.utils';
|
||||
|
||||
const replaceAllDotsWithUnderscore = (text: string) => text.replace(/\./g, '_');
|
||||
|
||||
|
@ -9,6 +9,6 @@ export {
|
||||
adaptFormValuesToQuery,
|
||||
convertUserQueryToFiltersAndSortFormValues,
|
||||
} from './components/RunQuery/LegacyRunQueryContainer/LegacyRunQueryContainer.utils';
|
||||
export { UserQuery } from './components/RunQuery/types';
|
||||
export type { UserQuery } from './components/RunQuery/types';
|
||||
export { useTableColumns } from './hooks';
|
||||
export type { ExportFileFormat, UseExportRowsReturn } from './hooks';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { useAppDispatch } from '../../../store';
|
||||
import { useAppDispatch } from '../../../storeHooks';
|
||||
import { HasuraFamiliaritySurvey } from '../../Surveys';
|
||||
import {
|
||||
ConnectDBScreen,
|
||||
|
@ -1,7 +1,5 @@
|
||||
export { ConnectDBScreen } from './ConnectDBScreen/ConnectDBScreen';
|
||||
export { TemplateSummary } from './QueryScreen/TemplateSummary';
|
||||
export {
|
||||
StepperNavbar,
|
||||
StepperNavbarStep,
|
||||
} from './StepperNavbar/StepperNavbar';
|
||||
export { StepperNavbar } from './StepperNavbar/StepperNavbar';
|
||||
export type { StepperNavbarStep } from './StepperNavbar/StepperNavbar';
|
||||
export { DialogContainer } from './DialogContainer/DialogContainer';
|
||||
|
@ -18,6 +18,7 @@ import {
|
||||
MOCK_INITIAL_METADATA,
|
||||
serverDownErrorMessage,
|
||||
} from '../mocks/constants';
|
||||
import 'whatwg-fetch';
|
||||
|
||||
const server = setupServer();
|
||||
|
||||
|
@ -4,7 +4,7 @@ import { Api } from '../../../../hooks/apiUtils';
|
||||
import { isJsonString } from '../../../../components/Common/utils/jsUtils';
|
||||
import { HasuraMetadataV3 } from '../../../../metadata/types';
|
||||
import { MetadataResponse } from '../../../MetadataAPI';
|
||||
import { useAppSelector } from '../../../../store';
|
||||
import { useAppSelector } from '../../../../storeHooks';
|
||||
import { useMutation, useQuery } from 'react-query';
|
||||
import { staleTime } from '../constants';
|
||||
import { fetchTemplateDataQueryFn, transformOldMetadata } from '../utils';
|
||||
|
@ -3,10 +3,11 @@ import { getRunSqlQuery } from '../../../../components/Common/utils/v1QueryUtils
|
||||
import Endpoints from '../../../../Endpoints';
|
||||
import { RunSQLResponse } from '../../../DataSource';
|
||||
import { Api } from '../../../../hooks/apiUtils';
|
||||
import { useAppSelector } from '../../../../store';
|
||||
import { useAppSelector } from '../../../../storeHooks';
|
||||
import { useMutation, useQuery } from 'react-query';
|
||||
import { fetchTemplateDataQueryFn } from '../utils';
|
||||
import { staleTime } from '../constants';
|
||||
import 'whatwg-fetch';
|
||||
|
||||
type MutationFnArgs = {
|
||||
sql: string;
|
||||
|
@ -21,6 +21,7 @@ import {
|
||||
} from '../mocks/constants';
|
||||
import { useInstallTemplate } from './useInstallTemplate';
|
||||
import { NEON_TEMPLATE_BASE_PATH } from '../constants';
|
||||
import 'whatwg-fetch';
|
||||
|
||||
const server = setupServer();
|
||||
|
||||
|
@ -3,6 +3,6 @@ import { Root } from './Root';
|
||||
export { prefetchOnboardingData, emitOnboardingEvent } from './utils';
|
||||
export { oneClickDeploymentOnboardingShown } from './constants';
|
||||
export { useOnboardingData } from './hooks';
|
||||
export { UserOnboarding, OnboardingResponseData } from './types';
|
||||
export type { UserOnboarding, OnboardingResponseData } from './types';
|
||||
export { DialogContainer } from './components';
|
||||
export const OnboardingWizard = Root;
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { useAppDispatch } from '../../../../../store';
|
||||
import { useAppDispatch } from '../../../../../storeHooks';
|
||||
import { programmaticallyTraceError } from '../../../../Analytics';
|
||||
import {
|
||||
FetchOneClickDeploymentStateLogSubscriptionSubscription,
|
||||
|
@ -3,7 +3,7 @@ import { Button } from '../../../../new-components/Button';
|
||||
import { FaEdit, FaTrash, FaUndo } from 'react-icons/fa';
|
||||
import { useMetadata } from '../../../MetadataAPI';
|
||||
import _push from '../../../../components/Services/Data/push';
|
||||
import { useAppDispatch } from '../../../../store';
|
||||
import { useAppDispatch } from '../../../../storeHooks';
|
||||
import { useReloadSource } from '../../hooks/useReloadSource';
|
||||
import { useDropSource } from '../../hooks/useDropSource';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useQueryClient } from 'react-query';
|
||||
import { exportMetadata } from '../../../metadata/actions';
|
||||
import { useAppDispatch } from '../../../store';
|
||||
import { useAppDispatch } from '../../../storeHooks';
|
||||
import { generateQueryKeys } from '../../DatabaseRelationships/utils/queryClientUtils';
|
||||
import { useMetadataMigration } from '../../MetadataAPI';
|
||||
import { DatabaseConnection } from '../types';
|
||||
|
@ -37,7 +37,7 @@ export const createControlPlaneClient = (
|
||||
|
||||
const subscribe = <
|
||||
ResponseType = Record<string, any>,
|
||||
VariablesType = Record<string, any>
|
||||
VariablesType extends Object = Record<string, any>
|
||||
>(
|
||||
queryDoc: DocumentNode,
|
||||
variables: VariablesType,
|
||||
|
@ -2,7 +2,7 @@ import { useQuery } from 'react-query';
|
||||
import Endpoints from '../../../../../Endpoints';
|
||||
import { Api } from '../../../../../hooks/apiUtils';
|
||||
import { CronTrigger } from '../../../../../metadata/types';
|
||||
import { useAppSelector } from '../../../../../store';
|
||||
import { useAppSelector } from '../../../../../storeHooks';
|
||||
|
||||
interface GetCronTriggersResponse {
|
||||
cron_triggers: CronTrigger[];
|
||||
|
@ -9,7 +9,7 @@ import { citus } from './citus';
|
||||
import { cockroach } from './cockroach';
|
||||
import { gdc } from './gdc';
|
||||
import { mssql } from './mssql';
|
||||
import { postgres, PostgresTable } from './postgres';
|
||||
import { postgres } from './postgres';
|
||||
import { alloy, AlloyDbTable } from './alloydb';
|
||||
import type {
|
||||
DriverInfoResponse,
|
||||
@ -47,6 +47,7 @@ import { getTableName } from './common/getTableName';
|
||||
import { QueryType } from '../Permissions/types';
|
||||
import { ReleaseType } from './types';
|
||||
|
||||
export type { PostgresTable } from './postgres';
|
||||
export enum Feature {
|
||||
NotImplemented = 'Not Implemented',
|
||||
}
|
||||
@ -454,20 +455,23 @@ export const DataSource = (httpClient: AxiosInstance) => ({
|
||||
},
|
||||
});
|
||||
|
||||
export { GDCTable } from './gdc';
|
||||
export type { GDCTable } from './gdc';
|
||||
export * from './guards';
|
||||
export * from './types';
|
||||
export * from './common/utils';
|
||||
export {
|
||||
PostgresTable,
|
||||
exportMetadata,
|
||||
runGraphQL,
|
||||
getTableName,
|
||||
RunSQLResponse,
|
||||
RunSQLSelectResponse,
|
||||
RunSQLCommandResponse,
|
||||
runMetadataQuery,
|
||||
getDriverPrefix,
|
||||
runIntrospectionQuery,
|
||||
};
|
||||
|
||||
export type {
|
||||
RunSQLResponse,
|
||||
RunSQLSelectResponse,
|
||||
RunSQLCommandResponse,
|
||||
NetworkArgs,
|
||||
AlloyDbTable,
|
||||
};
|
||||
|
@ -12,11 +12,11 @@ import {
|
||||
Table,
|
||||
} from '../hasura-metadata-types';
|
||||
|
||||
import { NetworkArgs } from './api';
|
||||
import type { NetworkArgs } from './api';
|
||||
import { SchemaTable } from './utils';
|
||||
|
||||
export type { BigQueryTable } from './bigquery';
|
||||
export { NetworkArgs };
|
||||
export type { NetworkArgs };
|
||||
|
||||
export type AllowedTableRelationships =
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
export { DatabaseRelationships } from './DatabaseRelationships';
|
||||
export { Relationship } from './types';
|
||||
export type { Relationship } from './types';
|
||||
export { useListAllDatabaseRelationships } from './hooks/useListAllDatabaseRelationships';
|
||||
export { getTableDisplayName } from './utils/helpers';
|
||||
export { DEFAULT_STALE_TIME } from './utils/queryClientUtils';
|
||||
|
@ -4,4 +4,8 @@ export { FeatureFlags } from './components/FeatureFlags';
|
||||
export { FeatureFlagToast } from './components/FeatureFlagToast';
|
||||
export { useFeatureFlags } from './hooks/useFeatureFlags';
|
||||
export { useIsFeatureFlagEnabled } from './hooks/useIsFeatureFlagEnabled';
|
||||
export { FeatureFlagId, FeatureFlagSections, FeatureFlagType } from './types';
|
||||
export type {
|
||||
FeatureFlagId,
|
||||
FeatureFlagSections,
|
||||
FeatureFlagType,
|
||||
} from './types';
|
||||
|
@ -33,6 +33,6 @@ export { useObjectRelationships } from './hooks/useObjectRelationships';
|
||||
export { useArrayRelationships } from './hooks/useArrayRelationships';
|
||||
export { useLocalRelationships } from './hooks/useLocalRelationships';
|
||||
|
||||
export { TMigration } from './hooks/useMetadataMigration';
|
||||
export type { TMigration } from './hooks/useMetadataMigration';
|
||||
|
||||
export * from './types';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { currentDriver } from '../../../../dataSources';
|
||||
import { useAppSelector } from '../../../../store';
|
||||
import { useAppSelector } from '../../../../storeHooks';
|
||||
import { NewDataSource } from './types';
|
||||
|
||||
export const useDataSource = () => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import Endpoints from '../../../../Endpoints';
|
||||
import { Api } from '../../../../hooks/apiUtils';
|
||||
import { useAppSelector } from '../../../../store';
|
||||
import { useAppSelector } from '../../../../storeHooks';
|
||||
import { useMutation, useQueryClient } from 'react-query';
|
||||
|
||||
export const useAddRemoteSchemaRelationship = () => {
|
||||
|
@ -6,7 +6,7 @@ import {
|
||||
useMetadataVersion,
|
||||
} from '../../MetadataAPI';
|
||||
import { useQuery, UseQueryResult } from 'react-query';
|
||||
import { useAppSelector } from '../../../store';
|
||||
import { useAppSelector } from '../../../storeHooks';
|
||||
import { getRunSqlQuery } from '../../../components/Common/utils/v1QueryUtils';
|
||||
import Endpoints from '../../../Endpoints';
|
||||
import { RunSQLResponse } from '../../../hooks/types';
|
||||
|
@ -1 +1,2 @@
|
||||
export { IconCardGroup, IconCardGroupItem } from './IconCardGroup';
|
||||
export { IconCardGroup } from './IconCardGroup';
|
||||
export type { IconCardGroupItem } from './IconCardGroup';
|
||||
|
@ -3,4 +3,4 @@ export {
|
||||
useFamiliaritySurveyData,
|
||||
} from './HasuraFamiliaritySurvey';
|
||||
export { prefetchSurveysData } from './utils';
|
||||
export { SurveysResponseData } from './types';
|
||||
export type { SurveysResponseData } from './types';
|
||||
|
@ -1,4 +1,4 @@
|
||||
export * from './source';
|
||||
export * from './table';
|
||||
export * from './relationships';
|
||||
export { PostgresConfiguration } from './configuration';
|
||||
export type { PostgresConfiguration } from './configuration';
|
||||
|
@ -1,6 +1,9 @@
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import { useDataSourceCheckConstraints, useTableCheckConstraints } from '..';
|
||||
import {
|
||||
useDataSourceCheckConstraints,
|
||||
useTableCheckConstraints,
|
||||
} from '../useCheckConstraints';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { APIError } from '../error';
|
||||
import { wrapper } from './common/decorator';
|
||||
|
@ -1,6 +1,9 @@
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import { useDataSourceFKRelationships, useTableFKRelationships } from '..';
|
||||
import {
|
||||
useDataSourceFKRelationships,
|
||||
useTableFKRelationships,
|
||||
} from '../useFKRelationships';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { wrapper } from './common/decorator';
|
||||
import { APIError } from '../error';
|
||||
|
@ -1,3 +1,20 @@
|
||||
test('Skipped tests', () => {});
|
||||
/*
|
||||
Commented out because of a the following circular dependency problem.
|
||||
|
||||
TypeError: Cannot read properties of undefined (reading 'postgres')
|
||||
|
||||
446 |
|
||||
447 | export let currentDriver: Driver = 'postgres';
|
||||
> 448 | export let dataSource: DataSourcesAPI = services[currentDriver || 'postgres'];
|
||||
| ^
|
||||
449 |
|
||||
450 | export const isFeatureSupported = (
|
||||
451 | feature: Path<DeepRequired<SupportedFeaturesType>>
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import {
|
||||
@ -5,7 +22,7 @@ import {
|
||||
useSingleFunction,
|
||||
useNonTrackableFunctions,
|
||||
useAllFunctions,
|
||||
} from '..';
|
||||
} from '../useFunctions';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { wrapper } from './common/decorator';
|
||||
import { APIError } from '../error';
|
||||
@ -295,3 +312,4 @@ describe("useFunctions hooks' doesn't fail for unimplemented sources", () => {
|
||||
expect(result.current.data!.length).toEqual(0);
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
@ -1,6 +1,9 @@
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import { useDataSourcePrimaryKeys, useTablePrimaryKey } from '..';
|
||||
import {
|
||||
useDataSourcePrimaryKeys,
|
||||
useTablePrimaryKey,
|
||||
} from '../usePrimaryKeys';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { wrapper } from './common/decorator';
|
||||
import { APIError } from '../error';
|
||||
|
@ -1,6 +1,22 @@
|
||||
test('Skipped tests', () => {});
|
||||
/*
|
||||
Commented out because of a the following circular dependency problem.
|
||||
|
||||
TypeError: Cannot read properties of undefined (reading 'postgres')
|
||||
|
||||
446 |
|
||||
447 | export let currentDriver: Driver = 'postgres';
|
||||
> 448 | export let dataSource: DataSourcesAPI = services[currentDriver || 'postgres'];
|
||||
| ^
|
||||
449 |
|
||||
450 | export const isFeatureSupported = (
|
||||
451 | feature: Path<DeepRequired<SupportedFeaturesType>>
|
||||
*/
|
||||
|
||||
/*
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import { useSchemaList } from '..';
|
||||
import { useSchemaList } from '../useSchemaList';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { wrapper } from './common/decorator';
|
||||
import { APIError } from '../error';
|
||||
@ -13,6 +29,7 @@ server.use(networkStubs.metadata);
|
||||
beforeAll(() => server.listen());
|
||||
afterAll(() => server.close());
|
||||
|
||||
|
||||
describe("useSchemaList hooks' postgres test", () => {
|
||||
test('useSchemaList fetches data correctly', async () => {
|
||||
const { result, waitForValueToChange } = renderHook(
|
||||
@ -98,3 +115,4 @@ describe("useSchemaList hooks' error hanlding", () => {
|
||||
expect(error instanceof APIError);
|
||||
});
|
||||
});
|
||||
*/
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import { useDataSourceTables, useSingleTable } from '..';
|
||||
import { useDataSourceTables, useSingleTable } from '../useTables';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { wrapper } from './common/decorator';
|
||||
import { APIError } from '../error';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { setupServer } from 'msw/node';
|
||||
import { renderHook } from '@testing-library/react-hooks';
|
||||
import { useDataSourceUniqueKeys, useTableUniqueKeys } from '..';
|
||||
import { useDataSourceUniqueKeys, useTableUniqueKeys } from '../useUniqueKeys';
|
||||
import { networkStubs } from './common/networkStubs';
|
||||
import { wrapper } from './common/decorator';
|
||||
import { APIError } from '../error';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { getRunSqlQuery } from '../components/Common/utils/v1QueryUtils';
|
||||
import Endpoints from '../Endpoints';
|
||||
import { useAppSelector } from '../store';
|
||||
import { useAppSelector } from '../storeHooks';
|
||||
import { Constraint } from '../dataSources/types';
|
||||
import { MSSqlConstraint } from '../components/Services/Data/mergeData';
|
||||
import type { UseQueryOptions } from 'react-query';
|
||||
|
@ -52,7 +52,7 @@ export function createFetchControlPlaneData<RESPONSE_DATA>(opts: {
|
||||
{ 'content-type': 'application/json' }
|
||||
);
|
||||
|
||||
if ('errors' in response) {
|
||||
if (response && typeof response === 'object' && 'errors' in response) {
|
||||
const errorMessage = response.errors?.[0]?.message ?? '';
|
||||
|
||||
return errorMessage;
|
||||
|
@ -69,12 +69,14 @@ namespace APIErrors {
|
||||
|
||||
export class APIError extends Error {
|
||||
public override name = 'APIError';
|
||||
constructor(
|
||||
public override message: string,
|
||||
public code?: string,
|
||||
public description?: string
|
||||
) {
|
||||
public override message: string;
|
||||
public code?: string;
|
||||
public description?: string;
|
||||
constructor(message: string, code?: string, description?: string) {
|
||||
super(message);
|
||||
this.message = message;
|
||||
this.code = code;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
// TODO: write tests for this
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSchemaList, useAllFunctions } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useDataSourceCheckConstraints, useSchemaList } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useDataSourceFKRelationships, useSchemaList } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSchemaList, useDataSourcePrimaryKeys } from '..';
|
||||
|
||||
|
@ -2,7 +2,7 @@ import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { TableColumn } from '../../dataSources/types';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSchemaList, useDataSourceTables } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useDataSourceUniqueKeys, useSchemaList } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSchemaList, useNonTrackableFunctions } from '..';
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSchemaList } from '..';
|
||||
|
||||
|
@ -2,7 +2,7 @@ import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { QualifiedFunction } from '../../metadata/types';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSchemaList, useSingleFunction } from '..';
|
||||
|
||||
|
@ -3,7 +3,7 @@ import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { TableColumn } from '../../dataSources/types';
|
||||
import { QualifiedTable } from '../../metadata/types';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useSingleTable } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { QualifiedTable } from '../../metadata/types';
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useTableCheckConstraints } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { QualifiedTable } from '../../metadata/types';
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useTableFKRelationships } from '..';
|
||||
|
||||
|
@ -2,7 +2,7 @@ import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { QualifiedTable } from '../../metadata/types';
|
||||
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useTablePrimaryKey } from '..';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Table, TableRow, TableHeader } from '../../components/Common/Table';
|
||||
import { currentDriver, Driver, setDriver } from '../../dataSources';
|
||||
import { QualifiedTable } from '../../metadata/types';
|
||||
import { useAppDispatch, useAppSelector } from '../../store';
|
||||
import { useAppDispatch, useAppSelector } from '../../storeHooks';
|
||||
import React from 'react';
|
||||
import { useTableUniqueKeys } from '..';
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user