1e484b35bSopenharmony_ci/**
2e484b35bSopenharmony_ci * Verify whether a string starts with $ or _.
3e484b35bSopenharmony_ci * @param {string} str - The string which to be verified.
4e484b35bSopenharmony_ci * @return {boolean} The result whether the string starts with $ or _.
5e484b35bSopenharmony_ci */
6e484b35bSopenharmony_ciexport function isReserved(str) {
7e484b35bSopenharmony_ci  const c = (str + '').charCodeAt(0);
8e484b35bSopenharmony_ci  return c === 0x24 || c === 0x5F;
9e484b35bSopenharmony_ci}
10e484b35bSopenharmony_ci
11e484b35bSopenharmony_ci/**
12e484b35bSopenharmony_ci * Create a cached version of a function.
13e484b35bSopenharmony_ci * @param {Function} func - The function which to be created a cached version.
14e484b35bSopenharmony_ci * @return {Function} The cached version of the function.
15e484b35bSopenharmony_ci */
16e484b35bSopenharmony_cifunction cached(func) {
17e484b35bSopenharmony_ci  const cache = Object.create(null);
18e484b35bSopenharmony_ci  return function cachedFn(str) {
19e484b35bSopenharmony_ci    const hit = cache[str];
20e484b35bSopenharmony_ci    return hit || (cache[str] = func(str));
21e484b35bSopenharmony_ci  };
22e484b35bSopenharmony_ci}
23e484b35bSopenharmony_ci
24e484b35bSopenharmony_ci/**
25e484b35bSopenharmony_ci * Camelize a hyphen-delmited string.
26e484b35bSopenharmony_ci * @param {string} str - A hyphen-delmited string.
27e484b35bSopenharmony_ci * @return {string} A camelized string.
28e484b35bSopenharmony_ci */
29e484b35bSopenharmony_ciexport const camelize = cached(str => {
30e484b35bSopenharmony_ci  return str.replace(/-(\w)/g, (_, s) => s ? s.toUpperCase() : '');
31e484b35bSopenharmony_ci});
32e484b35bSopenharmony_ci
33e484b35bSopenharmony_ci/**
34e484b35bSopenharmony_ci * Check the type of a variable.
35e484b35bSopenharmony_ci * @param {*} any - The variable which to be checked.
36e484b35bSopenharmony_ci * @return {string} The type of the variable.
37e484b35bSopenharmony_ci */
38e484b35bSopenharmony_ciexport function typof(any) {
39e484b35bSopenharmony_ci  const objType = Object.prototype.toString.call(any);
40e484b35bSopenharmony_ci  return objType.substring(8, objType.length - 1).toLowerCase();
41e484b35bSopenharmony_ci}
42e484b35bSopenharmony_ci
43e484b35bSopenharmony_ci/**
44e484b35bSopenharmony_ci * Regular expression for component.
45e484b35bSopenharmony_ci * @constant {RegExp}
46e484b35bSopenharmony_ci */
47e484b35bSopenharmony_ciconst COMPONENT_REG = /^@app-component\//;
48e484b35bSopenharmony_ci
49e484b35bSopenharmony_ci/**
50e484b35bSopenharmony_ci * Regular expression for module.
51e484b35bSopenharmony_ci * @constant {RegExp}
52e484b35bSopenharmony_ci */
53e484b35bSopenharmony_ciconst MODULE_REG = /^@app-module\//;
54e484b35bSopenharmony_ci
55e484b35bSopenharmony_ci/**
56e484b35bSopenharmony_ci * Regular expression for application.
57e484b35bSopenharmony_ci * @constant {RegExp}
58e484b35bSopenharmony_ci */
59e484b35bSopenharmony_ciconst APPLICATION_REG = /^@app-application\//;
60e484b35bSopenharmony_ci
61e484b35bSopenharmony_ci/**
62e484b35bSopenharmony_ci * Verify whether is a component.
63e484b35bSopenharmony_ci * @param {string} name - The name which need to be verified.
64e484b35bSopenharmony_ci * @return {boolean} The result whether is a component.
65e484b35bSopenharmony_ci */
66e484b35bSopenharmony_ciexport function isComponent(name) {
67e484b35bSopenharmony_ci  return !!name.match(COMPONENT_REG);
68e484b35bSopenharmony_ci}
69e484b35bSopenharmony_ci
70e484b35bSopenharmony_ci/**
71e484b35bSopenharmony_ci * Verify whether is a module.
72e484b35bSopenharmony_ci * @param {string} name - The name which need to be verified.
73e484b35bSopenharmony_ci * @return {boolean} The result whether is a module.
74e484b35bSopenharmony_ci */
75e484b35bSopenharmony_ciexport function isModule(name) {
76e484b35bSopenharmony_ci  return !!name.match(MODULE_REG);
77e484b35bSopenharmony_ci}
78e484b35bSopenharmony_ci
79e484b35bSopenharmony_ci/**
80e484b35bSopenharmony_ci * Verify whether is an application.
81e484b35bSopenharmony_ci * @param {string} name - The name which need to be verified.
82e484b35bSopenharmony_ci * @return {boolean} The result whether is an APP.
83e484b35bSopenharmony_ci */
84e484b35bSopenharmony_ciexport function isApplication(name) {
85e484b35bSopenharmony_ci  return !!name.match(APPLICATION_REG);
86e484b35bSopenharmony_ci}
87e484b35bSopenharmony_ci
88e484b35bSopenharmony_ci/**
89e484b35bSopenharmony_ci * Remove "@app-application".
90e484b35bSopenharmony_ci * @param {string} name - The name which need to be removed.
91e484b35bSopenharmony_ci * @return {string} The result which has been removed "@app-application".
92e484b35bSopenharmony_ci */
93e484b35bSopenharmony_ciexport function removeApplicationPrefix(str) {
94e484b35bSopenharmony_ci  const result = str.replace(APPLICATION_REG, '');
95e484b35bSopenharmony_ci  return result;
96e484b35bSopenharmony_ci}
97e484b35bSopenharmony_ci
98e484b35bSopenharmony_ci/**
99e484b35bSopenharmony_ci * Remove "@app-component and @app-module".
100e484b35bSopenharmony_ci * @param {string} name - The name which need to be removed.
101e484b35bSopenharmony_ci * @return {string} The result which has been removed "@app-component" and "@app-module".
102e484b35bSopenharmony_ci */
103e484b35bSopenharmony_ciexport function removePrefix(str) {
104e484b35bSopenharmony_ci  const result = str.replace(COMPONENT_REG, '').replace(MODULE_REG, '');
105e484b35bSopenharmony_ci  return result;
106e484b35bSopenharmony_ci}
107