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

[@osd/cross-platform] Adds cross-platform helpers #2681

Merged
merged 1 commit into from
Oct 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
- [Vis Builder] Change classname prefix wiz to vb ([#2581](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2581/files))
- [Vis Builder] Change wizard to vis_builder in file names and paths ([#2587](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2587))
- [Windows] Facilitate building and running OSD and plugins on Windows platforms ([#2601](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2601))
- [Windows] Add helper functions to work around the differences of platforms ([#2681](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2681))
- [Multi DataSource] Address UX comments on Data source list and create page ([#2625](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2625))
- [Vis Builder] Rename wizard to visBuilder in i18n id and formatted message id ([#2635](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2635))
- [Vis Builder] Rename wizard to visBuilder in class name, type name and function name ([#2639](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2639))
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@
"@osd/apm-config-loader": "1.0.0",
"@osd/config": "1.0.0",
"@osd/config-schema": "1.0.0",
"@osd/cross-platform": "1.0.0",
"@osd/i18n": "1.0.0",
"@osd/interpreter": "1.0.0",
"@osd/logging": "1.0.0",
Expand Down
5 changes: 3 additions & 2 deletions packages/osd-config-schema/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
"osd:bootstrap": "yarn build"
},
"devDependencies": {
"typescript": "4.0.2",
"tsd": "^0.21.0"
"@osd/cross-platform": "1.0.0",
"tsd": "^0.21.0",
"typescript": "4.0.2"
},
"peerDependencies": {
"lodash": "^4.17.21",
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions packages/osd-config-schema/src/errors/schema_error.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
import { relative, sep } from 'path';
import { SchemaError } from '.';

import { standardize, PROCESS_WORKING_DIR } from '@osd/cross-platform';

/**
* Make all paths in stacktrace relative.
*/
Expand All @@ -46,9 +48,7 @@ export const cleanStack = (stack: string) =>
}

const path = parts[1];
// Cannot use `standardize` from `@osd/utils
let relativePath = relative(process.cwd(), path);
if (process.platform === 'win32') relativePath = relativePath.replace(/\\/g, '/');
const relativePath = standardize(relative(PROCESS_WORKING_DIR, path));
Comment on lines -49 to +51
Copy link
Member

Choose a reason for hiding this comment

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

nice!


return line.replace(path, relativePath);
})
Expand Down
3 changes: 3 additions & 0 deletions packages/osd-cross-platform/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# `@osd/cross-platform` — OpenSearch Dashboards cross-platform helpers

This package contains the helper functions to work around the differences of platforms
Copy link
Member

Choose a reason for hiding this comment

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

I think we can help disambiguate "platforms" in this context with an example.

Suggested change
This package contains the helper functions to work around the differences of platforms
This package contains the helper functions to work around the differences of target platforms (e.g. identifying paths on Linux or Windows systems).

15 changes: 15 additions & 0 deletions packages/osd-cross-platform/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "@osd/cross-platform",
"main": "./target/index.js",
"version": "1.0.0",
"license": "Apache-2.0",
"private": true,
"scripts": {
"build": "tsc",
"osd:bootstrap": "yarn build"
},
"devDependencies": {
"typescript": "4.0.2",
"tsd": "^0.21.0"
}
}
7 changes: 7 additions & 0 deletions packages/osd-cross-platform/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

export * from './path';
export * from './process';
30 changes: 30 additions & 0 deletions packages/osd-cross-platform/src/path.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { normalize } from 'path';

/**
* Get a standardized reference to a path
* @param {string} path - the path to standardize
* @param {boolean} [usePosix=true] - produce a posix reference
* @param {boolean} [escapedBackslashes=true] - on Windows, double-backslash the reference
* @internal
*/
export const standardize = (
path: string,
usePosix: boolean = true,
escapedBackslashes: boolean = true
) => {
/* Force os-dependant separators
* path.posix.normalize doesn't convert backslashes to slashes on Windows so we manually force it afterwards
*/
const normal = normalize(path);

// Filter out in-browser executions as well as non-windows ones
if (process?.platform !== 'win32') return normal;

if (usePosix) return normal.replace(/\\/g, '/');
return escapedBackslashes ? normal.replace(/\\/g, '\\\\') : normal;
};
22 changes: 22 additions & 0 deletions packages/osd-cross-platform/src/process.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { execSync } from 'child_process';

let workingDir = process.cwd();

if (process.platform === 'win32') {
try {
const pathFullName = execSync('powershell "(Get-Item -LiteralPath $pwd).FullName"', {
peterzhuamazon marked this conversation as resolved.
Show resolved Hide resolved
cwd: workingDir,
encoding: 'utf8',
})?.trim?.();
if (pathFullName?.length > 2) workingDir = pathFullName;
Copy link
Member

Choose a reason for hiding this comment

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

What's the significance of length > 2 here?

} catch (ex) {
// Do nothing
}
}

export const PROCESS_WORKING_DIR = workingDir;
11 changes: 11 additions & 0 deletions packages/osd-cross-platform/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "target",
"declaration": true,
"declarationMap": true
},
"include": [
"src/**/*"
]
}
1 change: 1 addition & 0 deletions packages/osd-optimizer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"@babel/cli": "^7.16.0",
"@babel/core": "^7.16.5",
"@osd/babel-preset": "1.0.0",
"@osd/cross-platform": "1.0.0",
"@osd/dev-utils": "1.0.0",
"@osd/std": "1.0.0",
"@osd/ui-shared-deps": "1.0.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/osd-optimizer/src/optimizer/get_changes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import path from 'path';
jest.mock('execa');

import { getChanges } from './get_changes';
import { standardize } from '@osd/dev-utils';
import { standardize } from '@osd/cross-platform';

const execa: jest.Mock = jest.requireMock('execa');

Expand Down
1 change: 1 addition & 0 deletions packages/osd-plugin-generator/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"osd:watch": "node scripts/build --watch"
},
"dependencies": {
"@osd/cross-platform": "1.0.0",
"@osd/dev-utils": "1.0.0",
"ejs": "^3.1.7",
"execa": "^4.0.2",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ import Path from 'path';

import del from 'del';
import execa from 'execa';
import { REPO_ROOT, standardize, createAbsolutePathSerializer } from '@osd/dev-utils';
import { standardize } from '@osd/cross-platform';
import { REPO_ROOT, createAbsolutePathSerializer } from '@osd/dev-utils';
import globby from 'globby';

// Has to be a posix reference because it is used to generate glob patterns
Expand Down
1 change: 1 addition & 0 deletions packages/osd-plugin-helpers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"osd:watch": "tsc --watch"
},
"dependencies": {
"@osd/cross-platform": "1.0.0",
"@osd/dev-utils": "1.0.0",
"@osd/optimizer": "1.0.0",
"del": "^5.1.0",
Expand Down
17 changes: 9 additions & 8 deletions packages/osd-plugin-helpers/src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

import Path from 'path';

import { PROCESS_WORKING_DIR } from '@osd/cross-platform';
import { RunWithCommands, createFlagError, createFailError } from '@osd/dev-utils';

import { findOpenSearchDashboardsJson } from './find_opensearch_dashboards_json';
Expand Down Expand Up @@ -79,10 +80,10 @@ export function runCli() {
throw createFlagError('expected a single --skip-archive flag');
}

const pluginDir = await findOpenSearchDashboardsJson(process.cwd());
const pluginDir = await findOpenSearchDashboardsJson(PROCESS_WORKING_DIR);
if (!pluginDir) {
throw createFailError(
`Unable to find OpenSearch Dashboards Platform plugin in [${process.cwd()}] or any of its parent directories. Has it been migrated properly? Does it have a opensearch_dashboards.json file?`
`Unable to find OpenSearch Dashboards Platform plugin in [${PROCESS_WORKING_DIR}] or any of its parent directories. Has it been migrated properly? Does it have a opensearch_dashboards.json file?`
);
}

Expand Down Expand Up @@ -148,30 +149,30 @@ export function runCli() {
allowUnexpected: true,
},
async run({ log, flags }) {
const pluginDir = await findOpenSearchDashboardsJson(process.cwd());
const pluginDir = await findOpenSearchDashboardsJson(PROCESS_WORKING_DIR);
if (!pluginDir) {
throw createFailError(
`Unable to find OpenSearch Dashboards Platform plugin in [${process.cwd()}] or any of its parent directories. Has it been migrated properly? Does it have a opensearch_dashboards.json file?`
`Unable to find OpenSearch Dashboards Platform plugin in [${PROCESS_WORKING_DIR}] or any of its parent directories. Has it been migrated properly? Does it have a opensearch_dashboards.json file?`
);
}

let dashboardsPackage;
try {
dashboardsPackage = await import(Path.join(process.cwd(), '../../package.json'));
dashboardsPackage = await import(Path.join(PROCESS_WORKING_DIR, '../../package.json'));
} catch (ex) {
throw createFailError(`Unable to parse the OpenSearch Dashboards' package.json file`);
}

let pluginPackage;
try {
pluginPackage = await import(Path.join(process.cwd(), 'package.json'));
pluginPackage = await import(Path.join(PROCESS_WORKING_DIR, 'package.json'));
} catch (ex) {
throw createFailError(`Unable to parse the plugin's package.json file`);
}

let manifestFile;
try {
manifestFile = await import(Path.join(process.cwd(), 'opensearch_dashboards.json'));
manifestFile = await import(Path.join(PROCESS_WORKING_DIR, 'opensearch_dashboards.json'));
} catch (ex) {
throw createFailError(`Unable to parse the plugin's opensearch_dashboards.json file`);
}
Expand Down Expand Up @@ -240,7 +241,7 @@ export function runCli() {

const context: VersionContext = {
log,
sourceDir: process.cwd(),
sourceDir: PROCESS_WORKING_DIR,
pluginVersion: updatedPluginVersion,
compatibilityVersion: updatedCompatibilityVersion,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,8 @@ import Path from 'path';
import Fs from 'fs';

import execa from 'execa';
import {
REPO_ROOT,
standardize,
createStripAnsiSerializer,
createReplaceSerializer,
} from '@osd/dev-utils';
import { standardize } from '@osd/cross-platform';
import { REPO_ROOT, createStripAnsiSerializer, createReplaceSerializer } from '@osd/dev-utils';
import extract from 'extract-zip';
import del from 'del';
import globby from 'globby';
Expand Down
1 change: 1 addition & 0 deletions packages/osd-pm/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
"write-pkg": "^4.0.0"
},
"dependencies": {
"@osd/cross-platform": "1.0.0",
"@osd/utils": "1.0.0",
"tslib": "^2.0.0"
}
Expand Down
2 changes: 1 addition & 1 deletion packages/osd-pm/src/utils/projects_tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
import chalk from 'chalk';
import path from 'path';

import { standardize } from '@osd/utils';
import { standardize } from '@osd/cross-platform';
import { Project } from './project';

const projectKey = Symbol('__project');
Expand Down
1 change: 1 addition & 0 deletions packages/osd-utils/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
},
"dependencies": {
"@osd/config-schema": "1.0.0",
"@osd/cross-platform": "1.0.0",
"load-json-file": "^6.2.0"
},
"devDependencies": {
Expand Down
26 changes: 1 addition & 25 deletions packages/osd-utils/src/path/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
* under the License.
*/

import { join, normalize } from 'path';
import { join } from 'path';
import { accessSync, constants } from 'fs';
import { TypeOf, schema } from '@osd/config-schema';
import { REPO_ROOT } from '../repo_root';
Expand Down Expand Up @@ -94,27 +94,3 @@ export const config = {
data: schema.string({ defaultValue: () => getDataPath() }),
}),
};

/**
* Get a standardized reference to a path
* @param {string} path - the path to standardize
* @param {boolean} [usePosix=true] - produce a posix reference
* @param {boolean} [escapedBackslashes=true] - on Windows, double-backslash the reference
* @internal
*/
export const standardize = (
path: string,
usePosix: boolean = true,
escapedBackslashes: boolean = true
) => {
/* Force os-dependant separators
* path.posix.normalize doesn't convert backslashes to slashes on Windows so we manually force it afterwards
*/
const normal = normalize(path);

// Filter out in-browser executions as well as non-windows ones
if (process?.platform !== 'win32') return normal;

if (usePosix) return normal.replace(/\\/g, '/');
return escapedBackslashes ? normal.replace(/\\/g, '\\\\') : normal;
};
3 changes: 2 additions & 1 deletion src/dev/build/lib/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@

import { resolve } from 'path';

import { REPO_ROOT, standardize } from '@osd/utils';
import { standardize } from '@osd/cross-platform';
import { REPO_ROOT } from '@osd/utils';
import { createAbsolutePathSerializer } from '@osd/dev-utils';

import pkg from '../../../../package.json';
Expand Down