问:
In webdriver-io, how to separate specs from source
I'm using webdriver-io + browserstack (TS/JS project), and I'd like to run my tests against the bundled production output.

Settings specs to the bundled output:
specs: ['dist/test/index.js'],

If I create two separate js files, one for the source and one for the tests, the test is skipped:

INFO @wdio/cli: [0-0] SKIPPED in chrome - /dist/test/index.js

If I bundle everything together, it works.

Pouring over the documentation I can't seem to find the correct way to include source files.

When I use the jasmine browser runner, I can separate the two via srcFiles

```<code>{
    srcDir: 'dist',
    srcFiles: ['index.umd.js'],
    specDir: 'dist/test',
    specFiles: ['index.js'],
    browser: browser,
}
</code>```

My full wdio.conf.ts:

```<code>import type { Options } from '@wdio/types'
import { config as dotEnvConfig } from 'dotenv'

dotEnvConfig()

if (!process.env.BROWSERSTACK_USERNAME || !process.env.BROWSERSTACK_ACCESS_KEY)
    throw new Error(
        'missing .env BROWSERSTACK_USERNAME or BROWSERSTACK_ACCESS_KEY'
    )

export const config: Options.Testrunner = {
    //
    // ====================
    // Runner Configuration
    // ====================
    //
    //
    // =====================
    // ts-node Configurations
    // =====================
    //
    // You can write tests using TypeScript to get autocompletion and type safety.
    // You will need typescript and ts-node installed as devDependencies.
    // WebdriverIO will automatically detect if these dependencies are installed
    // and will compile your config and tests for you.
    // If you need to configure how ts-node runs please use the
    // environment variables for ts-node or use wdio config's autoCompileOpts section.
    //

    user: process.env.BROWSERSTACK_USERNAME,
    key: process.env.BROWSERSTACK_ACCESS_KEY,

    autoCompileOpts: {
        autoCompile: true,
        // see https://github.com/TypeStrong/ts-node#cli-and-programmatic-options
        // for all available options
        tsNodeOpts: {
            transpileOnly: true,
            project: 'tsconfig.json',
            require: ['tsconfig-paths/register'],
        },
        // tsconfig-paths is only used if "tsConfigPathsOpts" are provided, if you
        // do please make sure "tsconfig-paths" is installed as dependency
        // tsConfigPathsOpts: {
        //     baseUrl: './',
        //     paths: {
        //     },
        // },
    },
    //
    // ==================
    // Specify Test Files
    // ==================
    // Define which test specs should run. The pattern is relative to the directory
    // from which `wdio` was called.
    //
    // The specs are defined as an array of spec files (optionally using wildcards
    // that will be expanded). The test for each spec file will be run in a separate
    // worker process. In order to have a group of spec files run in the same worker
    // process simply enclose them in an array within the specs array.
    //
    // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
    // then the current working directory is where your `package.json` resides, so `wdio`
    // will be called from there.
    //

    /**
     * Running against the bundled specs is an order of magnitude faster than running against
     * all ts source files.
     */
    specs: ['dist/test/index.js'],

    // Patterns to exclude.
    exclude: [
        // 'path/to/excluded/files'
    ],
    //
    // ============
    // Capabilities
    // ============
    // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
    // time. Depending on the number of capabilities, WebdriverIO launches several test
    // sessions. Within your capabilities you can overwrite the spec and exclude options in
    // order to group specific specs to a specific capability.
    //
    // First, you can define how many instances should be started at the same time. Let's
    // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
    // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
    // files and you set maxInstances to 10, all spec files will get tested at the same time
    // and 30 processes will get spawned. The property handles how many capabilities
    // from the same test should run tests.
    //
    maxInstances: 10,
    //
    // If you have trouble getting all important capabilities together, check out the
    // Sauce Labs platform configurator - a great tool to configure your capabilities:
    // https://saucelabs.com/platform/platform-configurator
    //
    capabilities: [
        {
            // maxInstances can get overwritten per capability. So if you have an in-house Selenium
            // grid with only 5 firefox instances available you can make sure that not more than
            // 5 instances get started at a time.
            maxInstances: 5,
            //
            browserName: 'chrome',
            acceptInsecureCerts: true,
            // If outputDir is provided WebdriverIO can capture driver session logs
            // it is possible to configure which logTypes to include/exclude.
            // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
            // excludeDriverLogs: ['bugreport', 'server'],
        },
    ],
    //
    // ===================
    // Test Configurations
    // ===================
    // Define all options that are relevant for the WebdriverIO instance here
    //
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    logLevel: 'info',
    //
    // Set specific log levels per logger
    // loggers:
    // - webdriver, webdriverio
    // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
    // - @wdio/mocha-framework, @wdio/jasmine-framework
    // - @wdio/local-runner
    // - @wdio/sumologic-reporter
    // - @wdio/cli, @wdio/config, @wdio/utils
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    // logLevels: {
    //     webdriver: 'trace',
    //     webdriverio: 'trace',
    //     '@wdio/local-runner': 'trace',
    //     '@wdio/cli': 'trace',
    //     '@wdio/browserstack-service': 'debug',
    // },
    //
    // If you only want to run your tests until a specific amount of tests have failed use
    // bail (default is 0 - don't bail, run all tests).
    bail: 0,
    //
    // Set a base URL in order to shorten url command calls. If your `url` parameter starts
    // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
    // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
    // gets prepended directly.
    baseUrl: 'http://localhost',
    //
    // Default timeout for all waitFor* commands.
    waitforTimeout: 10000,
    //
    // Default timeout in milliseconds for request
    // if browser driver or grid doesn't send response
    connectionRetryTimeout: 120000,
    //
    // Default request retries count
    connectionRetryCount: 3,
    //
    // Test runner services
    // Services take over a specific job you don't want to take care of. They enhance
    // your test setup with almost no effort. Unlike plugins, they don't add new
    // commands. Instead, they hook themselves up into the test process.
    services: ['browserstack'],

    // Framework you want to run your specs with.
    // The following are supported: Mocha, Jasmine, and Cucumber
    // see also: https://webdriver.io/docs/frameworks
    //
    // Make sure you have the wdio adapter package for the specific framework installed
    // before running any tests.
    framework: 'jasmine',
    //
    // The number of times to retry the entire specfile when it fails as a whole
    // specFileRetries: 1,
    //
    // Delay in seconds between the spec file retry attempts
    // specFileRetriesDelay: 0,
    //
    // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue
    // specFileRetriesDeferred: false,
    //
    // Test reporter for stdout.
    // The only one supported by default is 'dot'
    // see also: https://webdriver.io/docs/dot-reporter
    reporters: ['spec'],

    //
    // Options to be passed to Jasmine.
    jasmineOpts: {
        // Jasmine default timeout
        defaultTimeoutInterval: 60000,
        //
        // The Jasmine framework allows interception of each assertion in order to log the state of the application
        // or website depending on the result. For example, it is pretty handy to take a screenshot every time
        // an assertion fails.
        expectationResultHandler: function (passed, assertion) {
            // do something
        },

        helpers: [
            'test/unit/_setup/jsdom.ts',
            'test/unit/_setup/consoleReporter.ts',
        ],
    },

    //
    // =====
    // Hooks
    // =====
    // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
    // it and to build services around it. You can either apply a single function or an array of
    // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
    // resolved to continue.
    /**
     * Gets executed once before all workers get launched.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     */
    // onPrepare: function (config, capabilities) {
    // },
    /**
     * Gets executed before a worker process is spawned and can be used to initialise specific service
     * for that worker as well as modify runtime environments in an async fashion.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {[type]} caps     object containing capabilities for session that will be spawn in the worker
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {[type]} args     object that will be merged with the main configuration once worker is initialized
     * @param  {[type]} execArgv list of string arguments passed to the worker process
     */
    // onWorkerStart: function (cid, caps, specs, args, execArgv) {
    // },
    /**
     * Gets executed just after a worker process has exited.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {Number} exitCode 0 - success, 1 - fail
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {Number} retries  number of retries used
     */
    // onWorkerEnd: function (cid, exitCode, specs, retries) {
    // },
    /**
     * Gets executed just before initialising the webdriver session and test framework. It allows you
     * to manipulate configurations depending on the capability or spec.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that are to be run
     * @param {String} cid worker id (e.g. 0-0)
     */
    // beforeSession: function (config, capabilities, specs, cid) {
    // },
    /**
     * Gets executed before test execution begins. At this point you can access to all global
     * variables like `browser`. It is the perfect place to define custom commands.
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs        List of spec file paths that are to be run
     * @param {Object}         browser      instance of created browser/device session
     */
    // before: function (capabilities, specs) {
    // },
    /**
     * Runs before a WebdriverIO command gets executed.
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     */
    // beforeCommand: function (commandName, args) {
    // },
    /**
     * Hook that gets executed before the suite starts
     * @param {Object} suite suite details
     */
    // beforeSuite: function (suite) {
    // },
    /**
     * Function to be executed before a test (in Mocha/Jasmine) starts.
     */
    // beforeTest: function (test, context) {
    // },
    /**
     * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
     * beforeEach in Mocha)
     */
    // beforeHook: function (test, context) {
    // },
    /**
     * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
     * afterEach in Mocha)
     */
    // afterHook: function (test, context, { error, result, duration, passed, retries }) {
    // },
    /**
     * Function to be executed after a test (in Mocha/Jasmine only)
     * @param {Object}  test             test object
     * @param {Object}  context          scope object the test was executed with
     * @param {Error}   result.error     error object in case the test fails, otherwise `undefined`
     * @param {Any}     result.result    return object of test function
     * @param {Number}  result.duration  duration of test
     * @param {Boolean} result.passed    true if test has passed, otherwise false
     * @param {Object}  result.retries   informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }`
     */
    // afterTest: function(test, context, { error, result, duration, passed, retries }) {
    // },

    /**
     * Hook that gets executed after the suite has ended
     * @param {Object} suite suite details
     */
    // afterSuite: function (suite) {
    // },
    /**
     * Runs after a WebdriverIO command gets executed
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     * @param {Number} result 0 - command success, 1 - command error
     * @param {Object} error error object if any
     */
    // afterCommand: function (commandName, args, result, error) {
    // },
    /**
     * Gets executed after all tests are done. You still have access to all global variables from
     * the test.
     * @param {Number} result 0 - test pass, 1 - test fail
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // after: function (result, capabilities, specs) {
    // },
    /**
     * Gets executed right after terminating the webdriver session.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // afterSession: function (config, capabilities, specs) {
    // },
    /**
     * Gets executed after all workers got shut down and the process is about to exit. An error
     * thrown in the onComplete hook will result in the test run failing.
     * @param {Object} exitCode 0 - success, 1 - fail
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {<Object>} results object containing test results
     */
    // onComplete: function(exitCode, config, capabilities, results) {
    // },
    /**
     * Gets executed when a refresh happens.
     * @param {String} oldSessionId session ID of the old session
     * @param {String} newSessionId session ID of the new session
     */
    // onReload: function(oldSessionId, newSessionId) {
    // }
}

