Skip to content

Commit

Permalink
Merge tag '0.1.0' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
Franck Cornu committed Nov 29, 2023
2 parents 1114ebf + 0b6ca15 commit ce579e8
Show file tree
Hide file tree
Showing 13 changed files with 249 additions and 31 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Deploy Modern Search Core Components - Storybook
name: Deploy documentation
env:
ENV_AzDeployAppId: ${{ secrets.ENV_AzDeployAppId }}
ENV_AzDeployAppCertificateValue: ${{ secrets.ENV_AzDeployAppCertificateValue }}
Expand Down
132 changes: 128 additions & 4 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Deploy Modern Search Core Components - NPM Publish
name: Publish components

on:
push:
Expand Down Expand Up @@ -79,7 +79,94 @@ jobs:
- name: Tests
run: pnpm run test

publish:

build_spfx:
runs-on: ubuntu-latest
env:
SEMVER: ${{ needs.version.outputs.semver }}
MAJORMINORPATCH: ${{ needs.version.outputs.majorMinorPatch }}
needs: [version, build_components]
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- uses: actions/setup-node@v3
with:
node-version: '16'

- uses: pnpm/action-setup@v2
with:
version: 8
run_install: false

- name: Get pnpm store directory
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ env.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install

- name: Build
run: |
npx lerna run build --scope pnp-modern-search-core
- name: Build + bundle SPFx
working-directory: ./packages/spfx
run: |
gulp update-version --value $MAJORMINORPATCH
gulp bundle --ship
gulp package-solution --ship
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: pnp-modern-search-core-spfx-$SEMVER
path: ${{ github.workspace }}/**/*.sppkg

release_spfx:
runs-on: ubuntu-latest
environment: production
if: ${{ github.ref_name == 'main' || startsWith(github.ref_name, 'release') || github.event.inputs.create_release }}
needs: [version,build_spfx]
defaults:
run:
working-directory: ./packages/spfx
steps:

- uses: actions/checkout@v3
with:
fetch-depth: 0

- uses: actions/download-artifact@v3
with:
name: pnp-modern-search-core-spfx-$SEMVER

- name: Create GitHub release
uses: ncipollo/release-action@v1
with:
name: PnP Modern Search Core WebParts - ${{ needs.version.outputs.semver }}
artifacts: ${{ github.workspace }}/**/*.sppkg
bodyFile: ".github/workflows/release-template.md"
draft: true
generateReleaseNotes: true
allowUpdates: true
replacesArtifacts: true
prerelease: ${{ startsWith(github.ref_name, 'release') }}
tag: ${{ needs.version.outputs.majorMinorPatch }}
commit: ${{ github.ref_name }}

build_components:

runs-on: ubuntu-latest
needs: [version, tests]
Expand Down Expand Up @@ -129,7 +216,44 @@ jobs:
- name: Build
run: pnpm run build

- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: build_dist
path: ${{ github.workspace }}/packages/components/dist

publish_components:
runs-on: ubuntu-latest
needs: [version,build_components]
defaults:
run:
working-directory: ./packages/components
env:
VERSION: ${{ needs.version.outputs.semver }}
steps:
- uses: actions/setup-node@v3
with:
node-version: '16'
registry-url: 'https://registry.npmjs.org'

- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: get-npm-version
id: package-version
run: echo "currentVersion=$(npm view pnp-modern-search-core dist-tags.latest)" >> "$GITHUB_OUTPUT"

- uses: actions/download-artifact@v3
with:
name: build_dist

- name: Publish
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
CURRENT_VERSION: ${{ steps.package-version.outputs.currentVersion }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }}
if: $CURRENT_VERSION != ${{ needs.version.outputs.semver }}
run: npm publish


4 changes: 4 additions & 0 deletions .github/workflows/release-template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
**This solution includes only one `.sppkg` file:**
- `pnp-modern-search-core-spfx.sppkg`.

