Feature request: Same payload functionality for Android/iOS on FCM

Expected Behaviour
You should be able to send the same payload to both iOS and Android on FCM and achieve the same results.
Actual Behaviour
Sending this payload
{
  "notification": {
    "title": "Test Notification",
    "body": "This offer expires at 11:30 or whatever",
    "notId": 10
  },
  "data": {
    "surveyID": "ewtawgreg-gragrag-rgarhthgbad"
  }
}

Will result in notifications on both platforms. However, only on iOS is the onNotification event triggered.
Reproduce Scenario (including but not limited to)
Send this payload to fully closed apps on Android/iOS and check for onNotification to trigger.
Steps to Reproduce
Platform and Version (eg. Android 5.0 or iOS 9.2.1)
Android 4.3 and up.
iOS 8 and up
(I'm sure it's like this for other versions but that's what I'm using)
(Android) What device vendor (e.g. Samsung, HTC, Sony...)
Any Android and iPhone.
Cordova CLI version and cordova platform version
Cordova cli 8.0.0
Cordova-android 6.3.0 (non-updateable ATM)
Cordova-iOS 4.5.0
Plugin version
plugin version 2.1.2 (currently not updateable due to cordova-android)
Sample Push Data Payload
{
  "notification": {
    "title": "Test Notification",
    "body": "This offer expires at 11:30 or whatever",
    "notId": 10
  },
  "data": {
    "surveyID": "ewtawgreg-gragrag-rgarhthgbad"
  }
}

Sample Code that illustrates the problem
N/A
Logs taken while reproducing problem
N/A
Now... I'm the guy who discovered the information currently found in the documentation. I had proposed at the time the use of a GCMReceiver class to help fix this and provided the sample that worked for my simple text-only notifications. However, that fell through because it failed too many tests and didn't work for a bunch of other scenarios which I didn't have time to test and fix. See here.
I'm back! I need to update to FCM, and I need my universal notifications too. I can't use my janky GCMReceiver class anymore and I still can not implement different payloads for different platforms.
I'll be working on it for myself, of course, but I'd very much appreciate any help anyone can offer. Ideas, your own solutions, some information, documentation, whatever. Whatever I come up with I'll post here as well so if anyone is interested, let's try to work together on this.

@Moghul I hope you can figure it out and I don't want to discourage you but my findings indicate that any push message coming into an Android device with a notification section will skip calling the onMessageReceived function of the FCMService class that is implemented in this plugin.
https://github.com/phonegap/phonegap-plugin-push/blob/master/docs/PAYLOAD.md#notification-vs-data-payloads

Sadly, I know. As far as I can tell, they took people's complaints and threw them out the window. Slapped a new name on the class and called it a new system.
I'm just hoping maybe some code gets triggered (in another class even), that can get that notification data. Then, I don't know. Put it in preferences, if I have to. I need the app to perform an action with the payload when you tap it.

@Moghul yeah, I checked when FCM was released and there appeared to be no changes.

Hi, as we've discovered the same problem with the plugin, I'd like to ask for the FCM implementation to be fixed to correspond to the documentation. Per the FCM documentation, a message that includes both notification and data should let the client handle the data:

FCM can send a notification message including an optional data payload. In such cases, FCM handles displaying the notification payload, and the client app handles the data payload.

As other plugins (admittedly, non-cordova plugins) pass the data just fine, I'd say you do get the data payload. We use Plugin.FirebasePushNotification on a Xamarin project.

@dais-set I'd love if that were the case but in my testing if notification is in the payload even if data is there as well onMessageReceived does not get called. My recommendation for this plugin is to put everything in data.
I really need onMessageReceived to be called so I can setup things like background notifications, action buttons, etc.

Yeah, just tested with logcat, onMessageReceived doesn't get called when tapping the notification. Something's up.

Thanks, @macdonst! I'll see if I can share anything useful. Unfortunately, it's not enough to put "everything" in data, as you're actually requesting for us to stop passing "notification".

What does it mean, the data is passed to an intend? I have no Android skills, but I'am interested in this issue because we are facing the same problem.