</code>```

Body:
I'm using webdriver-io + browserstack (TS/JS project), and I'd like to run my tests against the bundled production output.

Settings specs to the bundled output:
specs: ['dist/test/index.js'],

If I create two separate js files, one for the source and one for the tests, the test is skipped:

INFO @wdio/cli: [0-0] SKIPPED in chrome - /dist/test/index.js

If I bundle everything together, it works.

Pouring over the documentation I can't seem to find the correct way to include source files.

When I use the jasmine browser runner, I can separate the two via srcFiles

{
    srcDir: 'dist',
    srcFiles: ['index.umd.js'],
    specDir: 'dist/test',
    specFiles: ['index.js'],
    browser: browser,
}

My full wdio.conf.ts:

import type { Options } from '@wdio/types'
import { config as dotEnvConfig } from 'dotenv'

dotEnvConfig()

if (!process.env.BROWSERSTACK_USERNAME || !process.env.BROWSERSTACK_ACCESS_KEY)
    throw new Error(
        'missing .env BROWSERSTACK_USERNAME or BROWSERSTACK_ACCESS_KEY'
    )

export const config: Options.Testrunner = {
    //
    // ====================
    // Runner Configuration
    // ====================
    //
    //
    // =====================
    // ts-node Configurations
    // =====================
    //
    // You can write tests using TypeScript to get autocompletion and type safety.
    // You will need typescript and ts-node installed as devDependencies.
    // WebdriverIO will automatically detect if these dependencies are installed
    // and will compile your config and tests for you.
    // If you need to configure how ts-node runs please use the
    // environment variables for ts-node or use wdio config's autoCompileOpts section.
    //

    user: process.env.BROWSERSTACK_USERNAME,
    key: process.env.BROWSERSTACK_ACCESS_KEY,

    autoCompileOpts: {
        autoCompile: true,
        // see https://github.com/TypeStrong/ts-node#cli-and-programmatic-options
        // for all available options
        tsNodeOpts: {
            transpileOnly: true,
            project: 'tsconfig.json',
            require: ['tsconfig-paths/register'],
        },
        // tsconfig-paths is only used if "tsConfigPathsOpts" are provided, if you
        // do please make sure "tsconfig-paths" is installed as dependency
        // tsConfigPathsOpts: {
        //     baseUrl: './',
        //     paths: {
        //     },
        // },
    },
    //
    // ==================
    // Specify Test Files
    // ==================
    // Define which test specs should run. The pattern is relative to the directory
    // from which `wdio` was called.
    //
    // The specs are defined as an array of spec files (optionally using wildcards
    // that will be expanded). The test for each spec file will be run in a separate
    // worker process. In order to have a group of spec files run in the same worker
    // process simply enclose them in an array within the specs array.
    //
    // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
    // then the current working directory is where your `package.json` resides, so `wdio`
    // will be called from there.
    //

    /**
     * Running against the bundled specs is an order of magnitude faster than running against
     * all ts source files.
     */
    specs: ['dist/test/index.js'],

    // Patterns to exclude.
    exclude: [
        // 'path/to/excluded/files'
    ],
    //
    // ============
    // Capabilities
    // ============
    // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
    // time. Depending on the number of capabilities, WebdriverIO launches several test
    // sessions. Within your capabilities you can overwrite the spec and exclude options in
    // order to group specific specs to a specific capability.
    //
    // First, you can define how many instances should be started at the same time. Let's
    // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
    // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
    // files and you set maxInstances to 10, all spec files will get tested at the same time
    // and 30 processes will get spawned. The property handles how many capabilities
    // from the same test should run tests.
    //
    maxInstances: 10,
    //
    // If you have trouble getting all important capabilities together, check out the
    // Sauce Labs platform configurator - a great tool to configure your capabilities:
    // https://saucelabs.com/platform/platform-configurator
    //
    capabilities: [
        {
            // maxInstances can get overwritten per capability. So if you have an in-house Selenium
            // grid with only 5 firefox instances available you can make sure that not more than
            // 5 instances get started at a time.
            maxInstances: 5,
            //
            browserName: 'chrome',
            acceptInsecureCerts: true,
            // If outputDir is provided WebdriverIO can capture driver session logs
            // it is possible to configure which logTypes to include/exclude.
            // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
            // excludeDriverLogs: ['bugreport', 'server'],
        },
    ],
    //
    // ===================
    // Test Configurations
    // ===================
    // Define all options that are relevant for the WebdriverIO instance here
    //
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    logLevel: 'info',
    //
    // Set specific log levels per logger
    // loggers:
    // - webdriver, webdriverio
    // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
    // - @wdio/mocha-framework, @wdio/jasmine-framework
    // - @wdio/local-runner
    // - @wdio/sumologic-reporter
    // - @wdio/cli, @wdio/config, @wdio/utils
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    // logLevels: {
    //     webdriver: 'trace',
    //     webdriverio: 'trace',
    //     '@wdio/local-runner': 'trace',
    //     '@wdio/cli': 'trace',
    //     '@wdio/browserstack-service': 'debug',
    // },
    //
    // If you only want to run your tests until a specific amount of tests have failed use
    // bail (default is 0 - don't bail, run all tests).
    bail: 0,
    //
    // Set a base URL in order to shorten url command calls. If your `url` parameter starts
    // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
    // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
    // gets prepended directly.
    baseUrl: 'http://localhost',
    //
    // Default timeout for all waitFor* commands.
    waitforTimeout: 10000,
    //
    // Default timeout in milliseconds for request
    // if browser driver or grid doesn't send response
    connectionRetryTimeout: 120000,
    //
    // Default request retries count
    connectionRetryCount: 3,
    //
    // Test runner services
    // Services take over a specific job you don't want to take care of. They enhance
    // your test setup with almost no effort. Unlike plugins, they don't add new
    // commands. Instead, they hook themselves up into the test process.
    services: ['browserstack'],

    // Framework you want to run your specs with.
    // The following are supported: Mocha, Jasmine, and Cucumber
    // see also: https://webdriver.io/docs/frameworks
    //
    // Make sure you have the wdio adapter package for the specific framework installed
    // before running any tests.
    framework: 'jasmine',
    //
    // The number of times to retry the entire specfile when it fails as a whole
    // specFileRetries: 1,
    //
    // Delay in seconds between the spec file retry attempts
    // specFileRetriesDelay: 0,
    //
    // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue
    // specFileRetriesDeferred: false,
    //
    // Test reporter for stdout.
    // The only one supported by default is 'dot'
    // see also: https://webdriver.io/docs/dot-reporter
    reporters: ['spec'],

    //
    // Options to be passed to Jasmine.
    jasmineOpts: {
        // Jasmine default timeout
        defaultTimeoutInterval: 60000,
        //
        // The Jasmine framework allows interception of each assertion in order to log the state of the application
        // or website depending on the result. For example, it is pretty handy to take a screenshot every time
        // an assertion fails.
        expectationResultHandler: function (passed, assertion) {
            // do something
        },

        helpers: [
            'test/unit/_setup/jsdom.ts',
            'test/unit/_setup/consoleReporter.ts',
        ],
    },

    //
    // =====
    // Hooks
    // =====
    // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
    // it and to build services around it. You can either apply a single function or an array of
    // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
    // resolved to continue.
    /**
     * Gets executed once before all workers get launched.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     */
    // onPrepare: function (config, capabilities) {
    // },
    /**
     * Gets executed before a worker process is spawned and can be used to initialise specific service
     * for that worker as well as modify runtime environments in an async fashion.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {[type]} caps     object containing capabilities for session that will be spawn in the worker
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {[type]} args     object that will be merged with the main configuration once worker is initialized
     * @param  {[type]} execArgv list of string arguments passed to the worker process
     */
    // onWorkerStart: function (cid, caps, specs, args, execArgv) {
    // },
    /**
     * Gets executed just after a worker process has exited.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {Number} exitCode 0 - success, 1 - fail
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {Number} retries  number of retries used
     */
    // onWorkerEnd: function (cid, exitCode, specs, retries) {
    // },
    /**
     * Gets executed just before initialising the webdriver session and test framework. It allows you
     * to manipulate configurations depending on the capability or spec.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that are to be run
     * @param {String} cid worker id (e.g. 0-0)
     */
    // beforeSession: function (config, capabilities, specs, cid) {
    // },
    /**
     * Gets executed before test execution begins. At this point you can access to all global
     * variables like `browser`. It is the perfect place to define custom commands.
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs        List of spec file paths that are to be run
     * @param {Object}         browser      instance of created browser/device session
     */
    // before: function (capabilities, specs) {
    // },
    /**
     * Runs before a WebdriverIO command gets executed.
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     */
    // beforeCommand: function (commandName, args) {
    // },
    /**
     * Hook that gets executed before the suite starts
     * @param {Object} suite suite details
     */
    // beforeSuite: function (suite) {
    // },
    /**
     * Function to be executed before a test (in Mocha/Jasmine) starts.
     */
    // beforeTest: function (test, context) {
    // },
    /**
     * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
     * beforeEach in Mocha)
     */
    // beforeHook: function (test, context) {
    // },
    /**
     * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
     * afterEach in Mocha)
     */
    // afterHook: function (test, context, { error, result, duration, passed, retries }) {
    // },
    /**
     * Function to be executed after a test (in Mocha/Jasmine only)
     * @param {Object}  test             test object
     * @param {Object}  context          scope object the test was executed with
     * @param {Error}   result.error     error object in case the test fails, otherwise `undefined`
     * @param {Any}     result.result    return object of test function
     * @param {Number}  result.duration  duration of test
     * @param {Boolean} result.passed    true if test has passed, otherwise false
     * @param {Object}  result.retries   informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }`
     */
    // afterTest: function(test, context, { error, result, duration, passed, retries }) {
    // },

    /**
     * Hook that gets executed after the suite has ended
     * @param {Object} suite suite details
     */
    // afterSuite: function (suite) {
    // },
    /**
     * Runs after a WebdriverIO command gets executed
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     * @param {Number} result 0 - command success, 1 - command error
     * @param {Object} error error object if any
     */
    // afterCommand: function (commandName, args, result, error) {
    // },
    /**
     * Gets executed after all tests are done. You still have access to all global variables from
     * the test.
     * @param {Number} result 0 - test pass, 1 - test fail
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // after: function (result, capabilities, specs) {
    // },
    /**
     * Gets executed right after terminating the webdriver session.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // afterSession: function (config, capabilities, specs) {
    // },
    /**
     * Gets executed after all workers got shut down and the process is about to exit. An error
     * thrown in the onComplete hook will result in the test run failing.
     * @param {Object} exitCode 0 - success, 1 - fail
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {<Object>} results object containing test results
     */
    // onComplete: function(exitCode, config, capabilities, results) {
    // },
    /**
     * Gets executed when a refresh happens.
     * @param {String} oldSessionId session ID of the old session
     * @param {String} newSessionId session ID of the new session
     */
    // onReload: function(oldSessionId, newSessionId) {
    // }
}


