@24i/smartapps-bigscreen-rnv-build-engine 0.18.2 → 5.0.0-alpha.16

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.
@@ -0,0 +1,32 @@
1
+ module.exports = {
2
+ env: {
3
+ browser: true,
4
+ es2021: true,
5
+ node: true,
6
+ },
7
+ parser: '@typescript-eslint/parser',
8
+ parserOptions: {
9
+ ecmaVersion: 'latest',
10
+ sourceType: 'module',
11
+ ecmaFeatures: { jsx: true },
12
+ },
13
+ plugins: ['@typescript-eslint', 'react', 'react-hooks'],
14
+ extends: [
15
+ 'eslint:recommended',
16
+ 'plugin:@typescript-eslint/recommended',
17
+ 'plugin:react/recommended',
18
+ 'plugin:react-hooks/recommended',
19
+ ],
20
+ settings: {
21
+ react: { version: 'detect' },
22
+ },
23
+ rules: {
24
+ 'no-unused-vars': 'off',
25
+ '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
26
+ 'react/react-in-jsx-scope': 'off',
27
+ },
28
+ overrides: [{
29
+ files: ['**/metro.config.js'],
30
+ rules: { '@typescript-eslint/no-var-requires': 'off' },
31
+ }],
32
+ };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const engine_1 = __importDefault(require("../engine"));
7
7
  const constants_1 = require("../constants");
8
8
  const engineTasks_1 = require("../tasks/engineTasks");
9
+ jest.mock('inquirer', () => ({ prompt: jest.fn() }));
9
10
  jest.mock('manifoldjs-windows10', () => ({}));
10
11
  jest.mock('../../../renative.engine.json', () => ({ __esModule: true, id: 'engineID', plugins: {} }), { virtual: true });
11
12
  describe('engine config', () => {
@@ -29,9 +29,15 @@ describe('resolveBuildVersion', () => {
29
29
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RC_PROD_LATEST })).toBe('v1.0.0.rc');
30
30
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING })).toBe('v1.0.0');
31
31
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD })).toBe('v1.0.0');
32
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_LATEST })).toBe('v1.0.0');
33
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD_LATEST })).toBe('v1.0.0');
34
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_DIST })).toBe('v1.0.0');
32
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
33
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_LATEST,
34
+ })).toBe('v1.0.0');
35
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
36
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD_LATEST,
37
+ })).toBe('v1.0.0');
38
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
39
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_DIST,
40
+ })).toBe('v1.0.0');
35
41
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD_DIST })).toBe('v1.0.0');
36
42
  });
37
43
  });
@@ -51,10 +57,18 @@ describe('resolveBuildVersion', () => {
51
57
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RC_PROD_LATEST })).toBe('v1.0.0.rc-2');
52
58
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING })).toBe('v1.0.0-2');
53
59
  expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD })).toBe('v1.0.0-2');
54
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_LATEST })).toBe('v1.0.0-2');
55
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD_LATEST })).toBe('v1.0.0-2');
56
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_DIST })).toBe('v1.0.0-2');
57
- expect((0, resolveBuildVersion_1.resolveBuildVersion)({ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_DIST })).toBe('v1.0.0-2');
60
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
61
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_LATEST,
62
+ })).toBe('v1.0.0-2');
63
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
64
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_PROD_LATEST,
65
+ })).toBe('v1.0.0-2');
66
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
67
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_DIST,
68
+ })).toBe('v1.0.0-2');
69
+ expect((0, resolveBuildVersion_1.resolveBuildVersion)({
70
+ platform, flavour, scheme: constants_1.BuildSchemes.RELEASE_STAGING_DIST,
71
+ })).toBe('v1.0.0-2');
58
72
  });
59
73
  });
60
74
  });
@@ -4,7 +4,7 @@ exports.constructFullUrl = void 0;
4
4
  const resolveBuildEnvName_1 = require("../resolveBuildEnvName");
5
5
  const constants_1 = require("../../constants");
