@modern-js/utils 1.4.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/analyzeProject.d.ts +1 -0
  3. package/dist/analyzeProject.js +44 -0
  4. package/dist/constants.d.ts +1 -1
  5. package/dist/constants.js +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +1 -0
  8. package/dist/prettyInstructions.js +3 -3
  9. package/dist/storage.js +1 -1
  10. package/package.json +4 -2
  11. package/tests/.eslintrc.js +0 -6
  12. package/tests/__snapshots__/prettyInstructions.test.ts.snap +0 -19
  13. package/tests/applyOptionsChain.test.ts +0 -100
  14. package/tests/compatRequire.test.ts +0 -32
  15. package/tests/debug.test.ts +0 -25
  16. package/tests/ensureAbsolutePath.test.ts +0 -16
  17. package/tests/findExists.test.ts +0 -22
  18. package/tests/fixtures/browserlist/develop/package.json +0 -11
  19. package/tests/fixtures/browserlist/dotfile/.browserslistrc +0 -3
  20. package/tests/fixtures/browserlist/pkg/package.json +0 -7
  21. package/tests/fixtures/compat-require/cjs.js +0 -1
  22. package/tests/fixtures/compat-require/empty.js +0 -1
  23. package/tests/fixtures/compat-require/esm.js +0 -5
  24. package/tests/fixtures/compat-require/foo.js +0 -3
  25. package/tests/fixtures/file-exists/a.ejs +0 -0
  26. package/tests/fixtures/file-exists/a.js/.gitkeep +0 -0
  27. package/tests/fixtures/file-exists/a.mjs +0 -0
  28. package/tests/fixtures/file-exists/a.ts +0 -0
  29. package/tests/format.test.ts +0 -60
  30. package/tests/generateMetaTags.test.ts +0 -19
  31. package/tests/getBrowserslist.test.ts +0 -32
  32. package/tests/getCacheIdentifier.test.ts +0 -37
  33. package/tests/getEntryOptions.test.ts +0 -53
  34. package/tests/index.test.ts +0 -18
  35. package/tests/is.test.ts +0 -27
  36. package/tests/isPlatform.test.ts +0 -19
  37. package/tests/isType.test.ts +0 -85
  38. package/tests/logger.test.ts +0 -53
  39. package/tests/prettyInstructions.test.ts +0 -139
  40. package/tests/removeSlash.test.ts +0 -19
  41. package/tests/tsconfig.json +0 -11
  42. package/tests/wait.ts +0 -38
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @modern-js/utils
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3bf4f8b0: feat: support start api server only
8
+
9
+ ### Patch Changes
10
+
11
+ - b8599d09: fix: failed to generate webpack cache
12
+ - 60f7d8bf: feat: add tests dir to npmignore
13
+
3
14
  ## 1.4.1
4
15
 
5
16
  ### Patch Changes
@@ -0,0 +1 @@
1
+ export declare const isApiOnly: (appDirectory: string) => Promise<boolean>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ var __importDefault = (this && this.__importDefault) || function (mod) {
31
+ return (mod && mod.__esModule) ? mod : { "default": mod };
32
+ };
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.isApiOnly = void 0;
35
+ const path = __importStar(require("path"));
36
+ const minimist_1 = __importDefault(require("minimist"));
37
+ const compiled_1 = require("./compiled");
38
+ const isApiOnly = (appDirectory) => __awaiter(void 0, void 0, void 0, function* () {
39
+ const srcDir = path.join(appDirectory, 'src');
40
+ const existSrc = yield compiled_1.fs.pathExists(srcDir);
41
+ const options = (0, minimist_1.default)(process.argv.slice(2));
42
+ return !existSrc || Boolean(options['api-only']);
43
+ });
44
+ exports.isApiOnly = isApiOnly;
@@ -39,7 +39,7 @@ export declare const SHARED_DIR = "shared";
39
39
  /**
40
40
  * Modern.config.ts cached dir
41
41
  */
42
- export declare const CONFIG_CACHE_DIR = "./node_modules/.node-bundle-require";
42
+ export declare const CONFIG_CACHE_DIR = "./node_modules/.cache/node-bundle-require";
43
43
  export declare const CONFIG_FILE_EXTENSIONS: string[];
44
44
  /**
45
45
  * Serialized config path
package/dist/constants.js CHANGED
@@ -42,7 +42,7 @@ exports.SHARED_DIR = 'shared';
42
42
  /**
43
43
  * Modern.config.ts cached dir
44
44
  */
45
- exports.CONFIG_CACHE_DIR = './node_modules/.node-bundle-require';
45
+ exports.CONFIG_CACHE_DIR = './node_modules/.cache/node-bundle-require';
46
46
  exports.CONFIG_FILE_EXTENSIONS = ['.js', '.ts', '.ejs', '.mjs'];