____
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export class LanguageProvider {

// Load locale file dynamically
const localizedResources = await import(
/* webpackChunkName: "pnp-modern-search-core-[request]" */
/* webpackChunkName: "pnp-modern-search-core-languages" */
/* webpackExports: ["strings"] */
/* webpackMode: "lazy-once" */
`../../loc/strings.${locale}`
Expand Down
12 changes: 6 additions & 6 deletions packages/spfx/config/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,21 @@
"pnp-core-search-verticals-web-part": {
"components": [
{
"entrypoint": "./lib/webparts/SearchVerticals/SearchVerticalsWebPart.js",
"manifest": "./src/webparts/SearchVerticals/SearchVerticalsWebPart.manifest.json"
"entrypoint": "./lib/webparts/searchVerticals/SearchVerticalsWebPart.js",
"manifest": "./src/webparts/searchVerticals/SearchVerticalsWebPart.manifest.json"
}
]
}
},
"externals": {},
"localizedResources": {
"SearchResultsWebPartStrings": "lib/webparts/SearchResults/loc/{locale}.js",
"SearchBoxWebPartStrings": "lib/webparts/SearchBox/loc/{locale}.js",
"SearchResultsWebPartStrings": "lib/webparts/searchResults/loc/{locale}.js",
"SearchBoxWebPartStrings": "lib/webparts/searchBox/loc/{locale}.js",
"PropertyControlStrings": "node_modules/@pnp/spfx-property-controls/lib/loc/{locale}.js",
"ControlStrings": "node_modules/@pnp/spfx-controls-react/lib/loc/{locale}.js",
"CommonStrings": "lib/loc/{locale}.js",
"SearchFiltersWebPartStrings": "lib/webparts/SearchFilters/loc/{locale}.js",
"SearchFiltersWebPartStrings": "lib/webparts/searchFilters/loc/{locale}.js",
"MicrosoftSearchDataSourceStrings": "lib/datasources/loc/{locale}.js",
"SearchVerticalsWebPartStrings": "lib/webparts/SearchVerticals/loc/{locale}.js"
"SearchVerticalsWebPartStrings": "lib/webparts/searchVerticals/loc/{locale}.js"
}
}
4 changes: 2 additions & 2 deletions packages/spfx/config/package-solution.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"solution": {
"name": "PnP Modern Search Core - Search Web Parts",
"id": "9aad2c6c-dd90-4fae-9e62-8aeae8969c9a",
"version": "0.0.1.0",
"version": "1.0.0.0",
"includeClientSideAssets": true,
"skipFeatureDeployment": true,
"isDomainIsolated": false,
Expand Down Expand Up @@ -35,6 +35,6 @@
]
},
"paths": {
"zippedPackage": "solution/pnp.core.webparts.search.sppkg"
"zippedPackage": "solution/pnp.webparts.search.core.sppkg"
}
}
98 changes: 94 additions & 4 deletions packages/spfx/gulpfile.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
/* eslint-disable @typescript-eslint/no-empty-function */
'use strict';
const { registry } = require('gulp');

const gulp = require('gulp');
const path = require('path');
const log = require('fancy-log');
const fs = require('fs');

const build = require('@microsoft/sp-build-web');
build.addSuppression(`Warning - [sass] The local CSS class 'ms-Grid' is not camelCase and will not be type-safe.`);

Expand Down Expand Up @@ -78,9 +84,93 @@ const { addFastServe } = require("spfx-fast-serve-helpers");
addFastServe(build);
/* end of fast-serve */

// SPFx common gulp tasks
//const PnPModernSearchCommonRegistry = require('../toolchain/gulp.js');
//registry(new PnPModernSearchCommonRegistry());
const readJson = (path, cb) => {
fs.readFile(require.resolve(path), (err, data) => {
if (err)
log.error(err)
else
cb(null, JSON.parse(data))
});
}

const findFilesByExt = (base, ext, files, result) => {
files = files || fs.readdirSync(base)
result = result || []

files.forEach(
function (file) {
var newbase = path.join(base, file)
if (fs.statSync(newbase).isDirectory()) {
result = findFilesByExt(newbase, ext, fs.readdirSync(newbase), result)
} else {
if (file.substr(-1 * (ext.length + 1)) == '.' + ext) {
result.push(newbase)
}
}
}
);
return result
}

gulp.task('update-version', async () => {

// List all manifest files
const manifestFiles = findFilesByExt('./src','manifest.json');

const semver = require('semver');
const versionArgIdx = process.argv.indexOf('--value');
const newVersionNumber = semver.valid(process.argv[versionArgIdx+1]);

if (versionArgIdx !== -1 && newVersionNumber) {

// Update version in the package-solution
const pkgSolutionFilePath = path.resolve('./config/package-solution.json');

readJson(pkgSolutionFilePath, (err, pkgSolution) => {
log.info('Old package-solution.json version:\t' + pkgSolution.solution.version);
const pkgVersion = `${semver.major(newVersionNumber)}.${semver.minor(newVersionNumber)}.${semver.patch(newVersionNumber)}.0`;
pkgSolution.solution.version = pkgVersion;
log.info('New package-solution.json version:\t' + pkgVersion);
fs.writeFileSync(pkgSolutionFilePath, JSON.stringify(pkgSolution, null, 4), (error) => {});
});

// Updated version in Web Part manifests
manifestFiles.forEach((manifestFile) => {
readJson(path.resolve(`./${manifestFile}`), (err, manifest) => {

log.info(`Updating manifest file: "./${manifestFile}"`);

log.info('Old manifestFile version:\t' + manifest.version);
const wpVersion = `${semver.major(newVersionNumber)}.${semver.minor(newVersionNumber)}.${semver.patch(newVersionNumber)}`;
manifest.version = wpVersion;
log.info('New manifestFile version:\t' + wpVersion);
fs.writeFileSync(manifestFile, JSON.stringify(manifest, null, 4), (error) => { });
});
});
} else {
log.error(`The provided version ${process.argv[versionArgIdx+1]} is not a valid SemVer version`);
}

});