来源: stackexchange

问:
Create ECS Context with Docker without Docker Desktop
I'm trying to create an ECS context using Docker so that I can deploy to AWS using the Docker Compose CLI

```<code>docker context create ecs <my context name>
</code>```

But am receiving the following error:

```<code>"docker context create" requires exactly 1 argument.
See 'docker context create --help'.

Usage:  docker context create [OPTIONS] CONTEXT

Create a context
</code>```

I've edited my /etc/docker/daemon.json to include

```<code>{
    "experimental": true
}
</code>```

My Docker Compose CLI is version 2.14.2 and both the Client and Server show experimental as true

```<code>Client:
 Version:           20.10.22
 API version:       1.41
 Go version:        go1.19.4
 Git commit:        3a2c30b63a
 Built:             Tue Dec 20 20:43:40 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.22
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.19.4
  Git commit:       42c8b31499
  Built:            Tue Dec 20 20:42:46 2022
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.6.14
  GitCommit:        9ba4b250366a5ddde94bb7c9d1def331423aa323.m
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d1
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
</code>```

This should be available in Docker since 19.03
https://docs.docker.com/cloud/ecs-integration/#install-the-docker-compose-cli-on-linux

So far I've only been able to create an ECS context by installing Docker with the experimental Arch package for Docker Desktop instead of Docker Compose Standalone. The weird thing is, Docker Desktop's Docker Compose version is only 2.13.

This also might be related to this question:
docker context create ecs myecs - requires exactly one argument

ContentLicense: CC BY-SA 4.0

Body:
I'm trying to create an ECS context using Docker so that I can deploy to AWS using the Docker Compose CLI

docker context create ecs <my context name>

But am receiving the following error:

"docker context create" requires exactly 1 argument.
See 'docker context create --help'.

Usage:  docker context create [OPTIONS] CONTEXT

Create a context

I've edited my /etc/docker/daemon.json to include

{
    "experimental": true
}

My Docker Compose CLI is version 2.14.2 and both the Client and Server show experimental as true

Client:
 Version:           20.10.22
 API version:       1.41
 Go version:        go1.19.4
 Git commit:        3a2c30b63a
 Built:             Tue Dec 20 20:43:40 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.22
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.19.4
  Git commit:       42c8b31499
  Built:            Tue Dec 20 20:42:46 2022
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.6.14
  GitCommit:        9ba4b250366a5ddde94bb7c9d1def331423aa323.m
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d1
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

This should be available in Docker since 19.03
https://docs.docker.com/cloud/ecs-integration/#install-the-docker-compose-cli-on-linux

