Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Attempt at speeding up prisma-generator tests #1465

Draft
wants to merge 8 commits into
base: dev
Choose a base branch
from

Conversation

WimTibackx
Copy link
Contributor

In working on #1458 I noticed that some tests took me a while to execute. A lot of it seems to be centered around npm installs, so I picked out the prisma generator tests to experiment on.

As a baseline, current dev tests for that file took around 400 seconds on my system; with the npm installs taking up between 20 and 40 seconds.

With the --no-progress --no-audit --no-fund flags, total time for this file reduced to 300 seconds on my system.

I then looked at adding a test project directory, installing that in test-scaffold and copying from there each test. That reduced execution time to about 100 seconds on my system.

Given that this would seperate definition of the test context (which dependencies etc) from test execution, I wanted to try and avoid that if I could; so I looked at pnpm store. That is the version I finally submitted in this PR:

  • Generally, we define a gitignored directory as a custom pnpm-store directory only to be used in the test suite.
  • In beforeAll, we use a package.json and .npmrc written into a temp dir to load any missing dependencies into the store.
  • In beforeEach, we can then write that same package.json and .npmrc and execute pnpm install --offline to quickly install from the store.
    On my system this executes at around 55 seconds with an empty store, and at around 45 seconds when I've already populated the store earlier.

To me, this approach seems like a nice middle ground:

  • These tests are slightly less isolated then they were before, as they rely on the pnpm store. While that's unfortunate, it isn't that different from what we already have with test-scaffold.
  • Given that the project already uses pnpm, I'd expect it shouldn't be a problem to use pnpm commands within tests. I am somewhat wondering whether pnpm-installed-via-npm setups might be an issue?
  • Using a pnpm store specific to the complete workspace test suite keeps it insulated from the rest of the system and the actual workings of the project
  • The pnpm store seems slighly beneficial to me over the test-scaffold-and-copy I had before, given that the context of the test (package.json) isn't as separated from the actual test.

Happy to hear your thoughts on this! Is this an approach worth taking? Do you see downsides I'm missing here? Are there other factors to consider? Do you see room for further improvement?

Copy link
Contributor

coderabbitai bot commented May 25, 2024

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

This update improves the JavaScript testing setup by introducing utilities to handle project directory initialization and package management, specifically targeting pnpm. By adding these utilities, setting up and managing dependencies in tests becomes more streamlined. Additionally, the .gitignore file is updated to exclude a specific test store directory. No changes were made to the declarations of exported or public entities from the primary codebase.

Changes

File Change Summary
.gitignore Added /.pnpm-test-store directory
packages/schema/tests/generator/prisma-generator.test.ts Introduced preparePackageJson and initProjectDir functions, removed execSync utilization
script/test-utils.ts Added utility functions for package and project initialization and setup temporary directories

Sequence Diagrams

sequenceDiagram
    participant Developer
    participant TestUtils
    participant ProjectDir
    participant PNPM

    Developer->>TestUtils: Call preparePackageJson()
    TestUtils-->>Developer: Returns modified package.json content

    Developer->>TestUtils: Call initProjectDir()
    TestUtils-->>ProjectDir: Create directory and write package.json
    TestUtils-->>PNPM: Install dependencies
    PNPM-->>TestUtils: Installation complete
    TestUtils-->>Developer: Project directory ready
Loading

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

‼️ IMPORTANT
Auto-reply has been disabled for this repository in the CodeRabbit settings. The CodeRabbit bot will not respond to your replies unless it is explicitly tagged.

  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Outside diff range and nitpick comments (2)
script/test-utils.ts (1)

36-44: The execCmdSync function provides clear logging and error handling. Ensure that sensitive data is not logged in production environments.

packages/schema/tests/generator/prisma-generator.test.ts (1)

Line range hint 4-4: Ensure that Node.js built-in modules are imported with the node: protocol for consistency and clarity.

- import fs from 'fs';
- import path from 'path';
+ import fs from 'node:fs';
+ import path from 'node:path';

Also applies to: 5-5

Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between 37f4a3b and 5af1c35.
Files selected for processing (3)
  • .gitignore (1 hunks)
  • packages/schema/tests/generator/prisma-generator.test.ts (1 hunks)
  • script/test-utils.ts (1 hunks)
