@o3r/core
Version:
Core of the Otter Framework
126 lines (124 loc) • 6.54 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateStore = updateStore;
const fs = require("node:fs");
const path = require("node:path");
const schematics_1 = require("@angular-devkit/schematics");
const schematics_2 = require("@o3r/schematics");
const utility_1 = require("@schematics/angular/utility");
const ast_utils_1 = require("@schematics/angular/utility/ast-utils");
const ts = require("typescript");
const coreSchematicsFolder = path.resolve(__dirname, '..', '..');
const corePackageJsonPath = path.resolve(coreSchematicsFolder, '..', 'package.json');
const corePackageJsonContent = JSON.parse(fs.readFileSync(corePackageJsonPath, { encoding: 'utf8' }));
const o3rCoreVersion = corePackageJsonContent.version;
const ngrxEffectsDep = '@ngrx/effects';
const ngrxEntityDep = '@ngrx/entity';
const ngrxStoreDep = '@ngrx/store';
const ngrxRouterStore = '@ngrx/router-store';
const ngrxRouterStoreDevToolDep = '@ngrx/store-devtools';
/**
* Add Redux Store support
* @param options @see RuleFactory.options
* @param options.projectName
* @param options.workingDirector
* @param options.dependenciesSetupConfig
* @param options.exactO3rVersion
* @param projectType
*/
function updateStore(options, projectType) {
const addStoreModules = (tree) => {
const workspaceConfig = (0, schematics_2.getWorkspaceConfig)(tree);
const workspaceProject = (options.projectName && workspaceConfig?.projects?.[options.projectName]) || undefined;
const storeSyncPackageName = '@o3r/store-sync';
options.dependenciesSetupConfig.dependencies[storeSyncPackageName] = {
inManifest: [{
range: `${options.exactO3rVersion ? '' : '~'}${o3rCoreVersion}`,
types: (0, schematics_2.getProjectNewDependenciesTypes)(workspaceProject)
}],
ngAddOptions: { exactO3rVersion: options.exactO3rVersion }
};
(options.dependenciesSetupConfig.ngAddToRun ||= []).push(storeSyncPackageName);
};
/**
* Change package.json with the new dependencies
* @param tree
* @param context
*/
const updatePackageJson = (tree, context) => {
const workspaceConfig = (0, schematics_2.getWorkspaceConfig)(tree);
const workspaceProject = (options.projectName && workspaceConfig?.projects?.[options.projectName]) || undefined;
const projectDirectory = workspaceProject?.root || '.';
const projectPackageJson = tree.readJson(path.posix.join(projectDirectory, 'package.json'));
const appDeps = [ngrxEffectsDep, ngrxRouterStore, ngrxRouterStoreDevToolDep];
const corePeerDeps = [ngrxEntityDep, ngrxStoreDep];
const dependenciesList = projectType === 'application' ? [...corePeerDeps, ...appDeps] : [...corePeerDeps];
options.dependenciesSetupConfig.dependencies = {
...options.dependenciesSetupConfig.dependencies,
...(0, schematics_2.getExternalDependenciesInfo)({
dependenciesToInstall: dependenciesList,
devDependenciesToInstall: [],
o3rPackageJsonPath: corePackageJsonPath,
projectType,
projectPackageJson
}, context.logger)
};
};
/**
* Edit main module with the translation required configuration
* @param tree
* @param context
*/
const registerModules = (tree, context) => {
const additionalRules = [];
const moduleFilePath = (0, schematics_2.getAppModuleFilePath)(tree, context, options.projectName);
if (!moduleFilePath) {
return tree;
}
const sourceFileContent = tree.readText(moduleFilePath);
const sourceFile = ts.createSourceFile(moduleFilePath, sourceFileContent, ts.ScriptTarget.ES2015, true);
// If we already have a store module skip the process to avoid overriding configurations
if ((0, ast_utils_1.isImported)(sourceFile, 'StoreModule', '@ngrx/store')) {
return tree;
}
let recorder = tree.beginUpdate(moduleFilePath);
const { moduleIndex } = (0, schematics_2.getModuleIndex)(sourceFile, sourceFileContent);
const addImportToModuleFile = (name, file, moduleFunction) => additionalRules.push((0, utility_1.addRootImport)(options.projectName, ({ code, external }) => code `\n${external(name, file)}${moduleFunction}`));
const insertImportToModuleFile = (name, file, isDefault) => recorder = (0, schematics_2.insertImportToModuleFile)(name, file, sourceFile, recorder, moduleFilePath, isDefault);
const insertBeforeModule = (line) => recorder = (0, schematics_2.insertBeforeModule)(line, sourceFileContent, recorder, moduleIndex);
addImportToModuleFile('EffectsModule', '@ngrx/effects', '.forRoot([])');
addImportToModuleFile('StoreModule', '@ngrx/store', '.forRoot(rootReducers, {metaReducers, runtimeChecks})');
insertImportToModuleFile('StorageSync', '@o3r/store-sync');
insertImportToModuleFile('RuntimeChecks', '@ngrx/store');
insertImportToModuleFile('Serializer', '@o3r/core');
insertImportToModuleFile('environment', '../environments/environment');
if ((0, schematics_2.isApplicationThatUsesRouterModule)(tree, options)) {
addImportToModuleFile('StoreRouterConnectingModule', '@ngrx/router-store', '.forRoot()');
insertImportToModuleFile('routerReducer', '@ngrx/router-store');
}
insertBeforeModule(`
const localStorageStates: Record<string, Serializer<any>>[] = [/* Store to register in local storage */];
const storageSync = new StorageSync({
keys: localStorageStates, rehydrate: true
});
const rootReducers = {
${(0, schematics_2.isApplicationThatUsesRouterModule)(tree, options) ? 'router: routerReducer' : ''}
};
const metaReducers = [storageSync.localStorageSync()];
const runtimeChecks: Partial<RuntimeChecks> = {
strictActionImmutability: false,
strictActionSerializability: false,
strictActionTypeUniqueness: !environment.production,
strictActionWithinNgZone: !environment.production,
strictStateImmutability: !environment.production,
strictStateSerializability: false
};`);
tree.commitUpdate(recorder);
return (0, schematics_1.chain)(additionalRules)(tree, context);
};
return (0, schematics_1.chain)([
...(projectType === 'application' ? [registerModules, addStoreModules] : []),
updatePackageJson
]);
}
//# sourceMappingURL=index.js.map