So far I've only been able to create an ECS context by installing Docker with the experimental Arch package for Docker Desktop instead of Docker Compose Standalone. The weird thing is, Docker Desktop's Docker Compose version is only 2.13.

This also might be related to this question:
docker context create ecs myecs - requires exactly one argument


问:
Flutter convert xlsx to List<Object>
I have an xlsx excel table and I need to convert it into a List<Object> and take just the following columns: D, F, H, J, L. I'm trying everything but nothing works.

I'm using the following plugin to do it:

file_picker

excel

Does anyone know how can I convert it?

Table

Here is my example code:

import 'package:adminpanelweb/models/import_users.dart';
import 'package:excel/excel.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';

Future importUsers(BuildContext context, String palaceId) async {
  FilePickerResult? pickedFile = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['xlsx'],
    allowMultiple: false,
  );

  if (pickedFile != null) {
    var bytes = pickedFile.files.single.bytes;
    var excel = Excel.decodeBytes(bytes!);
    List<ImportUsers> users = [];
    List<String> stringList = [];
    for (var table in excel.tables.keys) {
      for (var rows in excel.tables[table]!.rows) {
        // print(
        //   '${rows.toString().isNotEmpty ? rows.map((e) => e?.value).toList() : ''}',
        // );

        stringList.add(
            '${rows.toString().isNotEmpty ? rows.map((e) => e?.value).toList() : ''}');
      }
    }
    final regExp = RegExp(r'(?:\[)?(\[[^\]]*?\](?:,?))(?:\])?');
    final input = stringList.toString();
    final result = regExp
        .allMatches(input)
        .map((m) => m.group(1))
        .map((String? item) => item?.replaceAll(RegExp(r'[\[\]]'), ''))
        .map((m) => [m])
        .toList();

    for (var items in result) {
      users = items.map((e) {
        return {
          "field1": e?[0],
          "WEB": e?[1],
          "R": e?[2],
          "Denominazione": e?[3],
          "Data Uscita": e?[4],
          "Codice Fiscale": e?[5],
          "Partita IVA": e?[6],
          "Username": e?[7],
          "field9": e?[8],
          "Password": e?[9],
          "Profilo": e?[10],
          "Email": e?[11],
        };
      }).toList() as List<ImportUsers>;
      print(items);
    }
    // print('sadasdasdasdsad ${users.length}');
  }
}
```
<p>After some hours I solved as it:</p>
<pre class="lang-dart prettyprint-override"><code>Future importUsers(BuildContext context, String palaceId) async {
  FilePickerResult? pickedFile = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['xlsx'],
    allowMultiple: false,
  );

  if (pickedFile != null) {
    List<User> xlsxToList = [];
    var bytes = pickedFile.files.single.bytes;
    var excel = Excel.decodeBytes(bytes!);

    for (var table in excel.tables.keys) {
      for (var row in excel.tables[table]!.rows) {
        xlsxToList.add(
          User(
            userEmail: row[11]?.value.toString(),
            userUsername: row[7]?.value.toString(),
            userName: row[3]?.value.toString(),
            userCf: row[5]?.value.toString(),
            userPassword: row[9]?.value.toString(),
          ),
        );
      }
    }
    xlsxToList.removeAt(0);
    print('__________ ${userToJson(xlsxToList)}');
  }
}
</code>```

Title: Flutter convert xlsx to List<Object>

Body:
I have an xlsx excel table and I need to convert it into a List<Object> and take just the following columns: D, F, H, J, L. I'm trying everything but nothing works.

I'm using the following plugin to do it:

file_picker

excel

Does anyone know how can I convert it?

Table

Here is my example code:

import 'package:adminpanelweb/models/import_users.dart';
import 'package:excel/excel.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';

Future importUsers(BuildContext context, String palaceId) async {
  FilePickerResult? pickedFile = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['xlsx'],
    allowMultiple: false,
  );

  if (pickedFile != null) {
    var bytes = pickedFile.files.single.bytes;
    var excel = Excel.decodeBytes(bytes!);
    List<ImportUsers> users = [];
    List<String> stringList = [];
    for (var table in excel.tables.keys) {
      for (var rows in excel.tables[table]!.rows) {
        // print(
        //   '${rows.toString().isNotEmpty ? rows.map((e) => e?.value).toList() : ''}',
        // );

        stringList.add(
            '${rows.toString().isNotEmpty ? rows.map((e) => e?.value).toList() : ''}');
      }
    }
    final regExp = RegExp(r'(?:\[)?(\[[^\]]*?\](?:,?))(?:\])?');
    final input = stringList.toString();
    final result = regExp
        .allMatches(input)
        .map((m) => m.group(1))
        .map((String? item) => item?.replaceAll(RegExp(r'[\[\]]'), ''))
        .map((m) => [m])
        .toList();

    for (var items in result) {
      users = items.map((e) {
        return {
          "field1": e?[0],
          "WEB": e?[1],
          "R": e?[2],
          "Denominazione": e?[3],
          "Data Uscita": e?[4],
          "Codice Fiscale": e?[5],
          "Partita IVA": e?[6],
          "Username": e?[7],
          "field9": e?[8],
          "Password": e?[9],
          "Profilo": e?[10],
          "Email": e?[11],
        };
      }).toList() as List<ImportUsers>;
      print(items);
    }
    // print('sadasdasdasdsad ${users.length}');
  }
}

After some hours I solved as it:

Future importUsers(BuildContext context, String palaceId) async {
  FilePickerResult? pickedFile = await FilePicker.platform.pickFiles(
    type: FileType.custom,
    allowedExtensions: ['xlsx'],
    allowMultiple: false,
  );

  if (pickedFile != null) {
    List<User> xlsxToList = [];
    var bytes = pickedFile.files.single.bytes;
    var excel = Excel.decodeBytes(bytes!);

    for (var table in excel.tables.keys) {
      for (var row in excel.tables[table]!.rows) {
        xlsxToList.add(
          User(
            userEmail: row[11]?.value.toString(),
            userUsername: row[7]?.value.toString(),
            userName: row[3]?.value.toString(),
            userCf: row[5]?.value.toString(),
            userPassword: row[9]?.value.toString(),
          ),
        );
      }
    }
    xlsxToList.removeAt(0);
    print('__________ ${userToJson(xlsxToList)}');
  }
}


问:
How to fix jhipster: No MethodInvocation found: Check that an AOP invocation is in when using repository
I have a jhipster generated gateway, where I want to add a new method to an existing repository (generated with jhipster entity command) This repository is extending by default R2dbcRepository. So far I have implemented my method called findReceiptsByCompanyId() when I am trying to call this method, it gives me the following error:

```<code>java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation is in progress and that the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST_PRECEDENCE will execute before ExposeInvocationInterceptor! In addition, ExposeInvocationInterceptor and ExposeInvocationInterceptor.currentInvocation() must be invoked from the same thread.
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.currentInvocation(ExposeInvocationInterceptor.java:74)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoError] :
    reactor.core.publisher.Mono.error(Mono.java:313)
    org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$5(TransactionAspectSupport.java:951)
Error has been observed at the following site(s):
    |_         Mono.error ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$5(TransactionAspectSupport.java:951)
    |_     Flux.usingWhen ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$8(TransactionAspectSupport.java:944)
    |_          Mono.then ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$7(TransactionAspectSupport.java:958)
    |_ Flux.onErrorResume ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$8(TransactionAspectSupport.java:957)
    |_   Mono.flatMapMany ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$invokeWithinTransaction$9(TransactionAspectSupport.java:940)
    |_   Mono.flatMapMany ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:939)
    |_  Flux.contextWrite ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:964)
    |_  Flux.contextWrite ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:965)
    |_   Flux.collectList ⇢ at com.nosi.gateway.web.rest.ReceiptResource.getAllReceiptsByCompanyId(ReceiptResource.java:180)
    |_           Mono.map ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:150)
    |_          Mono.flux ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:151)
    |_ Flux.singleOrEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:129)
    |_ Mono.switchIfEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:130)
    |_       Mono.flatMap ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:134)
    |_         checkpoint ⇢ Handler com.nosi.gateway.web.rest.ReceiptResource#getAllReceiptsByCompanyId(Long) [DispatcherHandler]
</code>```

How can I fix this? This is how my repository I modified looks like:

