@modern-js/utils 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
- });