edge-functions 1.0.0
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.
- package/.babelrc +13 -0
- package/.eslintignore +3 -0
- package/.eslintrc.json +42 -0
- package/.github/workflows/major.yml +28 -0
- package/.github/workflows/minor.yml +31 -0
- package/.vscode/settings.json +20 -0
- package/CODEOWNERS +2 -0
- package/CODE_OF_CONDUCT.md +73 -0
- package/CONTRIBUTING.md +90 -0
- package/LICENSE.md +21 -0
- package/README.md +60 -0
- package/aliases.js +13 -0
- package/docs/overview.md +36 -0
- package/docs/presets.md +115 -0
- package/examples/angular-static/.editorconfig +16 -0
- package/examples/angular-static/README.md +27 -0
- package/examples/angular-static/angular.json +98 -0
- package/examples/angular-static/package.json +39 -0
- package/examples/angular-static/src/app/app-routing.module.ts +10 -0
- package/examples/angular-static/src/app/app.component.css +0 -0
- package/examples/angular-static/src/app/app.component.html +484 -0
- package/examples/angular-static/src/app/app.component.spec.ts +29 -0
- package/examples/angular-static/src/app/app.component.ts +10 -0
- package/examples/angular-static/src/app/app.module.ts +18 -0
- package/examples/angular-static/src/assets/.gitkeep +0 -0
- package/examples/angular-static/src/favicon.ico +0 -0
- package/examples/angular-static/src/index.html +13 -0
- package/examples/angular-static/src/main.ts +7 -0
- package/examples/angular-static/src/styles.css +1 -0
- package/examples/angular-static/tsconfig.app.json +14 -0
- package/examples/angular-static/tsconfig.json +33 -0
- package/examples/angular-static/tsconfig.spec.json +14 -0
- package/examples/astro-static/README.md +55 -0
- package/examples/astro-static/astro.config.mjs +5 -0
- package/examples/astro-static/package.json +15 -0
- package/examples/astro-static/public/favicon.svg +9 -0
- package/examples/astro-static/src/components/Card.astro +63 -0
- package/examples/astro-static/src/env.d.ts +1 -0
- package/examples/astro-static/src/layouts/Layout.astro +36 -0
- package/examples/astro-static/src/pages/edge/index.astro +55 -0
- package/examples/astro-static/src/pages/index.astro +81 -0
- package/examples/astro-static/tsconfig.json +3 -0
- package/examples/hexo-static/.github/dependabot.yml +7 -0
- package/examples/hexo-static/_config.landscape.yml +0 -0
- package/examples/hexo-static/_config.yml +105 -0
- package/examples/hexo-static/package.json +26 -0
- package/examples/hexo-static/scaffolds/draft.md +4 -0
- package/examples/hexo-static/scaffolds/page.md +4 -0
- package/examples/hexo-static/scaffolds/post.md +5 -0
- package/examples/hexo-static/source/_posts/hello-world.md +38 -0
- package/examples/hexo-static/source/_posts/other-page.md +62 -0
- package/examples/hexo-static/themes/.gitkeep +0 -0
- package/examples/hexo-static/yarn.lock +1625 -0
- package/examples/next-12-static/.babelrc +3 -0
- package/examples/next-12-static/README.md +21 -0
- package/examples/next-12-static/components/post.jsx +27 -0
- package/examples/next-12-static/package-lock.json +6191 -0
- package/examples/next-12-static/package.json +18 -0
- package/examples/next-12-static/pages/index.jsx +34 -0
- package/examples/next-12-static/pages/post/[id].jsx +63 -0
- package/examples/next-static/README.md +34 -0
- package/examples/next-static/jsconfig.json +7 -0
- package/examples/next-static/next.config.js +9 -0
- package/examples/next-static/package.json +16 -0
- package/examples/next-static/public/next.svg +1 -0
- package/examples/next-static/public/vercel.svg +1 -0
- package/examples/next-static/src/app/blog/[slug]/page.js +27 -0
- package/examples/next-static/src/app/favicon.ico +0 -0
- package/examples/next-static/src/app/globals.css +107 -0
- package/examples/next-static/src/app/layout.js +17 -0
- package/examples/next-static/src/app/misty-mountains/moria/page.js +15 -0
- package/examples/next-static/src/app/page.js +96 -0
- package/examples/next-static/src/app/page.module.css +229 -0
- package/examples/next-static/yarn.lock +199 -0
- package/examples/react-static/README.md +70 -0
- package/examples/react-static/package.json +38 -0
- package/examples/react-static/public/favicon.ico +0 -0
- package/examples/react-static/public/index.html +43 -0
- package/examples/react-static/public/logo192.png +0 -0
- package/examples/react-static/public/logo512.png +0 -0
- package/examples/react-static/public/manifest.json +25 -0
- package/examples/react-static/public/robots.txt +3 -0
- package/examples/react-static/src/App.css +38 -0
- package/examples/react-static/src/App.js +25 -0
- package/examples/react-static/src/App.test.js +8 -0
- package/examples/react-static/src/index.css +13 -0
- package/examples/react-static/src/index.js +17 -0
- package/examples/react-static/src/logo.svg +1 -0
- package/examples/react-static/src/reportWebVitals.js +13 -0
- package/examples/react-static/src/setupTests.js +5 -0
- package/examples/simple-js-esm/main.js +14 -0
- package/examples/simple-js-esm/messages.js +7 -0
- package/examples/simple-js-node/main.js +18 -0
- package/examples/vue-static/README.md +24 -0
- package/examples/vue-static/babel.config.js +5 -0
- package/examples/vue-static/jsconfig.json +19 -0
- package/examples/vue-static/package.json +45 -0
- package/examples/vue-static/public/favicon.ico +0 -0
- package/examples/vue-static/public/index.html +17 -0
- package/examples/vue-static/src/App.vue +16 -0
- package/examples/vue-static/src/assets/logo.png +0 -0
- package/examples/vue-static/src/components/HelloWorld.vue +58 -0
- package/examples/vue-static/src/main.js +28 -0
- package/examples/vue-static/src/views/Home.vue +14 -0
- package/examples/vue-static/vue.config.js +4 -0
- package/jest.config.js +6 -0
- package/jsconfig.json +40 -0
- package/jsdoc.json +52 -0
- package/lib/build/bundlers/index.js +4 -0
- package/lib/build/bundlers/webpack/index.js +40 -0
- package/lib/build/bundlers/webpack/webpack.config.js +38 -0
- package/lib/build/dispatcher/dispatcher.js +211 -0
- package/lib/build/dispatcher/dispatcher.test.js +0 -0
- package/lib/build/dispatcher/index.js +3 -0
- package/lib/build/polyfills/index.js +0 -0
- package/lib/constants/azion-edges.constants.js +98 -0
- package/lib/constants/index.js +5 -0
- package/lib/constants/messages/build.messages.js +23 -0
- package/lib/constants/messages/env.messages.js +38 -0
- package/lib/constants/messages/global.messages.js +19 -0
- package/lib/constants/messages/index.js +10 -0
- package/lib/constants/messages/platform.messages.js +84 -0
- package/lib/constants/runtime-apis.constants.js +118 -0
- package/lib/env/index.js +5 -0
- package/lib/env/runtime.env.js +69 -0
- package/lib/env/server.env.js +90 -0
- package/lib/env/vulcan.env.js +93 -0
- package/lib/main.js +260 -0
- package/lib/notations/namespaces.js +30 -0
- package/lib/notations/typedef.js +10 -0
- package/lib/platform/actions/application/createApplication.actions.js +33 -0
- package/lib/platform/actions/application/enableEdgeFunctions.actions.js +34 -0
- package/lib/platform/actions/application/instantiateFunction.actions.js +37 -0
- package/lib/platform/actions/application/setFunctionAsDefaultRule.actions.js +33 -0
- package/lib/platform/actions/core/auth.actions.js +67 -0
- package/lib/platform/actions/core/deploy.actions.js +73 -0
- package/lib/platform/actions/core/propagation.actions.js +75 -0
- package/lib/platform/actions/core/storage.actions.js +84 -0
- package/lib/platform/actions/domain/createDomain.actions.js +42 -0
- package/lib/platform/actions/function/createFunction.actions.js +79 -0
- package/lib/platform/actions/function/showFunctionLogs.actions.js +149 -0
- package/lib/platform/edgehooks/ErrorHTML/ErrorHTML.hooks.js +101 -0
- package/lib/platform/edgehooks/ErrorHTML/index.js +3 -0
- package/lib/platform/edgehooks/index.js +5 -0
- package/lib/platform/edgehooks/mountSPA/index.js +3 -0
- package/lib/platform/edgehooks/mountSPA/mountSPA.hooks.js +55 -0
- package/lib/platform/edgehooks/mountSPA/mountSPA.hooks.test.js +19 -0
- package/lib/platform/edgehooks/mountSSG/index.js +3 -0
- package/lib/platform/edgehooks/mountSSG/mountSSG.hooks.js +61 -0
- package/lib/platform/edgehooks/mountSSG/mountSSG.hooks.test.js +0 -0
- package/lib/platform/index.js +65 -0
- package/lib/platform/services/application.service.js +140 -0
- package/lib/platform/services/base.service.js +200 -0
- package/lib/platform/services/domain.service.js +80 -0
- package/lib/platform/services/events.service.js +65 -0
- package/lib/platform/services/function.service.js +105 -0
- package/lib/platform/services/index.js +8 -0
- package/lib/platform/services/storage.service.js +59 -0
- package/lib/platform/services/tokens.service.js +55 -0
- package/lib/presets/custom/angular/deliver/config.js +12 -0
- package/lib/presets/custom/angular/deliver/handler.js +8 -0
- package/lib/presets/custom/angular/deliver/prebuild.js +20 -0
- package/lib/presets/custom/astro/deliver/config.js +12 -0
- package/lib/presets/custom/astro/deliver/handler.js +8 -0
- package/lib/presets/custom/astro/deliver/prebuild.js +37 -0
- package/lib/presets/custom/hexo/deliver/config.js +12 -0
- package/lib/presets/custom/hexo/deliver/handler.js +8 -0
- package/lib/presets/custom/hexo/deliver/prebuild.js +37 -0
- package/lib/presets/custom/next/deliver/config.js +14 -0
- package/lib/presets/custom/next/deliver/handler.js +9 -0
- package/lib/presets/custom/next/deliver/prebuild.js +193 -0
- package/lib/presets/custom/react/deliver/config.js +12 -0
- package/lib/presets/custom/react/deliver/handler.js +8 -0
- package/lib/presets/custom/react/deliver/prebuild.js +16 -0
- package/lib/presets/custom/vue/deliver/config.js +12 -0
- package/lib/presets/custom/vue/deliver/handler.js +8 -0
- package/lib/presets/custom/vue/deliver/prebuild.js +20 -0
- package/lib/presets/default/html/deliver/config.js +13 -0
- package/lib/presets/default/html/deliver/handler.js +9 -0
- package/lib/presets/default/html/deliver/prebuild.js +15 -0
- package/lib/presets/default/javascript/compute/config.js +13 -0
- package/lib/presets/default/javascript/compute/handler.js +5 -0
- package/lib/presets/default/javascript/compute/prebuild.js +6 -0
- package/lib/presets/default/typescript/compute/config.js +0 -0
- package/lib/presets/default/typescript/compute/handler.js +0 -0
- package/lib/presets/default/typescript/compute/prebuild.js +0 -0
- package/lib/providers/azion/worker.js +12 -0
- package/lib/utils/copyDirectory/copyDirectory.utils.js +54 -0
- package/lib/utils/copyDirectory/copyDirectory.utils.test.js +43 -0
- package/lib/utils/copyDirectory/index.js +3 -0
- package/lib/utils/debug/debug.utils.js +36 -0
- package/lib/utils/debug/debug.utils.test.js +43 -0
- package/lib/utils/debug/index.js +3 -0
- package/lib/utils/exec/exec.utils.js +58 -0
- package/lib/utils/exec/exec.utils.test.js +84 -0
- package/lib/utils/exec/index.js +3 -0
- package/lib/utils/feedback/feedback.utils.js +81 -0
- package/lib/utils/feedback/feedback.utils.test.js +11 -0
- package/lib/utils/feedback/index.js +3 -0
- package/lib/utils/generateTimestamp/generateTimestamp.utils.js +25 -0
- package/lib/utils/generateTimestamp/generateTimestamp.utils.test.js +10 -0
- package/lib/utils/generateTimestamp/index.js +3 -0
- package/lib/utils/getAbsoluteLibDirPath/getAbsoluteLibDirPath.utils.js +21 -0
- package/lib/utils/getAbsoluteLibDirPath/getAbsoluteLibDirPath.utils.test.js +13 -0
- package/lib/utils/getAbsoluteLibDirPath/index.js +3 -0
- package/lib/utils/getPackageManager/getPackageManager.utils.js +118 -0
- package/lib/utils/getPackageManager/getPackageManager.utils.test.js +35 -0
- package/lib/utils/getPackageManager/index.js +3 -0
- package/lib/utils/getPackageVersion/getPackageVersion.utils.js +25 -0
- package/lib/utils/getPackageVersion/getPackageVersion.utils.test.js +48 -0
- package/lib/utils/getPackageVersion/index.js +3 -0
- package/lib/utils/getPresetsList/getPresetsList.utils.js +50 -0
- package/lib/utils/getPresetsList/getPresetsList.utils.test.js +19 -0
- package/lib/utils/getPresetsList/index.js +3 -0
- package/lib/utils/getProjectJsonFile/getProjectJsonFile.utils.js +21 -0
- package/lib/utils/getProjectJsonFile/getProjectJsonFile.utils.test.js +39 -0
- package/lib/utils/getProjectJsonFile/index.js +3 -0
- package/lib/utils/getVulcanBuildId/getVulcanBuildId.utils.js +49 -0
- package/lib/utils/getVulcanBuildId/getVulcanBuildId.utils.test.js +36 -0
- package/lib/utils/getVulcanBuildId/index.js +3 -0
- package/lib/utils/index.js +29 -0
- package/lib/utils/overrideStaticOutputPath/index.js +3 -0
- package/lib/utils/overrideStaticOutputPath/overrideStaticOutputPath.utils.js +47 -0
- package/lib/utils/overrideStaticOutputPath/overrideStaticOutputPath.utils.test.js +35 -0
- package/lib/utils/readWorkerFile/index.js +3 -0
- package/lib/utils/readWorkerFile/readWorkerFile.utils.js +36 -0
- package/lib/utils/readWorkerFile/readWorkerFile.utils.test.js +24 -0
- package/package.json +99 -0
- package/releaserc.json +87 -0
- package/tasks/sync-aliases.js +115 -0
package/.babelrc
ADDED
package/.eslintignore
ADDED
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"env": {
|
|
3
|
+
"browser": true,
|
|
4
|
+
"es2021": true,
|
|
5
|
+
"jest/globals": true
|
|
6
|
+
},
|
|
7
|
+
"plugins": ["jsdoc", "jest"],
|
|
8
|
+
"extends": [
|
|
9
|
+
"airbnb-base",
|
|
10
|
+
"plugin:jsdoc/recommended",
|
|
11
|
+
"plugin:jest/recommended"
|
|
12
|
+
],
|
|
13
|
+
"overrides": [],
|
|
14
|
+
"parserOptions": {
|
|
15
|
+
"ecmaVersion": "latest",
|
|
16
|
+
"sourceType": "module"
|
|
17
|
+
},
|
|
18
|
+
"settings": {
|
|
19
|
+
"import/resolver": {
|
|
20
|
+
"alias": {
|
|
21
|
+
"map": [
|
|
22
|
+
["#root/*", "./"],
|
|
23
|
+
["#lib/*", "./lib"],
|
|
24
|
+
["#utils", "./lib/utils/index.js"],
|
|
25
|
+
["#polyfills", "./lib/build/polyfills/index.js"],
|
|
26
|
+
["#build", "./lib/build/dispatcher/index.js"],
|
|
27
|
+
["#bundlers", "./lib/build/bundlers/index.js"],
|
|
28
|
+
["#notations/*", "./lib/notations"],
|
|
29
|
+
["#env", "./lib/env/index.js"],
|
|
30
|
+
["#platform", "./lib/platform/index.js"],
|
|
31
|
+
["#constants", "./lib/constants/index.js"],
|
|
32
|
+
["#edge", "./lib/platform/edgehooks/index.js"]
|
|
33
|
+
],
|
|
34
|
+
"extensions": [".js", ".json"]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"rules": {
|
|
39
|
+
"import/extensions": ["error", "always"],
|
|
40
|
+
"no-console": "off"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Release (Major)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
jobs:
|
|
8
|
+
publish-release:
|
|
9
|
+
strategy:
|
|
10
|
+
matrix:
|
|
11
|
+
node-version: [19.x]
|
|
12
|
+
os: [ubuntu-latest, macos-latest]
|
|
13
|
+
|
|
14
|
+
name: Release - ${{ matrix.os }} - Node v${{ matrix.node-version }}
|
|
15
|
+
runs-on: ${{ matrix.os }}
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v3
|
|
19
|
+
- name: Setup Node ${{ matrix.node-version }}
|
|
20
|
+
uses: actions/setup-node@v3
|
|
21
|
+
with:
|
|
22
|
+
node-version: ${{ matrix.node-version }}
|
|
23
|
+
- name: Installing dependencies
|
|
24
|
+
run: yarn install
|
|
25
|
+
- name: Create Release
|
|
26
|
+
env:
|
|
27
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
28
|
+
run: npx semantic-release -e ./releaserc.json
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Release (Minor/Patch)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [closed]
|
|
6
|
+
branches:
|
|
7
|
+
- dev
|
|
8
|
+
jobs:
|
|
9
|
+
publish-release:
|
|
10
|
+
strategy:
|
|
11
|
+
matrix:
|
|
12
|
+
node-version: [19.x]
|
|
13
|
+
os: [ubuntu-latest]
|
|
14
|
+
|
|
15
|
+
name: Release - ${{ matrix.os }} - Node v${{ matrix.node-version }}
|
|
16
|
+
runs-on: ${{ matrix.os }}
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v3
|
|
20
|
+
- name: Setup Node ${{ matrix.node-version }}
|
|
21
|
+
uses: actions/setup-node@v3
|
|
22
|
+
with:
|
|
23
|
+
node-version: ${{ matrix.node-version }}
|
|
24
|
+
- name: Installing dependencies
|
|
25
|
+
run: yarn install
|
|
26
|
+
- name: Create Release
|
|
27
|
+
run: npx semantic-release -e ./releaserc.json
|
|
28
|
+
env:
|
|
29
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
30
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
31
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"editor.codeActionsOnSave": {
|
|
3
|
+
"source.fixAll.eslint": true
|
|
4
|
+
},
|
|
5
|
+
"editor.formatOnSave": true,
|
|
6
|
+
"[javascript]": {
|
|
7
|
+
"editor.formatOnSave": true
|
|
8
|
+
},
|
|
9
|
+
"[javascriptreact]": {
|
|
10
|
+
"editor.formatOnSave": true
|
|
11
|
+
},
|
|
12
|
+
"[typescript]": {
|
|
13
|
+
"editor.formatOnSave": true
|
|
14
|
+
},
|
|
15
|
+
"[typescriptreact]": {
|
|
16
|
+
"editor.formatOnSave": true
|
|
17
|
+
},
|
|
18
|
+
"prettier.eslintIntegration": true,
|
|
19
|
+
"docwriter.style": "JSDoc"
|
|
20
|
+
}
|
package/CODEOWNERS
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
In the interest of fostering an open and welcoming environment, we as
|
|
6
|
+
contributors and maintainers pledge to making participation in our project and
|
|
7
|
+
our community a harassment-free experience for everyone, regardless of age, body
|
|
8
|
+
size, disability, ethnicity, gender identity and expression, level of experience,
|
|
9
|
+
education, socio-economic status, nationality, personal appearance, race,
|
|
10
|
+
religion, or sexual identity and orientation.
|
|
11
|
+
|
|
12
|
+
## Our Standards
|
|
13
|
+
|
|
14
|
+
Examples of behavior that contributes to creating a positive environment
|
|
15
|
+
include:
|
|
16
|
+
|
|
17
|
+
* Using welcoming and inclusive language
|
|
18
|
+
* Being respectful of differing viewpoints and experiences
|
|
19
|
+
* Gracefully accepting constructive criticism
|
|
20
|
+
* Focusing on what is best for the community
|
|
21
|
+
* Showing empathy towards other community members
|
|
22
|
+
|
|
23
|
+
Examples of unacceptable behavior by participants include:
|
|
24
|
+
|
|
25
|
+
* The use of sexualized language or imagery and unwelcome sexual attention or
|
|
26
|
+
advances
|
|
27
|
+
* Trolling, insulting/derogatory comments, and personal or political attacks
|
|
28
|
+
* Public or private harassment
|
|
29
|
+
* Publishing others' private information, such as a physical or electronic
|
|
30
|
+
address, without explicit permission
|
|
31
|
+
* Other conduct which could reasonably be considered inappropriate in a
|
|
32
|
+
professional setting
|
|
33
|
+
|
|
34
|
+
## Our Responsibilities
|
|
35
|
+
|
|
36
|
+
Project maintainers are responsible for clarifying the standards of acceptable
|
|
37
|
+
behavior and are expected to take appropriate and fair corrective action in
|
|
38
|
+
response to any instances of unacceptable behavior.
|
|
39
|
+
|
|
40
|
+
Project maintainers have the right and responsibility to remove, edit, or
|
|
41
|
+
reject comments, commits, code, wiki edits, issues, and other contributions
|
|
42
|
+
that are not aligned to this Code of Conduct, or to ban temporarily or
|
|
43
|
+
permanently any contributor for other behaviors that they deem inappropriate,
|
|
44
|
+
threatening, offensive, or harmful.
|
|
45
|
+
|
|
46
|
+
## Scope
|
|
47
|
+
|
|
48
|
+
This Code of Conduct applies both within project spaces and in public spaces
|
|
49
|
+
when an individual is representing the project or its community. Examples of
|
|
50
|
+
representing a project or community include using an official project e-mail
|
|
51
|
+
address, posting via an official social media account, or acting as an appointed
|
|
52
|
+
representative at an online or offline event. Representation of a project may be
|
|
53
|
+
further defined and clarified by project maintainers.
|
|
54
|
+
|
|
55
|
+
## Enforcement
|
|
56
|
+
|
|
57
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
58
|
+
reported by contacting the Azion team at [support@azion.com](mailto:support@azion.com). All
|
|
59
|
+
complaints will be reviewed and investigated and will result in a response that
|
|
60
|
+
is deemed necessary and appropriate to the circumstances. The project team is
|
|
61
|
+
obligated to maintain confidentiality with regard to the reporter of an incident.
|
|
62
|
+
Further details of specific enforcement policies may be posted separately.
|
|
63
|
+
|
|
64
|
+
Project maintainers who do not follow or enforce the Code of Conduct in good
|
|
65
|
+
faith may face temporary or permanent repercussions as determined by other
|
|
66
|
+
members of the project's leadership.
|
|
67
|
+
|
|
68
|
+
## Attribution
|
|
69
|
+
|
|
70
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
|
71
|
+
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
|
72
|
+
|
|
73
|
+
[homepage]: https://www.contributor-covenant.org
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
First off, thanks for taking the time to contribute!
|
|
4
|
+
|
|
5
|
+
All types of contributions are encouraged and valued. See the Table of Contents for different ways to help and details about how this project handles them. 🎉
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
- [Code of Conduct](#code-of-conduct)
|
|
9
|
+
- [I Have a Question](#i-have-a-question)
|
|
10
|
+
- [I Want To Contribute](#i-want-to-contribute)
|
|
11
|
+
- [Reporting Bugs](#reporting-bugs)
|
|
12
|
+
- [Suggesting Enhancements](#suggesting-enhancements)
|
|
13
|
+
- [Your First Code Contribution](#your-first-code-contribution)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## Code of Conduct
|
|
17
|
+
|
|
18
|
+
This project and everyone participating in it is governed by the
|
|
19
|
+
[Code of Conduct](CODE_OF_CONDUCT.md).
|
|
20
|
+
By participating, you are expected to uphold this code.
|
|
21
|
+
|
|
22
|
+
## I Have a Question
|
|
23
|
+
|
|
24
|
+
> If you want to ask a question, we assume that you have read the available [Documentation](README.md).
|
|
25
|
+
|
|
26
|
+
Before you ask a question, it is best to search for existing [Issues](https://github.com/aziontech/vulcan/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue.
|
|
27
|
+
|
|
28
|
+
If you then still feel the need to ask a question and need clarification, we recommend the following:
|
|
29
|
+
|
|
30
|
+
- Open an [Issue](https://github.com/aziontech/vulcan/issues/new).
|
|
31
|
+
- Provide as much context as you can about what you're running into.
|
|
32
|
+
|
|
33
|
+
We will then take care of the issue as soon as possible.
|
|
34
|
+
|
|
35
|
+
## I Want To Contribute
|
|
36
|
+
|
|
37
|
+
> ### Legal Notice
|
|
38
|
+
> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content, and that the content you contribute may be provided under the project license.
|
|
39
|
+
|
|
40
|
+
### Reporting Bugs
|
|
41
|
+
|
|
42
|
+
#### Before Submitting a Bug Report
|
|
43
|
+
|
|
44
|
+
A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information, and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
|
|
45
|
+
|
|
46
|
+
- Make sure that you are using the latest version.
|
|
47
|
+
- Determine if your bug is really a bug and not an error on your side e.g. using incompatible binary to your OS/Platform (Make sure that you have read the [documentation](README.md).
|
|
48
|
+
- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/aziontech/vulcan/issues?q=label%3Abug).
|
|
49
|
+
- Collect information about the bug:
|
|
50
|
+
- Stack trace
|
|
51
|
+
- OS, Platform and Version (Windows, Linux, macOS, x86, ARM)
|
|
52
|
+
- Golang version, runtime environment or what seems relevant.
|
|
53
|
+
- Possibly your input and the output
|
|
54
|
+
- Can you reliably reproduce the issue? And can you also reproduce it with older versions?
|
|
55
|
+
|
|
56
|
+
We use GitHub issues to track bugs and errors. If you run into an issue with the project:
|
|
57
|
+
|
|
58
|
+
- Open an [Issue](https://github.com/aziontech/vulcan/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
|
|
59
|
+
- Explain the behavior you would expect and the actual behavior.
|
|
60
|
+
- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
|
|
61
|
+
- Provide the information you collected in the previous section.
|
|
62
|
+
|
|
63
|
+
### Suggesting Enhancements
|
|
64
|
+
|
|
65
|
+
This section guides you through submitting an enhancement suggestion for Cells Site Tempalte, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
|
|
66
|
+
|
|
67
|
+
#### Before Submitting an Enhancement
|
|
68
|
+
|
|
69
|
+
- Make sure that you are using the latest version.
|
|
70
|
+
- Perform a [search](https://github.com/aziontech/vulcan/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
|
71
|
+
- If your enhancement is nontrivial,
|
|
72
|
+
please open an [Issue](https://github.com/aziontech/vulcan/issues/new) to discuss the
|
|
73
|
+
idea and implementation strategy before submitting a PR.
|
|
74
|
+
|
|
75
|
+
#### How Do I Submit a Good Enhancement Suggestion?
|
|
76
|
+
|
|
77
|
+
Enhancement suggestions are tracked as [GitHub issues](https://github.com/aziontech/vulcan/issues).
|
|
78
|
+
|
|
79
|
+
- Use a **clear and descriptive title** for the issue to identify the suggestion.
|
|
80
|
+
- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
|
|
81
|
+
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
|
|
82
|
+
- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. <!-- this should only be included if the project has a GUI -->
|
|
83
|
+
- **Explain why this enhancement would be useful** to most Cells Site Template users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
|
|
84
|
+
|
|
85
|
+
### Your First Code Contribution
|
|
86
|
+
|
|
87
|
+
1. Fork the repo
|
|
88
|
+
2. Clone your forked repo
|
|
89
|
+
3. Commit the changes you’ve developed on your fork
|
|
90
|
+
4. If everything looks good, create a pull request on the base repo with your changes.
|
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Azion Technologies
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
|
|
2
|
+
# Vulcan - Forging The Edge
|
|
3
|
+
|
|
4
|
+
Vulcan is a powerful tool designed to streamline the development and deployment of JavaScript applications and frameworks. This powerful utility automates polyfills for Edge Computing, significantly simplifying the process of creating Workers, particularly for the Azion platform.
|
|
5
|
+
|
|
6
|
+
One of the key highlights of Vulcan is its ability to establish an intuitive and efficient protocol for facilitating the creation of presets. This makes customization and adaptation to specific project needs even more accessible, providing developers with the necessary flexibility to optimize their applications effectively and efficiently.
|
|
7
|
+
|
|
8
|
+
## Quick Installation
|
|
9
|
+
|
|
10
|
+
For those who just want to use Vulcan in their project without contributing to the development, you can install it directly from npm.
|
|
11
|
+
|
|
12
|
+
```shell
|
|
13
|
+
npm install edge-functions
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
or if you prefer yarn:
|
|
17
|
+
|
|
18
|
+
```shell
|
|
19
|
+
yarn add edge-functions
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Getting Started for Development
|
|
23
|
+
|
|
24
|
+
Follow these steps to start using Vulcan:
|
|
25
|
+
|
|
26
|
+
1. Clone the repository: Clone the Vulcan repository from GitHub to your local machine.
|
|
27
|
+
|
|
28
|
+
```shell
|
|
29
|
+
git clone https://github.com/aziontech/vulcan.git
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
2. Installation: Navigate to the cloned Vulcan directory and install the required dependencies.
|
|
33
|
+
|
|
34
|
+
```shell
|
|
35
|
+
cd vulcan
|
|
36
|
+
npm install
|
|
37
|
+
```
|
|
38
|
+
3. Install the Vulcan CLI globally, which allows you to use it as a command-line tool from anywhere in your system.
|
|
39
|
+
|
|
40
|
+
```shell
|
|
41
|
+
npm install -g
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This command sets up the necessary project structure and configuration files for Vulcan.
|
|
45
|
+
|
|
46
|
+
5. Start developing: Once the project is set up, you can start developing your JavaScript applications or frameworks using the power of Vulcan. Leverage the automated polyfills, Worker creation assistance, and other features provided by Vulcan to enhance your development workflow.
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## Docs
|
|
50
|
+
* [Overview](docs/overview.md)
|
|
51
|
+
* [Presets](docs/presets.md)
|
|
52
|
+
|
|
53
|
+
## Contributing
|
|
54
|
+
Check the [Contributing doc](CONTRIBUTING.md).
|
|
55
|
+
|
|
56
|
+
## Code of Conduct
|
|
57
|
+
Check the [Code of Conduct ](CODE_OF_CONDUCT.md).
|
|
58
|
+
|
|
59
|
+
## License
|
|
60
|
+
[MIT](LICENSE.md)
|
package/aliases.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default [
|
|
2
|
+
['#root/*', './'],
|
|
3
|
+
['#lib/*', './lib'],
|
|
4
|
+
['#utils', './lib/utils/index.js'],
|
|
5
|
+
['#polyfills', './lib/build/polyfills/index.js'],
|
|
6
|
+
['#build', './lib/build/dispatcher/index.js'],
|
|
7
|
+
['#bundlers', './lib/build/bundlers/index.js'],
|
|
8
|
+
['#notations/*', './lib/notations'],
|
|
9
|
+
['#env', './lib/env/index.js'],
|
|
10
|
+
['#platform', './lib/platform/index.js'],
|
|
11
|
+
['#constants', './lib/constants/index.js'],
|
|
12
|
+
['#edge', './lib/platform/edgehooks/index.js'],
|
|
13
|
+
];
|
package/docs/overview.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
## Build Pipeline
|
|
4
|
+
```mermaid
|
|
5
|
+
flowchart LR
|
|
6
|
+
|
|
7
|
+
A[Trigger] -->|args| B(Dispatcher)
|
|
8
|
+
B --> C(Prebuild)
|
|
9
|
+
C -->|args| D(Common Build)
|
|
10
|
+
D --> E[Artifacts]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Trigger
|
|
14
|
+
An external call to run a build.
|
|
15
|
+
|
|
16
|
+
### Dispatcher
|
|
17
|
+
* Receive build options(args);
|
|
18
|
+
* Select which build process to run;
|
|
19
|
+
* Load necessary template files and import correct modules (prebuild and configs);
|
|
20
|
+
|
|
21
|
+
### Prebuild
|
|
22
|
+
Custom prebuild module that runs actions to generate entrypoint and necessary files.
|
|
23
|
+
|
|
24
|
+
The user is free to run any action in this step. All actions must be called in a exported `main` function.
|
|
25
|
+
|
|
26
|
+
### Common Build
|
|
27
|
+
Module that runs azion common build.
|
|
28
|
+
|
|
29
|
+
Polyfills can be used to generate the worker(s) file(s).
|
|
30
|
+
|
|
31
|
+
Some configs can be passed to the builder but if user tries to override `azion worker configs` this passed configs will be ignored.
|
|
32
|
+
|
|
33
|
+
### Artifacts
|
|
34
|
+
Files generated to run in azion structure:
|
|
35
|
+
* js worker(s);
|
|
36
|
+
* Storage assets files;
|
package/docs/presets.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
# Documentation: Presets
|
|
4
|
+
Vulcan is an extensible platform that allows you to easily create new presets for frameworks and libraries to run on the Edge. This documentation will describe the fundamental structure and how to add your own preset.
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
## Presets Structure
|
|
8
|
+
|
|
9
|
+
To add a new preset, you need to create appropriate folders in two directories: `presets/default` or `presets/custom`. The folder representing your framework or library will automatically be included in the preset listings. Each preset has two modes, represented by folders of the same name: `compute` and `deliver`.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
https://github.com/aziontech/vulcan/assets/12740219/06edb9a0-26cd-4055-bd2e-d400b6a06f3c
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
- Compute: This holds configurations for frameworks that use computation on the Edge (Front-End SSR or Back-End).
|
|
19
|
+
- Deliver: This holds configurations for frameworks that merely handle requests on the Edge to deliver static files (routing, but not execute.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
Each preset is made up of three primary files: `config.js`, `prebuild.js`, and `handler.js`.
|
|
24
|
+
|
|
25
|
+

|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
1. `config.js`: This file is responsible for extending the Vulcan build (Edge build) and allows the inclusion of polyfills, plugins, and other necessities. By default, you don't need to make alterations.
|
|
30
|
+
|
|
31
|
+
2. `prebuild.js`: This file allows you to add the build and adaptation stages of the framework. This stage is executed before Vulcan's Forging process (which adapts it for the Edge). Here, you have access to the `#utils` domain, which provides methods and an interface for you to manipulate the build of the framework or library.
|
|
32
|
+
|
|
33
|
+
Commonly used methods include:
|
|
34
|
+
- `exec`: An abstraction for `child_process:spawn`. You send the command, the scope (which will be shown in the log, default is 'process'), and the verbose flag to display or not the resultant logs.
|
|
35
|
+
|
|
36
|
+
- `getPackageManager`: This method returns the package manager relative to the user's project (can be yarn, npm, or pnpm).
|
|
37
|
+
|
|
38
|
+
- `copyDirectory`: This function is used to copy the resulting static files from the framework build to the local Edge environment (.edge/statics).
|
|
39
|
+
|
|
40
|
+
- `feedback`: This interface is used to display messages during the process, if necessary, or in case of error.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
4. `handler.js`: This function is executed on the Edge. During the Forging stage, it is inserted within the provider's worker (presets/providers). Here, you have access to edgehooks (import from #edge), which are ready-made snippets of code to add to your handler.
|
|
44
|
+
|
|
45
|
+
Current edgehooks include:
|
|
46
|
+
|
|
47
|
+
- mountSPA: This function takes the request and sets up the routing for a standard SPA, ready to redirect requests to index.html and also route the static files.
|
|
48
|
+
|
|
49
|
+
- mountSSG: This function takes the request and sets up routes according to the SSG structure.
|
|
50
|
+
|
|
51
|
+
- ErrorHTML: This edgehook provides a return of an HTML template showing the error and the description passed as a parameter. You can pass the captured error as the third parameter, and it will be displayed on the screen (it's a good way to debug).
|
|
52
|
+
|
|
53
|
+
# How to add a new preset
|
|
54
|
+
|
|
55
|
+
Here's a step-by-step guide on how to add a new preset in Vulcan:
|
|
56
|
+
|
|
57
|
+
1. ## **Create a folder inside `./lib/presets/custom`:**
|
|
58
|
+
https://github.com/aziontech/vulcan/assets/12740219/abb1b2cc-5f74-473d-b731-c0b7157cb95e
|
|
59
|
+
|
|
60
|
+
- The name of this folder should represent the name of your framework or library.
|
|
61
|
+
|
|
62
|
+
- Inside this folder, you should create another folder named `compute` or `deliver`, depending on the operation mode you want. If the folder is created directly at the root, it will be interpreted as being of the `deliver` type by default.
|
|
63
|
+
|
|
64
|
+
- **Compute**: This mode should be used when there is effectively a computation being performed at the Edge.
|
|
65
|
+
|
|
66
|
+
- **Deliver**: This mode should be used when you intend to use the worker only for routing requests and delivering static files that will be computed on the client side.
|
|
67
|
+
|
|
68
|
+
3. ## **Create the following files in your preset's folder:**
|
|
69
|
+
|
|
70
|
+
## handler.js
|
|
71
|
+
This file contains the code that is executed within the worker in the edge function. Essentially, it is the code that runs directly on the edge. In the context of the `deliver` mode, this may simply act as a router. However, in cases where computation is needed, it can be designed to perform more complex tasks. Remember, the capabilities of your handler.js are dependent on your use case and the mode of operation you've chosen for your preset.
|
|
72
|
+
|
|
73
|
+
#### For the cases involving static (deliver) frameworks, here's what you can do:
|
|
74
|
+
- For Single Page Application (SPA) types:
|
|
75
|
+
Consider copying the preset handler similar to Vue. This utilizes the `mountSPA` hook which sets up the routing for your SPA effectively.
|
|
76
|
+
|
|
77
|
+
- For Static Site Generator (SSG) projects:
|
|
78
|
+
If you have a project that generates multiple HTML files, take a look at how the Next.js project handles this. They use the `mountSSG` hook, which sets up static routing for all the generated HTML pages.
|
|
79
|
+
|
|
80
|
+
**Note**: Remember, these are just examples and can serve as a starting point for your own custom preset. Adjust and extend them as necessary to fit your project's specific needs.
|
|
81
|
+
|
|
82
|
+
## config.js
|
|
83
|
+
This file serves as an extension to the edge build. It enables the inclusion of polyfills, plugins, or any other procedures that relate to the build process executed on the edge. Although it is editable, we strongly advise against making changes to this file unless absolutely necessary. It's designed to ensure optimal operation, and modifications should be undertaken with careful consideration.
|
|
84
|
+
|
|
85
|
+
## prebuild.js
|
|
86
|
+
In this file, you should adapt the native build process of your framework or library. Usually, in the case of *deliver* presets, this file will be used to ensure that the generated static artifacts are placed in the *.edge/statics/* directory.
|
|
87
|
+
#### React (deliver) Example:
|
|
88
|
+
|
|
89
|
+

|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
**Note**: The use of `compute` type presets is still under development and does not have many examples available. We currently support build/import resolution for pure JavaScript code (or with polyfills), as shown in the `./examples/simple-js-esm` example.
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
3. ## **Test your preset:**
|
|
98
|
+
After setting up your preset, you can test it using Vulcan's build command. Depending on the mode of your preset, run one of the following commands in your terminal:
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
https://github.com/aziontech/vulcan/assets/12740219/7033d37a-30ee-4098-8fe5-bbfca536591d
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
For `compute` mode:
|
|
108
|
+
|
|
109
|
+
vulcan build --preset <name> --mode compute
|
|
110
|
+
|
|
111
|
+
For `deliver` mode:
|
|
112
|
+
|
|
113
|
+
vulcan build --preset <name> --mode deliver
|
|
114
|
+
|
|
115
|
+
Replace `<name>` with the name of your preset. This will initiate Vulcan's build process for your preset, allowing you to verify its functionality.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Editor configuration, see https://editorconfig.org
|
|
2
|
+
root = true
|
|
3
|
+
|
|
4
|
+
[*]
|
|
5
|
+
charset = utf-8
|
|
6
|
+
indent_style = space
|
|
7
|
+
indent_size = 2
|
|
8
|
+
insert_final_newline = true
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
|
|
11
|
+
[*.ts]
|
|
12
|
+
quote_type = single
|
|
13
|
+
|
|
14
|
+
[*.md]
|
|
15
|
+
max_line_length = off
|
|
16
|
+
trim_trailing_whitespace = false
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Angular Static
|
|
2
|
+
|
|
3
|
+
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.1.3.
|
|
4
|
+
|
|
5
|
+
## Development server
|
|
6
|
+
|
|
7
|
+
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
|
|
8
|
+
|
|
9
|
+
## Code scaffolding
|
|
10
|
+
|
|
11
|
+
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
|
|
12
|
+
|
|
13
|
+
## Build
|
|
14
|
+
|
|
15
|
+
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
16
|
+
|
|
17
|
+
## Running unit tests
|
|
18
|
+
|
|
19
|
+
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
20
|
+
|
|
21
|
+
## Running end-to-end tests
|
|
22
|
+
|
|
23
|
+
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
|
|
24
|
+
|
|
25
|
+
## Further help
|
|
26
|
+
|
|
27
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|