```<code>/**
 * Spring Data SQL reactive repository for the Receipt entity.
 */
@SuppressWarnings("unused")
@Repository
public interface ReceiptRepository extends R2dbcRepository<Receipt, Long>, ReceiptRepositoryInternal {
    @Query("SELECT * FROM receipt entity WHERE entity.user_receipt_id = :id")
    Flux<Receipt> findByUser_receipt(Long id);

    @Query("SELECT * FROM receipt entity WHERE entity.user_receipt_id IS NULL")
    Flux<Receipt> findAllWhereUser_receiptIsNull();

    // just to avoid having unambigous methods
    @Override
    Flux<Receipt> findAll();

    @Override
    Flux<Receipt> findReceiptsByCompanyId(Long id);

    @Override
    Mono<Receipt> findById(Long id);

    @Override
    <S extends Receipt> Mono<S> save(S entity);
}

interface ReceiptRepositoryInternal{
    <S extends Receipt> Mono<S> insert(S entity);
    <S extends Receipt> Mono<S> save(S entity);
    Mono<Integer> update(Receipt entity);

    Flux<Receipt> findAll();
    Mono<Receipt> findById(Long id);
    Flux<Receipt> findAllBy(Pageable pageable);
    Flux<Receipt> findAllBy(Pageable pageable, Criteria criteria);

    Flux<Receipt> findReceiptsByCompanyId(Long id);

}
</code>```

My service class implementing the method:

```<code>@Service
@Transactional
public class ReceiptService {

    private final Logger log = LoggerFactory.getLogger(ReceiptService.class);

    private final ReceiptRepository receiptRepository;

    private final ReceiptMapper receiptMapper;

    public ReceiptService(ReceiptRepository receiptRepository, ReceiptMapper receiptMapper) {
        this.receiptRepository = receiptRepository;
        this.receiptMapper = receiptMapper;
    }

    /**
     * Save a receipt.
     *
     * @param receiptDTO the entity to save.
     * @return the persisted entity.
     */
    public Mono<ReceiptDTO> save(ReceiptDTO receiptDTO) {
        log.debug("Request to save Receipt : {}", receiptDTO);
        return receiptRepository.save(receiptMapper.toEntity(receiptDTO)).map(receiptMapper::toDto);
    }

    /**
     * Partially update a receipt.
     *
     * @param receiptDTO the entity to update partially.
     * @return the persisted entity.
     */
    public Mono<ReceiptDTO> partialUpdate(ReceiptDTO receiptDTO) {
        log.debug("Request to partially update Receipt : {}", receiptDTO);

        return receiptRepository
            .findById(receiptDTO.getId())
            .map(existingReceipt -> {
                receiptMapper.partialUpdate(existingReceipt, receiptDTO);

                return existingReceipt;
            })
            .flatMap(receiptRepository::save)
            .map(receiptMapper::toDto);
    }

    public Flux<ReceiptDTO> findByCompany(Long companyUserID) {
        log.debug("Request to get all Receipts by a company");
        return receiptRepository.findReceiptsByCompanyId(companyUserID).map(receiptMapper::toDto);

   }

}
</code>```

And finally my controller:

```<code>@RestController
@RequestMapping("/api")
public class ReceiptResource {

    private final Logger log = LoggerFactory.getLogger(ReceiptResource.class);

    private static final String ENTITY_NAME = "receipt";

    @Value("${jhipster.clientApp.name}")
    private String applicationName;

    private final ReceiptService receiptService;

    private final ReceiptRepository receiptRepository;

    private final UserRepository userRepository;

    public ReceiptResource(ReceiptService receiptService, ReceiptRepository receiptRepository, UserRepository userRepository) {
        this.receiptService = receiptService;
        this.receiptRepository = receiptRepository;
        this.userRepository = userRepository;
    }

    /**
     * {@code POST  /receipts} : Create a new receipt.
     *
     * @param receiptDTO the receiptDTO to create.
     * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new receiptDTO, or with status {@code 400 (Bad Request)} if the receipt has already an ID.
     * @throws URISyntaxException if the Location URI syntax is incorrect.
     */

    @PostMapping("/receipts")
    public Mono<ResponseEntity<ReceiptDTO>> createReceipt(@RequestBody ReceiptDTO receiptDTO) throws URISyntaxException {
        log.debug("REST request to save Receipt : {}", receiptDTO);
        if (receiptDTO.getId() != null) {
            throw new BadRequestAlertException("A new receipt cannot already have an ID", ENTITY_NAME, "idexists");
        }
        return receiptService
            .save(receiptDTO)
            .map(result -> {
                try {
                    return ResponseEntity
                        .created(new URI("/api/receipts/" + result.getId()))
                        .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
                        .body(result);
                } catch (URISyntaxException e) {
                    throw new RuntimeException(e);
                }
            });
    }

    @GetMapping("/receipts/byUserId")
    public Mono<List<ReceiptDTO>> getAllReceiptsByCompanyId(@RequestParam Long companyId) {
        log.debug("REST request to get all Receipts");

        return receiptService.findByCompany(companyId).collectList();
    }
}
</code>```

Body:
I have a jhipster generated gateway, where I want to add a new method to an existing repository (generated with jhipster entity command) This repository is extending by default R2dbcRepository. So far I have implemented my method called findReceiptsByCompanyId() when I am trying to call this method, it gives me the following error:

java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation is in progress and that the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST_PRECEDENCE will execute before ExposeInvocationInterceptor! In addition, ExposeInvocationInterceptor and ExposeInvocationInterceptor.currentInvocation() must be invoked from the same thread.
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.currentInvocation(ExposeInvocationInterceptor.java:74)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Assembly trace from producer [reactor.core.publisher.MonoError] :
    reactor.core.publisher.Mono.error(Mono.java:313)
    org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$5(TransactionAspectSupport.java:951)
Error has been observed at the following site(s):
    |_         Mono.error ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$5(TransactionAspectSupport.java:951)
    |_     Flux.usingWhen ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$8(TransactionAspectSupport.java:944)
    |_          Mono.then ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$7(TransactionAspectSupport.java:958)
    |_ Flux.onErrorResume ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$null$8(TransactionAspectSupport.java:957)
    |_   Mono.flatMapMany ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.lambda$invokeWithinTransaction$9(TransactionAspectSupport.java:940)
    |_   Mono.flatMapMany ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:939)
    |_  Flux.contextWrite ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:964)
    |_  Flux.contextWrite ⇢ at org.springframework.transaction.interceptor.TransactionAspectSupport$ReactiveTransactionSupport.invokeWithinTransaction(TransactionAspectSupport.java:965)
    |_   Flux.collectList ⇢ at com.nosi.gateway.web.rest.ReceiptResource.getAllReceiptsByCompanyId(ReceiptResource.java:180)
    |_           Mono.map ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:150)
    |_          Mono.flux ⇢ at org.springframework.http.codec.json.AbstractJackson2Encoder.encode(AbstractJackson2Encoder.java:151)
    |_ Flux.singleOrEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:129)
    |_ Mono.switchIfEmpty ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:130)
    |_       Mono.flatMap ⇢ at org.springframework.http.codec.EncoderHttpMessageWriter.write(EncoderHttpMessageWriter.java:134)
    |_         checkpoint ⇢ Handler com.nosi.gateway.web.rest.ReceiptResource#getAllReceiptsByCompanyId(Long) [DispatcherHandler]

How can I fix this? This is how my repository I modified looks like:

/**
 * Spring Data SQL reactive repository for the Receipt entity.
 */
@SuppressWarnings("unused")
@Repository
public interface ReceiptRepository extends R2dbcRepository<Receipt, Long>, ReceiptRepositoryInternal {
    @Query("SELECT * FROM receipt entity WHERE entity.user_receipt_id = :id")
    Flux<Receipt> findByUser_receipt(Long id);

    @Query("SELECT * FROM receipt entity WHERE entity.user_receipt_id IS NULL")
    Flux<Receipt> findAllWhereUser_receiptIsNull();

    // just to avoid having unambigous methods
    @Override
    Flux<Receipt> findAll();

    @Override
    Flux<Receipt> findReceiptsByCompanyId(Long id);

    @Override
    Mono<Receipt> findById(Long id);

    @Override
    <S extends Receipt> Mono<S> save(S entity);
}

