72 Commits

Author SHA1 Message Date
James M. Greene
5992ce8fd5 Merge pull request #48 from actions/do-not-enable-by-default
Update default behavior to NOT attempt to create/enable the Pages site
2023-01-18 15:13:37 -06:00
James M. Greene
c8deda3832 Update distributables 2023-01-18 15:03:42 -06:00
James M. Greene
5d8963e8a5 Update default behavior to NOT attempt to create/enable the Pages site 2023-01-18 15:03:22 -06:00
James M. Greene
529ba710d5 Merge pull request #47 from actions/dependabot/github_actions/actions/publish-action-0.2.2
Bump actions/publish-action from 0.2.1 to 0.2.2
2023-01-18 14:56:58 -06:00
dependabot[bot]
29e9dd5abe Bump actions/publish-action from 0.2.1 to 0.2.2
Bumps [actions/publish-action](https://github.com/actions/publish-action) from 0.2.1 to 0.2.2.
- [Release notes](https://github.com/actions/publish-action/releases)
- [Commits](https://github.com/actions/publish-action/compare/v0.2.1...v0.2.2)

---
updated-dependencies:
- dependency-name: actions/publish-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-18 20:56:23 +00:00
James M. Greene
c450a282d7 Merge pull request #45 from actions/dependabot/npm_and_yarn/json5-1.0.2
Bump json5 from 1.0.1 to 1.0.2
2023-01-18 14:55:38 -06:00
dependabot[bot]
6567d4c154 Bump json5 from 1.0.1 to 1.0.2
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-18 20:53:57 +00:00
James M. Greene
aba1aa6bab Merge pull request #46 from actions/dependabot-config
Add Dependabot config for Actions usage updates
2023-01-13 16:37:40 -06:00
James M. Greene
6a80311a73 Comply with Prettier expectations 2023-01-13 16:34:06 -06:00
James M. Greene
380c12d4cc Add Dependabot config for Actions usage updates 2023-01-13 15:59:46 -06:00
James M. Greene
c5a3e1159e Merge pull request #43 from actions/warn-unsupported-exts
Warn about unsupported file extensions after erring
2022-11-23 09:32:16 -06:00
James M. Greene
a069fede0c Update distributables after updating deps 2022-11-22 23:17:34 -06:00
James M. Greene
2f460cfbe0 Update distributables 2022-11-22 23:11:12 -06:00
James M. Greene
e5c1ee9f14 Reformat 2022-11-22 23:10:56 -06:00
James M. Greene
7fea7010df Minor revisions 2022-11-22 23:10:56 -06:00
James M. Greene
34521f23a5 Add warn for unsupported extensions 2022-11-22 23:10:37 -06:00
James M. Greene
d84b27279d Merge pull request #42 from actions/JamesMGreene-patch-1
Update to the latest `actions/publish-action`
2022-11-22 22:29:53 -06:00
James M. Greene
5650def507 Update to the latest actions/publish-action
To avoid Actions core deprecation messages.

https://github.com/actions/publish-action/releases/tag/v0.2.1
2022-11-22 22:29:07 -06:00
James M. Greene
0c2178e929 Merge pull request #41 from actions/alt-blank-extensions
Test: Better support alternative file extensions for blank config files
2022-11-22 21:35:02 -06:00
James M. Greene
948e60fb96 Reformat 2022-11-22 21:34:10 -06:00
James M. Greene
1305a1ba92 Better support alternative file extensions for blank config files in the tests 2022-11-22 21:30:53 -06:00
James M. Greene
b94e9adb36 Merge pull request #38 from actions/support-wrapped-exports
Support wrapped exports
2022-11-21 16:57:31 -06:00
James M. Greene
fc8c2c4e6e Update the distributables 2022-11-21 13:12:55 -06:00
James M. Greene
e978eba337 Add support for indirect config declarator in chained declaration statement 2022-11-21 13:12:45 -06:00
James M. Greene
343cb08233 Add tests for when multiple declarations are chained together 2022-11-21 12:36:09 -06:00
James M. Greene
f87a94c875 Update the distributables 2022-11-21 12:15:34 -06:00
James M. Greene
7eb40247a7 Format 2022-11-21 12:14:59 -06:00
James M. Greene
86f141f32d Add support for 'Indirect module export with a wrapping call at the export' 2022-11-21 12:12:47 -06:00
James M. Greene
76b6a8292e Small corrections 2022-11-21 12:08:39 -06:00
James M. Greene
8e221f24db Add support for 'Indirect module export with a wrapping call at the definition' 2022-11-21 12:05:26 -06:00
James M. Greene
d897860efd Add support for 'Indirect default export with a wrapping call at the export' 2022-11-21 11:34:58 -06:00
James M. Greene
24270f0cca Add support for 'Indirect default export with a wrapping call at the definition' 2022-11-21 11:04:42 -06:00
James M. Greene
0c3c14948a Merge branch 'main' into support-wrapped-exports 2022-11-18 01:02:58 -06:00
James M. Greene
b0c19d0de9 Merge pull request #37 from actions/merge-pr-33
Merge PR #33
2022-11-18 01:01:12 -06:00
James M. Greene
51323db177 Fix the Next.js tests 2022-11-18 00:57:58 -06:00
James M. Greene
3d9811d6e2 Update distributables 2022-11-18 00:56:40 -06:00
James M. Greene
9c3b6344a2 Merge branch 'main' into patch-1 2022-11-18 00:50:11 -06:00
James M. Greene
97fb35057c Add comment 2022-11-18 00:50:00 -06:00
James M. Greene
c917d1c3cd Merge pull request #35 from actions/bump-actions
Bump actions
2022-11-18 00:46:30 -06:00
James M. Greene
ffa824f004 Start making some of those tests pass 2022-11-18 00:45:01 -06:00
James M. Greene
d4a76d1ee1 Add unit tests to verify support for function-wrapped exports 2022-11-18 00:29:31 -06:00
Yoann Chaudet
bd8a5da49f Bump actions 2022-10-31 16:34:08 -07:00
Kapil Koju
5cb77813a2 Add back experimental.images.unoptimized for old NextJS 2022-10-24 23:46:06 -04:00
Kapil Koju
2094727a1b Fix nextjs images.unoptimized config path name
`images.unoptimized` is no longer in `experimental` and is stable with NextJS `v12.3.0`.
https://nextjs.org/docs/api-reference/next/image#unoptimized
2022-10-24 23:09:43 -04:00
Mingzi
d875fa8dc1 Merge pull request #31 from rentziass/rentziass/update-actions-core
Update @actions/core to 1.10.0
2022-10-06 09:56:39 -07:00
Francesco Renzi
67f329fcfd Update @actions/core to 1.10.0 2022-10-06 11:08:55 +01:00
James M. Greene
2ce6d5eaa1 Merge pull request #27 from actions/fix-readme-links
Fix non-Code links in README
2022-09-26 12:01:36 -05:00
James M. Greene
bb6976f8d1 Merge branch 'main' into fix-readme-links 2022-09-26 11:00:10 -05:00
James M. Greene
f2098a32c3 Merge pull request #26 from actions/unused-deps
Clean up some unused dependencies
2022-09-26 10:59:55 -05:00
James M. Greene
7fa35a05fd Merge branch 'main' into unused-deps 2022-09-26 10:58:37 -05:00
James M. Greene
c3113876b0 Merge pull request #25 from actions/eslint-roller
Add ESLint
2022-09-26 10:52:23 -05:00
James M. Greene
af5f3c3f72 Merge branch 'main' into eslint-roller 2022-09-21 16:18:10 -05:00
James M. Greene
ad83b485e7 Merge pull request #24 from actions/i-feel-pretty
Expand Prettier usage
2022-09-21 16:17:21 -05:00
James M. Greene
a84400a87f Fix non-Code links in README 2022-09-19 10:50:02 -05:00
James M. Greene
7a0a617c8a Remove unused dependencies 2022-09-16 23:20:01 -05:00
James M. Greene
062df390be Make ESLint fail hard on semi-colon usage 2022-09-16 23:00:18 -05:00
James M. Greene
7619de7040 Simplify ESLint ignore pattern 2022-09-16 22:55:06 -05:00
James M. Greene
66e9ac3c2e Add an 'all' script and simplify 'prepare' 2022-09-16 22:54:24 -05:00
James M. Greene
4012a9fa87 Correct Actions input parameter name 2022-09-16 22:43:42 -05:00
James M. Greene
4a12ff50fb Update distributables 2022-09-16 22:41:27 -05:00
James M. Greene
a07391ec25 Don't lint during prepare 2022-09-16 22:03:34 -05:00
James M. Greene
2491ca8488 Reformat ESLint config 2022-09-16 22:03:15 -05:00
James M. Greene
875ec87ff9 Remove stray line break 2022-09-16 22:01:13 -05:00
James M. Greene
4eadc891b5 Add Actions workflow to verify lint status 2022-09-16 21:57:04 -05:00
James M. Greene
c4feb8d01e Ignore ESLint rule about condition looping condition for now 2022-09-16 21:56:47 -05:00
James M. Greene
1f9ca39237 Fix bad reference in string interpolation
Regression from https://github.com/actions/configure-pages/pull/21
2022-09-16 21:54:58 -05:00
James M. Greene
1cefe6fc7c Remove unnecessary try/catch 2022-09-16 21:50:49 -05:00
James M. Greene
25a1ec8799 Add eslint configuration and scripts 2022-09-16 21:48:52 -05:00
James M. Greene
b9c4ac6c14 Minor workflow improvements 2022-09-16 20:48:19 -05:00
James M. Greene
6e4f93b15d Add eslint dependency and plugins 2022-09-16 20:47:23 -05:00
James M. Greene
069c984c5e Let Prettier reformat all of the things 2022-09-16 20:37:18 -05:00
James M. Greene
b030b061cb Allow prettier to check more files that it's capable of handling 2022-09-16 20:35:47 -05:00
34 changed files with 4585 additions and 374 deletions

17
.eslintrc.json Normal file
View 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/"]
}

6
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'

View File

@@ -1,6 +1,6 @@
--- ---
name-template: "v$RESOLVED_VERSION" name-template: 'v$RESOLVED_VERSION'
tag-template: "v$RESOLVED_VERSION" tag-template: 'v$RESOLVED_VERSION'
template: | template: |
# Changelog # 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. See details of [all code changes](https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION) since previous release.
categories: categories:
- title: "🚀 Features" - title: '🚀 Features'
labels: labels:
- "feature" - 'feature'
- "enhancement" - 'enhancement'
- title: "🐛 Bug Fixes" - title: '🐛 Bug Fixes'
labels: labels:
- "fix" - 'fix'
- "bugfix" - 'bugfix'
- "bug" - 'bug'
- title: "🧰 Maintenance" - title: '🧰 Maintenance'
labels: labels:
- "infrastructure" - 'infrastructure'
- "automation" - 'automation'
- "documentation" - 'documentation'
- title: "🏎 Performance" - title: '🏎 Performance'
label: "performance" label: 'performance'
change-template: "- $TITLE @$AUTHOR (#$NUMBER)" change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
version-resolver: version-resolver:
major: major:
labels: labels:
- "type: breaking" - 'type: breaking'
minor: minor:
labels: labels:
- "type: enhancement" - 'type: enhancement'
patch: patch:
labels: labels:
- "type: bug" - 'type: bug'
- "type: maintenance" - 'type: maintenance'
- "type: documentation" - 'type: documentation'
default: patch default: patch

View File

@@ -1,4 +1,4 @@
name: Checking formatting name: Check formatting
on: on:
push: push:
@@ -17,11 +17,12 @@ concurrency:
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 2
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Setup Node.JS - name: Setup Node
uses: actions/setup-node@v3 uses: actions/setup-node@v3
with: with:
node-version: 16.x node-version: 16.x

View File

@@ -11,7 +11,7 @@ jobs:
draft-release: draft-release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: release-drafter/release-drafter@v5 - uses: release-drafter/release-drafter@v5
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

35
.github/workflows/lint.yml vendored Normal file
View 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

View File

@@ -5,7 +5,7 @@ on:
workflow_dispatch: workflow_dispatch:
inputs: inputs:
TAG_NAME: TAG_NAME:
description: "Tag name that the major tag will point to" description: 'Tag name that the major tag will point to'
required: true required: true
env: env:
@@ -24,7 +24,7 @@ jobs:
steps: steps:
- name: Update the ${{ env.TAG_NAME }} tag - name: Update the ${{ env.TAG_NAME }} tag
id: update-major-tag id: update-major-tag
uses: actions/publish-action@v0.1.0 uses: actions/publish-action@v0.2.2
with: with:
source-tag: ${{ env.TAG_NAME }} source-tag: ${{ env.TAG_NAME }}
slack-webhook: ${{ secrets.SLACK_WEBHOOK }} slack-webhook: ${{ secrets.SLACK_WEBHOOK }}

5
.prettierignore Normal file
View File

@@ -0,0 +1,5 @@
# Ignore build artifacts
/dist/
# Ignore all Markdown files
*.md

View File

@@ -26,7 +26,7 @@ The scripts and documentation in this project are released under the [MIT Licens
<!-- references --> <!-- references -->
[starter-workflows]: https://github.com/actions/starter-workflows/tree/main/pages [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 [draft-release]: .github/workflows/draft-release.yml
[release]: .github/workflows/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

View File

@@ -16,8 +16,8 @@ inputs:
default: ${{ github.token }} default: ${{ github.token }}
required: true required: true
enablement: enablement:
description: 'Should a Pages site be enabled for the repository if not so already?' description: 'Should a Pages site be enabled for the repository if not so already? This will only work with user-to-server tokens.'
default: 'true' default: 'false'
required: false required: false
outputs: outputs:
base_url: base_url:

408
dist/index.js vendored
View File

@@ -140,7 +140,6 @@ const file_command_1 = __nccwpck_require__(717);
const utils_1 = __nccwpck_require__(5278); const utils_1 = __nccwpck_require__(5278);
const os = __importStar(__nccwpck_require__(2037)); const os = __importStar(__nccwpck_require__(2037));
const path = __importStar(__nccwpck_require__(1017)); const path = __importStar(__nccwpck_require__(1017));
const uuid_1 = __nccwpck_require__(5840);
const oidc_utils_1 = __nccwpck_require__(8041); const oidc_utils_1 = __nccwpck_require__(8041);
/** /**
* The code to exit an action * The code to exit an action
@@ -170,21 +169,10 @@ function exportVariable(name, val) {
process.env[name] = convertedVal; process.env[name] = convertedVal;
const filePath = process.env['GITHUB_ENV'] || ''; const filePath = process.env['GITHUB_ENV'] || '';
if (filePath) { if (filePath) {
const delimiter = `ghadelimiter_${uuid_1.v4()}`; return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val));
// These should realistically never happen, but just in case someone finds a way to exploit uuid generation let's not allow keys or values that contain the delimiter.
if (name.includes(delimiter)) {
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
} }
if (convertedVal.includes(delimiter)) {
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
}
const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
file_command_1.issueCommand('ENV', commandValue);
}
else {
command_1.issueCommand('set-env', { name }, convertedVal); command_1.issueCommand('set-env', { name }, convertedVal);
} }
}
exports.exportVariable = exportVariable; exports.exportVariable = exportVariable;
/** /**
* Registers a secret which will get masked from logs * Registers a secret which will get masked from logs
@@ -201,7 +189,7 @@ exports.setSecret = setSecret;
function addPath(inputPath) { function addPath(inputPath) {
const filePath = process.env['GITHUB_PATH'] || ''; const filePath = process.env['GITHUB_PATH'] || '';
if (filePath) { if (filePath) {
file_command_1.issueCommand('PATH', inputPath); file_command_1.issueFileCommand('PATH', inputPath);
} }
else { else {
command_1.issueCommand('add-path', {}, inputPath); command_1.issueCommand('add-path', {}, inputPath);
@@ -241,8 +229,11 @@ function getMultilineInput(name, options) {
const inputs = getInput(name, options) const inputs = getInput(name, options)
.split('\n') .split('\n')
.filter(x => x !== ''); .filter(x => x !== '');
if (options && options.trimWhitespace === false) {
return inputs; return inputs;
} }
return inputs.map(input => input.trim());
}
exports.getMultilineInput = getMultilineInput; exports.getMultilineInput = getMultilineInput;
/** /**
* Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification.
@@ -274,8 +265,12 @@ exports.getBooleanInput = getBooleanInput;
*/ */
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function setOutput(name, value) { function setOutput(name, value) {
const filePath = process.env['GITHUB_OUTPUT'] || '';
if (filePath) {
return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value));
}
process.stdout.write(os.EOL); process.stdout.write(os.EOL);
command_1.issueCommand('set-output', { name }, value); command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value));
} }
exports.setOutput = setOutput; exports.setOutput = setOutput;
/** /**
@@ -404,7 +399,11 @@ exports.group = group;
*/ */
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
function saveState(name, value) { function saveState(name, value) {
command_1.issueCommand('save-state', { name }, value); const filePath = process.env['GITHUB_STATE'] || '';
if (filePath) {
return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value));
}
command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value));
} }
exports.saveState = saveState; exports.saveState = saveState;
/** /**
@@ -470,13 +469,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
return result; return result;
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.issueCommand = void 0; exports.prepareKeyValueMessage = exports.issueFileCommand = void 0;
// We use any as a valid input type // We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
const fs = __importStar(__nccwpck_require__(7147)); const fs = __importStar(__nccwpck_require__(7147));
const os = __importStar(__nccwpck_require__(2037)); const os = __importStar(__nccwpck_require__(2037));
const uuid_1 = __nccwpck_require__(5840);
const utils_1 = __nccwpck_require__(5278); const utils_1 = __nccwpck_require__(5278);
function issueCommand(command, message) { function issueFileCommand(command, message) {
const filePath = process.env[`GITHUB_${command}`]; const filePath = process.env[`GITHUB_${command}`];
if (!filePath) { if (!filePath) {
throw new Error(`Unable to find environment variable for file command ${command}`); throw new Error(`Unable to find environment variable for file command ${command}`);
@@ -488,7 +488,22 @@ function issueCommand(command, message) {
encoding: 'utf8' encoding: 'utf8'
}); });
} }
exports.issueCommand = issueCommand; exports.issueFileCommand = issueFileCommand;
function prepareKeyValueMessage(key, value) {
const delimiter = `ghadelimiter_${uuid_1.v4()}`;
const convertedValue = utils_1.toCommandValue(value);
// These should realistically never happen, but just in case someone finds a
// way to exploit uuid generation let's not allow keys or values that contain
// the delimiter.
if (key.includes(delimiter)) {
throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`);
}
if (convertedValue.includes(delimiter)) {
throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`);
}
return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`;
}
exports.prepareKeyValueMessage = prepareKeyValueMessage;
//# sourceMappingURL=file-command.js.map //# sourceMappingURL=file-command.js.map
/***/ }), /***/ }),
@@ -2836,10 +2851,10 @@ module.exports = {
var defaultOptions = { var defaultOptions = {
// `ecmaVersion` indicates the ECMAScript version to parse. Must be // `ecmaVersion` indicates the ECMAScript version to parse. Must be
// either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10
// (2019), 11 (2020), 12 (2021), 13 (2022), or `"latest"` (the // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"`
// latest version the library supports). This influences support // (the latest version the library supports). This influences
// for strict mode, the set of reserved words, and support for // support for strict mode, the set of reserved words, and support
// new syntax features. // for new syntax features.
ecmaVersion: null, ecmaVersion: null,
// `sourceType` indicates the mode the code should be parsed in. // `sourceType` indicates the mode the code should be parsed in.
// Can be either `"script"` or `"module"`. This influences global // Can be either `"script"` or `"module"`. This influences global
@@ -2873,8 +2888,9 @@ module.exports = {
// When enabled, super identifiers are not constrained to // When enabled, super identifiers are not constrained to
// appearing in methods and do not raise an error when they appear elsewhere. // appearing in methods and do not raise an error when they appear elsewhere.
allowSuperOutsideMethod: null, allowSuperOutsideMethod: null,
// When enabled, hashbang directive in the beginning of file // When enabled, hashbang directive in the beginning of file is
// is allowed and treated as a line comment. // allowed and treated as a line comment. Enabled by default when
// `ecmaVersion` >= 2023.
allowHashBang: false, allowHashBang: false,
// When `locations` is on, `loc` properties holding objects with // When `locations` is on, `loc` properties holding objects with
// `start` and `end` properties in `{line, column}` form (with // `start` and `end` properties in `{line, column}` form (with
@@ -2949,6 +2965,9 @@ module.exports = {
if (options.allowReserved == null) if (options.allowReserved == null)
{ options.allowReserved = options.ecmaVersion < 5; } { options.allowReserved = options.ecmaVersion < 5; }
if (opts.allowHashBang == null)
{ options.allowHashBang = options.ecmaVersion >= 14; }
if (isArray(options.onToken)) { if (isArray(options.onToken)) {
var tokens = options.onToken; var tokens = options.onToken;
options.onToken = function (token) { return tokens.push(token); }; options.onToken = function (token) { return tokens.push(token); };
@@ -3279,7 +3298,7 @@ module.exports = {
if (refDestructuringErrors.trailingComma > -1) if (refDestructuringErrors.trailingComma > -1)
{ this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); }
var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;
if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } if (parens > -1) { this.raiseRecoverable(parens, isAssign ? "Assigning to rvalue" : "Parenthesized pattern"); }
}; };
pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) { pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {
@@ -4375,6 +4394,7 @@ module.exports = {
}; };
pp$8.isDirectiveCandidate = function(statement) { pp$8.isDirectiveCandidate = function(statement) {
return ( return (
this.options.ecmaVersion >= 5 &&
statement.type === "ExpressionStatement" && statement.type === "ExpressionStatement" &&
statement.expression.type === "Literal" && statement.expression.type === "Literal" &&
typeof statement.expression.value === "string" && typeof statement.expression.value === "string" &&
@@ -4785,7 +4805,8 @@ module.exports = {
{ this.exprAllowed = type.beforeExpr; } { this.exprAllowed = type.beforeExpr; }
}; };
// Used to handle egde case when token context could not be inferred correctly in tokenize phase // Used to handle egde cases when token context could not be inferred correctly during tokenization phase
pp$6.overrideContext = function(tokenCtx) { pp$6.overrideContext = function(tokenCtx) {
if (this.curContext() !== tokenCtx) { if (this.curContext() !== tokenCtx) {
this.context[this.context.length - 1] = tokenCtx; this.context[this.context.length - 1] = tokenCtx;
@@ -5601,15 +5622,6 @@ module.exports = {
} }
return this.finishNode(prop, "RestElement") return this.finishNode(prop, "RestElement")
} }
// To disallow parenthesized identifier via `this.toAssignable()`.
if (this.type === types$1.parenL && refDestructuringErrors) {
if (refDestructuringErrors.parenthesizedAssign < 0) {
refDestructuringErrors.parenthesizedAssign = this.start;
}
if (refDestructuringErrors.parenthesizedBind < 0) {
refDestructuringErrors.parenthesizedBind = this.start;
}
}
// Parse argument. // Parse argument.
prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);
// To disallow trailing comma via `this.toAssignable()`. // To disallow trailing comma via `this.toAssignable()`.
@@ -8039,7 +8051,7 @@ module.exports = {
// Acorn is a tiny, fast JavaScript parser written in JavaScript. // Acorn is a tiny, fast JavaScript parser written in JavaScript.
var version = "8.7.1"; var version = "8.8.0";
Parser.acorn = { Parser.acorn = {
Parser: Parser, Parser: Parser,
@@ -15189,7 +15201,6 @@ async function enablePagesSite({ repositoryNwo, githubToken }) {
} }
async function getPagesSite({ 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, { const response = await axios.get(pagesEndpoint, {
@@ -15201,9 +15212,6 @@ async function getPagesSite({ repositoryNwo, githubToken }) {
const pageObject = response.data const pageObject = response.data
return pageObject return pageObject
} catch (error) {
throw error
}
} }
async function findOrCreatePagesSite({ repositoryNwo, githubToken, enablement = true }) { async function findOrCreatePagesSite({ repositoryNwo, githubToken, enablement = true }) {
@@ -15263,7 +15271,7 @@ Pages's path based routing (and work).
Supported configuration initializations: Supported configuration initializations:
(1) Default export: (1) Direct default export:
export default { export default {
// configuration object here // configuration object here
@@ -15275,19 +15283,69 @@ Supported configuration initializations:
// configuration object here // 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 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 { class ConfigParser {
// Ctor // Ctor
// - configurationFile: path to the configuration file // - configurationFile: path to the configuration file
// - blankConfigurationFile: a blank configuration file to use if non was previously found // - blankConfigurationFile: a blank configuration file to use if non was previously found
constructor({ configurationFile, blankConfigurationFile, properties }) { constructor({ configurationFile, blankConfigurationFile, allowWrappingCall = false, properties }) {
// Save field // Save field
this.configurationFile = configurationFile this.configurationFile = configurationFile
this.allowWrappingCall = allowWrappingCall === true
this.properties = properties this.properties = properties
// If the configuration file does not exist, initialize it with the blank configuration file // If the configuration file does not exist, initialize it with the blank configuration file
@@ -15303,12 +15361,43 @@ class ConfigParser {
this.configuration = fs.readFileSync(this.configurationFile, 'utf8') 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. // Find the configuration object in an AST.
// Look for a default export, a direct module export or an indirect module // Look for, in order:
// export (in that 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. // Return the configuration object or null.
findConfigurationObject(ast) { findConfigurationObject(ast, allowWrappingCall = false) {
// Try to find a default export // Try to find a default export
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration') var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
@@ -15318,21 +15407,61 @@ class ConfigParser {
return defaultExport.declaration 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 // Indirect default export
else if (defaultExport && defaultExport.declaration.type === 'Identifier') { else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
const identifierName = defaultExport.declaration.name const identifierName = defaultExport.declaration.name
const identifierDefinition = ast.body.find( const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
node => const identifierInitialization = identifierDeclarator && identifierDeclarator.init
node.type === 'VariableDeclaration' && if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
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) {
core.info('Found configuration object in indirect default export declaration') 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
} }
} }
@@ -15355,21 +15484,57 @@ class ConfigParser {
return moduleExport.expression.right 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 // Indirect module export
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') { else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
const identifierName = moduleExport && moduleExport.expression.right.name const identifierName = moduleExport && moduleExport.expression.right.name
const identifierDefinition = ast.body.find( const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
node => const identifierInitialization = identifierDeclarator && identifierDeclarator.init
node.type === 'VariableDeclaration' && if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
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) {
core.info('Found configuration object in indirect module export') 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
} }
} }
@@ -15433,7 +15598,7 @@ class ConfigParser {
const ast = espree.parse(this.configuration, espreeOptions) const ast = espree.parse(this.configuration, espreeOptions)
// Find the configuration object // Find the configuration object
var configurationObject = this.findConfigurationObject(ast) var configurationObject = this.findConfigurationObject(ast, this.allowWrappingCall)
if (!configurationObject) { if (!configurationObject) {
throw 'Could not find a configuration object in the configuration file' throw 'Could not find a configuration object in the configuration file'
} }
@@ -15443,6 +15608,7 @@ class ConfigParser {
var depth = 0 var depth = 0
const properties = propertyName.split('.') const properties = propertyName.split('.')
var lastNode = configurationObject var lastNode = configurationObject
// eslint-disable-next-line no-constant-condition
while (true) { while (true) {
// Find the node for the current property // Find the node for the current property
var propertyNode = this.findProperty(lastNode, properties[depth]) var propertyNode = this.findProperty(lastNode, properties[depth])
@@ -15546,7 +15712,7 @@ function getRequiredVars() {
githubToken: core.getInput('token'), githubToken: core.getInput('token'),
staticSiteGenerator: core.getInput('static_site_generator'), staticSiteGenerator: core.getInput('static_site_generator'),
generatorConfigFile: core.getInput('generator_config_file'), generatorConfigFile: core.getInput('generator_config_file'),
enablement: core.getInput('enablement') !== 'false' enablement: core.getInput('enablement') !== 'true'
} }
} }
@@ -15606,6 +15772,8 @@ const core = __nccwpck_require__(2186)
const { ConfigParser } = __nccwpck_require__(8395) const { ConfigParser } = __nccwpck_require__(8395)
const removeTrailingSlash = __nccwpck_require__(9255) const removeTrailingSlash = __nccwpck_require__(9255)
const SUPPORTED_FILE_EXTENSIONS = ['.js', '.cjs', '.mjs']
// Return the settings to be passed to a {ConfigParser} for a given static site generator, // 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 // optional configuration file path, and a Pages siteUrl value to inject
function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) { function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) {
@@ -15638,7 +15806,9 @@ function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, sit
// Disable server side image optimization too // Disable server side image optimization too
// https://nextjs.org/docs/api-reference/next/image#unoptimized // 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': case 'gatsby':
@@ -15678,11 +15848,22 @@ function setPagesConfig({ staticSiteGenerator, generatorConfigFile, siteUrl }) {
const settings = getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) const settings = getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl })
new ConfigParser(settings).injectAll() new ConfigParser(settings).injectAll()
} catch (error) { } catch (error) {
const isSupportedFileExtension = SUPPORTED_FILE_EXTENSIONS.some(ext => generatorConfigFile.endsWith(ext))
// Logging // Logging
if (!isSupportedFileExtension) {
core.warning( 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.`, `Unsupported configuration file extension. Currently supported extensions: ${SUPPORTED_FILE_EXTENSIONS.map(
ext => JSON.stringify(ext)
).join(', ')}`,
error 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
)
}
} }
} }
@@ -16509,14 +16690,15 @@ TokenTranslator.prototype = {
const SUPPORTED_VERSIONS = [ const SUPPORTED_VERSIONS = [
3, 3,
5, 5,
6, 6, // 2015
7, 7, // 2016
8, 8, // 2017
9, 9, // 2018
10, 10, // 2019
11, 11, // 2020
12, 12, // 2021
13 13, // 2022
14 // 2023
]; ];
/** /**
@@ -16634,12 +16816,23 @@ const ESPRIMA_FINISH_NODE = Symbol("espree's esprimaFinishNode");
* @param {int} end The index at which the comment ends. * @param {int} end The index at which the comment ends.
* @param {Location} startLoc The location at which the comment starts. * @param {Location} startLoc The location at which the comment starts.
* @param {Location} endLoc The location at which the comment ends. * @param {Location} endLoc The location at which the comment ends.
* @param {string} code The source code being parsed.
* @returns {Object} The comment object. * @returns {Object} The comment object.
* @private * @private
*/ */
function convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc) { function convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc, code) {
let type;
if (block) {
type = "Block";
} else if (code.slice(start, start + 2) === "#!") {
type = "Hashbang";
} else {
type = "Line";
}
const comment = { const comment = {
type: block ? "Block" : "Line", type,
value: text value: text
}; };
@@ -16684,6 +16877,25 @@ var espree = () => Parser => {
? new TokenTranslator(tokTypes, code) ? new TokenTranslator(tokTypes, code)
: null; : null;
/*
* Data that is unique to Espree and is not represented internally
* in Acorn.
*
* For ES2023 hashbangs, Espree will call `onComment()` during the
* constructor, so we must define state before having access to
* `this`.
*/
const state = {
originalSourceType: originalSourceType || options.sourceType,
tokens: tokenTranslator ? [] : null,
comments: options.comment === true ? [] : null,
impliedStrict: ecmaFeatures.impliedStrict === true && options.ecmaVersion >= 5,
ecmaVersion: options.ecmaVersion,
jsxAttrValueToken: false,
lastToken: null,
templateElements: []
};
// Initialize acorn parser. // Initialize acorn parser.
super({ super({
@@ -16702,38 +16914,28 @@ var espree = () => Parser => {
if (tokenTranslator) { if (tokenTranslator) {
// Use `tokens`, `ecmaVersion`, and `jsxAttrValueToken` in the state. // Use `tokens`, `ecmaVersion`, and `jsxAttrValueToken` in the state.
tokenTranslator.onToken(token, this[STATE]); tokenTranslator.onToken(token, state);
} }
if (token.type !== tokTypes.eof) { if (token.type !== tokTypes.eof) {
this[STATE].lastToken = token; state.lastToken = token;
} }
}, },
// Collect comments // Collect comments
onComment: (block, text, start, end, startLoc, endLoc) => { onComment: (block, text, start, end, startLoc, endLoc) => {
if (this[STATE].comments) { if (state.comments) {
const comment = convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc); const comment = convertAcornCommentToEsprimaComment(block, text, start, end, startLoc, endLoc, code);
this[STATE].comments.push(comment); state.comments.push(comment);
} }
} }
}, code); }, code);
/* /*
* Data that is unique to Espree and is not represented internally in * We put all of this data into a symbol property as a way to avoid
* Acorn. We put all of this data into a symbol property as a way to * potential naming conflicts with future versions of Acorn.
* avoid potential naming conflicts with future versions of Acorn.
*/ */
this[STATE] = { this[STATE] = state;
originalSourceType: originalSourceType || options.sourceType,
tokens: tokenTranslator ? [] : null,
comments: options.comment === true ? [] : null,
impliedStrict: ecmaFeatures.impliedStrict === true && this.options.ecmaVersion >= 5,
ecmaVersion: this.options.ecmaVersion,
jsxAttrValueToken: false,
lastToken: null,
templateElements: []
};
} }
tokenize() { tokenize() {
@@ -16946,7 +17148,7 @@ var espree = () => Parser => {
}; };
}; };
const version$1 = "9.3.2"; const version$1 = "9.4.0";
/** /**
* @fileoverview Main Espree file that converts Acorn into Esprima output. * @fileoverview Main Espree file that converts Acorn into Esprima output.

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

3882
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -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.", "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", "main": "./dist/index.js",
"scripts": { "scripts": {
"format": "prettier --write 'src/**/*.js'", "all": "npm run format && npm run lint && npm run prepare && npm run test",
"format:check": "prettier --check 'src/**/*.js'", "format": "prettier --write .",
"prepare": "npm run format && ncc build src/index.js -o dist --source-map --license licenses.txt", "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" "test": "jest"
}, },
"repository": { "repository": {
@@ -21,14 +24,15 @@
}, },
"homepage": "https://github.com/actions/configure-pages#readme", "homepage": "https://github.com/actions/configure-pages#readme",
"dependencies": { "dependencies": {
"@actions/core": "^1.9.1", "@actions/core": "^1.10.0",
"axios": "^0.27.2", "axios": "^0.27.2",
"axios-retry": "^3.2.5", "espree": "^9.3.2"
"espree": "^9.3.2",
"string-format": "^1.0.0"
}, },
"devDependencies": { "devDependencies": {
"@vercel/ncc": "^0.34.0", "@vercel/ncc": "^0.34.0",
"eslint": "^8.23.1",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-github": "^4.3.7",
"jest": "^28.1.1", "jest": "^28.1.1",
"prettier": "^2.7.1" "prettier": "^2.7.1"
} }

View File

@@ -33,7 +33,6 @@ async function enablePagesSite({ repositoryNwo, githubToken }) {
} }
async function getPagesSite({ 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, { const response = await axios.get(pagesEndpoint, {
@@ -45,9 +44,6 @@ async function getPagesSite({ repositoryNwo, githubToken }) {
const pageObject = response.data const pageObject = response.data
return pageObject return pageObject
} catch (error) {
throw error
}
} }
async function findOrCreatePagesSite({ repositoryNwo, githubToken, enablement = true }) { async function findOrCreatePagesSite({ repositoryNwo, githubToken, enablement = true }) {

View File

@@ -9,7 +9,7 @@ Pages's path based routing (and work).
Supported configuration initializations: Supported configuration initializations:
(1) Default export: (1) Direct default export:
export default { export default {
// configuration object here // configuration object here
@@ -21,19 +21,69 @@ Supported configuration initializations:
// configuration object here // 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 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 { class ConfigParser {
// Ctor // Ctor
// - configurationFile: path to the configuration file // - configurationFile: path to the configuration file
// - blankConfigurationFile: a blank configuration file to use if non was previously found // - blankConfigurationFile: a blank configuration file to use if non was previously found
constructor({ configurationFile, blankConfigurationFile, properties }) { constructor({ configurationFile, blankConfigurationFile, allowWrappingCall = false, properties }) {
// Save field // Save field
this.configurationFile = configurationFile this.configurationFile = configurationFile
this.allowWrappingCall = allowWrappingCall === true
this.properties = properties this.properties = properties
// If the configuration file does not exist, initialize it with the blank configuration file // 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') 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. // Find the configuration object in an AST.
// Look for a default export, a direct module export or an indirect module // Look for, in order:
// export (in that 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. // Return the configuration object or null.
findConfigurationObject(ast) { findConfigurationObject(ast, allowWrappingCall = false) {
// Try to find a default export // Try to find a default export
var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration') var defaultExport = ast.body.find(node => node.type === 'ExportDefaultDeclaration')
@@ -64,21 +145,61 @@ class ConfigParser {
return defaultExport.declaration 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 // Indirect default export
else if (defaultExport && defaultExport.declaration.type === 'Identifier') { else if (defaultExport && defaultExport.declaration.type === 'Identifier') {
const identifierName = defaultExport.declaration.name const identifierName = defaultExport.declaration.name
const identifierDefinition = ast.body.find( const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
node => const identifierInitialization = identifierDeclarator && identifierDeclarator.init
node.type === 'VariableDeclaration' && if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
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) {
core.info('Found configuration object in indirect default export declaration') 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 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 // Indirect module export
else if (moduleExport && moduleExport.expression.right.type === 'Identifier') { else if (moduleExport && moduleExport.expression.right.type === 'Identifier') {
const identifierName = moduleExport && moduleExport.expression.right.name const identifierName = moduleExport && moduleExport.expression.right.name
const identifierDefinition = ast.body.find( const identifierDeclarator = this.findTopLevelVariableDeclarator(ast, identifierName)
node => const identifierInitialization = identifierDeclarator && identifierDeclarator.init
node.type === 'VariableDeclaration' && if (identifierInitialization && identifierInitialization.type === 'ObjectExpression') {
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) {
core.info('Found configuration object in indirect module export') 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) const ast = espree.parse(this.configuration, espreeOptions)
// Find the configuration object // Find the configuration object
var configurationObject = this.findConfigurationObject(ast) var configurationObject = this.findConfigurationObject(ast, this.allowWrappingCall)
if (!configurationObject) { if (!configurationObject) {
throw 'Could not find a configuration object in the configuration file' throw 'Could not find a configuration object in the configuration file'
} }
@@ -189,6 +346,7 @@ class ConfigParser {
var depth = 0 var depth = 0
const properties = propertyName.split('.') const properties = propertyName.split('.')
var lastNode = configurationObject var lastNode = configurationObject
// eslint-disable-next-line no-constant-condition
while (true) { while (true) {
// Find the node for the current property // Find the node for the current property
var propertyNode = this.findProperty(lastNode, properties[depth]) var propertyNode = this.findProperty(lastNode, properties[depth])

View File

@@ -10,7 +10,7 @@ const tempFolder = getTempFolder()
// Cases to test // Cases to test
const cases = [ const cases = [
// //
// Default export // Direct default export
// //
{ {
property: 'property', property: 'property',
@@ -97,11 +97,13 @@ const cases = [
source: 'const config = {}; export default config', source: 'const config = {}; export default config',
expected: 'const config = { property: "value"}; export default config' expected: 'const config = { property: "value"}; export default config'
}, },
// with more than 1 declaration chained together
{ {
property: 'property', property: 'property',
source: 'var config = {}; export default config', source: 'var temp = {}, config = {}; export default config',
expected: 'var config = { property: "value"}; export default config' expected: 'var temp = {}, config = { property: "value"}; export default config'
}, },
// deeper
{ {
property: 'a.b.c', property: 'a.b.c',
source: 'var config = {}; export default config', source: 'var config = {}; export default config',
@@ -140,11 +142,13 @@ const cases = [
source: 'const config = {}; module.exports = config', source: 'const config = {}; module.exports = config',
expected: 'const config = { property: "value"}; module.exports = config' expected: 'const config = { property: "value"}; module.exports = config'
}, },
// with more than 1 declaration chained together
{ {
property: 'property', property: 'property',
source: 'var config = {}; module.exports = config', source: 'var temp = {}, config = {}; module.exports = config',
expected: 'var config = { property: "value"}; module.exports = config' expected: 'var temp = {}, config = { property: "value"}; module.exports = config'
}, },
// deeper
{ {
property: 'a.b.c', property: 'a.b.c',
source: 'var config = {}; module.exports = config', source: 'var config = {}; module.exports = config',
@@ -154,6 +158,109 @@ const cases = [
property: 'a.b.c', property: 'a.b.c',
source: 'var config = { a: { b: [], c: "hello" } }; module.exports = config', source: 'var config = { a: { b: [], c: "hello" } }; module.exports = config',
expected: 'var config = { a: { b: { c: "value"}, 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()) 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}`, () => { it(`injects path properly for case #${index}`, () => {
// Write the source file // Write the source file
const sourceFile = `${tempFolder}/source.js` const sourceFile = `${tempFolder}/source.js`
@@ -180,7 +287,8 @@ describe('config-parser', () => {
// Update the settings and do the injection // Update the settings and do the injection
new ConfigParser({ new ConfigParser({
configurationFile: sourceFile configurationFile: sourceFile,
allowWrappingCall
}).inject(property, 'value') }).inject(property, 'value')
// Compare the files // Compare the files

View File

@@ -7,7 +7,7 @@ function getRequiredVars() {
githubToken: core.getInput('token'), githubToken: core.getInput('token'),
staticSiteGenerator: core.getInput('static_site_generator'), staticSiteGenerator: core.getInput('static_site_generator'),
generatorConfigFile: core.getInput('generator_config_file'), generatorConfigFile: core.getInput('generator_config_file'),
enablement: core.getInput('enablement') !== 'false' enablement: core.getInput('enablement') !== 'true'
} }
} }

View File

@@ -1,3 +1,3 @@
// Default Pages configuration for Next // 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 module.exports = nextConfig

View File

@@ -1,7 +1,7 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
swcMinify: true, swcMinify: true
} }
module.exports = nextConfig module.exports = nextConfig

View File

@@ -1,5 +1,6 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
images: { unoptimized: true },
experimental: { images: { unoptimized: true } }, experimental: { images: { unoptimized: true } },
basePath: '/docs', basePath: '/docs',
reactStrictMode: true, reactStrictMode: true,

View File

@@ -1,5 +1,6 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
images: { unoptimized: true },
experimental: { images: { unoptimized: true } }, experimental: { images: { unoptimized: true } },
basePath: '/docs', basePath: '/docs',
reactStrictMode: true, reactStrictMode: true,

View File

@@ -1,5 +1,6 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
images: { unoptimized: true },
experimental: { images: { unoptimized: true } }, experimental: { images: { unoptimized: true } },
basePath: '/docs', basePath: '/docs',
reactStrictMode: true, reactStrictMode: true,

View File

@@ -1,7 +1,7 @@
/** @type {import('next').NextConfig} */ /** @type {import('next').NextConfig} */
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
swcMinify: true, swcMinify: true
} }
export default nextConfig export default nextConfig

View File

@@ -1,15 +1,15 @@
const getAllDynamicRoute = async function () { const getAllDynamicRoute = async function () {
const routes = await (async () => { const routes = await (async () => {
return ['/posts/hello-world', '/posts/hello-again']; return ['/posts/hello-world', '/posts/hello-again']
})(); })()
return routes; return routes
}; }
module.exports = { module.exports = {
mode: 'universal', mode: 'universal',
generate: { generate: {
async routes() { async routes() {
return getAllDynamicRoute(); return getAllDynamicRoute()
}
} }
} }
};

View File

@@ -1,9 +1,9 @@
const getAllDynamicRoute = async function () { const getAllDynamicRoute = async function () {
const routes = await (async () => { const routes = await (async () => {
return ['/posts/hello-world', '/posts/hello-again']; return ['/posts/hello-world', '/posts/hello-again']
})(); })()
return routes; return routes
}; }
module.exports = { module.exports = {
target: 'static', target: 'static',
@@ -11,7 +11,7 @@ module.exports = {
mode: 'universal', mode: 'universal',
generate: { generate: {
async routes() { async routes() {
return getAllDynamicRoute(); return getAllDynamicRoute()
}
} }
} }
};

View File

@@ -1,9 +1,9 @@
const getAllDynamicRoute = async function () { const getAllDynamicRoute = async function () {
const routes = await (async () => { const routes = await (async () => {
return ['/posts/hello-world', '/posts/hello-again']; return ['/posts/hello-world', '/posts/hello-again']
})(); })()
return routes; return routes
}; }
export default { export default {
target: 'static', target: 'static',
@@ -11,7 +11,7 @@ export default {
mode: 'universal', mode: 'universal',
generate: { generate: {
async routes() { async routes() {
return getAllDynamicRoute(); return getAllDynamicRoute()
}
} }
} }
};

View File

@@ -1,15 +1,15 @@
const getAllDynamicRoute = async function () { const getAllDynamicRoute = async function () {
const routes = await (async () => { const routes = await (async () => {
return ['/posts/hello-world', '/posts/hello-again']; return ['/posts/hello-world', '/posts/hello-again']
})(); })()
return routes; return routes
}; }
export default { export default {
mode: 'universal', mode: 'universal',
generate: { generate: {
async routes() { async routes() {
return getAllDynamicRoute(); return getAllDynamicRoute()
}
} }
} }
};

View File

@@ -14,9 +14,7 @@ module.exports = {
{ hid: 'description', name: 'description', content: '' }, { hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' } { name: 'format-detection', content: 'telephone=no' }
], ],
link: [ link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}, },
// Global CSS: https://go.nuxtjs.dev/config-css // Global CSS: https://go.nuxtjs.dev/config-css

View File

@@ -16,9 +16,7 @@ module.exports = {
{ hid: 'description', name: 'description', content: '' }, { hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' } { name: 'format-detection', content: 'telephone=no' }
], ],
link: [ link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}, },
// Global CSS: https://go.nuxtjs.dev/config-css // Global CSS: https://go.nuxtjs.dev/config-css

View File

@@ -16,9 +16,7 @@ export default {
{ hid: 'description', name: 'description', content: '' }, { hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' } { name: 'format-detection', content: 'telephone=no' }
], ],
link: [ link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}, },
// Global CSS: https://go.nuxtjs.dev/config-css // Global CSS: https://go.nuxtjs.dev/config-css

View File

@@ -14,9 +14,7 @@ export default {
{ hid: 'description', name: 'description', content: '' }, { hid: 'description', name: 'description', content: '' },
{ name: 'format-detection', content: 'telephone=no' } { name: 'format-detection', content: 'telephone=no' }
], ],
link: [ link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
}, },
// Global CSS: https://go.nuxtjs.dev/config-css // Global CSS: https://go.nuxtjs.dev/config-css

View File

@@ -2,6 +2,8 @@ const core = require('@actions/core')
const { ConfigParser } = require('./config-parser') const { ConfigParser } = require('./config-parser')
const removeTrailingSlash = require('./remove-trailing-slash') 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, // 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 // optional configuration file path, and a Pages siteUrl value to inject
function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) { function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) {
@@ -34,7 +36,9 @@ function getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, sit
// Disable server side image optimization too // Disable server side image optimization too
// https://nextjs.org/docs/api-reference/next/image#unoptimized // 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': case 'gatsby':
@@ -74,12 +78,23 @@ function setPagesConfig({ staticSiteGenerator, generatorConfigFile, siteUrl }) {
const settings = getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl }) const settings = getConfigParserSettings({ staticSiteGenerator, generatorConfigFile, siteUrl })
new ConfigParser(settings).injectAll() new ConfigParser(settings).injectAll()
} catch (error) { } catch (error) {
const isSupportedFileExtension = SUPPORTED_FILE_EXTENSIONS.some(ext => generatorConfigFile.endsWith(ext))
// Logging // Logging
if (!isSupportedFileExtension) {
core.warning( 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.`, `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 error
) )
} }
} }
}
module.exports = { getConfigParserSettings, setPagesConfig } module.exports = { getConfigParserSettings, setPagesConfig }

View File

@@ -11,6 +11,13 @@ const tempFolder = getTempFolder()
const SUPPORTED_GENERATORS = ['next', 'nuxt', 'gatsby', 'sveltekit'] const SUPPORTED_GENERATORS = ['next', 'nuxt', 'gatsby', 'sveltekit']
const SUPPORTED_FILE_EXTENSIONS = ['.js', '.cjs', '.mjs'] 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 // Test suite
describe('configParser', () => { describe('configParser', () => {
@@ -44,7 +51,7 @@ describe('configParser', () => {
// Copy the source fixture to a temp file // Copy the source fixture to a temp file
const fixtureSourceFile = `${fixtureFolder}/${configurationFile}` const fixtureSourceFile = `${fixtureFolder}/${configurationFile}`
const fixtureTargetFile = `${tempFolder}/${configurationFile}` const fixtureTargetFile = `${tempFolder}/${configurationFile}`
if (configurationFile !== 'blank.js') { if (!isBlankConfigFileName(configurationFile)) {
fs.copyFileSync(fixtureSourceFile, fixtureTargetFile) fs.copyFileSync(fixtureSourceFile, fixtureTargetFile)
} else if (fs.existsSync(fixtureTargetFile)) { } else if (fs.existsSync(fixtureTargetFile)) {
fs.rmSync(fixtureTargetFile) fs.rmSync(fixtureTargetFile)
@@ -77,7 +84,7 @@ describe('configParser', () => {
// Copy the source fixture to a temp file // Copy the source fixture to a temp file
const fixtureSourceFile = `${fixtureFolder}/${configurationFile}` const fixtureSourceFile = `${fixtureFolder}/${configurationFile}`
const fixtureTargetFile = `${tempFolder}/${configurationFile}` const fixtureTargetFile = `${tempFolder}/${configurationFile}`
if (configurationFile !== 'blank.js') { if (!isBlankConfigFileName(configurationFile)) {
fs.copyFileSync(fixtureSourceFile, fixtureTargetFile) fs.copyFileSync(fixtureSourceFile, fixtureTargetFile)
} else if (fs.existsSync(fixtureTargetFile)) { } else if (fs.existsSync(fixtureTargetFile)) {
fs.rmSync(fixtureTargetFile) fs.rmSync(fixtureTargetFile)