https://stackoverflow.com/questions/40718155/open-specific-activity-when-notification-clicked-in-fcm

The problem with notification in the payload is the OS will read it and try to display it's own notification. So if you use some method to have onMessageReceived or handleIntent called you may end up with two notifications in the shade.

I was thinking about just making PushPlugin.sendExtras(originalExtras); work from a separate activity or something.
The push notification works as far as a push notification goes, fine. It's when you tap it that none of the code actually triggers (apart from the PushPlugin.java class code).
I have currently made it so that I can trigger a separate activity for now (just so i don't mess with the OG code) when I tap the notification. Now I need to figure out this stuff:
05-15 13:43:00.867 28849 28849 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{opeepl.respondent.app/com.adobe.phonegap.push.BackgroundNotificationActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putBoolean(java.lang.String, boolean)' on a null object reference
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2450)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2510)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.ActivityThread.-wrap11(ActivityThread.java)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:102)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:148)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:5461)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putBoolean(java.lang.String, boolean)' on a null object reference
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at com.adobe.phonegap.push.BackgroundNotificationActivity.processPushBundle(BackgroundNotificationActivity.java:81)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at com.adobe.phonegap.push.BackgroundNotificationActivity.onCreate(BackgroundNotificationActivity.java:46)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:6251)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2403)
05-15 13:43:00.867 28849 28849 E AndroidRuntime: 	... 9 more

Then I will figure out how to use sendExtras, then how to switch back to the main activity. Baby steps.