47
47
  /**
48
48
  * Serialized config path
package/dist/index.d.ts CHANGED
@@ -31,3 +31,4 @@ export * from './wait';
31
31
  export * from './emptyDir';
32
32
  export * from './getServerConfig';
33
33
  export * from './ssrHelpers';
34
+ export * from './analyzeProject';
package/dist/index.js CHANGED
@@ -43,3 +43,4 @@ __exportStar(require("./wait"), exports);
43
43
  __exportStar(require("./emptyDir"), exports);
44
44
  __exportStar(require("./getServerConfig"), exports);
45
45
  __exportStar(require("./ssrHelpers"), exports);
46
+ __exportStar(require("./analyzeProject"), exports);
@@ -33,13 +33,13 @@ const getAddressUrls = (protocol = 'http', port) => {
33
33
  }, []);
34
34
  };
35
35
  const prettyInstructions = (appContext, config) => {
36
- const { entrypoints, serverRoutes, port, existSrc, checkedEntries } = appContext;
36
+ const { entrypoints, serverRoutes, port, apiOnly, checkedEntries } = appContext;
37
37
  const urls = getAddressUrls(config.dev.https && (0, is_1.isDev)() ? 'https' : 'http', port);
38
- const routes = existSrc
38
+ const routes = !apiOnly
39
39
  ? serverRoutes.filter(route => route.entryName)
40
40
  : serverRoutes;
41
41
  let message = 'App running at:\n\n';
42
- if ((0, exports.isSingleEntry)(entrypoints) || !existSrc) {
42
+ if ((0, exports.isSingleEntry)(entrypoints) || apiOnly) {
43
43
  message += urls
44
44
  .map(({ type, url }) => ` ${compiled_1.chalk.bold(`> ${type.padEnd(10)}`)}${compiled_1.chalk.cyanBright(normalizeUrl(`${url}/${routes[0].urlPath}`))}\n`)
45
45
  .join('');
package/dist/storage.js CHANGED
@@ -49,7 +49,7 @@ const createStorage = () => {
49
49
  }
50
50
  const context = storage.getStore();
51
51
  if (!context) {
52
- throw new Error(`Can't call useContext out of scope, it should be placed on top of the function`);
52
+ throw new Error(`Can't call useContext out of scope, make sure @modern-js/utils is a single version in node_modules`);
53
53
  }
54
54
  return context;
55
55
  };
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.4.1",
14
+ "version": "1.5.0",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/index.d.ts",
17
17
  "main": "./dist/index.js",
@@ -57,10 +57,11 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@babel/runtime": "^7",
60
+ "minimist": "^1.2.0",
60
61
  "typescript": "^4"
61
62
  },
62
63
  "devDependencies": {
63
- "@modern-js/types": "^1.4.0",
64
+ "@modern-js/types": "^1.5.0",
64
65
  "@scripts/build": "0.0.0",
65
66
  "@scripts/jest-config": "0.0.0",
66
67
  "@types/debug": "4.1.7",
@@ -69,6 +70,7 @@
69
70
  "@types/jest": "^26",
70
71
  "@types/js-yaml": "4.0.5",
71
72
  "@types/lodash": "4.14.181",
73
+ "@types/minimist": "^1.2.2",
72
74
  "@types/node": "^14",
73
75
  "@types/recursive-readdir": "2.2.0",
74
76
  "@types/signale": "1.4.4",
@@ -1,6 +0,0 @@
1
- module.exports = {
2
- extends: ['@modern-js'],
3
- parserOptions: {
4
- project: require.resolve('./tsconfig.json'),
5
- },
6
- };
@@ -1,19 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`prettyInstructions The src directory does not exist 1`] = `
4
- "App running at:
5
-
6
- > Network: http://127.0.0.1:8080/api
7
- > Network: http://11.11.111.11:8080/api
8
- > Network: http://10.100.100.100:8080/api
9
- "
10
- `;
11
-
12
- exports[`prettyInstructions basic usage 1`] = `
13
- "App running at:
14
-
15
- > Network: http://127.0.0.1:8080/
16
- > Network: http://11.11.111.11:8080/
17
- > Network: http://10.100.100.100:8080/
18
- "
19
- `;
@@ -1,100 +0,0 @@
1
- import { applyOptionsChain } from '../src/applyOptionsChain';
2
-
3
- describe('apply options chain', () => {
4
- test(`should return default options`, () => {
5
- expect(applyOptionsChain({ default: 'a' })).toEqual({ default: 'a' });
6
- });
7
-
8
- test(`should merge default options`, () => {
9
- expect(
10
- applyOptionsChain(
11
- { name: 'a' },
12
- {
13
- name: 'b',
14
- custom: 'c',
15
- },
16
- ),
17
- ).toEqual({
18
- name: 'b',
19
- custom: 'c',
20
- });
21
- });
22
-
23
- test(`should support custom merge function`, () => {
24
- const merge = (target: any, source: any) => {
25
- for (const key in source) {
26
- if (target.hasOwnProperty(key)) {
27
- target[key] += source[key];
28
- } else {
29
- target[key] = source[key];
30
- }
31
- }
32
- return target;
33
- };
34
-
35
- expect(
36
- applyOptionsChain(
37
- {
38
- a: 1,
39
- b: 'b',
40
- },
41
- {
42
- a: 2,
43
- b: 'b',
44
- c: 'c',
45
- },
46
- {},
47
- merge,
48
- ),
49
- ).toEqual({
50
- a: 3,
51
- b: 'bb',
52
- c: 'c',
53
- });
54
- });
55
-
56
- test(`should support funciton or object array`, () => {
57
- const defaults = { a: 'a' };
58
-
59
- const options = [
60
- { b: 'b' },
61
- (o: any, { add }: { add: any }) => {
62
- o.c = add(1, 2);
63
- },
64
- (o: any) => ({
65
- ...o,
66
- d: 'd',
67
- }),
68
- { e: 'e' },
69
- ];
70
- expect(
71
- applyOptionsChain(defaults, options as any, {
72
- add: (a: any, b: any) => a + b,
73
- }),
74
- ).toEqual({
75
- a: 'a',
76
- b: 'b',
77
- c: 3,
78
- d: 'd',
79
- e: 'e',
80
- });
81
- });
82
-
83
- test(`should throw error`, () => {
84
- expect(() => {
85
- applyOptionsChain(1, 2);
86
- }).toThrow(/^applyOptionsChain error:/);
87
- });
88
-
89
- test(`should log warning about function result`, () => {
90
- let outputs = '';
91
- /* eslint-disable no-console */
92
- console.log = jest.fn(input => (outputs += input));
93
- /* eslint-enable no-console */
94
- applyOptionsChain({ name: 'a' } as any, [() => 111]);
95
-
96
- expect(outputs).toContain(
97
- 'Function should mutate the config and return nothing, Or return a cloned or merged version of config object.',
98
- );
99
- });
100
- });
@@ -1,32 +0,0 @@
1
- import path from 'path';
2
- import { compatRequire, cleanRequireCache } from '../src/compatRequire';
3
-
4
- describe('compat require', () => {
5
- const fixturePath = path.resolve(__dirname, './fixtures/compat-require');
6
-
7
- test(`should support default property`, () => {
8
- expect(compatRequire(path.join(fixturePath, 'esm.js'))).toEqual({
9
- name: 'esm',
10
- });
11
- });
12
-
13
- test(`should support commonjs module`, () => {
14
- expect(compatRequire(path.join(fixturePath, 'cjs.js'))).toEqual({
15
- name: 'cjs',
16
- });
17
- });
18
-
19
- test(`should return null`, () => {
20
- expect(compatRequire(path.join(fixturePath, 'empty.js'))).toEqual(null);
21
- });
22
-
23
- test('should clearn cache after fn', () => {
24
- const foo = module.require('./fixtures/compat-require/foo');
25
- const requirePath = require.resolve('./fixtures/compat-require/foo.js');
26
- expect(foo.name).toBe('foo');
27
- expect(require.cache[requirePath]).toBeDefined();
28
- cleanRequireCache([requirePath]);
29
- jest.resetModules();
30
- expect(require.cache[requirePath]).toBeUndefined();
31
- });
32
- });
@@ -1,25 +0,0 @@
1
- import { debug } from '../src/compiled';
2
- import { stripAnsi } from '../src';
3
- import { createDebugger } from '../src/debug';
4
-
5
- describe('debug utility', () => {
6
- test('should return file path', () => {
7
- const debug1 = createDebugger('test');
8
-
9
- const debug2 = createDebugger('test2');
10
-
11
- debug.enable('modern-js:test2');
12
-
13
- debug.log = (...args) => {
14
- // XXX: args[0] 的内容有时候是 ' \x1B[38;5;167;1mmodern-js:test2 \x1B[0m22222' 这种格式
15
- expect(stripAnsi(args[0])).toContain('modern-js:test2 22222');
16
- };
17
-
18
- debug1('11111');
19
- debug2('22222');
20
-
21
- expect(debug2.enabled).toBe(true);
22
-
23
- expect(debug1.enabled).toBe(false);
24
- });
25
- });
@@ -1,16 +0,0 @@
1
- import path from 'path';
2
- import { ensureAbsolutePath } from '../src/ensureAbsolutePath';
3
-
4
- describe('ensure absolute file path', () => {
5
- test('should return filePath directly', () => {
6
- expect(
7
- path.isAbsolute(ensureAbsolutePath('/a/b', '/a/b/c/d/e.jsx')),
8
- ).toBeTruthy();
9
- });
10
-
11
- test(`should resolve absolute path`, () => {
12
- expect(
13
- path.isAbsolute(ensureAbsolutePath('/a/b', 'c/d/e.jsx')),
14
- ).toBeTruthy();
15
- });
16
- });
@@ -1,22 +0,0 @@
1
- import path from 'path';
2
- import { findExists } from '../src/findExists';
3
-
4
- describe('find first exists file', () => {
5
- const fixturePath = path.resolve(__dirname, './fixtures/file-exists');
6
-
7
- test('should return file path', () => {
8
- expect(
9
- findExists(
10
- ['.js', '.ts', '.ejs', '.mjs'].map(ext =>
11
- path.join(fixturePath, `a${ext}`),
12
- ),
13
- ),
14
- ).toEqual(path.join(fixturePath, 'a.ts'));
15
- });
16
-
17
- test('should return false when no file exists', () => {
18
- expect(
19
- findExists(['.jsx'].map(ext => path.join(fixturePath, `a${ext}`))),
20
- ).toBe(false);
21
- });
22
- });
@@ -1,11 +0,0 @@
1
- {
2
- "name": "test-browserlist-develop",
3
- "browserslist": {
4
- "development": [
5
- "last 1 chrome version"
6
- ],
7
- "production": [
8
- "IOS 7"
9
- ]
10
- }
11
- }
@@ -1,3 +0,0 @@
1
- defaults
2
- not IE 11
3
- maintained node versions
@@ -1,7 +0,0 @@
1
- {
2
- "name": "test-browserlist-pkg",
3
- "browserslist": [
4
- "not IE 11",
5
- "maintained node versions"
6
- ]
7
- }
@@ -1 +0,0 @@
1
- module.exports = { name: 'cjs' };
@@ -1 +0,0 @@
1
- module.exports = null;
@@ -1,5 +0,0 @@
1
- Object.defineProperty(exports, '__esModule', { value: true });
2
-
3
- const _default = { name: 'esm' };
4
-
5
- exports.default = _default;
@@ -1,3 +0,0 @@
1
- module.exports = {
2
- name: 'foo',
3
- };
File without changes
File without changes
File without changes
File without changes
@@ -1,60 +0,0 @@
1
- import { formatProxyOptions } from '../src/format';
2
-
3
- describe('test format', () => {
4
- it('should format correctly use simply options', async () => {
5
- const proxy = {
6
- '/simple': `http://localhost`,
7
- };
8
-
9
- const options = formatProxyOptions(proxy);
10
- expect(options).toEqual([
11
- {
12
- context: '/simple',
13
- changeOrigin: true,
14
- logLevel: 'warn',
15
- target: 'http://localhost',
16
- },
17
- ]);
18
- });
19
-
20
- it('should format correctly use simply options', async () => {
21
- const proxy = {
22
- '/simple-obj': {
23
- target: `http://localhost`,
24
- },
25
- };
26
- const options = formatProxyOptions(proxy);
27
- expect(options).toEqual([
28
- {
29
- context: '/simple-obj',
30
- changeOrigin: true,
31
- logLevel: 'warn',
32
- target: 'http://localhost',
33
- },
34
- ]);
35
- });
36
-
37
- it('should format correctly use simply options', async () => {
38
- const proxy = {
39
- context: '/context',
40
- target: `http://localhost`,
41
- };
42
- const options = formatProxyOptions(proxy);
43
- expect(options).toEqual([
44
- { context: '/context', target: 'http://localhost' },
45
- ]);
46
- });
47
-
48
- it('should format correctly use simply options', async () => {
49
- const proxy = [
50
- {
51
- context: '/array',
52
- target: `http://localhost`,
53
- },
54
- ];
55
- const options = formatProxyOptions(proxy);
56
- expect(options).toEqual([
57
- { context: '/array', target: 'http://localhost' },
58
- ]);
59
- });
60
- });
@@ -1,19 +0,0 @@
1
- import { generateMetaTags } from '../src/generateMetaTags';
2
-
3
- describe('generateMetaTags', () => {
4
- it('should return empty string when params is empty', () => {
5
- expect(generateMetaTags()).toEqual('');
6
- });
7
-
8
- it('should generate meta tag correctly', () => {
9
- const options = {
10
- foo: {
11
- name: 'viewport',
12
- content: 'width=500, initial-scale=1',
13
- },
14
- };
15
- expect(generateMetaTags(options).trim()).toEqual(
16
- '<meta name="viewport" content="width=500, initial-scale=1">',
17
- );
18
- });
19
- });
@@ -1,32 +0,0 @@
1
- import path from 'path';
2
- import { getBrowserslist, defaults } from '../src/getBrowserslist';
3
-
4
- describe('get browserslist', () => {
5
- const fixture = path.resolve(__dirname, './fixtures/browserlist');
6
-
7
- test(`should load browserslist from package.json`, () => {
8
- expect(getBrowserslist(path.join(fixture, 'pkg'))).toEqual([
9
- 'not IE 11',
10
- 'maintained node versions',
11
- ]);
12
- });
13
-
14
- test(`should load browerslist from .browserslistrc`, () => {
15
- expect(getBrowserslist(path.join(fixture, 'dotfile'))).toEqual([
16
- 'defaults',
17
- 'not IE 11',
18
- 'maintained node versions',
19
- ]);
20
- });
21
-
22
- test(`should load browserslist base on environment`, () => {
23
- process.env.NODE_ENV = 'development';
24
- expect(getBrowserslist(path.join(fixture, 'develop'))).toEqual([
25
- 'last 1 chrome version',
26
- ]);
27
- });
28
-
29
- test(`should return default browserslist config`, () => {
30
- expect(getBrowserslist(path.join(fixture))).toEqual(defaults);
31
- });
32
- });
@@ -1,37 +0,0 @@
1
- import { getCacheIdentifier } from '../src/getCacheIdentifier';
2
-
3
- describe('get cache identifier', () => {
4
- test('should use package name and version', () => {
5
- expect(
6
- getCacheIdentifier([
7
- {
8
- name: 'package-a',
9
- version: '0.1.0',
10
- },
11
- {
12
- name: 'package-b',
13
- version: '1.0.1',
14
- },
15
- ]),
16
- ).toEqual(`test:package-a@0.1.0:package-b@1.0.1`);
17
- });
18
-
19
- test(`should return identifier with node environment`, () => {
20
- const packages = [
21
- {
22
- name: 'a',
23
- version: '0.1.0',
24
- },
25
- ];
26
-
27
- process.env.NODE_ENV = 'development';
28
- expect(getCacheIdentifier(packages)).toEqual('development:a@0.1.0');
29
-
30
- process.env.NODE_ENV = 'production';
31
- expect(getCacheIdentifier(packages)).toEqual('production:a@0.1.0');
32
-
33
- process.env.NODE_ENV = '';
34
-
35
- expect(getCacheIdentifier(packages)).toEqual(`:a@0.1.0`);
36
- });
37
- });
@@ -1,53 +0,0 @@
1
- import { getEntryOptions } from '../src/getEntryOptions';
2
-
3
- describe('get entry options', () => {
4
- test('should return default options', () => {
5
- expect(getEntryOptions('page-a', 'default value')).toEqual('default value');
6
-
7
- expect(
8
- getEntryOptions('page-a', 'default value', { 'page-b': 'a' }),
9
- ).toEqual('default value');
10
- });
11
-
12
- test(`should return options from optionsByEntries`, () => {
13
- expect(
14
- getEntryOptions('page-a', 'default value', { 'page-a': 'a' }),
15
- ).toEqual('a');
16
- });
17
-
18
- test(`should compatible with main entry using packageName as key`, () => {
19
- expect(
20
- getEntryOptions(
21
- 'main',
22
- 'default value',
23
- { 'package-name': 'a' },
24
- 'package-name',
25
- ),
26
- ).toEqual('a');
27
- });
28
-
29
- expect(
30
- getEntryOptions(
31
- 'page-a',
32
- { name: 'a' },
33
- {
34
- 'page-a': {
35
- name: 'page-a',
36
- about: 'b',
37
- },
38
- },
39
- ),
40
- ).toEqual({
41
- name: 'page-a',
42
- about: 'b',
43
- });
44
-
45
- expect(
46
- getEntryOptions<
47
- | {
48
- [name: string]: string;
49
- }
50
- | boolean
51
- >('page-a', { name: 'a' }, { 'page-a': false }),
52
- ).toEqual(false);
53
- });
@@ -1,18 +0,0 @@
1
- import { canUseNpm, canUsePnpm, canUseYarn } from '../src';
2
-
3
- jest.setTimeout(40000);
4
-
5
- describe('test generator utils', () => {
6
- test('test canUseNpm', async () => {
7
- const npmAbility = await canUseNpm();
8
- expect(typeof npmAbility === 'boolean').toBe(true);
9
- });
10
- test('test canUsePnpm', async () => {
11
- const pnpmAbility = await canUsePnpm();
12
- expect(typeof pnpmAbility === 'boolean').toBe(true);
13
- });
14
- test('test canUseYarn', async () => {
15
- const yarnAbility = await canUseYarn();
16
- expect(typeof yarnAbility === 'boolean').toBe(true);
17
- });
18
- });
package/tests/is.test.ts DELETED
@@ -1,27 +0,0 @@
1
- import { isEmpty, isFastRefresh } from '../src/is';
2
-
3
- describe('validate', () => {
4
- it('should validate empty object correctly', () => {
5
- expect(isEmpty({})).toBeTruthy();
6
- expect(isEmpty({ foo: 'bar' })).toBeFalsy();
7
- });
8
-
9
- it('should validate fast refresh correctly', () => {
10
- const { NODE_ENV, FAST_REFRESH } = process.env;
11
-
12
- process.env.NODE_ENV = 'development';
13
- process.env.FAST_REFRESH = 'true';
14
- expect(isFastRefresh()).toBeTruthy();
15
-
16
- process.env.NODE_ENV = 'production';
17
- process.env.FAST_REFRESH = 'true';
18
- expect(isFastRefresh()).toBeFalsy();
19
-
20
- process.env.NODE_ENV = 'development';
21
- process.env.FAST_REFRESH = 'false';
22
- expect(isFastRefresh()).toBeFalsy();
23
-
24
- process.env.NODE_ENV = NODE_ENV;
25
- process.env.FAST_REFRESH = FAST_REFRESH;
26
- });
27
- });
@@ -1,19 +0,0 @@
1
- import { isNodeJS, isBrowser } from '../src/is/platform';
2
-
3
- describe('validate platform', () => {
4
- it('should validate Node.js correctly', () => {
5
- expect(isNodeJS()).toBeTruthy();
6
- });
7
-
8
- it('should validate browser correctly', () => {
9
- const windowSpy = jest.spyOn(window, 'window', 'get');
10
-
11
- windowSpy.mockImplementation((): any => undefined);
12
- expect(isBrowser()).toBeFalsy();
13
-
14
- windowSpy.mockImplementation((): any => global);
15
- expect(isBrowser()).toBeTruthy();
16
-
17
- windowSpy.mockRestore();
18
- });
19
- });
@@ -1,85 +0,0 @@
1
- import {
2
- isArray,
3
- isObject,
4
- isString,
5
- isRegExp,
6
- isPromise,
7
- isUndefined,
8
- isPlainObject,
9
- } from '../src/is/type';
10
-
11
- describe('validate type', () => {
12
- it('should validate string correctly', () => {
13
- expect(isString('')).toBeTruthy();
14
- expect(isString('foo')).toBeTruthy();
15
- expect(isString(null)).toBeFalsy();
16
- expect(isString(123)).toBeFalsy();
17
- });
18
-
19
- it('should validate undefined correctly', () => {
20
- expect(isUndefined(undefined)).toBeTruthy();
21
- expect(isUndefined(null)).toBeFalsy();
22
- expect(isUndefined('')).toBeFalsy();
23
- expect(isUndefined(123)).toBeFalsy();
24
- });
25
-
26
- it('should validate array correctly', () => {
27
- expect(isArray(undefined)).toBeFalsy();
28
- expect(isArray(null)).toBeFalsy();
29
- expect(isArray('')).toBeFalsy();
30
- expect(isArray(123)).toBeFalsy();
31
- expect(isArray({})).toBeFalsy();
32
- expect(isArray([])).toBeTruthy();
33
- });
34
-
35
- it('should validate object correctly', () => {
36
- expect(isObject(1)).toBeFalsy();
37
- expect(isObject('1')).toBeFalsy();
38
- expect(isObject(undefined)).toBeFalsy();
39
- expect(isObject(null)).toBeFalsy();
40
- // eslint-disable-next-line @typescript-eslint/no-empty-function
41
- expect(isObject(() => {})).toBeFalsy();
42
- expect(isObject({})).toBeTruthy();
43
- expect(isObject([])).toBeTruthy();
44
- expect(isObject(/foo/)).toBeTruthy();
45
- });
46
-
47
- it('should validate plain object correctly', () => {
48
- expect(isPlainObject(1)).toBeFalsy();
49
- expect(isPlainObject('1')).toBeFalsy();
50
- expect(isPlainObject(undefined)).toBeFalsy();
51
- expect(isPlainObject(null)).toBeFalsy();
52
- // eslint-disable-next-line @typescript-eslint/no-empty-function
53
- expect(isPlainObject(() => {})).toBeFalsy();
54
- expect(isPlainObject({})).toBeTruthy();
55
- expect(isPlainObject([])).toBeFalsy();
56
- expect(isPlainObject(/foo/)).toBeFalsy();
57
- });
58
-
59
- it('should validate RegExp correctly', () => {
60
- expect(isRegExp(1)).toBeFalsy();
61
- expect(isRegExp('1')).toBeFalsy();
62
- expect(isRegExp(undefined)).toBeFalsy();
63
- expect(isRegExp(null)).toBeFalsy();
64
- expect(isRegExp({})).toBeFalsy();
65
- expect(isRegExp([])).toBeFalsy();
66
- expect(isRegExp(/foo/)).toBeTruthy();
67
- });
68
-
69
- it('should validate Promise correctly', () => {
70
- expect(isPromise(1)).toBeFalsy();
71
- expect(isPromise('1')).toBeFalsy();
72
- expect(isPromise(undefined)).toBeFalsy();
73
- expect(isPromise(null)).toBeFalsy();
74
- expect(isPromise({})).toBeFalsy();
75
- expect(isPromise([])).toBeFalsy();
76
- expect(isPromise(/foo/)).toBeFalsy();
77
- expect(
78
- isPromise(
79
- new Promise<void>(resolve => {
80
- resolve();
81
- }),
82
- ),
83
- ).toBeTruthy();
84
- });
85
- });
@@ -1,53 +0,0 @@
1
- import { logger } from '../src/logger';
2
-
3
- describe('logger', () => {
4
- test('should log', () => {
5
- // eslint-disable-next-line no-console
6
- console.log = jest.fn();
7
-
8
- logger.log('this is a log message');
9
-
10
- // eslint-disable-next-line no-console
11
- expect((console.log as jest.Mock).mock.calls[0][0]).toBe(
12
- 'this is a log message',
13
- );
14
-
15
- logger.info('this is an info message');
16
-
17
- logger.warn('this is a warn message');
18
-
19
- logger.error(new Error('this is an error message'));
20
-
21
- // eslint-disable-next-line no-console
22
- expect(console.log as jest.Mock).toHaveBeenCalledTimes(4);
23
- });
24
-
25
- test('should create new logger', () => {
26
- // eslint-disable-next-line no-console
27
- console.log = jest.fn();
28
-
29
- const customLogger = new logger.Logger({
30
- config: {
31
- displayLabel: true,
32
- underlineLabel: false,
33
- uppercaseLabel: false,
34
- },
35
- types: {
36
- custom: {
37
- color: 'blue',
38
- label: 'custom',
39
- level: 'info',
40
- },
41
- },
42
- });
43
-
44
- customLogger.custom('custom log');
45
-
46
- const reg = new RegExp(`custom.*custom log$`);
47
- // eslint-disable-next-line no-console
48
- expect((console.log as jest.Mock).mock.calls[0][0]).toMatch(reg);
49
-
50
- // eslint-disable-next-line no-console
51
- expect(console.log as jest.Mock).toHaveBeenCalledTimes(1);
52
- });
53
- });
@@ -1,139 +0,0 @@
1
- import { prettyInstructions } from '../src/prettyInstructions';
2
-
3
- const mockNetworkInterfaces = {
4
- lo0: [
5
- {
6
- address: '127.0.0.1',
7
- netmask: '255.0.0.0',
8
- family: 'IPv4',
9
- mac: '00:00:00:00:00:00',
10
- internal: true,
11
- cidr: '127.0.0.1/8',
12
- },
13
- ],
14
- en5: [
15
- {
16
- address: 'fe80::aede:48ff:fe00:1122',
17
- netmask: 'ffff:ffff:ffff:ffff::',
18
- family: 'IPv6',
19
- mac: 'ac:de:48:00:11:22',
20
- internal: false,
21
- cidr: 'fe80::aede:48ff:fe00:1122/64',
22
- scopeid: 4,
23
- },
24
- ],
25
- en0: [
26
- {
27
- address: '11.11.111.11',
28
- netmask: '255.255.252.0',
29
- family: 'IPv4',
30
- mac: '90:9c:4a:cf:11:d2',
31
- internal: false,
32
- cidr: '10.85.117.60/22',
33
- },
34
- ],
35
- utun2: [
36
- {
37
- address: '10.100.100.100',
38
- netmask: '255.255.224.0',
39
- family: 'IPv4',
40
- mac: '00:00:00:00:00:00',
41
- internal: false,
42
- cidr: '10.255.182.172/19',
43
- },
44
- ],
45
- };
46
-
47
- jest.mock('os', () => {
48
- const originalModule = jest.requireActual('os');
49
- return {
50
- __esModule: true,
51
- ...originalModule,
52
- default: {
53
- networkInterfaces() {
54
- return mockNetworkInterfaces;
55
- },
56
- },
57
- };
58
- });
59
-
60
- jest.mock('../compiled/chalk', () => ({
61
- __esModule: true,
62
- default: {
63
- bold: jest.fn(str => str),
64
- green: jest.fn(str => str),
65
- red: jest.fn(str => str),
66
- yellow: jest.fn(str => str),
67
- cyanBright: jest.fn(str => str),
68
- },
69
- }));
70
-
71
- describe('prettyInstructions', () => {
72
- test('basic usage', () => {
73
- const mockAppContext = {
74
- entrypoints: [
75
- {
76
- entryName: 'main',
77
- entry: '/example/node_modules/.modern-js/main/index.js',
78
- isAutoMount: true,
79
- customBootstrap: false,
80
- },
81
- ],
82
- serverRoutes: [
83
- {
84
- urlPath: '/',
85
- entryName: 'main',
86
- entryPath: 'html/main/index.html',
87
- isSPA: true,
88
- isSSR: false,
89
- enableModernMode: false,
90
- },
91
- {
92
- urlPath: '/api',
93
- isApi: true,
94
- entryPath: '',
95
- isSPA: false,
96
- isSSR: false,
97
- },
98
- ],
99
- port: 8080,
100
- existSrc: true,
101
- };
102
- const mockConfig = {
103
- dev: {
104
- https: true,
105
- },
106
- };
107
-
108
- const message = prettyInstructions(mockAppContext, mockConfig);
109
-
110
- expect(message).toMatchSnapshot();
111
- });
112
-
113
- test('The src directory does not exist', () => {
114
- const mockAppContext = {
115
- entrypoints: [],
116
- serverRoutes: [
117
- {
118
- urlPath: '/api',
119
- isApi: true,
120
- entryPath: '',
121
- isSPA: false,
122
- isSSR: false,
123
- },
124
- ],
125
- port: 8080,
126
- existSrc: false,
127
- };
128
-
129
- const mockConfig = {
130
- dev: {
131
- https: true,
132
- },
133
- };
134
-
135
- const message = prettyInstructions(mockAppContext, mockConfig);
136
-
137
- expect(message).toMatchSnapshot();
138
- });
139
- });
@@ -1,19 +0,0 @@
1
- import {
2
- removeLeadingSlash,
3
- removeSlash,
4
- removeTailSlash,
5
- } from '../src/removeSlash';
6
-
7
- describe('remove slash', () => {
8
- test(`should remove leading slash`, () => {
9
- expect(removeLeadingSlash('///yuck/example//')).toEqual('yuck/example//');
10
- });
11
-
12
- test(`should remove tail slash`, () => {
13
- expect(removeTailSlash('///yuck/example//')).toEqual('///yuck/example');
14
- });
15
-
16
- test(`should remove slash`, () => {
17
- expect(removeSlash('///yuck/example//')).toEqual('yuck/example');
18
- });
19
- });
@@ -1,11 +0,0 @@
1
- {
2
- "extends": "@modern-js/tsconfig/base",
3
- "compilerOptions": {
4
- "declaration": false,
5
- "jsx": "preserve",
6
- "baseUrl": "./",
7
- "isolatedModules": true,
8
- "paths": {},
9
- "types": ["node", "jest"]
10
- }
11
- }
package/tests/wait.ts DELETED
@@ -1,38 +0,0 @@
1
- import { wait } from '../src/wait';
2
-
3
- jest.useRealTimers();
4
-
5
- describe('wait', () => {
6
- test('basic usage', async () => {
7
- const fn1 = jest.fn();
8
- const fn2 = jest.fn();
9
- const fn3 = async () => {
10
- fn1();
11
- await wait();
12
- fn2();
13
- };
14
-
15
- fn3();
16
- expect(fn1).toBeCalled();
17
- expect(fn2).not.toBeCalled();
18
- await wait();
19
- expect(fn2).toBeCalled();
20
- });
21
-
22
- test('delay', async () => {
23
- const fn1 = jest.fn();
24
- const fn2 = jest.fn();
25
- const time = 100;
26
- const fn3 = async () => {
27
- fn1();
28
- await wait(time);
29
- fn2();
30
- };
31
-
32
- fn3();
33
- expect(fn1).toBeCalled();
34
- expect(fn2).not.toBeCalled();
35
- await wait(time);
36
- expect(fn2).toBeCalled();
37
- });
38
- });