UNPKG

@o3r/core

Version:
126 lines (124 loc) 6.54 kB
"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