interface ReceiptRepositoryInternal{
    <S extends Receipt> Mono<S> insert(S entity);
    <S extends Receipt> Mono<S> save(S entity);
    Mono<Integer> update(Receipt entity);

    Flux<Receipt> findAll();
    Mono<Receipt> findById(Long id);
    Flux<Receipt> findAllBy(Pageable pageable);
    Flux<Receipt> findAllBy(Pageable pageable, Criteria criteria);

    Flux<Receipt> findReceiptsByCompanyId(Long id);

}

My service class implementing the method:

@Service
@Transactional
public class ReceiptService {

    private final Logger log = LoggerFactory.getLogger(ReceiptService.class);

    private final ReceiptRepository receiptRepository;

    private final ReceiptMapper receiptMapper;

    public ReceiptService(ReceiptRepository receiptRepository, ReceiptMapper receiptMapper) {
        this.receiptRepository = receiptRepository;
        this.receiptMapper = receiptMapper;
    }

    /**
     * Save a receipt.
     *
     * @param receiptDTO the entity to save.
     * @return the persisted entity.
     */
    public Mono<ReceiptDTO> save(ReceiptDTO receiptDTO) {
        log.debug("Request to save Receipt : {}", receiptDTO);
        return receiptRepository.save(receiptMapper.toEntity(receiptDTO)).map(receiptMapper::toDto);
    }

    /**
     * Partially update a receipt.
     *
     * @param receiptDTO the entity to update partially.
     * @return the persisted entity.
     */
    public Mono<ReceiptDTO> partialUpdate(ReceiptDTO receiptDTO) {
        log.debug("Request to partially update Receipt : {}", receiptDTO);

        return receiptRepository
            .findById(receiptDTO.getId())
            .map(existingReceipt -> {
                receiptMapper.partialUpdate(existingReceipt, receiptDTO);

                return existingReceipt;
            })
            .flatMap(receiptRepository::save)
            .map(receiptMapper::toDto);
    }

    public Flux<ReceiptDTO> findByCompany(Long companyUserID) {
        log.debug("Request to get all Receipts by a company");
        return receiptRepository.findReceiptsByCompanyId(companyUserID).map(receiptMapper::toDto);

   }

}

And finally my controller:

@RestController
@RequestMapping("/api")
public class ReceiptResource {

    private final Logger log = LoggerFactory.getLogger(ReceiptResource.class);

    private static final String ENTITY_NAME = "receipt";

    @Value("${jhipster.clientApp.name}")
    private String applicationName;

    private final ReceiptService receiptService;

    private final ReceiptRepository receiptRepository;

    private final UserRepository userRepository;

    public ReceiptResource(ReceiptService receiptService, ReceiptRepository receiptRepository, UserRepository userRepository) {
        this.receiptService = receiptService;
        this.receiptRepository = receiptRepository;
        this.userRepository = userRepository;
    }

    /**
     * {@code POST  /receipts} : Create a new receipt.
     *
     * @param receiptDTO the receiptDTO to create.
     * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new receiptDTO, or with status {@code 400 (Bad Request)} if the receipt has already an ID.
     * @throws URISyntaxException if the Location URI syntax is incorrect.
     */

    @PostMapping("/receipts")
    public Mono<ResponseEntity<ReceiptDTO>> createReceipt(@RequestBody ReceiptDTO receiptDTO) throws URISyntaxException {
        log.debug("REST request to save Receipt : {}", receiptDTO);
        if (receiptDTO.getId() != null) {
            throw new BadRequestAlertException("A new receipt cannot already have an ID", ENTITY_NAME, "idexists");
        }
        return receiptService
            .save(receiptDTO)
            .map(result -> {
                try {
                    return ResponseEntity
                        .created(new URI("/api/receipts/" + result.getId()))
                        .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId().toString()))
                        .body(result);
                } catch (URISyntaxException e) {
                    throw new RuntimeException(e);
                }
            });
    }

    @GetMapping("/receipts/byUserId")
    public Mono<List<ReceiptDTO>> getAllReceiptsByCompanyId(@RequestParam Long companyId) {
        log.debug("REST request to get all Receipts");

        return receiptService.findByCompany(companyId).collectList();
    }
}


问:
java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes-executor-release.so. in React-Native: 0.70.6
info Fetching system and libraries information...
System:
OS: macOS 12.2.1
CPU: (10) arm64 Apple M1 Max
Memory: 122.73 MB / 32.00 GB
Shell: 5.8 - /bin/zsh
Binaries:
Node: 18.11.0 - /opt/homebrew/bin/node
Yarn: 1.22.18 - /opt/homebrew/bin/yarn
npm: 8.19.2 - /opt/homebrew/bin/npm
Watchman: 2022.10.17.00 - /opt/homebrew/bin/watchman
Managers:
CocoaPods: 1.11.3 - /opt/homebrew/bin/pod
SDKs:
iOS SDK:
Platforms: DriverKit 21.4, iOS 15.4, macOS 12.3, tvOS 15.4, watchOS 8.5
Android SDK:
API Levels: 23, 29, 30, 31, 32, 33
Build Tools: 29.0.2, 29.0.3, 30.0.2, 30.0.3, 32.0.0, 32.1.0, 33.0.0, 33.0.1
System Images: android-24 | Google APIs ARM 64 v8a, android-25 | Google APIs ARM 64 v8a, android-28 | Google APIs ARM 64 v8a, android-28 | Google ARM64-V8a Play ARM 64 v8a, android-29 | ARM 64 v8a, android-29 | Google Play ARM 64 v8a, android-30 | ARM 64 v8a, android-30 | Intel x86 Atom_64, android-30 | Google APIs ARM 64 v8a, android-30 | Google APIs Intel x86 Atom, android-30 | Google APIs Intel x86 Atom_64, android-30 | Google Play ARM 64 v8a, android-30 | Google Play Intel x86 Atom, android-30 | Google Play Intel x86 Atom_64, android-31 | ARM 64 v8a, android-31 | Intel x86 Atom_64, android-31 | Google APIs ARM 64 v8a, android-31 | Google APIs Intel x86 Atom_64, android-31 | Google Play ARM 64 v8a, android-31 | Google Play Intel x86 Atom_64, android-32 | Google APIs ARM 64 v8a, android-32 | Google APIs Intel x86 Atom_64, android-32 | Google Play ARM 64 v8a, android-32 | Google Play Intel x86 Atom_64, android-33 | Google APIs ARM 64 v8a, android-Tiramisu | Google Play ARM 64 v8a
Android NDK: 22.1.7171670
IDEs:
Android Studio: 2021.3 AI-213.7172.25.2113.9123335
Xcode: 13.3/13E113 - /usr/bin/xcodebuild
Languages:
Java: 11.0.8 - /Library/Java/JavaVirtualMachines/openlogic-openjdk-11.jdk/Contents/Home/bin/javac
npmPackages:
@react-native-community/cli: Not Found
react: 18.2.0 => 18.2.0
react-native: 0.70.6 => 0.70.6
react-native-macos: Not Found
npmGlobalPackages:
react-native: Not Found

While opening an app itself I am getting below crash

java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes-executor-release.so

SoSource 0: com.facebook.soloader.DirectorySoSource[root = /data/app/~~Ugf7fQtxfAVyef-2afpx_A==/com.swellmoney.qa.android-bbsSDgEUlLKmTLucaSeD8g==/lib/arm64 flags = 0]
SoSource 1: com.facebook.soloader.DirectApkSoSource[root = (/data/app/~~Ugf7fQtxfAVyef-2afpx_A==/com.swellmoney.qa.android-bbsSDgEUlLKmTLucaSeD8g==/base.apk!/lib/arm64-v8a, )]
SoSource 2: com.facebook.soloader.DirectorySoSource[root = /system/lib64 flags = 2]
SoSource 3: com.facebook.soloader.DirectorySoSource[root = /vendor/lib64 flags = 2]
Native lib dir: /data/app/~~Ugf7fQtxfAVyef-2afpx_A==/com.swellmoney.qa.android-bbsSDgEUlLKmTLucaSeD8g==/lib/arm64
result: 0
at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:1127)
at com.facebook.soloader.SoLoader.loadLibraryBySoNameImpl(SoLoader.java:943)
at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:855)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:802)
at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:772)
at com.facebook.hermes.reactexecutor.HermesExecutor.loadLibrary(HermesExecutor.java:30)
at com.facebook.hermes.reactexecutor.HermesExecutor.(HermesExecutor.java:19)
at com.facebook.hermes.reactexecutor.HermesExecutor.loadLibrary(HermesExecutor.java:23)
at com.facebook.react.ReactInstanceManagerBuilder.getDefaultJSExecutorFactory(ReactInstanceManagerBuilder.java:393)
at com.facebook.react.ReactInstanceManagerBuilder.build(ReactInstanceManagerBuilder.java:343)
at com.facebook.react.ReactNativeHost.createReactInstanceManager(ReactNativeHost.java:96)
at com.facebook.react.ReactNativeHost.getReactInstanceManager(ReactNativeHost.java:42)
at com.swellmoney.android.MainApplication.onCreate(MainApplication.java:67)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1192)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6712)
at android.app.ActivityThread.access$1300(ActivityThread.java:237)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)