Files skipped from review due to trivial changes (1)
  • .gitignore
Additional Context Used
Biome (6)
packages/schema/tests/generator/prisma-generator.test.ts (5)

4-4: A Node.js builtin module should be imported with the node: protocol.


5-5: A Node.js builtin module should be imported with the node: protocol.


21-21: The computed expression can be simplified without the use of a string literal.


23-23: Do not use template literals if interpolation and special-character handling are not needed.


221-221: Do not use template literals if interpolation and special-character handling are not needed.

script/test-utils.ts (1)

46-46: This type annotation is trivially inferred from its initialization.

Additional comments not posted (3)
script/test-utils.ts (1)

6-10: The constants for paths and file contents are well-defined and follow best practices for maintainability and reusability.

packages/schema/tests/generator/prisma-generator.test.ts (2)

10-10: Correct usage of imported utility functions from script/test-utils.ts. This ensures consistency and reusability across tests.


32-32: The initProjectDir function is used correctly in the beforeEach hook to ensure a clean environment for each test. Good practice!

script/test-utils.ts Outdated Show resolved Hide resolved
script/test-utils.ts Outdated Show resolved Hide resolved
packages/schema/tests/generator/prisma-generator.test.ts Outdated Show resolved Hide resolved
packages/schema/tests/generator/prisma-generator.test.ts Outdated Show resolved Hide resolved
script/test-utils.ts Outdated Show resolved Hide resolved
script/test-utils.ts Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range and nitpick comments (1)
packages/schema/tests/generator/prisma-generator.test.ts (1)

Line range hint 4-5: Update import statements to use the node: protocol for built-in modules.

