mirror of
https://github.com/actions/configure-pages.git
synced 2026-03-29 09:24:52 +00:00
Compare commits
106 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23968016b8 | ||
|
|
3d4ee3e950 | ||
|
|
cdda64832d | ||
|
|
38eb20d0ee | ||
|
|
36b9431494 | ||
|
|
179e061a24 | ||
|
|
175172ab3d | ||
|
|
685a74a557 | ||
|
|
84be8935f1 | ||
|
|
24bc4a64af | ||
|
|
ea72118a93 | ||
|
|
f98f257726 | ||
|
|
995b240285 | ||
|
|
c6c1171c00 | ||
|
|
37538b280c | ||
|
|
8d642d8eae | ||
|
|
9b8d2f4ab2 | ||
|
|
e2f34b1f92 | ||
|
|
7aebbf763e | ||
|
|
6a2b91eafe | ||
|
|
939d05ad85 | ||
|
|
0ca1df54d4 | ||
|
|
5c42783e5b | ||
|
|
13d4de8a28 | ||
|
|
5aa8bf5ac6 | ||
|
|
1d79de2fe7 | ||
|
|
5a80553d12 | ||
|
|
7eb7a15548 | ||
|
|
b8c94fdc9e | ||
|
|
9b358e73bb | ||
|
|
13e6bc7a20 | ||
|
|
3c444c051b | ||
|
|
12fd9a085c | ||
|
|
a8216d627c | ||
|
|
5992ce8fd5 | ||
|
|
c8deda3832 | ||
|
|
5d8963e8a5 | ||
|
|
529ba710d5 | ||
|
|
29e9dd5abe | ||
|
|
c450a282d7 | ||
|
|
6567d4c154 | ||
|
|
aba1aa6bab | ||
|
|
6a80311a73 | ||
|
|
380c12d4cc | ||
|
|
c5a3e1159e | ||
|
|
a069fede0c | ||
|
|
2f460cfbe0 | ||
|
|
e5c1ee9f14 | ||
|
|
7fea7010df | ||
|
|
34521f23a5 | ||
|
|
d84b27279d | ||
|
|
5650def507 | ||
|
|
0c2178e929 | ||
|
|
948e60fb96 | ||
|
|
1305a1ba92 | ||
|
|
b94e9adb36 | ||
|
|
fc8c2c4e6e | ||
|
|
e978eba337 | ||
|
|
343cb08233 | ||
|
|
f87a94c875 | ||
|
|
7eb40247a7 | ||
|
|
86f141f32d | ||
|
|
76b6a8292e | ||
|
|
8e221f24db | ||
|
|
d897860efd | ||
|
|
24270f0cca | ||
|
|
0c3c14948a | ||
|
|
b0c19d0de9 | ||
|
|
51323db177 | ||
|
|
3d9811d6e2 | ||
|
|
9c3b6344a2 | ||
|
|
97fb35057c | ||
|
|
c917d1c3cd | ||
|
|
ffa824f004 | ||
|
|
d4a76d1ee1 | ||
|
|
bd8a5da49f | ||
|
|
5cb77813a2 | ||
|
|
2094727a1b | ||
|
|
d875fa8dc1 | ||
|
|
67f329fcfd | ||
|
|
2ce6d5eaa1 | ||
|
|
bb6976f8d1 | ||
|
|
f2098a32c3 | ||
|
|
7fa35a05fd | ||
|
|
c3113876b0 | ||
|
|
af5f3c3f72 | ||
|
|
ad83b485e7 | ||
|
|
a84400a87f | ||
|
|
7a0a617c8a | ||
|
|
062df390be | ||
|
|
7619de7040 | ||
|
|
66e9ac3c2e | ||
|
|
4012a9fa87 | ||
|
|
4a12ff50fb | ||
|
|
a07391ec25 | ||
|
|
2491ca8488 | ||
|
|
875ec87ff9 | ||
|
|
4eadc891b5 | ||
|
|
c4feb8d01e | ||
|
|
1f9ca39237 | ||
|
|
1cefe6fc7c | ||
|
|
25a1ec8799 | ||
|
|
b9c4ac6c14 | ||
|
|
6e4f93b15d | ||
|
|
069c984c5e | ||
|
|
b030b061cb |
17
.eslintrc.json
Normal file
17
.eslintrc.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"env": {
|
||||
"commonjs": true,
|
||||
"es2021": true,
|
||||
"node": true,
|
||||
"jest": true
|
||||
},
|
||||
"plugins": ["github"],
|
||||
"extends": ["eslint:recommended", "prettier", "plugin:github/internal"],
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 12
|
||||
},
|
||||
"rules": {
|
||||
"semi": ["error", "never"]
|
||||
},
|
||||
"ignorePatterns": ["/dist/", "/src/fixtures/", "/src/blank-configurations/"]
|
||||
}
|
||||
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: 'github-actions'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
|
||||
- package-ecosystem: 'npm'
|
||||
directory: '/'
|
||||
schedule:
|
||||
interval: 'weekly'
|
||||
42
.github/release-drafter.yml
vendored
42
.github/release-drafter.yml
vendored
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name-template: "v$RESOLVED_VERSION"
|
||||
tag-template: "v$RESOLVED_VERSION"
|
||||
name-template: 'v$RESOLVED_VERSION'
|
||||
tag-template: 'v$RESOLVED_VERSION'
|
||||
template: |
|
||||
# Changelog
|
||||
|
||||
@@ -8,33 +8,33 @@ template: |
|
||||
|
||||
See details of [all code changes](https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION) since previous release.
|
||||
categories:
|
||||
- title: "🚀 Features"
|
||||
- title: '🚀 Features'
|
||||
labels:
|
||||
- "feature"
|
||||
- "enhancement"
|
||||
- title: "🐛 Bug Fixes"
|
||||
- 'feature'
|
||||
- 'enhancement'
|
||||
- title: '🐛 Bug Fixes'
|
||||
labels:
|
||||
- "fix"
|
||||
- "bugfix"
|
||||
- "bug"
|
||||
- title: "🧰 Maintenance"
|
||||
- 'fix'
|
||||
- 'bugfix'
|
||||
- 'bug'
|
||||
- title: '🧰 Maintenance'
|
||||
labels:
|
||||
- "infrastructure"
|
||||
- "automation"
|
||||
- "documentation"
|
||||
- title: "🏎 Performance"
|
||||
label: "performance"
|
||||
change-template: "- $TITLE @$AUTHOR (#$NUMBER)"
|
||||
- 'infrastructure'
|
||||
- 'automation'
|
||||
- 'documentation'
|
||||
- title: '🏎 Performance'
|
||||
label: 'performance'
|
||||
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
|
||||
version-resolver:
|
||||
major:
|
||||
labels:
|
||||
- "type: breaking"
|
||||
- 'type: breaking'
|
||||
minor:
|
||||
labels:
|
||||
- "type: enhancement"
|
||||
- 'type: enhancement'
|
||||
patch:
|
||||
labels:
|
||||
- "type: bug"
|
||||
- "type: maintenance"
|
||||
- "type: documentation"
|
||||
- 'type: bug'
|
||||
- 'type: maintenance'
|
||||
- 'type: documentation'
|
||||
default: patch
|
||||
|
||||
5
.github/workflows/check-formatting.yml
vendored
5
.github/workflows/check-formatting.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Checking formatting
|
||||
name: Check formatting
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -17,11 +17,12 @@ concurrency:
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 2
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node.JS
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16.x
|
||||
|
||||
2
.github/workflows/draft-release.yml
vendored
2
.github/workflows/draft-release.yml
vendored
@@ -11,7 +11,7 @@ jobs:
|
||||
draft-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- uses: release-drafter/release-drafter@v5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
35
.github/workflows/lint.yml
vendored
Normal file
35
.github/workflows/lint.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: Lint code
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
# This allows a subsequently queued workflow run to interrupt previous runs
|
||||
concurrency:
|
||||
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 2
|
||||
steps:
|
||||
- name: Check out repo
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16.x
|
||||
cache: npm
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run linter
|
||||
run: npm run lint:check
|
||||
48
.github/workflows/rebuild-dependabot-prs.yml
vendored
Normal file
48
.github/workflows/rebuild-dependabot-prs.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: Rebuild distributables for Dependabot PRs
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'dependabot/npm**'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
# This allows a subsequently queued workflow run to interrupt previous runs
|
||||
concurrency:
|
||||
group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
rebuild-dist:
|
||||
if: ${{ github.event.sender.login == 'dependabot[bot]' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.PAGES_AUTOMATION_PAT }}
|
||||
|
||||
- name: Setup Node.JS
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 16.x
|
||||
cache: 'npm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Rebuild the dist/ directory
|
||||
run: npm run prepare
|
||||
|
||||
- name: Commit any differences present in the dist/ directory
|
||||
run: |
|
||||
if [ "$(git diff --ignore-space-at-eol dist/ | wc -l)" -gt "0" ]; then
|
||||
echo "Detected uncommitted changes after rebuild in dist folder. Committing..."
|
||||
git add dist/
|
||||
git config --local user.name "github-actions[bot]"
|
||||
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git commit -m "Update distributables after Dependabot 🤖"
|
||||
echo "Pushing branch ${{ github.ref_name }}"
|
||||
git push origin ${{ github.ref_name }}
|
||||
fi
|
||||
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
TAG_NAME:
|
||||
description: "Tag name that the major tag will point to"
|
||||
description: 'Tag name that the major tag will point to'
|
||||
required: true
|
||||
|
||||
env:
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
steps:
|
||||
- name: Update the ${{ env.TAG_NAME }} tag
|
||||
id: update-major-tag
|
||||
uses: actions/publish-action@v0.1.0
|
||||
uses: actions/publish-action@v0.2.2
|
||||
with:
|
||||
source-tag: ${{ env.TAG_NAME }}
|
||||
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}
|
||||
|
||||
5
.prettierignore
Normal file
5
.prettierignore
Normal file
@@ -0,0 +1,5 @@
|
||||
# Ignore build artifacts
|
||||
/dist/
|
||||
|
||||
# Ignore all Markdown files
|
||||
*.md
|
||||
@@ -26,7 +26,7 @@ The scripts and documentation in this project are released under the [MIT Licens
|
||||
|
||||
<!-- references -->
|
||||
[starter-workflows]: https://github.com/actions/starter-workflows/tree/main/pages
|
||||
[release-list]: /releases
|
||||
[release-list]: https://github.com/actions/configure-pages/releases
|
||||
[draft-release]: .github/workflows/draft-release.yml
|
||||
[release]: .github/workflows/release.yml
|
||||
[release-workflow-runs]: /actions/workflows/release.yml
|
||||
[release-workflow-runs]: https://github.com/actions/configure-pages/actions/workflows/release.yml
|
||||
|
||||
@@ -16,8 +16,8 @@ inputs:
|
||||
default: ${{ github.token }}
|
||||
required: true
|
||||
enablement:
|
||||
description: 'Should a Pages site be enabled for the repository if not so already?'
|
||||
default: 'true'
|
||||
description: 'Should a Pages site be enabled for the repository if not so already? This will only work with user-to-server tokens.'
|
||||
default: 'false'
|
||||
required: false
|
||||
outputs:
|
||||
base_url:
|
||||
|
||||
7541
dist/index.js
vendored
7541
dist/index.js
vendored
File diff suppressed because it is too large
Load Diff
2
dist/index.js.map
vendored
2
dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
44
dist/licenses.txt
vendored
44
dist/licenses.txt
vendored
@@ -110,25 +110,13 @@ SOFTWARE.
|
||||
|
||||
axios
|
||||
MIT
|
||||
Copyright (c) 2014-present Matt Zabriskie
|
||||
# Copyright (c) 2014-present Matt Zabriskie & Collaborators
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
combined-stream
|
||||
@@ -572,6 +560,30 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
proxy-from-env
|
||||
MIT
|
||||
The MIT License
|
||||
|
||||
Copyright (C) 2016-2018 Rob Wu <rob@robwu.nl>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
supports-color
|
||||
MIT
|
||||
MIT License
|
||||
|
||||
6475
package-lock.json
generated
6475
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
26
package.json
26
package.json
@@ -5,9 +5,12 @@
|
||||
"description": "A GitHub Action to enable Pages and extract various metadata about a site. It can also be used to configure various static site generators we support as starter workflows.",
|
||||
"main": "./dist/index.js",
|
||||
"scripts": {
|
||||
"format": "prettier --write 'src/**/*.js'",
|
||||
"format:check": "prettier --check 'src/**/*.js'",
|
||||
"prepare": "npm run format && ncc build src/index.js -o dist --source-map --license licenses.txt",
|
||||
"all": "npm run format && npm run lint && npm run prepare && npm run test",
|
||||
"format": "prettier --write .",
|
||||
"format:check": "prettier --check .",
|
||||
"lint": "DEBUG=eslint:cli-engine eslint --fix .",
|
||||
"lint:check": "DEBUG=eslint:cli-engine eslint .",
|
||||
"prepare": "ncc build src/index.js -o dist --source-map --license licenses.txt",
|
||||
"test": "jest"
|
||||
},
|
||||
"repository": {
|
||||
@@ -21,15 +24,16 @@
|
||||
},
|
||||
"homepage": "https://github.com/actions/configure-pages#readme",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.9.1",
|
||||
"axios": "^0.27.2",
|
||||
"axios-retry": "^3.2.5",
|
||||
"espree": "^9.3.2",
|
||||
"string-format": "^1.0.0"
|
||||
"@actions/core": "^1.10.0",
|
||||
"axios": "^1.3.3",
|
||||
"espree": "^9.4.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vercel/ncc": "^0.34.0",
|
||||
"jest": "^28.1.1",
|
||||
"prettier": "^2.7.1"
|
||||
"@vercel/ncc": "^0.36.1",
|
||||
"eslint": "^8.34.0",
|
||||
"eslint-config-prettier": "^8.6.0",
|
||||
"eslint-plugin-github": "^4.6.0",
|
||||
"jest": "^29.4.1",
|
||||
"prettier": "^2.8.4"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,21 +33,17 @@ async function enablePagesSite({ repositoryNwo, githubToken }) {
|
||||
}
|
||||
|
||||
async function getPagesSite({ repositoryNwo, githubToken }) {
|
||||
try {
|
||||
const pagesEndpoint = `${getApiBaseUrl()}/repos/${repositoryNwo}/pages`
|
||||
const pagesEndpoint = `${getApiBaseUrl()}/repos/${repositoryNwo}/pages`
|
||||
|
||||
const response = await axios.get(pagesEndpoint, {
|
||||
headers: {
|
||||
Accept: 'application/vnd.github.v3+json',
|
||||
Authorization: `Bearer ${githubToken}`
|
||||
}
|
||||
})
|
||||
const response = await axios.get(pagesEndpoint, {
|
||||
headers: {
|
||||
Accept: 'application/vnd.github.v3+json',
|
||||
Authorization: `Bearer ${githubToken}`
|
||||
}
|
||||
})
|
||||
|
||||
const pageObject = response.data
|
||||
return pageObject
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
const pageObject = response.data
|
||||
return pageObject
|
||||
}
|
||||
|
||||
async function findOrCreatePagesSite({ repositoryNwo, githubToken, enablement = true }) {
|
||||
|
||||
@@ -9,7 +9,7 @@ Pages's path based routing (and work).
|
||||
|
||||
Supported configuration initializations:
|
||||
|
||||
(1) Default export:
|
||||
(1) Direct default export:
|
||||
|
||||
export default {
|
||||
// configuration object here
|
||||
@@ -21,19 +21,69 @@ Supported configuration initializations:
|
||||
// configuration object here
|
||||
}
|
||||
|
||||
(3) Indirect module export:
|
||||
(3) Indirect default export:
|
||||
|
||||
const config = // configuration object here
|
||||
const config = {
|
||||
// configuration object here
|
||||
}
|
||||
export default config
|
||||
|
||||
(4) Indirect module export:
|
||||
|
||||
const config = {
|
||||
// configuration object here
|
||||
}
|
||||
module.exports = config
|
||||
|
||||
(5) Direct default export with wrapping call:
|
||||
|
||||
export default defineConfig({
|
||||
// configuration object here
|
||||
})
|
||||
|
||||
(6) Direct module export with wrapping call:
|
||||
|
||||
module.exports = defineConfig({
|
||||
// configuration object here
|
||||
})
|
||||
|
||||
(7) Indirect default export with wrapping call at the definition:
|
||||
|
||||
const config = defineConfig({
|
||||
// configuration object here
|
||||
})
|
||||
export default config
|
||||
|
||||
(8) Indirect default export with wrapping call at the export:
|
||||
|
||||
const config = {
|
||||
// configuration object here
|
||||
}
|
||||
export default defineConfig(config)
|
||||
|
||||
(9) Indirect module export with wrapping call at the definition:
|
||||
|
||||
const config = defineConfig({
|
||||
// configuration object here
|
||||
})
|
||||
module.exports = config
|
||||
|
||||
(10) Indirect module export with wrapping call at the export:
|
||||
|
||||
const config = {
|
||||
// configuration object here
|
||||
}
|
||||
module.exports = defineConfig(config)
|
||||
*/
|
||||
|
||||
class ConfigParser {
|
||||
// Ctor
|
||||
// - configurationFile: path to the configuration file
|
||||
// - blankConfigurationFile: a blank configuration file to use if non was previously found
|
||||
constructor({ configurationFile, blankConfigurationFile, properties }) {
|
||||
constructor({ configurationFile, blankConfigurationFile, allowWrappingCall = false, properties }) {
|
||||
// Save field
|
||||
this.configurationFile = configurationFile
|
||||
this.allowWrappingCall = allowWrappingCall === true
|
||||
this.properties = properties
|
||||
|
||||
// If the configuration file does not exist, initialize it with the blank configuration file
|
||||
@@ -49,12 +99,43 @@ class ConfigParser {
|
||||
this.configuration = fs.readFileSync(this.configurationFile, 'utf8')
|
||||
}
|
||||
|
||||
findTopLevelVariableDeclarator(ast, identifierName) {
|
||||
let targetDeclarator
|
||||
ast.body.find(
|
||||
node =>
|
||||
node.type === 'VariableDeclaration' &&
|
||||
node.declarations &&
|
||||
node.declarations.length > 0 &&
|
||||
node.declarations.find(declarator => {
|
||||
if (
|
||||
declarator.type === 'VariableDeclarator' &&
|
||||
declarator.id &&
|
||||
declarator.id.type === 'Identifier' &&
|
||||
declarator.id.name === identifierName
|
||||
) {
|
||||
targetDeclarator = declarator
|
||||
return true
|
||||
}
|
||||
})
|
||||
)
|
||||
return targetDeclarator
|
||||
}
|
||||
|
||||
// Find the configuration object in an AST.
|
||||
// Look for a default export, a direct module export or an indirect module
|
||||
// export (in that order).
|
||||
// Look for, in order:
|
||||
// - a direct default export
|
||||
// - a direct default export with a wrapping call
|
||||
// - an indirect default export
|
||||
// - an indirect default export with a wrapping call at the definition
|
||||
// - an indirect default export with a wrapping call at the export
|
||||
// - a direct module export
|
||||
// - a direct module export with a wrapping call
|
||||
// - an indirect module export
|
||||
// - an indirect module export with a wrapping call at the definition
|
||||
// - an indirect module export with a wrapping call at the export
|
||||
//
|
||||
// Return the configuration object or null.
|
||||
findConfigurationObject(ast) {
|
||||
findConfigurationObject(ast, allowWrappingCall = false) {
|
||||
// Try to find a default export
|
||||
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
|
||||
|
||||
@@ -64,21 +145,61 @@ class ConfigParser {
|
||||
return defaultExport.declaration
|
||||
}
|
||||
|
||||
// Direct default export with a wrapping call
|
||||
else if (
|
||||
allowWrappingCall &&
|
||||
defaultExport &&
|
||||
defaultExport.declaration.type === 'CallExpression' &&
|
||||
defaultExport.declaration.arguments.length > 0 &&
|
||||
defaultExport.declaration.arguments[0] &&
|
||||
defaultExport.declaration.arguments[0].type === 'ObjectExpression'
|
||||
) {
|
||||
core.info('Found configuration object in direct default export declaration with a wrapping call')
|
||||
return defaultExport.declaration.arguments[0]
|
||||
}
|
||||
|
||||
// Indirect default export
|
||||
else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
|
||||
const identifierName = defaultExport.declaration.name
|
||||
const identifierDefinition = ast.body.find(
|
||||
node =>
|
||||
node.type === 'VariableDeclaration' &&
|
||||
node.declarations.length == 1 &&
|
||||
node.declarations[0].type === 'VariableDeclarator' &&
|
||||
node.declarations[0].id.type === 'Identifier' &&
|
||||
node.declarations[0].id.name === identifierName &&
|
||||
node.declarations[0].init.type === 'ObjectExpression'
|
||||
)
|
||||
if (identifierDefinition) {
|
||||
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||
core.info('Found configuration object in indirect default export declaration')
|
||||
return identifierDefinition.declarations[0].init
|
||||
return identifierInitialization
|
||||
}
|
||||
// Indirect default export with a wrapping call at the definition
|
||||
else if (
|
||||
allowWrappingCall &&
|
||||
identifierInitialization &&
|
||||
identifierInitialization.type === 'CallExpression' &&
|
||||
identifierInitialization.arguments.length > 0 &&
|
||||
identifierInitialization.arguments[0] &&
|
||||
identifierInitialization.arguments[0].type === 'ObjectExpression'
|
||||
) {
|
||||
core.info(
|
||||
'Found configuration object in indirect default export declaration with a wrapping call at the definition'
|
||||
)
|
||||
return identifierInitialization.arguments[0]
|
||||
}
|
||||
}
|
||||
|
||||
// Indirect default export with a wrapping call at the export
|
||||
else if (
|
||||
allowWrappingCall &&
|
||||
defaultExport &&
|
||||
defaultExport.declaration.type === 'CallExpression' &&
|
||||
defaultExport.declaration.arguments.length > 0 &&
|
||||
defaultExport.declaration.arguments[0] &&
|
||||
defaultExport.declaration.arguments[0].type === 'Identifier'
|
||||
) {
|
||||
const identifierName = defaultExport.declaration.arguments[0].name
|
||||
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||
core.info(
|
||||
'Found configuration object in indirect default export declaration with a wrapping call at the export'
|
||||
)
|
||||
return identifierInitialization
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,21 +222,57 @@ class ConfigParser {
|
||||
return moduleExport.expression.right
|
||||
}
|
||||
|
||||
// Direct default export with a wrapping call
|
||||
else if (
|
||||
allowWrappingCall &&
|
||||
moduleExport &&
|
||||
moduleExport.expression.right.type === 'CallExpression' &&
|
||||
moduleExport.expression.right.arguments.length > 0 &&
|
||||
moduleExport.expression.right.arguments[0] &&
|
||||
moduleExport.expression.right.arguments[0].type === 'ObjectExpression'
|
||||
) {
|
||||
core.info('Found configuration object in direct module export with a wrapping call')
|
||||
return moduleExport.expression.right.arguments[0]
|
||||
}
|
||||
|
||||
// Indirect module export
|
||||
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
|
||||
const identifierName = moduleExport && moduleExport.expression.right.name
|
||||
const identifierDefinition = ast.body.find(
|
||||
node =>
|
||||
node.type === 'VariableDeclaration' &&
|
||||
node.declarations.length == 1 &&
|
||||
node.declarations[0].type === 'VariableDeclarator' &&
|
||||
node.declarations[0].id.type === 'Identifier' &&
|
||||
node.declarations[0].id.name === identifierName &&
|
||||
node.declarations[0].init.type === 'ObjectExpression'
|
||||
)
|
||||
if (identifierDefinition) {
|
||||
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||
core.info('Found configuration object in indirect module export')
|
||||
return identifierDefinition.declarations[0].init
|
||||
return identifierInitialization
|
||||
}
|
||||
// Indirect module export with a wrapping call at the definition
|
||||
else if (
|
||||
allowWrappingCall &&
|
||||
identifierInitialization &&
|
||||
identifierInitialization.type === 'CallExpression' &&
|
||||
identifierInitialization.arguments.length > 0 &&
|
||||
identifierInitialization.arguments[0] &&
|
||||
identifierInitialization.arguments[0].type === 'ObjectExpression'
|
||||
) {
|
||||
core.info('Found configuration object in indirect module export with a wrapping call at the definition')
|
||||
return identifierInitialization.arguments[0]
|
||||
}
|
||||
}
|
||||
|
||||
// Indirect module export with a wrapping call at the export
|
||||
else if (
|
||||
allowWrappingCall &&
|
||||
moduleExport &&
|
||||
moduleExport.expression.right.type === 'CallExpression' &&
|
||||
moduleExport.expression.right.arguments.length > 0 &&
|
||||
moduleExport.expression.right.arguments[0] &&
|
||||
moduleExport.expression.right.arguments[0].type === 'Identifier'
|
||||
) {
|
||||
const identifierName = moduleExport.expression.right.arguments[0].name
|
||||
const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
|
||||
const identifierInitialization = identifierDeclarator && identifierDeclarator.init
|
||||
if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
|
||||
core.info('Found configuration object in indirect module export declaration with a wrapping call at the export')
|
||||
return identifierInitialization
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +336,7 @@ class ConfigParser {
|
||||
const ast = espree.parse(this.configuration, espreeOptions)
|
||||
|
||||
// Find the configuration object
|
||||
var configurationObject = this.findConfigurationObject(ast)
|
||||
var configurationObject = this.findConfigurationObject(ast, this.allowWrappingCall)
|
||||
if (!configurationObject) {
|
||||
throw 'Could not find a configuration object in the configuration file'
|
||||
}
|
||||
@@ -189,6 +346,7 @@ class ConfigParser {
|
||||
var depth = 0
|
||||
const properties = propertyName.split('.')
|
||||
var lastNode = configurationObject
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
// Find the node for the current property
|
||||
var propertyNode = this.findProperty(lastNode, properties[depth])
|
||||
|
||||
@@ -10,7 +10,7 @@ const tempFolder = getTempFolder()
|
||||
// Cases to test
|
||||
const cases = [
|
||||
//
|
||||
// Default export
|
||||
// Direct default export
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
@@ -97,11 +97,13 @@ const cases = [
|
||||
source: 'const config = {}; export default config',
|
||||
expected: 'const config = { property: "value"}; export default config'
|
||||
},
|
||||
// with more than 1 declaration chained together
|
||||
{
|
||||
property: 'property',
|
||||
source: 'var config = {}; export default config',
|
||||
expected: 'var config = { property: "value"}; export default config'
|
||||
source: 'var temp = {}, config = {}; export default config',
|
||||
expected: 'var temp = {}, config = { property: "value"}; export default config'
|
||||
},
|
||||
// deeper
|
||||
{
|
||||
property: 'a.b.c',
|
||||
source: 'var config = {}; export default config',
|
||||
@@ -140,11 +142,13 @@ const cases = [
|
||||
source: 'const config = {}; module.exports = config',
|
||||
expected: 'const config = { property: "value"}; module.exports = config'
|
||||
},
|
||||
// with more than 1 declaration chained together
|
||||
{
|
||||
property: 'property',
|
||||
source: 'var config = {}; module.exports = config',
|
||||
expected: 'var config = { property: "value"}; module.exports = config'
|
||||
source: 'var temp = {}, config = {}; module.exports = config',
|
||||
expected: 'var temp = {}, config = { property: "value"}; module.exports = config'
|
||||
},
|
||||
// deeper
|
||||
{
|
||||
property: 'a.b.c',
|
||||
source: 'var config = {}; module.exports = config',
|
||||
@@ -154,6 +158,109 @@ const cases = [
|
||||
property: 'a.b.c',
|
||||
source: 'var config = { a: { b: [], c: "hello" } }; module.exports = config',
|
||||
expected: 'var config = { a: { b: { c: "value"}, c: "hello" } }; module.exports = config'
|
||||
},
|
||||
|
||||
//
|
||||
// Direct default export with wrapping call
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
source: 'import { defineConfig } from "astro/config"; export default defineConfig({ p1: 0 })',
|
||||
expected: 'import { defineConfig } from "astro/config"; export default defineConfig({ property: "value", p1: 0 })',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
|
||||
//
|
||||
// Direct module exports with wrapping call
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
source: 'const { defineConfig } = require("astro/config"); module.exports = defineConfig({ p1: 0 })',
|
||||
expected:
|
||||
'const { defineConfig } = require("astro/config"); module.exports = defineConfig({ property: "value", p1: 0 })',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
|
||||
//
|
||||
// Indirect default export with wrapping call at the definition
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
source: 'import { defineConfig } from "astro/config"; const config = defineConfig({}); export default config',
|
||||
expected:
|
||||
'import { defineConfig } from "astro/config"; const config = defineConfig({ property: "value" }); export default config',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
// with more than 1 declaration chained together
|
||||
{
|
||||
property: 'property',
|
||||
source:
|
||||
'import { defineConfig } from "astro/config"; const temp = {}, config = defineConfig({}); export default config',
|
||||
expected:
|
||||
'import { defineConfig } from "astro/config"; const temp = {}, config = defineConfig({ property: "value" }); export default config',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
|
||||
//
|
||||
// Indirect default export with wrapping call at the export
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
source: 'import { defineConfig } from "astro/config"; const config = {}; export default defineConfig(config)',
|
||||
expected:
|
||||
'import { defineConfig } from "astro/config"; const config = { property: "value" }; export default defineConfig(config)',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
// with more than 1 declaration chained together
|
||||
{
|
||||
property: 'property',
|
||||
source:
|
||||
'import { defineConfig } from "astro/config"; const temp = {}, config = {}; export default defineConfig(config)',
|
||||
expected:
|
||||
'import { defineConfig } from "astro/config"; const temp = {}, config = { property: "value" }; export default defineConfig(config)',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
|
||||
//
|
||||
// Indirect module exports with wrapping call at the definition
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
source:
|
||||
'const { defineConfig } = require("astro/config"); const config = defineConfig({}); module.exports = config',
|
||||
expected:
|
||||
'const { defineConfig } = require("astro/config"); const config = defineConfig({ property: "value"}); module.exports = config',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
// with more than 1 declaration chained together
|
||||
{
|
||||
property: 'property',
|
||||
source:
|
||||
'const { defineConfig } = require("astro/config"); const temp = {}, config = defineConfig({}); module.exports = config',
|
||||
expected:
|
||||
'const { defineConfig } = require("astro/config"); const temp = {}, config = defineConfig({ property: "value"}); module.exports = config',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
|
||||
//
|
||||
// Indirect module exports with wrapping call at the export
|
||||
//
|
||||
{
|
||||
property: 'property',
|
||||
source:
|
||||
'const { defineConfig } = require("astro/config"); const config = {}; module.exports = defineConfig(config)',
|
||||
expected:
|
||||
'const { defineConfig } = require("astro/config"); const config = { property: "value"}; module.exports = defineConfig(config)',
|
||||
allowWrappingCall: true
|
||||
},
|
||||
// with more than 1 declaration chained together
|
||||
{
|
||||
property: 'property',
|
||||
source:
|
||||
'const { defineConfig } = require("astro/config"); const temp = {}, config = {}; module.exports = defineConfig(config)',
|
||||
expected:
|
||||
'const { defineConfig } = require("astro/config"); const temp = {}, config = { property: "value"}; module.exports = defineConfig(config)',
|
||||
allowWrappingCall: true
|
||||
}
|
||||
]
|
||||
|
||||
@@ -168,7 +275,7 @@ describe('config-parser', () => {
|
||||
jest.spyOn(core, 'debug').mockImplementation(jest.fn())
|
||||
})
|
||||
|
||||
cases.forEach(({ property, source, expected }, index) => {
|
||||
cases.forEach(({ property, source, expected, allowWrappingCall = false }, index) => {
|
||||
it(`injects path properly for case #${index}`, () => {
|
||||
// Write the source file
|
||||
const sourceFile = `${tempFolder}/source.js`
|
||||
@@ -180,7 +287,8 @@ describe('config-parser', () => {
|
||||
|
||||
// Update the settings and do the injection
|
||||
new ConfigParser({
|
||||
configurationFile: sourceFile
|
||||
configurationFile: sourceFile,
|
||||
allowWrappingCall
|
||||
}).inject(property, 'value')
|
||||
|
||||
// Compare the files
|
||||
|
||||
@@ -7,7 +7,7 @@ function getRequiredVars() {
|
||||
githubToken: core.getInput('token'),
|
||||
staticSiteGenerator: core.getInput('static_site_generator'),
|
||||
generatorConfigFile: core.getInput('generator_config_file'),
|
||||
enablement: core.getInput('enablement') !== 'false'
|
||||
enablement: core.getInput('enablement') === 'true'
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
// Default Pages configuration for Next
|
||||
const nextConfig = { experimental: { images: { unoptimized: true } }, basePath: '/docs' }
|
||||
const nextConfig = { images: { unoptimized: true }, experimental: { images: { unoptimized: true } }, basePath: '/docs' }
|
||||
module.exports = nextConfig
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
swcMinify: true,
|
||||
swcMinify: true
|
||||
}
|
||||
|
||||
module.exports = nextConfig
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
images: { unoptimized: true },
|
||||
experimental: { images: { unoptimized: true } },
|
||||
basePath: '/docs',
|
||||
reactStrictMode: true,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
images: { unoptimized: true },
|
||||
experimental: { images: { unoptimized: true } },
|
||||
basePath: '/docs',
|
||||
reactStrictMode: true,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
images: { unoptimized: true },
|
||||
experimental: { images: { unoptimized: true } },
|
||||
basePath: '/docs',
|
||||
reactStrictMode: true,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
swcMinify: true,
|
||||
swcMinify: true
|
||||
}
|
||||
|
||||
export default nextConfig
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
const getAllDynamicRoute = async function() {
|
||||
const getAllDynamicRoute = async function () {
|
||||
const routes = await (async () => {
|
||||
return ['/posts/hello-world', '/posts/hello-again'];
|
||||
})();
|
||||
return routes;
|
||||
};
|
||||
return ['/posts/hello-world', '/posts/hello-again']
|
||||
})()
|
||||
return routes
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
mode: 'universal',
|
||||
generate: {
|
||||
async routes () {
|
||||
return getAllDynamicRoute();
|
||||
async routes() {
|
||||
return getAllDynamicRoute()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
const getAllDynamicRoute = async function() {
|
||||
const getAllDynamicRoute = async function () {
|
||||
const routes = await (async () => {
|
||||
return ['/posts/hello-world', '/posts/hello-again'];
|
||||
})();
|
||||
return routes;
|
||||
};
|
||||
return ['/posts/hello-world', '/posts/hello-again']
|
||||
})()
|
||||
return routes
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
target: 'static',
|
||||
router: { base: '/docs/' },
|
||||
mode: 'universal',
|
||||
generate: {
|
||||
async routes () {
|
||||
return getAllDynamicRoute();
|
||||
async routes() {
|
||||
return getAllDynamicRoute()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
const getAllDynamicRoute = async function() {
|
||||
const getAllDynamicRoute = async function () {
|
||||
const routes = await (async () => {
|
||||
return ['/posts/hello-world', '/posts/hello-again'];
|
||||
})();
|
||||
return routes;
|
||||
};
|
||||
return ['/posts/hello-world', '/posts/hello-again']
|
||||
})()
|
||||
return routes
|
||||
}
|
||||
|
||||
export default {
|
||||
target: 'static',
|
||||
router: { base: '/docs/' },
|
||||
mode: 'universal',
|
||||
generate: {
|
||||
async routes () {
|
||||
return getAllDynamicRoute();
|
||||
async routes() {
|
||||
return getAllDynamicRoute()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
const getAllDynamicRoute = async function() {
|
||||
const getAllDynamicRoute = async function () {
|
||||
const routes = await (async () => {
|
||||
return ['/posts/hello-world', '/posts/hello-again'];
|
||||
})();
|
||||
return routes;
|
||||
};
|
||||
return ['/posts/hello-world', '/posts/hello-again']
|
||||
})()
|
||||
return routes
|
||||
}
|
||||
|
||||
export default {
|
||||
mode: 'universal',
|
||||
generate: {
|
||||
async routes () {
|
||||
return getAllDynamicRoute();
|
||||
async routes() {
|
||||
return getAllDynamicRoute()
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -14,9 +14,7 @@ module.exports = {
|
||||
{ hid: 'description', name: 'description', content: '' },
|
||||
{ name: 'format-detection', content: 'telephone=no' }
|
||||
],
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||
]
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
|
||||
},
|
||||
|
||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||
@@ -36,4 +34,4 @@ module.exports = {
|
||||
|
||||
// Build Configuration: https://go.nuxtjs.dev/config-build
|
||||
build: {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,7 @@ module.exports = {
|
||||
{ hid: 'description', name: 'description', content: '' },
|
||||
{ name: 'format-detection', content: 'telephone=no' }
|
||||
],
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||
]
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
|
||||
},
|
||||
|
||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||
@@ -38,4 +36,4 @@ module.exports = {
|
||||
|
||||
// Build Configuration: https://go.nuxtjs.dev/config-build
|
||||
build: {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,7 @@ export default {
|
||||
{ hid: 'description', name: 'description', content: '' },
|
||||
{ name: 'format-detection', content: 'telephone=no' }
|
||||
],
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||
]
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
|
||||
},
|
||||
|
||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||
@@ -38,4 +36,4 @@ export default {
|
||||
|
||||
// Build Configuration: https://go.nuxtjs.dev/config-build
|
||||
build: {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,9 +14,7 @@ export default {
|
||||
{ hid: 'description', name: 'description', content: '' },
|
||||
{ name: 'format-detection', content: 'telephone=no' }
|
||||
],
|
||||
link: [
|
||||
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
|
||||
]
|
||||
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
|
||||
},
|
||||
|
||||
// Global CSS: https://go.nuxtjs.dev/config-css
|
||||
@@ -36,4 +34,4 @@ export default {
|
||||
|
||||
// Build Configuration: https://go.nuxtjs.dev/config-build
|
||||
build: {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ const core = require('@actions/core')
|
||||
const { ConfigParser } = require('./config-parser')
|
||||
const removeTrailingSlash = require('./remove-trailing-slash')
|
||||
|
||||
const SUPPORTED_FILE_EXTENSIONS = ['.js', '.cjs', '.mjs']
|
||||
|
||||
// Return the settings to be passed to a {ConfigParser} for a given static site generator,
|
||||
// optional configuration file path, and a Pages siteUrl value to inject
|
||||
function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) {
|
||||
@@ -34,7 +36,9 @@ function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, sit
|
||||
|
||||
// Disable server side image optimization too
|
||||
// https://nextjs.org/docs/api-reference/next/image#unoptimized
|
||||
'experimental.images.unoptimized': true
|
||||
'experimental.images.unoptimized': true,
|
||||
// No longer experimental as of Next.js v12.3.0
|
||||
'images.unoptimized': true
|
||||
}
|
||||
}
|
||||
case 'gatsby':
|
||||
@@ -74,11 +78,22 @@ function setPagesConfig({ staticSiteGenerator, generatorConfigFile, siteUrl }) {
|
||||
const settings = getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl })
|
||||
new ConfigParser(settings).injectAll()
|
||||
} catch (error) {
|
||||
const isSupportedFileExtension = SUPPORTED_FILE_EXTENSIONS.some(ext => generatorConfigFile.endsWith(ext))
|
||||
|
||||
// Logging
|
||||
core.warning(
|
||||
`We were unable to determine how to inject the site metadata into your config. Generated URLs may be incorrect. The base URL for this site should be ${path}. Please ensure your framework is configured to generate relative links appropriately.`,
|
||||
error
|
||||
)
|
||||
if (!isSupportedFileExtension) {
|
||||
core.warning(
|
||||
`Unsupported configuration file extension. Currently supported extensions: ${SUPPORTED_FILE_EXTENSIONS.map(
|
||||
ext => JSON.stringify(ext)
|
||||
).join(', ')}`,
|
||||
error
|
||||
)
|
||||
} else {
|
||||
core.warning(
|
||||
`We were unable to determine how to inject the site metadata into your config. Generated URLs may be incorrect. The base URL for this site should be ${siteUrl}. Please ensure your framework is configured to generate relative links appropriately.`,
|
||||
error
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,8 +2,7 @@ const fs = require('fs')
|
||||
const path = require('path')
|
||||
const core = require('@actions/core')
|
||||
|
||||
const { getConfigParserSettings } = require('./set-pages-config')
|
||||
const { ConfigParser } = require('./config-parser')
|
||||
const { setPagesConfig } = require('./set-pages-config')
|
||||
const { getTempFolder, compareFiles } = require('./test-helpers')
|
||||
|
||||
// Get the temp folder
|
||||
@@ -11,6 +10,13 @@ const tempFolder = getTempFolder()
|
||||
|
||||
const SUPPORTED_GENERATORS = ['next', 'nuxt', 'gatsby', 'sveltekit']
|
||||
const SUPPORTED_FILE_EXTENSIONS = ['.js', '.cjs', '.mjs']
|
||||
const IS_BLANK_CONFIG_FILE_REGEX = new RegExp(
|
||||
'^blank\\.(' + SUPPORTED_FILE_EXTENSIONS.map(ext => ext.slice(1)).join('|') + ')$'
|
||||
)
|
||||
|
||||
function isBlankConfigFileName(fileName) {
|
||||
return IS_BLANK_CONFIG_FILE_REGEX.test(fileName)
|
||||
}
|
||||
|
||||
// Test suite
|
||||
describe('configParser', () => {
|
||||
@@ -44,18 +50,18 @@ describe('configParser', () => {
|
||||
// Copy the source fixture to a temp file
|
||||
const fixtureSourceFile = `${fixtureFolder}/${configurationFile}`
|
||||
const fixtureTargetFile = `${tempFolder}/${configurationFile}`
|
||||
if (configurationFile !== 'blank.js') {
|
||||
if (!isBlankConfigFileName(configurationFile)) {
|
||||
fs.copyFileSync(fixtureSourceFile, fixtureTargetFile)
|
||||
} else if (fs.existsSync(fixtureTargetFile)) {
|
||||
fs.rmSync(fixtureTargetFile)
|
||||
}
|
||||
|
||||
// Get settings for the static site generator
|
||||
const settings = getConfigParserSettings({ staticSiteGenerator, siteUrl })
|
||||
// Update the settings
|
||||
settings.configurationFile = fixtureTargetFile
|
||||
// Do the injection
|
||||
new ConfigParser(settings).injectAll()
|
||||
// Do the injections for the static site generator
|
||||
setPagesConfig({
|
||||
staticSiteGenerator,
|
||||
generatorConfigFile: fixtureTargetFile,
|
||||
siteUrl
|
||||
})
|
||||
|
||||
// Read the expected file
|
||||
const expectedFile = `${fixtureFolder}/${path.basename(
|
||||
@@ -64,7 +70,7 @@ describe('configParser', () => {
|
||||
)}.expected${defaultFileExtension}`
|
||||
|
||||
// Compare the actual and expected files
|
||||
compareFiles(settings.configurationFile, expectedFile)
|
||||
compareFiles(fixtureTargetFile, expectedFile)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -77,22 +83,19 @@ describe('configParser', () => {
|
||||
// Copy the source fixture to a temp file
|
||||
const fixtureSourceFile = `${fixtureFolder}/${configurationFile}`
|
||||
const fixtureTargetFile = `${tempFolder}/${configurationFile}`
|
||||
if (configurationFile !== 'blank.js') {
|
||||
if (!isBlankConfigFileName(configurationFile)) {
|
||||
fs.copyFileSync(fixtureSourceFile, fixtureTargetFile)
|
||||
} else if (fs.existsSync(fixtureTargetFile)) {
|
||||
fs.rmSync(fixtureTargetFile)
|
||||
}
|
||||
|
||||
// Get settings for the static site generator
|
||||
const settings = getConfigParserSettings({
|
||||
// Do the injections for the static site generator
|
||||
setPagesConfig({
|
||||
staticSiteGenerator,
|
||||
generatorConfigFile: fixtureTargetFile,
|
||||
siteUrl
|
||||
})
|
||||
|
||||
// Do the injection
|
||||
new ConfigParser(settings).injectAll()
|
||||
|
||||
// Read the expected file
|
||||
const expectedFile = `${fixtureFolder}/${path.basename(
|
||||
configurationFile,
|
||||
@@ -100,7 +103,7 @@ describe('configParser', () => {
|
||||
)}.expected${fileExtension}`
|
||||
|
||||
// Compare the actual and expected files
|
||||
compareFiles(settings.configurationFile, expectedFile)
|
||||
compareFiles(fixtureTargetFile, expectedFile)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user