问:
Why is my Roblox player added code not working
```<code>game.Players.PlayerAdded:Connect(function(plr)
    wait(3)
    local clone = workspace:FindFirstChild(plr.Name):Clone()
    clone.Parent = game.ReplicatedStorage.Regenerate
end)
game.Players.PlayerRemoving:Connect(function(plr)
    game.ReplicatedStorage.Regenerate:FindFirstChild(plr.Name):Destroy()
end)
</code>```

I'm making a regenerate button, but the clone parent isn't cloning or setting the parent. Here's the error: ServerScriptService.Script:4: attempt to index nil with 'Parent'

Body:
game.Players.PlayerAdded:Connect(function(plr)
    wait(3)
    local clone = workspace:FindFirstChild(plr.Name):Clone()
    clone.Parent = game.ReplicatedStorage.Regenerate
end)
game.Players.PlayerRemoving:Connect(function(plr)
    game.ReplicatedStorage.Regenerate:FindFirstChild(plr.Name):Destroy()
end)

I'm making a regenerate button, but the clone parent isn't cloning or setting the parent. Here's the error: ServerScriptService.Script:4: attempt to index nil with 'Parent'


问:
Examples of manipulating a 3d model inside an aframe photosphere
I want a gltf model inside a photosphere to behave like in aframe-model-viewer - you can "grab" it with mouse or controllers and rotate it in all axes, and zoom it. But when "not grabbing" or rotating away from the model for the photosphere to behave as normal.

So the model-viewer behaviour only occurs when interacting with the model in vr, mobile and desktop browser - it’s a gltf you can manipulate within a photosphere with the camera fixed to the centre of the sphere. Is that possible, and if it is do you know of any examples I can look at?

I've tried adding the model-viewer component into a photosphere scene, but the scene doesn't load, no errors.


问:
Can Tkinter Treeview Display Images in Any Column Rows As Shown Here?
I'm able to easily populate and sort the Treeview widget, but I was also wondering if it's possible to add images in any column rows that I want. I've checked all over the net, but was unable to find any examples.

Here's an image displaying exactly what I'm trying to achieve.
enter image description here

I'd like to be able to add little image icons to multiple column rows as needed. Anyone know of a way to do it in Tkinter or within some other similar widget? Thanks.


问:
Saving an object updates all the fields even when `updatable=false` in SpringJPA
I have an class called Credential which has field called User. Here is the class,

```<code>@Entity
public class Credential extends BaseModel {

    // more fields

    @ManyToOne(targetEntity = User.class, cascade = CascadeType.ALL)
    @JoinTable(name = "user_cred", joinColumns = @JoinColumn(name = "cred_id",
    updatable = false, insertable = true),
    inverseJoinColumns = @JoinColumn(name = "user_id", updatable = false,
    insertable = true))
    @JsonIgnore
    private User user;

    // setters getters
}
</code>```

I also have a service class which I am using to save this object of this Credential class. Now the user class is having a field Key which I don't want to update if I am saving a new Credential object.
Here is the User class,

```<code>@Entity
@Table(name = "users")
public class User extends BaseModel {

    // more fields

    @OneToOne(targetEntity = AESKey.class, cascade = CascadeType.ALL)
    @JoinColumn(name = "password_id", updatable = false, insertable = true)
    private Key password;

    // getter setter
}
</code>```

I have used updatable=false in both User field inCredential and Key field in User. Even then when I am saving the Credential object, Key object is also updated.
I have tried removing cascade = CascadeType.ALL but the result is the same.
Here is the query that runs everytime I save the Credential object,

```<code>Hibernate: insert into credential (creation_date, associated_phone_number, email, password, username, id) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into user_cred (user_id, cred_id) values (?, ?)
Hibernate: update key set creation_date=?, key=?, type=? where id=?
</code>```

I dont want to add updatable=false to my fields in Key class as then I will be forbidden to update my Key objects directly. I just want to prevent indirect updations.

Can anyone tell how prevent my Key object from updating.

Body:
I have an class called Credential which has field called User. Here is the class,

@Entity
public class Credential extends BaseModel {

    // more fields

    @ManyToOne(targetEntity = User.class, cascade = CascadeType.ALL)
    @JoinTable(name = "user_cred", joinColumns = @JoinColumn(name = "cred_id",
    updatable = false, insertable = true),
    inverseJoinColumns = @JoinColumn(name = "user_id", updatable = false,
    insertable = true))
    @JsonIgnore
    private User user;

    // setters getters
}

I also have a service class which I am using to save this object of this Credential class. Now the user class is having a field Key which I don't want to update if I am saving a new Credential object.
Here is the User class,

@Entity
@Table(name = "users")
public class User extends BaseModel {

    // more fields

    @OneToOne(targetEntity = AESKey.class, cascade = CascadeType.ALL)
    @JoinColumn(name = "password_id", updatable = false, insertable = true)
    private Key password;

    // getter setter
}

I have used updatable=false in both User field inCredential and Key field in User. Even then when I am saving the Credential object, Key object is also updated.
I have tried removing cascade = CascadeType.ALL but the result is the same.
Here is the query that runs everytime I save the Credential object,

Hibernate: insert into credential (creation_date, associated_phone_number, email, password, username, id) values (?, ?, ?, ?, ?, ?)
Hibernate: insert into user_cred (user_id, cred_id) values (?, ?)
Hibernate: update key set creation_date=?, key=?, type=? where id=?

I dont want to add updatable=false to my fields in Key class as then I will be forbidden to update my Key objects directly. I just want to prevent indirect updations.

Can anyone tell how prevent my Key object from updating.


问:
Issues with Default Docker image in Hyperledger Iroha 2
I'm following the tutorial on how to build and install Hyperledger Iroha 2 (https://hyperledger.github.io/iroha-2-docs/guide/build-and-install.html). I've cloned this repository: https://github.com/hyperledger/iroha/tree/iroha2-stable

Everything works fine until it comes to running the docker-compose up command. I get two issues:

Telemetry does not start correctly

iroha-iroha3-1  | 2022-12-23T19:46:49.464546Z ERROR iroha: Telemetry did not start

It fails to deserialise the raw genesis block, which leads to the peer exiting

iroha-iroha0-1  | 2022-12-23T19:46:49.951644Z  INFO iroha: Iroha version cargo_pkg_version="2.0.0-pre-rc.9" git_sha="28e4a4d088cda046410cf93f30dae3a925b3d82e"
iroha-iroha0-1  | Error: Failed to deserialize raw genesis block from "/config/genesis.json"
iroha-iroha0-1  |
iroha-iroha0-1  | Caused by:
iroha-iroha0-1  |     data did not match any variant of untagged enum DeserializeHelper at line 246 column 9
iroha-iroha0-1  |
iroha-iroha0-1  | Location:
iroha-iroha0-1  |     /iroha/core/src/genesis.rs:254:41

I'm a bit lost as to what the issue is, or even where to find this "/config/genesis.json" file as its within the docker image.

Any help would be much appreciated


问:
Is there a way to update the lightbox album/gallery when using it with a filter?
I'm using Isotope & Lightbox2 to create a filterable gallery, which is working fine. However, when I open the light box while browsing a specific filtered gallery, navigating through the lightbox also displays other images.

Is it possible to change the list of images displayed by the lightbox based on the filter?

