diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 41e7ce2bf1..de198a0619 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -91,12 +91,10 @@ jobs: uses: bahmutov/npm-install@v1 - name: Disable ServiceWorker - run: | - sed -i "s/serviceWorker:.*/serviceWorker:false,/" src/environments/environment.prod.ts + run: node schematics/customization/service-worker false - name: Build SSR - run: | - npm run build + run: npm run build - name: Upload Build Output uses: actions/upload-artifact@v1 diff --git a/e2e/test-schematics.sh b/e2e/test-schematics.sh index 68f14ba7d3..7443dae7d5 100644 --- a/e2e/test-schematics.sh +++ b/e2e/test-schematics.sh @@ -90,6 +90,10 @@ else sed -i -e 's/^};$/mockServerAPI: true };/' src/environments/environment.prod.ts fi +node schematics/customization/service-worker false +grep '"serviceWorker": false' angular.json +grep 'serviceWorker: false' src/environments/environment.prod.ts + git add -A npx lint-staged npx tsc --project tsconfig.spec.json diff --git a/schematics/customization/service-worker/index.js b/schematics/customization/service-worker/index.js new file mode 100644 index 0000000000..d89d2514c9 --- /dev/null +++ b/schematics/customization/service-worker/index.js @@ -0,0 +1,61 @@ +const fs = require('fs'); +const { parse, stringify } = require('comment-json'); +const { execSync } = require('child_process'); +const { Project, ts } = require('ts-morph'); + +if (process.argv.length < 3) { + console.warn('required argument missing, provide true or false'); + process.exit(1); +} + +const enable = process.argv[2].toLowerCase() === 'true'; +console.log('setting serviceWorker to', enable); + +// replace in angular.json +const angularJson = parse(fs.readFileSync('./angular.json', { encoding: 'UTF-8' })); +const project = Object.keys(angularJson.projects)[0]; +const build = angularJson.projects[project].architect.build; + +if (build.options.serviceWorker !== undefined) { + build.options.serviceWorker = enable; +} + +Object.keys(build.configurations) + .filter(key => key !== 'local') + .forEach(key => { + const configuration = build.configurations[key]; + if (configuration.serviceWorker !== undefined) { + configuration.serviceWorker = enable; + } + }); + +fs.writeFileSync('./angular.json', stringify(angularJson, null, 2)); +execSync('npx prettier --write angular.json'); + +// replace in environments +const tsMorphProject = new Project(); +tsMorphProject.addSourceFilesAtPaths('src/environments/environment*.ts'); + +tsMorphProject + .getSourceFiles() + .filter( + file => + !file.getBaseName().endsWith('.model.ts') && + !file.getBaseName().endsWith('.local.ts') && + file.getBaseName() !== 'environment.ts' + ) + .forEach(file => { + file + .forEachDescendantAsArray() + .filter(stm => stm.getKind() == ts.SyntaxKind.VariableDeclaration && stm.getName() === 'environment') + .map(stm => stm.getInitializer()) + .forEach(objectLiteralExpression => { + const property = objectLiteralExpression.getProperty('serviceWorker'); + if (property) { + property.setInitializer(`${enable}`); + } + }); + }); + +tsMorphProject.saveSync(); +execSync('npx prettier --write src/environments/*.*');