Check it out, the data is there.
    private boolean processPushBundle(boolean isPushPluginActive, Intent intent) {
        Bundle extras = getIntent().getExtras();
        Bundle remoteInput = null;

        for (String key: extras.keySet()) {
          Log.d("LOG_TAG", key + " is a key in the bundle ----");
        }

05-15 14:09:51.569  8915  8915 D LOG_TAG : google.sent_time is a key in the bundle ----
05-15 14:09:51.569  8915  8915 D LOG_TAG : surveyId is a key in the bundle ----
05-15 14:09:51.569  8915  8915 D LOG_TAG : google.ttl is a key in the bundle ----
05-15 14:09:51.569  8915  8915 D LOG_TAG : _fbSourceApplicationHasBeenSet is a key in the bundle ----
05-15 14:09:51.569  8915  8915 D LOG_TAG : from is a key in the bundle ----
05-15 14:09:51.569  8915  8915 D LOG_TAG : google.message_id is a key in the bundle ----
05-15 14:09:51.569  8915  8915 D LOG_TAG : collapse_key is a key in the bundle ----

surveyId specifically is mine.

@Moghul now check to see if the notification show uses the icon and color specified by the init option fo the plugin. Does it play the correct sound? Can you add action buttons. When clicked do the action buttons call their JS handler correctly?

Before I do all that, do you know that it doesn't?

@Moghul my suspicion is that in seeing the notification part of the payload the OS will take over to display the notification in the notification shade. It will ignore the icon and sound properties set in the init method. Such are the constraints we are faced with when we want to enable folks to set this from JS code.

Oh yeah, I see what you mean. I'm pretty sure you're right about it taking over since... well, it says so. It's definitely a limitation of the solution if you have custom notifications.

Hence our balancing act in this project.

True, but if you're using default notifications, this isn't a bad solution. It needs cleaning up so you don't pass the sender and whatnot to the js, but for example, for me, it does precisely what I want - pass the data to the JS.
Right now, this is a flat improvement IMHO and only needs a quirk section in the documentation.
No, it does not completely fulfill the requirements in the title of this thread, but I still think it's worth putting in the plugin.

Thanks @Moghul!

No problem @dais-set, but it still needs testing. Maybe you don't even need a separate activity.
Hopefully @macdonst will give this minor improvement a pass so I don't have to have custom code in my plugin.

We have a bug with this right now.
If the app is in background (not closed), and you send the payload with the click_action key, tapping the notification will not bring the app to foreground and will remove it from recent screens. Going to the menu and opening the app will make it behave as if opening from recent screens.
05-15 15:50:03.501 31067 31067 D Push_HandlerActivity: bringToForeground = true
05-15 15:50:03.807   795  5754 I WindowManager: Screenshot max retries 4 of Token{ed23228 ActivityRecord{858284b u0 opeepl.respondent.app/com.adobe.phonegap.push.PushHandlerActivity t742 f}} appWin=Window{f5d8f04 u0 Starting opeepl.respondent.app} drawState=3
05-15 15:50:03.808 31067 31067 D Push_HandlerActivity: isPushPluginActive = true
05-15 15:50:03.808 31067 31067 D Push_HandlerActivity: don't want main activity
05-15 15:50:03.810 31067 31067 D SystemWebChromeClient: file:///android_asset/www/js/generalManagers/notificationManager.js: Line 165 : [object Object]
05-15 15:50:03.810 31067 31067 I chromium: [INFO:CONSOLE(165)] "[object Object]", source: file:///android_asset/www/js/generalManagers/notificationManager.js (165)
05-15 15:50:03.824   795 11380 W InputMethodManagerService: Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@1cc2722 attribute=null, token = android.os.BinderProxy@b1f9f7d

But as you can see, the notification event actually triggers. Any help would be appreciated. Working on a PR right now but ofc I can't submit it like this.

@Moghul you can send a PR when you feel it's ready.

I'll do it after this bug is fixed.

If anyone has any improvements or corrections, please speak up, I'd love to get this one merged.
@macdonst do you think we could do another 2.1.x version with this change so that I can keep using cordova-android 6.3.0?

Hi @moghul, I know it has been a while with this thread, but I use the phonegap-plugin-push v2.3.0 and looking at plugin.xml I can see that your fine hack was not merged? The Yaaaas, it works! post.
I would like to apply same to my project, but my problem is that when I build with cordova build android command, cordova first sets the gradle version to gradle-4.4-all.zip, which messes up my build. I use gradle-4.1-all.zip with ./gradlew build from the project folder.
It also returns some app level dependencies to versions that would not build, as well as resets the settings.gradle file which clears some of my manual library includes.
So unless i am removing and adding back the specific plugin with your hack, I cannot get it on board my android build.
So, Do You know how I may apply your hack directly to the files in Android Studio?
Alternatively, I think it is possible to manipulate the cordova pre & post build hooks, but I dont know how to do this.
For my Project I use the following:
Installed platforms:
  android 7.1.0
  browser 5.0.3
  ios 4.5.5

Ionic:
   ionic (Ionic CLI)  : 4.6.0
   Ionic Framework    : ionic-angular 3.9.2
   @ionic/app-scripts : 3.2.1

Cordova:
   cordova (Cordova CLI) : 8.1.2<EMAIL_ADDRESS>   Cordova Platforms     : android 7.1.0, browser 5.0.3, ios 4.5.5
   Cordova Plugins       : cordova-plugin-ionic-keyboard 2.1.3, cordova-plugin-ionic-webview 1.2.1, (and 28 other plugins)

System:
   Android SDK Tools : 26.1.1 (/Users/chiemekailo/Library/Android/sdk)
   ios-deploy        : 1.9.4
   NodeJS            : v11.6.0 (/Users/chiemekailo/.nvm/versions/node/v11.6.0/bin/node)
   npm               : 6.12.0
   OS                : macOS Mojave
   Xcode             : Xcode 10.1


Custom reports not being generated in v1.1.8

I can create sanity checks, and the whole folder structure is there for squid2.x reports, just no files.  There is no folder structure for squid3 for ETREDUX reports.  In issue #182 I had this same problem and it was related to not having defined the samples in the Sample naming menu, but that isn't the case here.
Here's my file:
954_1_2019_May_01_15.02.squid.zip

I ran sanity reports then ran ET_Redux report and got this - see screenshot

It works for me now too but I am stumped.  I experimented with a lot of different things before making the issue - different orders of things, clearing out the reports folder, restarted squid etc.  What I hadn't done before making the issue and sending to you was saved the latest squid project (after importing a new pd file).  It was only in doing that that I realized the workflow issue when bringing in a new file.  So maybe there are some "order of operations" type gremlins in there.  I will keep an eye on it.

This is still a problem for me.  I open a squid file, check the visualizations (ref mat wtd mean and unknowns concordia) to make sure things look normal then I go to Reports--> Custom-->Unknowns--> by sample for ETREDUX and Topsoil.  It creates the folder structure but there is nothing in there. I quit squid and tried again, this time doing the sanity check first.  I get the sanity check files but not the others.
One thing I noticed when I created this issue the first time, and then was unable to re-create it, is that when it DID properly create the report files, it opened it automatically in Excel.  Now (as before) I get nothing...is there some system setting that it could be choking on? It wants to open the file but is unable?  I've this same process with Excel 2016 closed and open (at the time of making the reports) to no avail.

This must be related to opening Excel automagically on WIndows ... I will make all reports just saved and leave it to the user to open them if needed.

@NicoleRayner I asked Jim @bowring to disable the auto-open functionality because I am running two version of Excel and the auto-open behaviour was causing me grief, so that one is on me. I asked for a conventional "Save As..." window in its place (because I always need to change the name of the file!), but we have not gone that way yet.
One issue I had last week (and I was supposed to write it up, haven't done it yet) was that the directory path for saving Reports is keyed to the Project Name (as specified in the Manage Project window), not the name of the .squid file, and it took me a long time to work that out. The interim solution will be to tie the Project Name and the .squid file name together (i.e. if you change one, you change the other), until we have a chance to look more closely.


🐛 /poke is not working

check what is going on during execution because it's not working anymore.

Probably some updates on pokeapi

Just updated the pokebase python module and it's working again.


Changed stale link to point to samples.md

Glad to see you in here @shazron  🙌
Feel free to reach out if your getting started here or Slack 👊


cached n5 data

When using neuroglancer to view n5 data (in my case, served from the local filesystem), neuroglancer apparently maintains a cached version of the data -- i.e., when I delete the n5 files on disk, I can still view them in neuroglancer. Is there some configuration setting that prevents  this caching? It makes debugging very difficult if my changes to the n5 data on disk are not propagated to the viewer. Removing + recreating the image layer doesn't fix this, nor does clearing the browser cache.

Neuroglancer maintains its own cache in memory, but that is cleared by reloading the page (i.e. using your browser's Reload command).  There isn't currently a way to clear the cache from the UI, but the browser reload command is usually adequate for this purpose.  If that doesn't work, then there could be an issue with the cache headers sent by the server, but I'm guessing that is not the problem.

A page refresh solved the problem, thanks!


fix small typo in readme

wrong package name for security filter

Codecov Report

Merging #21 into master will not change coverage.

@@           Coverage Diff           @@
##           master      #21   +/-   ##
=======================================
  Coverage   93.75%   93.75%
=======================================
  Files          12       12
  Lines         128      128
  Branches        7        7
=======================================
  Hits          120      120
  Misses          8        8

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update bdeac82...e8369a4. Read the comment docs.

Thank you, @tadjik1 !


Refactoring:fabric8-hdd->fabric8-hypothesis

signed off: @dev-gaur<EMAIL_ADDRESS>fabric8-hypothesis-issue-id: fabric8-hypothesis/fabric8-hypothesis-planning#4

Verified.


Add Missing Parameters to Resources #159 MSFT_xExchMailboxServer

Added missing parameters, which were not reserved for Microsoft internal
use.

This change is

Looks good to me. Thanks!


Remote dev container

Love the idea, let me know if you can take care of the integration in the current state of the main branch. would it be possible for you to provide also a description in a section of the README?

@xuwenhao please note that this is diverging heaps fro the main branch, will need to be refactored. CUDA device could be a command line arguments among the others.


SQL query execution time

The SQL query execution time is missing in the breadcrumb although it is part of the method signature/event object.
/**
 * Until Laravel 5.1
 *
 * @param string $query
 * @param array  $bindings
 * @param int    $time
 * @param string $connectionName
 */
protected function queryHandler($query, $bindings, $time, $connectionName)
{
    $data = ['connectionName' => $connectionName];

    if ($this->recordSqlBindings) {
        $data['bindings'] = $bindings;
    }

    Integration::addBreadcrumb(new Breadcrumb(
        Breadcrumb::LEVEL_INFO,
        Breadcrumb::TYPE_USER,
        'sql.query',
        $query,
        $data
    ));
}

/**
 * Since Laravel 5.2
 *
 * @param \Illuminate\Database\Events\QueryExecuted $query
 */
protected function queryExecutedHandler(QueryExecuted $query)
{
    $data = ['connectionName' => $query->connectionName];

    if ($this->recordSqlBindings) {
        $data['bindings'] = $query->bindings;
    }

    Integration::addBreadcrumb(new Breadcrumb(
        Breadcrumb::LEVEL_INFO,
        Breadcrumb::TYPE_USER,
        'sql.query',
        $query->sql,
        $data
    ));
}

Both methods ignore/do not use the query execution time, which is actually valuable information.
I guess if we add something like the following snipped in both methods, the issue will be solved.
if (null !== $query->time) {
    $data['executionTime'] = $query->time;
}

Also is it important that the breadcrumb keys are in camel case? I think snake case for array keys are better suited.


Added AUTHORS file

Current coverage is 16.66% (diff: 100%)

Merging #911 into master will decrease coverage by 0.12%

@@             master       #911   diff @@
==========================================
  Files           460        460
  Lines         19428      19428
  Methods           0          0
  Messages          0          0
  Branches       2868       2868
==========================================
- Hits           3261       3237    -24
- Misses        15808      15833    +25
+ Partials        359        358     -1

Powered by Codecov. Last update 369964c...0214fea

No squash 😢

I learned that rebase and merge isn't squash and merge :'(


boost/container_hash: Breaking change of boost::hash_value in 1.81.0?

In yuzu, we are using boost::hash_value to compute the hash of a macro program (represented by a std::vector<u32>):
https://github.com/yuzu-emu/yuzu/blob/09da9da6fb4428e8f305e967c9102dcf4030c5e9/src/video_core/macro/macro.cpp#L90-L108
These values, in turn, are used to determine the macro programs to emulate at a high level for performance reasons:
https://github.com/yuzu-emu/yuzu/blob/09da9da6fb4428e8f305e967c9102dcf4030c5e9/src/video_core/macro/macro_hle.cpp#L467-L549
Upon updating boost to 1.81.0, we have discovered boost::hash_value produces completely different values to 1.79.0.
As a result, we have 2 questions:
Is the value returned by boost::hash_value meant to be different on 1.81.0 compared to previous releases?
If this is the case, why was this not documented as a potentially breaking change in the changelog?

In retrospect, I understand if hash_value was never intended to be used in such a manner. However, it should probably be better documented that hash_value is not suitable for generating persistent hash values that would remain compatible with future revisions of the API so future users of this API understand what it is meant to be used for and what it isn't.

We have decided to port over a small subset of the old hashing implementation for our use:
https://github.com/yuzu-emu/yuzu/blob/f9fe8511eaf194374d4b73d49cb8dba0c4db1dbb/src/common/container_hash.h

We have decided to port over a small subset of the old hashing implementation for our use: https://github.com/yuzu-emu/yuzu/blob/1179236265c4524968fc0d431e99c3cf2611f5e9/src/common/container_hash.h

You might also be interested in Aumasson and Bernstein's SipHash. It is meant to be a fast (AXR design), collision resistant with a uniform distribution.
SipHash outputs 64-bit and 128-bit hashes. It is my goto hash when I need something lightweight and fast without a lot of collision resistance.
Typically a SipHash would be used in things like IP filters to avoid DoS attacks. But it should work well in this use case.


How to use alias with vitest workspace

Clear and concise description of the problem
No documentation.
intellisense is working in my spec file no import error but vitest extension for some reason can not load module with alias
Suggested solution
When using workspace, put the resolve in the "vitest.workspace.ts" !
import { defineWorkspace } from 'vitest/config'
import { resolve } from 'path';
export default defineWorkspace(
    [
        {
            test: {
                include: ['./packageName/**/*.spec.{ts,js}'],
                name: 'packageName',
                alias: {
                    '@': resolve(__dirname, './'),
                }
            }
        }
    ])

Alternative
No response
Additional context
No response
Validations

[X] Follow our Code of Conduct
[X] Read the Contributing Guidelines.
[X] Read the docs.
[X] Check that there isn't already an issue that request the same feature to avoid creating a duplicate.

You could try something like:
import { defineWorkspace } from 'vitest/config'
import { resolve } from 'path';
export default defineWorkspace(
    [
        {
            test: {
                include: ['./packageName/**/*.spec.{ts,js}'],
                name: 'packageName',
                alias: {
-                    '@': resolve(__dirname, './'),
+                    '@': resolve(__dirname, './packageName'),
                }
            }
        }
    ])

But without seeing rest of your project's code it's impossible to help any further.
Here's also one example that uses alias with workspaces: https://stackblitz.com/~/edit/vitest-sonar-reporter-workspaces?file=packages/server/vitest.config.ts.

The proposed solution is already working, sorry that i may not be clear enough. The issue is when i googled and reading the doc, no one mention to put alias in defineWorkspace

Doesn't https://vitest.dev/guide/workspace already cover configuring workspaces? What kind of change would you propose there? It shouldn't be alias specific as we simply cannot cover all possible configuration options there.

it can be faq or troubleshoot
when following conditions are true

using alias
typescript intellisense is working
using vitest workspace
vitest extensions in vs code give error of failed to import

Please add alias in vitest.workspace.ts
worse case they can also find this issue

Please add alias in vitest.workspace.ts

You don't need to put alias in vitest.workspace.ts. It can be in projects vitest.config.ts too, as shown in https://stackblitz.com/~/edit/vitest-sonar-reporter-workspaces?file=packages/server/vitest.config.ts.
The documentation in https://vitest.dev/guide/workspace should already describe how to configure workspaces. The alias option doesn't have any special handling when used in workspaces so I don't see reason why it should be specifically mentioned there.


hugo version v0.97.0 rendering error

Describe the bug
hugo version v0.97.0 rendering error.
Screenshots
If applicable, add screenshots to help explain your problem.

Hugo version:
$ hugo version

v0.97.0
Theme version:
0.75.1

I guess this is caused by the postcss which will remove most of the CSS if the following configuration is not set.
[build]
  writeStats = true

It tells Hugo to generate the hugo_stat.json file, used by postcss for purging unused CSS.

actually,i have set this.

in my localhost:1313
hugo version 0.96.0 html is rendered as
<link rel="stylesheet" href="http://localhost:1313/assets/main/bundle.min.87fc6e639c81cc56a4ccd268ca277524d1890d44f26c83aa95dc38d2319adfe9.css" integrity="sha256-h/xuY5yBzFakzNJoyid1JNGJDUTybIOqldw40jGa3+k="

hugo version 0.97.0 html is rendered as
<link rel="stylesheet" href="[__h_pp_l1_7_Permalink__e=](http://localhost:1313/__h_pp_l1_7_Permalink__e=)" integrity="__h_pp_l1_7_Data.Integrity__e=" crossorigin="anonymous">

i don't know why

Just upgrade to 0.97.0 and reproduced this issue.

It should be a bug or breaking change of Hugo 0.97.0. You'll need to execute hugo server with the --renderToDisk flag.

Confirmed that this has been fixed by hugo 0.97.1.


Add ability to turn off a route without removing

Disable a route, maybe via an enabled flag on a route.

Hello @spencergibb, Have been wanting to contribute to spring cloud projects, and this seems like an issue I can tackle, howbeit I will need a little guidance as this will be my first time contributing to an open source project.

hi @spencergibb I have raised a PR for this enhancement. As this is my first contribution, please let me know if there is anything else that I need to do as a part of process. 🙂

Closing in favor of #308