6
6
  const constructFullUrl = ({ baseUrl, scheme, c }) => {
7
- const { packageVersion } = c.buildConfig?.common;
7
+ const packageVersion = c.buildConfig?.common?.packageVersion;
8
8
  const envName = (0, resolveBuildEnvName_1.resolveBuildEnvName)(scheme);
9
9
  switch (scheme) {
10
10
  case constants_1.BuildSchemes.DEV_LATEST:
@@ -3,19 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.notifySlack = void 0;
4
4
  const child_process_1 = require("child_process");
5
5
  const slackBlockKitBuilder_1 = require("../../utils/slackBlockKitBuilder");
6
- const getSlackPayload = (appName, fileName, filePath) => {
7
- return {
8
- blocks: [
9
- slackBlockKitBuilder_1.Divider.plain(),
10
- slackBlockKitBuilder_1.Section.mrkdwn(`${appName} Production Packages`),
11
- slackBlockKitBuilder_1.Context.mrkdwns([fileName]),
12
- slackBlockKitBuilder_1.Actions.buttons([{
13
- text: 'Download Production Packages',
14
- url: filePath,
15
- }]),
16
- ],
17
- };
18
- };
6
+ const getSlackPayload = (appName, fileName, filePath) => ({
7
+ blocks: [
8
+ slackBlockKitBuilder_1.Divider.plain(),
9
+ slackBlockKitBuilder_1.Section.mrkdwn(`${appName} Production Packages`),
10
+ slackBlockKitBuilder_1.Context.mrkdwns([fileName]),
11
+ slackBlockKitBuilder_1.Actions.buttons([{
12
+ text: 'Download Production Packages',
13
+ url: filePath,
14
+ }]),
15
+ ],
16
+ });
19
17
  const notifySlack = (c, fileName) => {
20
18
  const appName = c.buildConfig.common.appName ?? '';
21
19
  const webHookUrl = c.buildConfig.common.deploy.slack?.webhookUrl ?? '';
@@ -230,9 +230,9 @@ const configureIap = (c) => {
230
230
  const buildGradleFilePath = path.join(projectDir, 'app', buildGradleFileName);
231
231
  const flavorFilePath = path.join(projectDir, `app/src/${flavourName}/kotlin/com/twentyfouri/tvbridge/Flavor.kt`);
232
232
  const enableIap = rnv_1.Common.getConfigProp(c, c.platform, 'enableIap', false);
233
- let iapDependencies = [];
234
- let flavorImports = [];
235
- let flavorIapFactories = [];
233
+ const iapDependencies = [];
234
+ const flavorImports = [];
235
+ const flavorIapFactories = [];
236
236
  if (enableIap) {
237
237
  switch (c.platform) {
238
238
  case 'firetv':
@@ -245,6 +245,8 @@ const configureIap = (c) => {
245
245
  flavorImports.push('import com.twentyfouri.bridgetv.googleiap.GoogleIapServiceFactory');
246
246
  flavorIapFactories.push('GoogleIapServiceFactory');
247
247
  break;
248
+ default:
249
+ break;
248
250
  }
249
251
  }
250
252
  const injects = [{
@@ -106,7 +106,7 @@ const handleLinuxKeyring = () => {
106
106
  }
107
107
  };
108
108
  const setTizenCertificate = (c) => {
109
- const { TIZEN_SECURITY_PROFILE_NAME = '24i-SmartApps-BigScreen', TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH = 'certificates/24i_smartapps_bigscreen_author.p12', TIZEN_DISTRIBUTOR_CERTIFICATE_RELATIVE_PATH = 'certificates/24i_smartapps_bigscreen_distributor.p12', TIZEN_AUTHOR_CERTIFICATE_PASSWORD, } = process.env;
109
+ const { TIZEN_SECURITY_PROFILE_NAME = '24i-SmartApps-BigScreen', TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH = 'certificates/24i_smartapps_bigscreen_author.p12', TIZEN_DISTRIBUTOR_CERTIFICATE_RELATIVE_PATH = ('certificates/24i_smartapps_bigscreen_distributor.p12'), TIZEN_AUTHOR_CERTIFICATE_PASSWORD, } = process.env;
110
110
  const tizenCliPath = c.cli.tizen;
111
111
  const isDebug = c.runtime.scheme === constants_1.BuildSchemes.DEBUG;
112
112
  if (!fs.existsSync(TIZEN_AUTHOR_CERTIFICATE_RELATIVE_PATH)) {
@@ -54,7 +54,8 @@ const getHostedAppUrl = (c) => {
54
54
  if (baseUrl)
55
55
  return `${baseUrl}/public/index.html`;
56
56
  const localIp = program.debugIp ?? ip_1.default.address();
57
- const localPort = runtime.port ?? 8100;
57
+ const defaultLocalPort = 8100;
58
+ const localPort = runtime.port ?? defaultLocalPort;
58
59
  return `http://${localIp}:${localPort}/`;
59
60
  };
60
61
  const configureAppUrl = (c) => {
@@ -105,7 +106,7 @@ const copyAppIcon = (c) => {
105
106
  rnv_1.Logger.logInfo(`App icon copied from: ${srcIconPath}`);
106
107
  }
107
108
  else {
108
- rnv_1.Logger.logDebug(`No environment-specific app icon found, skipping copy.`);
109
+ rnv_1.Logger.logDebug('No environment-specific app icon found, skipping copy.');
109
110
  }
110
111
  };
111
112
  const installDependencies = (c) => {
@@ -133,14 +134,15 @@ const buildVegaOSProject = async (c) => {
133
134
  const watchListOutput = (0, child_process_1.execSync)('watchman watch-list', { stdio: 'pipe' }).toString();
134
135
  const watchList = JSON.parse(watchListOutput);
135
136
  const parentWatches = (watchList.roots || []).filter((root) => projectDir.startsWith(root) && root !== projectDir);
136
- for (const parentWatch of parentWatches) {
137
+ parentWatches.forEach((parentWatch) => {
137
138
  (0, child_process_1.execSync)(`watchman watch-del '${parentWatch}'`, { stdio: 'pipe' });
138
- }
139
+ });
139
140
  }
140
141
  catch {
141
142
  }
142
143
  rnv_1.Logger.logInfo(`Building VegaOS project (${buildType})...`);
143
- const buildCmd = `npx react-native build-vega --build-type ${buildType} --build-version ${appVersion} --build-number ${versionCode}`;
144
+ const buildCmd = `npx react-native build-vega --build-type ${buildType} `
145
+ + `--build-version ${appVersion} --build-number ${versionCode}`;
144
146
  (0, child_process_1.execSync)(buildCmd, { cwd: projectDir, stdio: 'inherit' });
145
147
  if (!fs.existsSync(outputDir)) {
146
148
  fs.mkdirSync(outputDir, { recursive: true });
@@ -151,7 +153,7 @@ const buildVegaOSProject = async (c) => {
151
153
  if (!fs.existsSync(dir))
152
154
  return;
153
155
  const entries = fs.readdirSync(dir, { withFileTypes: true });
154
- for (const entry of entries) {
156
+ entries.forEach((entry) => {
155
157
  const fullPath = path.join(dir, entry.name);
156
158
  if (entry.isDirectory()) {
157
159
  findArmv7Vpkg(fullPath);
@@ -159,7 +161,7 @@ const buildVegaOSProject = async (c) => {
159
161
  else if (entry.name.endsWith('.vpkg') && fullPath.includes('armv7')) {
160
162
  armv7VpkgFile = fullPath;
161
163
  }
162
- }
164
+ });
163
165
  };
164
166
  findArmv7Vpkg(buildDir);
165
167
  if (armv7VpkgFile) {
@@ -1,32 +1,9 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  Object.defineProperty(exports, "__esModule", { value: true });
26
3
  exports.customRnvHooksRunTask = void 0;
27
- const inquirer = __importStar(require("inquirer"));
28
4
  const rnv_1 = require("rnv");
29
5
  const buildHooks_1 = require("rnv/dist/core/projectManager/buildHooks");
6
+ const inquirer = require('inquirer');
30
7
  const { logTask, logInfo } = rnv_1.Logger;
31
8
  const { executeTask } = rnv_1.TaskManager;
32
9
  const { fsExistsSync } = rnv_1.FileUtils;
@@ -38,9 +38,12 @@ const { TASK_INSTALL, TASK_PROJECT_CONFIGURE, TASK_TEMPLATE_APPLY, TASK_APP_CONF
38
38
  const { checkAndCreateBabelConfig, copyRuntimeAssets, cleanPlaformAssets, checkAndCreateGitignore, versionCheck, } = rnv_1.ProjectManager;
39
39
  const { configureEngines, getEngineRunnerByPlatform } = rnv_1.EngineManager;
40
40
  const { executeTask, initializeTask, findSuitableTask } = rnv_1.TaskManager;
41
+ const resolveBuildEnginePackageRoot = () => path.dirname(require.resolve('@24i/smartapps-bigscreen-rnv-build-engine/package.json', { paths: [process.cwd(), __dirname] }));
41
42
  const patchEngineTemplatesPath = (c) => {
42
- const templatesPath = path.join(process.cwd(), 'node_modules', '@24i', 'smartapps-bigscreen-rnv-build-engine', 'dist', 'templates');
43
+ const packageRoot = resolveBuildEnginePackageRoot();
44
+ const templatesPath = path.join(packageRoot, 'dist', 'templates');
43
45
  const engine = getEngineRunnerByPlatform(c, c.platform);
46
+ engine.rootPath = packageRoot;
44
47
  engine.originalTemplatePlatformsDir = path.join(templatesPath, 'platforms');
45
48
  engine.originalTemplateAssetsDir = path.join(templatesPath, 'assets');
46
49
  engine.originalTemplatePlatformProjectDir = path.join(templatesPath, 'platforms', 'project');
@@ -48,8 +48,8 @@ const copyEnvironmentFolder = (c, dirPath) => {
48
48
  rnv_1.FileUtils.copyFolderContentsRecursiveSync(envFolderPath, path.join(envFolderPath, '..'));
49
49
  }
50
50
  const envs = ['dev', 'staging', 'prod'];
51
- envs.forEach((envType) => {
52
- const envDir = path.join(dirPath, `_${envType}`);
51
+ envs.forEach((environmentType) => {
52
+ const envDir = path.join(dirPath, `_${environmentType}`);
53
53
  fs.rmSync(envDir, { recursive: true, force: true });
54
54
  });
55
55
  };
@@ -4,7 +4,7 @@ exports.forEachSupportedPlatformFlavour = exports.forEachPlatformFlavour = expor
4
4
  const resolvers_1 = require("../resolvers");
5
5
  const getProgressMessage = ({ schemes, schemeIndex, platforms, platformIndex, flavours, flavourIndex, }) => {
6
6
  const printScheme = schemes && schemes.length && schemeIndex !== undefined;
7
- let string = `\nProcessing`;
7
+ let string = '\nProcessing';
8
8
  if (printScheme) {
9
9
  string += ` "${schemes[schemeIndex]}" scheme"`;
10
10
  string += ` (${schemeIndex + 1}/${schemes.length}),`;
@@ -16,16 +16,23 @@ const getProgressMessage = ({ schemes, schemeIndex, platforms, platformIndex, fl
16
16
  return string;
17
17
  };
18
18
  exports.getProgressMessage = getProgressMessage;
19
- const _forEachPlatformFlavour = (platforms, c, cb, options = {}) => {
19
+ const forEachPlatformFlavourInternal = (platforms, c, cb, options = {}) => {
20
20
  const { ignoredPlatforms = [], schemes = [], schemeIndex = 0, } = options;
21
- const processPlatformFlavours = (platform, platformIndex, platforms) => {
21
+ const processPlatformFlavours = (platform, platformIndex, platformList) => {
22
22
  if (ignoredPlatforms.includes(platform)) {
23
- console.log(`\nSkipping "${platforms[platformIndex]}" platform (${platformIndex + 1}/${platforms.length}).`);
23
+ const skippedPlatform = platformList[platformIndex];
24
+ console.log(`\nSkipping "${skippedPlatform}" platform `
25
+ + `(${platformIndex + 1}/${platformList.length}).`);
24
26
  return;
25
27
  }
26
28
  const processFlavour = (flavour, flavourIndex, flavours) => {
27
29
  console.log(getProgressMessage({
28
- schemes, schemeIndex, platforms, platformIndex, flavours, flavourIndex,
30
+ schemes,
31
+ schemeIndex,
32
+ platforms: platformList,
33
+ platformIndex,
34
+ flavours,
35
+ flavourIndex,
29
36
  }));
30
37
  const { scheme } = c.runtime;
31
38
  return cb({ platform, flavour, scheme });
@@ -37,10 +44,10 @@ const _forEachPlatformFlavour = (platforms, c, cb, options = {}) => {
37
44
  };
38
45
  const forEachSupportedPlatformFlavour = (c, cb, options = {}) => {
39
46
  const supportedPlatforms = (0, resolvers_1.resolveSupportedPlatforms)(c);
40
- _forEachPlatformFlavour(supportedPlatforms, c, cb, options);
47
+ forEachPlatformFlavourInternal(supportedPlatforms, c, cb, options);
41
48
  };
42
49
  exports.forEachSupportedPlatformFlavour = forEachSupportedPlatformFlavour;
43
50
  const forEachPlatformFlavour = (platforms, c, cb) => {
44
- _forEachPlatformFlavour(platforms, c, cb);
51
+ forEachPlatformFlavourInternal(platforms, c, cb);
45
52
  };
46
53
  exports.forEachPlatformFlavour = forEachPlatformFlavour;
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getSafeSchemeString = void 0;
4
- const getSafeSchemeString = (scheme) => {
5
- return scheme.replace(/:/g, '_');
6
- };
4
+ const getSafeSchemeString = (scheme) => scheme.replace(/:/g, '_');
7
5
  exports.getSafeSchemeString = getSafeSchemeString;
@@ -29,7 +29,7 @@ const fs_1 = require("fs");
29
29
  const path = __importStar(require("path"));
30
30
  const glob = __importStar(require("glob"));
31
31
  const resolvers_1 = require("../resolvers");
32
- const getSafeSchemeString_1 = require("../utils/getSafeSchemeString");
32
+ const getSafeSchemeString_1 = require("./getSafeSchemeString");
33
33
  const zipDir = (srcDir, outputFile) => (0, child_process_1.execSync)(`zip ${outputFile} -0 -j ${srcDir}/*`);
34
34
  const getPlatformBuildsPaths = (c, platformName) => {
35
35
  const { platformBuildsDir } = c.buildConfig.paths;
@@ -39,7 +39,7 @@ const getPlatformBuildsPaths = (c, platformName) => {
39
39
  const platformBuildsGlob = `${outputGlob}/*.${(0, resolvers_1.resolveBuildFileExtension)(platformName)}`;
40
40
  try {
41
41
  const buildsPathsCandidates = glob.sync(platformBuildsGlob) || [];
42
- return buildsPathsCandidates.filter((path) => path.includes(platformName));
42
+ return buildsPathsCandidates.filter((buildPath) => buildPath.includes(platformName));
43
43
  }
44
44
  catch (e) {
45
45
  return [];
@@ -50,7 +50,7 @@ const processPlatform = (c, platformName) => {
50
50
  if (platformBuildsPaths && platformBuildsPaths.length === 0)
51
51
  return;
52
52
  const outputZipFilePath = (0, resolvers_1.resolveZippedPlatformBuildsRelativeFilePath)(c, platformName);
53
- const tempPlatformDir = `${path.dirname(outputZipFilePath)}/${platformName}`;
53
+ const tempPlatformDir = path.join(path.dirname(outputZipFilePath), platformName);
54
54
  (0, fs_1.mkdirSync)(tempPlatformDir, { recursive: true });
55
55
  const copyBuildFileIntoTempPlatformDir = (buildFilePath) => {
56
56
  const buildFileName = path.basename(buildFilePath);
@@ -42,8 +42,7 @@ const getPlatformBuildsPaths = (c, platformName, scheme) => {
42
42
  const platformBuildsGlob = `${outputGlob}/*.${(0, index_1.resolveBuildFileExtension)(platformName)}`;
43
43
  try {
44
44
  const buildsPathsCandidates = glob.sync(platformBuildsGlob) || [];
45
- const platformBuildsPaths = buildsPathsCandidates.filter((path) => path.includes(platformName));
46
- return platformBuildsPaths;
45
+ return buildsPathsCandidates.filter((buildPath) => buildPath.includes(platformName));
47
46
  }
48
47
  catch (e) {
49
48
  return [];
@@ -56,8 +55,7 @@ const getPublicDirPath = (c, platform, flavour, scheme) => {
56
55
  const baseC = (0, index_1.getBaseConfig)({ scheme });
57
56
  const { isBuildHosted } = getConfigProp(baseC, platform, 'webpackConfig', {});
58
57
  const sourceDirPath = isBuildHosted ? `${sourcePath}-public` : sourcePath;
59
- const contentDirPath = path.join(sourceDirPath, 'project', 'public');
60
- return contentDirPath;
58
+ return path.join(sourceDirPath, 'project', 'public');
61
59
  };
62
60
  const copyProdContentIntoTempPlatformFlavourDir = (c, platform, flavour, prodScheme, destPlatformFlavourPath) => {
63
61
  const srcPublicDirPath = getPublicDirPath(c, platform, flavour, prodScheme);
@@ -75,13 +73,16 @@ const processPlatform = (c, platformName, schemes) => {
75
73
  throw new Error('Missing production scheme.');
76
74
  }
77
75
  const outputZipFilePath = (0, index_1.resolveZippedPlatformBuildsRelativeFilePath)(c, platformName);
78
- const stagingBuildsPaths = stagingScheme ? getPlatformBuildsPaths(c, platformName, stagingScheme) : [];
79
- const prodBuildsPaths = prodScheme ? getPlatformBuildsPaths(c, platformName, prodScheme) : [];
76
+ const stagingBuildPaths = stagingScheme
77
+ ? getPlatformBuildsPaths(c, platformName, stagingScheme) : [];
78
+ const prodBuildPaths = getPlatformBuildsPaths(c, platformName, prodScheme);
80
79
  const flavourBuilds = [];
81
80
  const supportedFlavours = (0, index_1.resolveSupportedFlavoursForPlatform)(c, platformName);
82
81
  supportedFlavours.forEach((flavour) => {
83
- const flavourStagingBuildsPaths = stagingBuildsPaths.filter((path) => path.includes(flavour));
84
- const flavourProdBuildsPaths = prodBuildsPaths.filter((path) => path.includes(flavour));
82
+ const flavourStagingBuildsPaths = stagingBuildPaths
83
+ .filter((buildPath) => buildPath.includes(flavour));
84
+ const flavourProdBuildsPaths = prodBuildPaths
85
+ .filter((buildPath) => buildPath.includes(flavour));
85
86
  flavourBuilds.push({
86
87
  flavour,
87
88
  stagingBuildsPaths: flavourStagingBuildsPaths,
@@ -90,15 +91,15 @@ const processPlatform = (c, platformName, schemes) => {
90
91
  });
91
92
  const tempPlatformDir = `${path.dirname(outputZipFilePath)}/${platformName}`;
92
93
  flavourBuilds.forEach((flavourBuild) => {
93
- const { flavour, stagingBuildsPaths, prodBuildsPaths } = flavourBuild;
94
- const tempPFDir = path.join(tempPlatformDir, flavour);
95
- const tempPFBuildsDir = path.join(tempPFDir, 'builds');
96
- (0, fs_1.mkdirSync)(tempPFDir, { recursive: true });
97
- (0, fs_1.mkdirSync)(tempPFBuildsDir, { recursive: true });
98
- [...stagingBuildsPaths, ...prodBuildsPaths].forEach((buildFilePath) => {
99
- copyBuildFileIntoTempPlatformFlavourDir(buildFilePath, tempPFBuildsDir);
94
+ const { flavour, stagingBuildsPaths: stagingPaths, prodBuildsPaths: prodPaths, } = flavourBuild;
95
+ const tempPlatformFlavourDir = path.join(tempPlatformDir, flavour);
96
+ const tempPlatformFlavourBuildsDir = path.join(tempPlatformFlavourDir, 'builds');
97
+ (0, fs_1.mkdirSync)(tempPlatformFlavourDir, { recursive: true });
98
+ (0, fs_1.mkdirSync)(tempPlatformFlavourBuildsDir, { recursive: true });
99
+ [...stagingPaths, ...prodPaths].forEach((buildFilePath) => {
100
+ copyBuildFileIntoTempPlatformFlavourDir(buildFilePath, tempPlatformFlavourBuildsDir);
100
101
  });
101
- copyProdContentIntoTempPlatformFlavourDir(c, platformName, flavour, prodScheme, tempPFDir);
102
+ copyProdContentIntoTempPlatformFlavourDir(c, platformName, flavour, prodScheme, tempPlatformFlavourDir);
102
103
  });
103
104
  zipDir(tempPlatformDir, path.resolve(outputZipFilePath));
104
105
  (0, fs_1.rmdirSync)(tempPlatformDir, { recursive: true });
@@ -40,7 +40,8 @@ const htmlTemp = (options) => {
40
40
  if (platform === 'tizen') {
41
41
  tizenScripts = '<script type="text/javascript" src="$WEBAPIS/webapis/webapis.js"></script>';
42
42
  }
43
- let faviconTag = '<link id="favicon" rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=">';
43
+ let faviconTag = '<link id="favicon" rel="icon" type="image/png" '
44
+ + 'href="data:image/png;base64,iVBORw0KGgo=">';
44
45
  if (platform === 'webtv') {
45
46
  faviconTag = `
46
47
  <script>
@@ -43,6 +43,12 @@ const getAppContentPath = (baseUrl, isBuildHosted = false) => {
43
43
  ? `${baseUrl}/${relativePath}`
44
44
  : `./${relativePath}`;
45
45
  };
46
+ const getBuildEnginePackageRoot = (projectDir) => path_1.default.dirname(require.resolve('@24i/smartapps-bigscreen-rnv-build-engine/package.json', { paths: [projectDir, __dirname] }));
47
+ const resolveFromProject = (moduleName, projectDir) => require.resolve(moduleName, { paths: [projectDir, getBuildEnginePackageRoot(projectDir), __dirname] });
48
+ const makeTypeScriptOptions = (projectDir) => ({
49
+ typescriptPath: resolveFromProject('typescript', projectDir),
50
+ configFile: path_1.default.join(projectDir, 'tsconfig.json'),
51
+ });
46
52
  const makeRules = (config, projectDir, isDevServer) => ({
47
53
  babel: {
48
54
  test: /\.[tj]sx?$/,
@@ -51,6 +57,8 @@ const makeRules = (config, projectDir, isDevServer) => ({
51
57
  {
52
58
  loader: 'ts-loader',
53
59
  options: {
60
+ compiler: makeTypeScriptOptions(projectDir).typescriptPath,
61
+ configFile: makeTypeScriptOptions(projectDir).configFile,
54
62
  transpileOnly: true,
55
63
  allowTsInNodeModules: true,
56
64
  },
@@ -66,6 +74,7 @@ const makeRules = (config, projectDir, isDevServer) => ({
66
74
  {
67
75
  loader: 'sass-loader',
68
76
  options: {
77
+ implementation: require(resolveFromProject('sass', projectDir)),
69
78
  sourceMap: false,
70
79
  additionalData: (0, extendSass_1.extendSass)(config),
71
80
  },
@@ -135,10 +144,13 @@ function generateConfig(config) {
135
144
  const isBuildHosted = config.isBuildHosted || false;
136
145
  const appContentPath = getAppContentPath(baseUrl, isBuildHosted);
137
146
  const copiedDirWithPublicContentPath = path_1.default.join(appBuildDir, `../${path_1.default.parse(appBuildDir).name}-public`);
147
+ const typeScriptOptions = makeTypeScriptOptions(projectDir);
138
148
  const plugins = {
139
149
  forkTsChecker: new fork_ts_checker_webpack_plugin_1.default({
140
150
  typescript: {
151
+ configFile: typeScriptOptions.configFile,
141
152
  memoryLimit: 4096,
153
+ typescriptPath: typeScriptOptions.typescriptPath,
142
154
  },
143
155
  }),
144
156
  webpack: new webpack_1.default.DefinePlugin({
@@ -16,20 +16,6 @@ const dispatchEvent = (webRef: WebViewRef, eventName: string, detail: object) =>
16
16
  `);
17
17
  };
18
18
 
19
- const getErrorDetail = (error: unknown) => {
20
- if (error instanceof Error) {
21
- return {
22
- name: error.name,
23
- message: error.message,
24
- stack: error.stack,
25
- };
26
- }
27
-
28
- return {
29
- value: String(error),
30
- };
31
- };
32
-
33
19
  export const handlePurchase = async (webRef: WebViewRef, sku: string) => {
34
20
  try {
35
21
  const response = await PurchasingService.purchase({ sku });
package/fixDependency.js CHANGED
@@ -1,19 +1,61 @@
1
1
  /* eslint-disable */
2
2
 
3
- const fs = require('fs').promises;
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ const packageDir = __dirname;
7
+ const packageJson = require('./package.json');
8
+
9
+ const addIfExists = (paths, targetPath) => {
10
+ if (targetPath && fs.existsSync(targetPath)) {
11
+ paths.add(targetPath);
12
+ }
13
+ };
14
+
15
+ const resolveNestedDependency = (packageName, nestedPackageName, paths) => {
16
+ try {
17
+ const packageJsonPath = require.resolve(`${packageName}/package.json`, { paths });
18
+ return path.join(path.dirname(packageJsonPath), 'node_modules', nestedPackageName);
19
+ } catch {
20
+ return null;
21
+ }
22
+ };
23
+
24
+ const collectDependencyPaths = (deleteDependencies = []) => {
25
+ const paths = new Set();
26
+ const monorepoRoot = path.resolve(packageDir, '..', '..', '..');
27
+ const smartappsSdkRoot = path.resolve(packageDir, '..', '..');
28
+ const baseDirs = [packageDir, smartappsSdkRoot, monorepoRoot, process.cwd()];
4
29
 
5
- const main = async (deleteDependencies) => {
6
- console.log("Fix dependencies")
7
- if (deleteDependencies === undefined) return;
8
30
  for (const dependency of deleteDependencies) {
9
- const packageLockFilePath = `${dependency.path}`;
10
- console.log(packageLockFilePath);
11
- try {
12
- await fs.rm(packageLockFilePath, { recursive: true, force: true });
13
- } catch {
14
- console.log("error")
31
+ for (const baseDir of baseDirs) {
32
+ addIfExists(paths, path.resolve(baseDir, dependency.path));
15
33
  }
16
34
  }
35
+
36
+ const resolvePaths = [packageDir, smartappsSdkRoot, monorepoRoot, process.cwd()];
37
+ addIfExists(paths, resolveNestedDependency('fstream', 'graceful-fs', resolvePaths));
38
+ addIfExists(paths, resolveNestedDependency('unzip2', 'graceful-fs', resolvePaths));
39
+
40
+ return paths;
41
+ };
42
+
43
+ const fixDependencies = () => {
44
+ const paths = collectDependencyPaths(packageJson.deleteDependencies);
45
+
46
+ if (!paths.size) {
47
+ return;
48
+ }
49
+
50
+ console.log('Fix dependencies');
51
+ for (const dependencyPath of paths) {
52
+ console.log(dependencyPath);
53
+ fs.rmSync(dependencyPath, { recursive: true, force: true });
54
+ }
17
55
  };
18
56
 
19
- main(require('./package.json').deleteDependencies);
57
+ if (require.main === module) {
58
+ fixDependencies();
59
+ }
60
+
61
+ module.exports = fixDependencies;
package/index.js ADDED
@@ -0,0 +1,103 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { spawnSync } = require('child_process');
4
+
5
+ const packageDir = __dirname;
6
+ const distEntry = path.join(packageDir, 'dist', 'src', 'index.js');
7
+ const fixDependencies = require('./fixDependency');
8
+
9
+ const getLatestMtimeMs = (targetPath) => {
10
+ if (!fs.existsSync(targetPath)) {
11
+ return 0;
12
+ }
13
+
14
+ const stat = fs.statSync(targetPath);
15
+ if (!stat.isDirectory()) {
16
+ return stat.mtimeMs;
17
+ }
18
+
19
+ return fs.readdirSync(targetPath).reduce((latest, entry) => {
20
+ const entryPath = path.join(targetPath, entry);
21
+ return Math.max(latest, getLatestMtimeMs(entryPath));
22
+ }, stat.mtimeMs);
23
+ };
24
+
25
+ const shouldBuildDist = () => {
26
+ if (!fs.existsSync(distEntry)) {
27
+ return true;
28
+ }
29
+
30
+ const sourceMtime = Math.max(
31
+ getLatestMtimeMs(path.join(packageDir, 'src')),
32
+ getLatestMtimeMs(path.join(packageDir, 'templates')),
33
+ getLatestMtimeMs(path.join(packageDir, 'tsconfig.json'))
34
+ );
35
+
36
+ return sourceMtime > fs.statSync(distEntry).mtimeMs;
37
+ };
38
+
39
+ const buildDist = () => {
40
+ const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
41
+ const result = spawnSync(npmCommand, ['run', 'build'], {
42
+ cwd: packageDir,
43
+ env: {
44
+ ...process.env,
45
+ SMARTAPPS_RNV_BUILD_ENGINE_BOOTSTRAP: '1',
46
+ },
47
+ stdio: 'inherit',
48
+ });
49
+
50
+ if (result.error) {
51
+ throw result.error;
52
+ }
53
+
54
+ if (result.status !== 0) {
55
+ throw new Error(`Failed to build ${path.relative(process.cwd(), packageDir)} before loading RNV engine`);
56
+ }
57
+ };
58
+
59
+ const ensureEsbuild = () => {
60
+ let esbuildDir;
61
+ try {
62
+ esbuildDir = path.dirname(require.resolve('esbuild/package.json', { paths: [packageDir, process.cwd()] }));
63
+ } catch {
64
+ return;
65
+ }
66
+
67
+ const binPath = path.join(esbuildDir, 'bin', 'esbuild');
68
+ const validation = spawnSync(binPath, ['--version'], {
69
+ encoding: 'utf8',
70
+ stdio: ['ignore', 'pipe', 'pipe'],
71
+ });
72
+
73
+ if (validation.status === 0) {
74
+ return;
75
+ }
76
+
77
+ const result = spawnSync(process.execPath, [path.join(esbuildDir, 'install.js')], {
78
+ cwd: process.cwd(),
79
+ env: process.env,
80
+ stdio: 'inherit',
81
+ });
82
+
83
+ if (result.error) {
84
+ throw result.error;
85
+ }
86
+
87
+ if (result.status !== 0) {
88
+ throw new Error('Failed to install esbuild native binary before loading RNV engine');
89
+ }
90
+ };
91
+
92
+ if (shouldBuildDist()) {
93
+ buildDist();
94
+ }
95
+
96
+ if (!fs.existsSync(distEntry)) {
97
+ throw new Error(`Missing compiled RNV build engine entry: ${distEntry}`);
98
+ }
99
+
100
+ fixDependencies();
101
+ ensureEsbuild();
102
+
103
+ module.exports = require(distEntry);
package/jest.config.js CHANGED
@@ -5,4 +5,7 @@ module.exports = {
5
5
  '/node_modules/ansi-color/', // compiler error: Octal literal in strict mode
6
6
  '/node_modules/fstream', // compiler error: Octal literal in strict mode
7
7
  ],
8
+ // build output contains compiled copies of the source tests and templates.
9
+ testPathIgnorePatterns: ['<rootDir>/dist/'],
10
+ modulePathIgnorePatterns: ['<rootDir>/dist/'],
8
11
  };
package/package.json CHANGED
@@ -1,91 +1,94 @@
1
1
  {
2
- "name": "@24i/smartapps-bigscreen-rnv-build-engine",
3
- "version": "0.18.2",
4
- "description": "Package with build engine for SmartApps BIGscreen projects...",
5
- "main": "dist/src/index.js",
6
- "scripts": {
7
- "build:clean": "rm -rf dist",
8
- "build": "npm run build:clean && tsc && npm run copy:projects",
9
- "copy:project:tizen": "mkdir -p dist/templates/platforms/tizen && cp -R templates/platforms/tizen/project dist/templates/platforms/tizen/",
10
- "copy:project:webos": "mkdir -p dist/templates/platforms/webos && cp -R templates/platforms/webos/project dist/templates/platforms/webos/",
11
- "copy:project:androidtv": "mkdir -p dist/templates/platforms/androidtv && cp -R templates/platforms/androidtv/project dist/templates/platforms/androidtv/",
12
- "copy:project:vegaos": "mkdir -p dist/templates/platforms/vegaos && cp -R templates/platforms/vegaos/project dist/templates/platforms/vegaos/",
13
- "copy:projects": "npm run copy:project:tizen && npm run copy:project:webos && npm run copy:project:androidtv && npm run copy:project:vegaos",
14
- "eslint": "eslint \"./src/**/*.{js,jsx,ts,tsx}\" \"./templates/**/*.{js,jsx,ts,tsx}\"",
15
- "stylelint": "stylelint \"./src/**/*.scss\" --aei --rd --risd --rdd",
16
- "lintcheck": "npm run eslint && npm run stylelint",
17
- "typecheck": "tsc --noEmit",
18
- "lintcheck:cached": "npm run eslint -- --cache && npm run stylelint -- --cache",
19
- "typecheck:cached": "tsc --noEmit --incremental",
20
- "test": "jest --passWithNoTests",
21
- "prepublishOnly": "npm run build",
22
- "postinstall": "node fixDependency.js"
23
- },
24
- "deleteDependencies": [
25
- {
26
- "path": "../../unzip2/node_modules/graceful-fs/",
27
- "version": "^4.2.8"
28
- },
29
- {
30
- "path": "./node_modules/fstream/node_modules/graceful-fs/",
31
- "version": "^4.2.8"
32
- },
33
- {
34
- "path": "../../fstream/node_modules/graceful-fs/",
35
- "version": "^4.2.8"
36
- }
37
- ],
38
- "dependencies": {
39
- "fs-extra": "11.1.1",
40
- "xml2js": "^0.4.23"
41
- },
42
- "devDependencies": {
43
- "@types/fs-extra": "11.0.1",
44
- "@types/inquirer": "8.2.1",
45
- "@types/ip": "1.1.0",
46
- "@types/mini-css-extract-plugin": "1.4.3",
47
- "@types/node": "18.0.3",
48
- "@types/semver": "7.3.10",
49
- "@types/ssh2": "1.11.4",
50
- "@types/tapable": "2.2.2",
51
- "@types/webpack": "5.28.0",
52
- "@types/xml2js": "0.4.11",
53
- "nock": "13.2.8",
54
- "svgo": "1.3.2"
55
- },
56
- "peerDependencies": {
57
- "@24i/smartapps-bigscreen-device": "*",
58
- "@rnv/sdk-webpack": "0.35.3",
59
- "assign-deep": "1.0.1",
60
- "core-js": "3.36.1",
61
- "coveralls": "3.1.1",
62
- "css-hot-loader": "1.4.4",
63
- "css-loader": "5.2.7",
64
- "filemanager-webpack-plugin": "6.1.7",
65
- "fork-ts-checker-webpack-plugin": "7.2.11",
66
- "glob": "8.0.1",
67
- "html-webpack-harddisk-plugin": "2.0.0",
68
- "html-webpack-plugin": "5.5.0",
69
- "ip": "1.1.5",
70
- "manifoldjs-windows10": "0.1.8",
71
- "mini-css-extract-plugin": "2.6.0",
72
- "node-ssh": "12.0.4",
73
- "ora": "5.4.1",
74
- "raf": "3.4.1",
75
- "regenerator-runtime": "0.13.9",
76
- "renative-template-blank": "0.35.3",
77
- "rnv": "0.35.3",
78
- "sass": "1.51.0",
79
- "sass-loader": "12.6.0",
80
- "source-map-loader": "3.0.1",
81
- "svgo": "1.3.2",
82
- "ts-loader": "9.3.0",
83
- "webpack": "5.72.0",
84
- "webpack-cli": "4.10.0",
85
- "webpack-dev-server": "4.9.0",
86
- "webpack-spritesmith": "1.1.0"
87
- },
88
- "keywords": [],
89
- "author": "24i",
90
- "license": "ISC"
2
+ "name": "@24i/smartapps-bigscreen-rnv-build-engine",
3
+ "version": "5.0.0-alpha.16",
4
+ "description": "Package with build engine for SmartApps BIGscreen projects...",
5
+ "main": "index.js",
6
+ "scripts": {
7
+ "build:clean": "rm -rf dist",
8
+ "build": "npm run build:clean && tsc && npm run copy:projects",
9
+ "copy:project:tizen": "mkdir -p dist/templates/platforms/tizen && cp -R templates/platforms/tizen/project dist/templates/platforms/tizen/",
10
+ "copy:project:webos": "mkdir -p dist/templates/platforms/webos && cp -R templates/platforms/webos/project dist/templates/platforms/webos/",
11
+ "copy:project:androidtv": "mkdir -p dist/templates/platforms/androidtv && cp -R templates/platforms/androidtv/project dist/templates/platforms/androidtv/",
12
+ "copy:project:vegaos": "mkdir -p dist/templates/platforms/vegaos && cp -R templates/platforms/vegaos/project dist/templates/platforms/vegaos/",
13
+ "copy:projects": "npm run copy:project:tizen && npm run copy:project:webos && npm run copy:project:androidtv && npm run copy:project:vegaos",
14
+ "eslint": "eslint \"./src/**/*.{js,jsx,ts,tsx}\" \"./templates/**/*.{js,jsx,ts,tsx}\"",
15
+ "eslint:vegaos": "eslint --no-eslintrc --no-ignore --config .eslintrc.vegaos.js \"./templates/platforms/vegaos/project/**/*.{js,jsx,ts,tsx}\"",
16
+ "stylelint": "stylelint \"./src/**/*.scss\" --aei --rd --risd --rdd",
17
+ "lintcheck": "npm run eslint && npm run eslint:vegaos && npm run stylelint",
18
+ "typecheck": "tsc --noEmit",
19
+ "lintcheck:cached": "npm run eslint -- --cache && npm run eslint:vegaos -- --cache && npm run stylelint -- --cache",
20
+ "typecheck:cached": "tsc --noEmit --incremental",
21
+ "test": "jest",
22
+ "postinstall": "node fixDependency.js"
23
+ },
24
+ "deleteDependencies": [
25
+ {
26
+ "path": "../../unzip2/node_modules/graceful-fs/",
27
+ "version": "^4.2.8"
28
+ },
29
+ {
30
+ "path": "./node_modules/fstream/node_modules/graceful-fs/",
31
+ "version": "^4.2.8"
32
+ },
33
+ {
34
+ "path": "../../fstream/node_modules/graceful-fs/",
35
+ "version": "^4.2.8"
36
+ }
37
+ ],
38
+ "dependencies": {
39
+ "fs-extra": "11.1.1",
40
+ "xml2js": "^0.4.23"
41
+ },
42
+ "devDependencies": {
43
+ "@types/fs-extra": "11.0.1",
44
+ "@types/inquirer": "8.2.1",
45
+ "@types/ip": "1.1.0",
46
+ "@types/mini-css-extract-plugin": "1.4.3",
47
+ "@types/node": "18.0.3",
48
+ "@types/semver": "7.3.10",
49
+ "@types/ssh2": "1.11.4",
50
+ "@types/tapable": "2.2.2",
51
+ "@types/webpack": "5.28.0",
52
+ "@types/xml2js": "0.4.11",
53
+ "nock": "13.2.8",
54
+ "svgo": "1.3.2"
55
+ },
56
+ "peerDependencies": {
57
+ "@24i/smartapps-bigscreen-device": "*",
58
+ "@rnv/sdk-webpack": "0.35.3",
59
+ "assign-deep": "1.0.1",
60
+ "core-js": "3.36.1",
61
+ "coveralls": "3.1.1",
62
+ "css-hot-loader": "1.4.4",
63
+ "css-loader": "5.2.7",
64
+ "filemanager-webpack-plugin": "6.1.7",
65
+ "fork-ts-checker-webpack-plugin": "7.2.11",
66
+ "glob": "8.0.1",
67
+ "html-webpack-harddisk-plugin": "2.0.0",
68
+ "html-webpack-plugin": "5.5.0",
69
+ "ip": "1.1.5",
70
+ "manifoldjs-windows10": "0.1.8",
71
+ "mini-css-extract-plugin": "2.6.0",
72
+ "node-ssh": "12.0.4",
73
+ "ora": "5.4.1",
74
+ "raf": "3.4.1",
75
+ "regenerator-runtime": "0.13.9",
76
+ "renative-template-blank": "0.35.3",
77
+ "rnv": "0.35.3",
78
+ "sass": "^1.77.4",
79
+ "sass-loader": "12.6.0",
80
+ "source-map-loader": "3.0.1",
81
+ "svgo": "1.3.2",
82
+ "ts-loader": "9.3.0",
83
+ "webpack": "5.72.0",
84
+ "webpack-cli": "4.10.0",
85
+ "webpack-dev-server": "4.9.0",
86
+ "webpack-spritesmith": "1.1.0"
87
+ },
88
+ "keywords": [],
89
+ "author": "24i",
90
+ "license": "ISC",
91
+ "publishConfig": {
92
+ "access": "public"
93
+ }
91
94
  }