gulp.task('update-package-name', async () => {

const pkgSolutionFilePath = './config/package-solution.json';

const fileNameArg = process.argv.indexOf('--name');
const fileName = process.argv[fileNameArg + 1];

if (fileNameArg !== -1 && fileName) {
readJson(pkgSolutionFilePath, (err, pkgSolution) => {
const currentPackageName = path.basename(pkgSolution.paths.zippedPackage, '.sppkg');
log.info(`Rename ${currentPackageName}.sppkg to ${fileName}.sppkg`);
pkgSolution.paths.zippedPackage = pkgSolution.paths.zippedPackage.replace(path.basename(pkgSolution.paths.zippedPackage, '.sppkg'), fileName);
fs.writeFile(pkgSolutionFilePath, JSON.stringify(pkgSolution, null, 4), (error) => { });
});
} else {
log.error(`Error: wrong parameters`);
}
});

build.initialize(require('gulp'));

3 changes: 2 additions & 1 deletion packages/spfx/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
"null-loader": "4.0.1",
"spfx-fast-serve-helpers": "~1.17.0",
"typescript": "4.9.5",
"webpack": "~4.44.2"
"webpack": "~4.44.2",
"semver": "7.5.4"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"id": "2ad6c8e4-0912-460b-a65c-7e0bbdb864cf",
"alias": "PnPModernSearchCoreSearchBoxWebPart",
"componentType": "WebPart",
"version": "0.0.1",
"version": "1.0.0",
"manifestVersion": 2,
"requiresCustomScript": false,
"supportedHosts": [
Expand All @@ -28,8 +28,7 @@
"fr-fr": "Permet aux utilisateurs de rechercher sur la base d'une requête textuelle"
},
"iconImageUrl": "data:image/png;base64,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",
"properties": {
}
"properties": {}
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"id": "4f2451b5-c1ea-4a68-8097-90edc9da61ce",
"alias": "PnPModernSearchCoreFiltersPart",
"componentType": "WebPart",
"version": "0.0.1",
"version": "1.0.0",
"manifestVersion": 2,
"requiresCustomScript": false,
"supportedHosts": [
Expand All @@ -28,8 +28,7 @@
"fr-fr": "Filtre les résultats provenant du Web Part de résultats de recherche"
},
"iconImageUrl": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAdCAYAAADGgB7AAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAgbSURBVFhHzVdZbFTXGf5mt2c8M97GHq9jC9cbXsHGjR0QxoCgLTGbIlrRipQK5aEpIQ/tQ9V9U58auany0NA+VKGKmoIxkNQq4CAgMUocG/ASLwnYrct4PMaz7zO3/39mbtRaE4Sp1PaTzvz3nnuW/3z/dgb/r1Ck5H8MSZKyqdUoFIoMatdS3f87kDIvUhugtkpNikQiLCQpkfhlash/H7R9CzVHKBgSujDu3rktZDAYYDEaiYTVqeHrwhObkjZtITFEMntmdhbFRUU4f/ZNRGMxNLe0ori4GB6PB9U1tR+QaduTsx4fT6QYK0NiyO12tXwyN4elpSU8sD9AXV09XC4XpibGEQoG8c0XX4JGo0FGRkY/jT9GCrrFAo8BZUoKBAKBCpZer8eWlO5sn89jST2nvrn52w+otZjN2fD6fDTPj+bWzWhobEJl1efw3DdOQKFSEWNuVoqn7afD2P1+/zmv261PHeyRWDdjtOh2EkPhcBhLdjsmJydQUlqOOWLuD6//kfqWsH37Nhw//hyGb17Hvt4DCIXC0Om0MJlMW4m1G8mV1gFio5Sl3+cVLPm8nnJiLJ9PGAwEmrmPngepCbz37k1pauoj6bXTv5MamjZJ7R1dQnJ75sAhaXR0VDpz5kxqtMAxXoMtEQ6HhAU+C+tiLJFIdNKJb/Lz7MyMcHSfP4CvHz+B1tYWHHn2EKpra9HX9wquDr2DXTt70L21E70HDor5BBfNz0k9PxLCxwJ+Xw1LPoksiS1NKBiwkb+VJ+KJbO6jUxzh7zFSaGFhHkajCa/85lWSRvRs68TwpTfQ971TqLYVo76uFn+9fAWLdgdOv/ZbniaCJhGPf4vXkvfy+3xl4uMaCMX0hqxplkaj2SXLLKMpmpGpn6fNF5QqpSsry0T8Kr7M32+PjcJiKcDwrVsYHR3DF/fswpV+8q/FedyfHsfUyHvYtb2Lh+Kj6RlUV9dgfn6epiugUCr28vryXoasrL+JgWsgFCN2hNbsTyyJpQo+ESdH+WRkxv0k8j/5eI6+e5GTk4O33x5EEeWvrvZmZBsNSMSjKLeV4aFzCf5VJz7fsQVXrg4hSM4foWBxUyqh0+2Jx2KltK4c5WkjVChG7AitiRUnS2LpPp9Iq9XFBFMEOu0mCndYCgpFbkpQ38iHo9jZ043Fe3M4+vwLCLqduD87jbbuL2B+bhpNTQ1irt3hwPKyg9kR70qVao9Om5HaK8ncWiR9LOCXtReSmMuLxaIKei+hCI2HQyEVKfYlg8GA8Tu3sbj4d9y4foNZFE6/+ekdqG5qx/M/+jW+8tKPUVXXiNINtbAWWnk5OJ0ruHRhQMxLYS/5qShVVLrSRqdQDBJkrYVUKlRxytwGrUZnlyCptDqdkbrFAsQuma8YzpWH/Iqz5/oxfM+FNy5/CEtJBXKLynFr5A7eufsA0xS5zK5jeQkvnDyF0ZEPxBzCjoQUF3sTAWkZE+ki4Pdn6w0GF/maiTb2UI5R63QZMbY/U03MtBFj77NvUZEmBpwYfn8EFy68BY/BhlVjDZRKBY5trYDKvYD+a3cx7wxB57ejLF/Csa99FS0NG8m0zbBarWxK3jaH1nRFIxGdRqsNc8e/QmjNSrFkpVgqFUoxkyDxDy2wkaVer6c6OIFWKtLRaIy7cOjwYf6OeELC6Wv3cGVRC7uqEEpjLjKLqqDUmWEi3+KyNTU1gVURAALCAUPhYCbLtUGQNOUayINZRf6ly1UVSxWd9K2LA6IGHtzfC4MmAfvgr6BJDkOvahGt6jHYbB6hbK7kxJayTJjNZlGqJsbHkZeXJ8YSCslCBWwR2TKpfoG0islQQBI7JhKScFQH3SK6tm7D2Tf/xCkFv/j5z6BTKzlx8mdIeVa0FhMVVhFwCMXiMBm0KMjPh5p8rXd/sgLwzYNgJP+NkHtkU4QGKJnXc6fMXFrFZO3JtKssialbLKPRCHbv2YvtO3qg1WrR0tYBKdOStDdhyFiHdzMaYA1FxLsjZkJjW6dIFZ1dT4v7GSMjUxjEQ37so6pBZQoxSuaT3Cnvnd6UqRD2+70FLEmheZZ5+RYYTSbq9+Hi+XOYmpxEZcc+Yoy/0mk/nsGl6wGcvl0r3qMJFbwaK90ugohGwny7EP0MYnmRItLKZUqhUJplpig9ib2TzvEYoAXuUYKtiMdjwl8W5u+Dq4CqcBN+ODABn2cFMY+DByLudyMR9oFyDurzYzj7+z5egapFLnJyc3m5h/F43KpWq6P8kg5pGZNLk8/j2cAyEPDxdegUJ1iTiaKMTt7dsxP1DY3wIAeqgkqYq9qwuX0Ljj5Vime2lMFSVgVj6QbEc6pQXFKCzEy98LMU+lgpYkmww2zRRaKQn+Xr0GMzxiDWXiZxcnl5GS63W2z0k347hv7hx85KDQ5X+sVVyEoJeGzuAb796kVEXA7sbrPhxJF9aG3ciFxiTK1S9SqVyoHkqunxyKgk5gTvfKJYNJpN0fRTMuWzFotlyVZejvN/uYrB178P99DLaDM6RR3NopylJG/uqLfhO4dacXR3I5pqKqEnh/cHAtCo1ZxKPo1AbuSDn1IpY12MySDm/hwKhQ4ODF7GnalZlBVbsWvbU6J2yiBGhBLMKm/CpSmLXEGn03HUdZNyY2Lgk4DsXceSfY7YyqaIMfu8XgspdoKaRFlcWllZkdwej0TOzF1CkoLieQ34D/EQlzdiSdxiaWwhM5buv+cTMcagDb5Lpz5Jj3pqC9T4L5pc81j6qI1TW6Vb6wrVRx+N/7fs/tkA/gnZljSiSOojiwAAAABJRU5ErkJggg==",
"properties": {
}
"properties": {}
}
]
}
Loading

0 comments on commit ce579e8

Please sign in to comment.