I'm using vanilla javascript.

I tried updating the lightbox album, but it didn't work.


问:
Program still referencing anaconda after uninstall
I'm attempting to install and run this github project, and have installed Python 3.10 on my Windows 10 PC, and added it to the PATH.

When I go to start running it, it searches for a Python installation and instead of locating Python 3.10, it looks in "C:\Users\username\anaconda3\python.exe", however, I have uninstalled Anaconda, deleted its folder, and removed it from my PATH environment variables. I have also added Python 3.10 to the top of my PATH variable, and restarted my computer, however it still appears to be referencing this old Anaconda install.

Is there another location Anaconda may still be installed/referenced besides the environment PATH variable, and the folder it was previously contained in?

What I have tried:

Uninstalling and deleting Anaconda.

Restarting the PC.

Installing Python 3.10, and adding it to PATH.

Updating PATH variables to point to Python 3.10, and removing Anaconda3 from there.


问:
.NET 7.0/C# Linux - Enumerate audio devices, select one and play WAVs through it
I'm currently porting a small program I wrote for Windows to Linux.

Broken down to its essentials, this program more or less just needs to be able to:

Enumerate through available audio out devices

Select one

Play WAVs through it (as well as recognise when a WAV file has finished playing so it can know when it is ready to play another)

The original version of this tool uses NAudio but NAudio unfortunately isn't compatible with Linux.

I've searched high and low for an alternative that can provide the same functionality needed but can't seem to find any straight answer at all. Is there really no existing, straightforward library that can do this on Linux or am I just completely missing it?


问:
Glide - Could not find the image error in Laravel
I have a weird issue with Glide on a fresh local Laravel install (PHP 8.1.13 / Laravel 9.44.0). I followed the documentation to the letter, my route looks like this:

```<code>Route::get('/img/{path}', [ImageController::class, 'show'])->where('path', '.*');
</code>```

I have an ImageController that looks like this:

```<code>namespace App\Http\Controllers;

use Illuminate\Contracts\Filesystem\Filesystem;
use League\Glide\Responses\LaravelResponseFactory;
use League\Glide\ServerFactory;

class ImageController extends Controller
{
    public function show(Filesystem $filesystem, $path)
    {
        $server = ServerFactory::create([
            'response' => new LaravelResponseFactory(app('request')),
            'source' => $filesystem->getDriver(),
            'cache' => $filesystem->getDriver(),
            'cache_path_prefix' => '.cache',
        ]);

        return $server->getImageResponse($path, request()->all());
    }
}
</code>```

But when I try to access an image through the correct path, it gives me a "Could not find the image storage/images/portrait-rose.jpg." error.

This is the error in laravel.log:

```<code>[2022-12-24 09:07:18] local.ERROR: Could not find the image `storage/images/gaia.jpg`. {"userId":1,"exception":"[object] (League\\Glide\\Filesystem\\FileNotFoundException(code: 0): Could not find the image `storage/images/gaia.jpg`. at C:\\wamp\\www\\jolyne\\vendor\\league\\glide\\src\\Server.php:629)
[stacktrace]
#0 C:\\wamp\\www\\jolyne\\vendor\\league\\glide\\src\\Server.php(548): League\\Glide\\Server->makeImage('storage/images/...', Array)
#1 C:\\wamp\\www\\jolyne\\app\\Http\\Controllers\\ImageController.php(20): League\\Glide\\Server->getImageResponse('storage/images/...', Array)
#2 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php(54): App\\Http\\Controllers\\ImageController->show(Object(Illuminate\\Filesystem\\FilesystemAdapter), 'storage/images/...')
#3 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('show', Array)
#4 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(260): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\ImageController), 'show')
#5 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(205): Illuminate\\Routing\\Route->runController()
#6 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(798): Illuminate\\Routing\\Route->run()
#7 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(141): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#8 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\AddLinkHeadersForPreloadedAssets.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#9 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\AddLinkHeadersForPreloadedAssets->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#10 C:\\wamp\\www\\jolyne\\vendor\\inertiajs\\inertia-laravel\\src\\Middleware.php(92): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#11 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Inertia\\Middleware->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#12 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Middleware\\SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#13 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#14 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#15 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#16 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#17 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#18 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#19 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure))
#20 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#21 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#22 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#23 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#25 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#26 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(799): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#27 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(776): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#28 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(740): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#29 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(729): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#30 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(190): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#31 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#32 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#34 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#37 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#40 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#41 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#42 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#43 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#44 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#45 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#46 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#47 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(165): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#48 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(134): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#49 C:\\wamp\\www\\jolyne\\public\\index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#50 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\resources\\server.php(16): require_once('C:\\\\wamp\\\\www\\\\jol...')
#51 {main}
"}
</code>```

Url is: http://localhost:8000/img/storage/images/portrait-rose.jpg

And if I try to access http://localhost:8000/storage/images/portrait-rose.jpg the image definitely shows up.
What could be the issue there?

Thanks in advance.

Body:
I have a weird issue with Glide on a fresh local Laravel install (PHP 8.1.13 / Laravel 9.44.0). I followed the documentation to the letter, my route looks like this:

Route::get('/img/{path}', [ImageController::class, 'show'])->where('path', '.*');

I have an ImageController that looks like this:

namespace App\Http\Controllers;

use Illuminate\Contracts\Filesystem\Filesystem;
use League\Glide\Responses\LaravelResponseFactory;
use League\Glide\ServerFactory;

class ImageController extends Controller
{
    public function show(Filesystem $filesystem, $path)
    {
        $server = ServerFactory::create([
            'response' => new LaravelResponseFactory(app('request')),
            'source' => $filesystem->getDriver(),
            'cache' => $filesystem->getDriver(),
            'cache_path_prefix' => '.cache',
        ]);

        return $server->getImageResponse($path, request()->all());
    }
}

But when I try to access an image through the correct path, it gives me a "Could not find the image storage/images/portrait-rose.jpg." error.

This is the error in laravel.log:

[2022-12-24 09:07:18] local.ERROR: Could not find the image `storage/images/gaia.jpg`. {"userId":1,"exception":"[object] (League\\Glide\\Filesystem\\FileNotFoundException(code: 0): Could not find the image `storage/images/gaia.jpg`. at C:\\wamp\\www\\jolyne\\vendor\\league\\glide\\src\\Server.php:629)
[stacktrace]
#0 C:\\wamp\\www\\jolyne\\vendor\\league\\glide\\src\\Server.php(548): League\\Glide\\Server->makeImage('storage/images/...', Array)
#1 C:\\wamp\\www\\jolyne\\app\\Http\\Controllers\\ImageController.php(20): League\\Glide\\Server->getImageResponse('storage/images/...', Array)
#2 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php(54): App\\Http\\Controllers\\ImageController->show(Object(Illuminate\\Filesystem\\FilesystemAdapter), 'storage/images/...')
#3 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('show', Array)
#4 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(260): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\ImageController), 'show')
#5 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(205): Illuminate\\Routing\\Route->runController()
#6 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(798): Illuminate\\Routing\\Route->run()
#7 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(141): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#8 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\AddLinkHeadersForPreloadedAssets.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#9 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\AddLinkHeadersForPreloadedAssets->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#10 C:\\wamp\\www\\jolyne\\vendor\\inertiajs\\inertia-laravel\\src\\Middleware.php(92): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#11 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Inertia\\Middleware->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#12 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Middleware\\SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#13 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#14 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#15 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#16 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#17 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#18 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#19 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure))
#20 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#21 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#22 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#23 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#24 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#25 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#26 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(799): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#27 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(776): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#28 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(740): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#29 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(729): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#30 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(190): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#31 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#32 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#33 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#34 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#37 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#38 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#39 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#40 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#41 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#42 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#43 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#44 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#45 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#46 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#47 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(165): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#48 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(134): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#49 C:\\wamp\\www\\jolyne\\public\\index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#50 C:\\wamp\\www\\jolyne\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\resources\\server.php(16): require_once('C:\\\\wamp\\\\www\\\\jol...')
#51 {main}
"}

Url is: http://localhost:8000/img/storage/images/portrait-rose.jpg

And if I try to access http://localhost:8000/storage/images/portrait-rose.jpg the image definitely shows up.
What could be the issue there?

Thanks in advance.