- import fs from 'fs';
- import path from 'path';
+ import fs from 'node:fs';
+ import path from 'node:path';
Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between 5af1c35 and 2ca1f13.
Files selected for processing (2)
  • .gitignore (1 hunks)
  • packages/schema/tests/generator/prisma-generator.test.ts (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • .gitignore
Additional Context Used
Biome (4)
packages/schema/tests/generator/prisma-generator.test.ts (4)

4-4: A Node.js builtin module should be imported with the node: protocol.


5-5: A Node.js builtin module should be imported with the node: protocol.


21-21: The computed expression can be simplified without the use of a string literal.


220-220: Do not use template literals if interpolation and special-character handling are not needed.

Additional comments not posted (1)
packages/schema/tests/generator/prisma-generator.test.ts (1)

Line range hint 36-36: The test cases are well-structured and cover the necessary functionality effectively.

packages/schema/tests/generator/prisma-generator.test.ts Outdated Show resolved Hide resolved
packages/schema/tests/generator/prisma-generator.test.ts Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Outside diff range and nitpick comments (3)
packages/schema/tests/generator/prisma-generator.test.ts (3)

Line range hint 4-4: Update the import statement to use the node: protocol for built-in modules.

- import fs from 'fs';
+ import fs from 'node:fs';

Line range hint 5-5: Update the import statement to use the node: protocol for built-in modules.

- import path from 'path';
+ import path from 'node:path';

Line range hint 220-220: Simplify the use of template literals where simple strings would suffice.

- expect(content).toContain('provider = "postgresql"');
+ expect(content).toContain('provider = postgresql');
Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 2ca1f13 and 08b9402.

Files selected for processing (2)
  • packages/schema/tests/generator/prisma-generator.test.ts (1 hunks)
  • script/test-utils.ts (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • script/test-utils.ts
Additional context used
Biome
packages/schema/tests/generator/prisma-generator.test.ts

[error] 4-4: A Node.js builtin module should be imported with the node: protocol.


[error] 5-5: A Node.js builtin module should be imported with the node: protocol.


[error] 21-21: The computed expression can be simplified without the use of a string literal.


[error] 220-220: Do not use template literals if interpolation and special-character handling are not needed.

@ymc9
Copy link
Member

ymc9 commented Jun 2, 2024

Hi @WimTibackx, I'm sorry for the late response. Thanks for working on improving test speed. I've been bothered by it for quite a while but have been procrastinating on it 😅.

I think using a shared pnpm store is a great idea, which should make the installation process significantly faster, especially for running locally. From another perspective, I'm also wondering if we need to scaffold a npm project for each test at all. The tests were made this way mainly because Prisma and ZenStack both do code generation into node_modules and using disposable projects is the simplest way to isolate. However, since both Prisma and ZenStack allow specifying where to output the generated code, we can probably only emit them into some temp dir while not having a full-scale npm project at all.

What do you think about this direction? It's gonna be a bigger change though.

WimTibackx and others added 4 commits June 15, 2024 11:56
…ecific store once, then offline-installing from that store for each test going forward
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 08b9402 and 11068cb.

Files selected for processing (3)
  • .gitignore (1 hunks)
  • packages/schema/tests/generator/prisma-generator.test.ts (1 hunks)
  • script/test-utils.ts (1 hunks)
Files skipped from review due to trivial changes (1)
  • .gitignore
Additional comments not posted (6)
script/test-utils.ts (2)

1-4: Imports are well-organized and essential for the functionality provided by this module.


6-10: Constants are clearly defined and well-documented, ensuring easy maintenance and understanding.

packages/schema/tests/generator/prisma-generator.test.ts (4)

10-10: Correct usage of imported functions from test-utils to facilitate testing setup.


31-31: Efficient use of initProjectDir within beforeEach ensures a clean setup for each test case.


28-28: The logging statement in beforeEach could be simplified for consistency and readability.

- console.log('Project dir: ', r.name);
+ console.log('Project directory:', r.name);

Likely invalid or redundant comment.


19-23: The beforeAll hook is used effectively to prepare the environment for tests. Consider simplifying the logging statement to enhance readability.

- console.log(`Got my packageJsonContents`);
+ console.log('Package JSON contents prepared');

Likely invalid or redundant comment.

Comment on lines 38 to 56
export function initProjectDir(projectDir: string, packageJsonContents: string, offline = true) {
try {
if (!fs.existsSync(projectDir)) {
fs.mkdirSync(projectDir, { recursive: true });
}
fs.writeFileSync(path.join(projectDir, PACKAGE_JSON_FILE), packageJsonContents, { flag: 'w+' });
fs.writeFileSync(path.join(projectDir, NPM_RC_FILE), NPM_RC_CONTENTS, { flag: 'w+' });
} catch (e) {
console.error(`Failed to set up project dir in ${projectDir}`);
throw e;
}

try {
execSync(`pnpm install ${offline ? '--offline ' : ''}--ignore-workspace`, {cwd: projectDir, stdio: 'ignore'});
} catch (e) {
console.error(`Failed to initialize project dependencies in ${projectDir}${offline ? '(offline mode)' : '(online mode)'}`);
throw e;
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The initProjectDir function effectively sets up the project directory and handles potential errors robustly. However, the error messages could be made more descriptive to aid debugging.

- console.error(`Failed to set up project dir in ${projectDir}`);
+ console.error(`Failed to set up project directory in ${projectDir}: ${e.message}`);

- console.error(`Failed to initialize project dependencies in ${projectDir}${offline ? '(offline mode)' : '(online mode)'}`);
+ console.error(`Failed to initialize project dependencies in ${projectDir}${offline ? '(offline mode)' : '(online mode)'}: ${e.message}`);
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function initProjectDir(projectDir: string, packageJsonContents: string, offline = true) {
try {
if (!fs.existsSync(projectDir)) {
fs.mkdirSync(projectDir, { recursive: true });
}
fs.writeFileSync(path.join(projectDir, PACKAGE_JSON_FILE), packageJsonContents, { flag: 'w+' });
fs.writeFileSync(path.join(projectDir, NPM_RC_FILE), NPM_RC_CONTENTS, { flag: 'w+' });
} catch (e) {
console.error(`Failed to set up project dir in ${projectDir}`);
throw e;
}
try {
execSync(`pnpm install ${offline ? '--offline ' : ''}--ignore-workspace`, {cwd: projectDir, stdio: 'ignore'});
} catch (e) {
console.error(`Failed to initialize project dependencies in ${projectDir}${offline ? '(offline mode)' : '(online mode)'}`);
throw e;
}
}
export function initProjectDir(projectDir: string, packageJsonContents: string, offline = true) {
try {
if (!fs.existsSync(projectDir)) {
fs.mkdirSync(projectDir, { recursive: true });
}
fs.writeFileSync(path.join(projectDir, PACKAGE_JSON_FILE), packageJsonContents, { flag: 'w+' });
fs.writeFileSync(path.join(projectDir, NPM_RC_FILE), NPM_RC_CONTENTS, { flag: 'w+' });
} catch (e) {
console.error(`Failed to set up project directory in ${projectDir}: ${e.message}`);
throw e;
}
try {
execSync(`pnpm install ${offline ? '--offline ' : ''}--ignore-workspace`, {cwd: projectDir, stdio: 'ignore'});
} catch (e) {
console.error(`Failed to initialize project dependencies in ${projectDir}${offline ? '(offline mode)' : '(online mode)'}: ${e.message}`);
throw e;
}
}

Comment on lines 12 to 36
export function preparePackageJson(dependencies: {[key: string]: string} = {}, devDependencies: {[key: string]: string} = {}): string {
// Given that this is a loose file included from elsewhere, I couldn't rely on the tmp package here and had to go with built-in node functions. I saw no significant downsides in this case, versus the upside in developer experience of not needing to do a build step when changing these utils.
const tmpDir = fs.mkdtempSync(path.join(tmpdir(), 'zenstack-test-'));
console.log(`Loading dependencies into store via temp dir ${tmpDir}`);
try {
const packageJsonContents =
`{
"name":"test-project",
"version":"1.0.0",
"dependencies": {
${Object.entries(dependencies).map(([k, v]) => `"${k}": "${v}"`).join(',\n')}
},
"devDependencies": {
${Object.entries(devDependencies).map(([k, v]) => `"${k}": "${v}"`).join(',\n')}
}
}`;

// I considered doing a `pnpm store add` here instead of a plain install. While that worked, I decided against it in the end because it's a secondary way of processing the dependencies and I didn't see a significant downside to just installing and throwing the local project away right after.
initProjectDir(tmpDir, packageJsonContents, false);

return packageJsonContents;
} finally {
fs.rmSync(tmpDir, {recursive: true, force: true});
}
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The preparePackageJson function is well-structured for generating a temporary directory and handling dependencies. Consider adding a comment explaining the decision to use pnpm install instead of pnpm store add for future maintainers.

+ // Using `pnpm install` for simplicity and because it's the primary way of handling dependencies.
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export function preparePackageJson(dependencies: {[key: string]: string} = {}, devDependencies: {[key: string]: string} = {}): string {
// Given that this is a loose file included from elsewhere, I couldn't rely on the tmp package here and had to go with built-in node functions. I saw no significant downsides in this case, versus the upside in developer experience of not needing to do a build step when changing these utils.
const tmpDir = fs.mkdtempSync(path.join(tmpdir(), 'zenstack-test-'));
console.log(`Loading dependencies into store via temp dir ${tmpDir}`);
try {
const packageJsonContents =
`{
"name":"test-project",
"version":"1.0.0",
"dependencies": {
${Object.entries(dependencies).map(([k, v]) => `"${k}": "${v}"`).join(',\n')}
},
"devDependencies": {
${Object.entries(devDependencies).map(([k, v]) => `"${k}": "${v}"`).join(',\n')}
}
}`;
// I considered doing a `pnpm store add` here instead of a plain install. While that worked, I decided against it in the end because it's a secondary way of processing the dependencies and I didn't see a significant downside to just installing and throwing the local project away right after.
initProjectDir(tmpDir, packageJsonContents, false);
return packageJsonContents;
} finally {
fs.rmSync(tmpDir, {recursive: true, force: true});
}
}
export function preparePackageJson(dependencies: {[key: string]: string} = {}, devDependencies: {[key: string]: string} = {}): string {
// Given that this is a loose file included from elsewhere, I couldn't rely on the tmp package here and had to go with built-in node functions. I saw no significant downsides in this case, versus the upside in developer experience of not needing to do a build step when changing these utils.
const tmpDir = fs.mkdtempSync(path.join(tmpdir(), 'zenstack-test-'));
console.log(`Loading dependencies into store via temp dir ${tmpDir}`);
try {
const packageJsonContents =
`{
"name":"test-project",
"version":"1.0.0",
"dependencies": {
${Object.entries(dependencies).map(([k, v]) => `"${k}": "${v}"`).join(',\n')}
},
"devDependencies": {
${Object.entries(devDependencies).map(([k, v]) => `"${k}": "${v}"`).join(',\n')}
}
}`;
// Using `pnpm install` for simplicity and because it's the primary way of handling dependencies.
// I considered doing a `pnpm store add` here instead of a plain install. While that worked, I decided against it in the end because it's a secondary way of processing the dependencies and I didn't see a significant downside to just installing and throwing the local project away right after.
initProjectDir(tmpDir, packageJsonContents, false);
return packageJsonContents;
} finally {
fs.rmSync(tmpDir, {recursive: true, force: true});
}
}

@WimTibackx
Copy link
Contributor Author

Hi @ymc9! It's about time I respond to this. Sorry for the delayed reply, I got a bit wrapped up in work and life for a bit.

I think using a shared pnpm store is a great idea, which should make the installation process significantly faster, especially for running locally.

I've been looking into this last weekend, but it requires some further tinkering. My original proof of concept probably used the easiest set of dependencies, unfortunately :) . The bigger dependency trees and the post-install scripts require some further work for this PR. I'm taking another shot at it today, will keep you posted.

I'm also wondering if we need to scaffold a npm project for each test at all. (...) since both Prisma and ZenStack allow specifying where to output the generated code, we can probably only emit them into some temp dir while not having a full-scale npm project at all.

That's a fair point indeed. As long as there's one full-on npm project integration test per module / variant, having other test cases run based on results emitting to a temp dir could suffice indeed.

For now, I'll see if I can universally apply the pnpm store approach, as that should already help a fair bit.

…for consistency and added reuse possibilities.

removed pnpm store initialization from the scaffolding process for now, because it's slightly easier dependency wise and because doing this in scaffold is something I want to revisit anyway. I'd like to end up in a system where we can include a large superset of the dependencies in play. Not sure if that's attainable at this point.

Given that we now don't run pnpm store initialization in test-scaffold, this means the performance hit will happen on (multiple?) first tests. This is not acceptable for the end result, but as an intermediate state in this PR it's good enough.

Note as well that the exact implementation of what is now pnpm-project.ts changed a bit: it now uses the tmp package for consistency, optionally includes some standard dependencies, and includes workspace overrides (because the pnpm behavior with regards to deep dependencies is different fron npm).
allow splitting of dependencies and devDependencies
@WimTibackx WimTibackx marked this pull request as draft June 22, 2024 14:08
if (opt.customSchemaFilePath) {
run(`npx zenstack generate --no-version-check --schema ${zmodelPath} --no-dependency-check${outputArg}`, {
NODE_PATH: './node_modules',
run(`pnpm exec zenstack generate --no-version-check --schema ${zmodelPath} --no-dependency-check${outputArg}`, {

Check warning

Code scanning / CodeQL

Unsafe shell command constructed from library input Medium

This string concatenation which depends on
library input
is later used in a
shell command
.
This string concatenation which depends on
library input
is later used in a
shell command
.
This string concatenation which depends on
library input
is later used in a
shell command
.
This string concatenation which depends on
library input
is later used in a
shell command
.
This string concatenation which depends on
library input
is later used in a
shell command
.
});
} else {
run(`npx zenstack generate --no-version-check --no-dependency-check${outputArg}`, {
NODE_PATH: './node_modules',
run(`pnpm exec zenstack generate --no-version-check --no-dependency-check${outputArg}`, {

Check warning

Code scanning / CodeQL

Unsafe shell command constructed from library input Medium

This string concatenation which depends on
library input
is later used in a
shell command
.
This string concatenation which depends on
library input
is later used in a
shell command
.
…icated between schema tests and the testtools package.

Might want to look for a better solution in the future.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants