### package.json configuration Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/messaging-api/nodejs-sample/index.html.md Example of the package.json file structure before and after adding the start script. ```json { "name": "sample-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } ``` ```json { "name": "sample-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } ``` -------------------------------- ### Display installed path Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/messaging-api/generate-json-web-token/index.html.md Example output showing the installation path of the jwx tool. ```text // Example of installed path display Installed jwx in {installed path} ``` -------------------------------- ### Install Dependencies and Launch LIFF App Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/trying-liff-app/index.html.md Install the necessary package dependencies for the LIFF app and then start the local development server. The app will be accessible once compilation is successful. ```bash yarn install yarn dev ``` -------------------------------- ### Interactive Configuration Prompts Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/cli-tool-create-liff-app/index.html.md Examples of the interactive prompts encountered during the project setup. ```text ? Enter your project name: (my-app) ``` ```text ? Which template do you want to use? (Use arrow keys) ❯ vanilla react vue svelte nextjs nuxtjs ``` ```text ? JavaScript or TypeScript? (Use arrow keys) ❯ JavaScript TypeScript ``` ```text ? Please enter your LIFF ID: Don't you have LIFF ID? Check out https://developers.line.biz/ja/docs/liff/getting-started/ (liffId) ``` ```text ? Which package manager do you want to use? (Use arrow keys) ❯ yarn npm ``` -------------------------------- ### Create Shortcut on Home Screen Examples Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/liff/index.html.md Demonstrates various ways to specify the URL for creating a shortcut on the home screen, including LIFF URLs, permanent links, endpoint URLs, and URLs starting with the endpoint. It also shows an example of handling potential errors. ```javascript // If the endpoint URL of the LINE MINI App // is https://example.com/path1/path2 // and its LIFF ID is 1234567890-AbcdEfgh // Example of specifying the LIFF URL liff .createShortcutOnHomeScreen({ url: "https://miniapp.line.me/1234567890-AbcdEfgh", }) .then(() => { /* ... */ }); liff .createShortcutOnHomeScreen({ url: "https://liff.line.me/1234567890-AbcdEfgh", }) .then(() => { /* ... */ }); // Example of specifying a permanent link liff .createShortcutOnHomeScreen({ url: "https://liff.line.me/1234567890-AbcdEfgh/path3", }) .then(() => { /* ... */ }); // Example of specifying the endpoint URL of the LINE MINI App liff .createShortcutOnHomeScreen({ url: "https://example.com/path1/path2", }) .then(() => { /* ... */ }); // Example of specifying a URL that begins with the endpoint URL of the LINE MINI App liff .createShortcutOnHomeScreen({ url: "https://example.com/path1/path2/path3", }) .then(() => { /* ... */ }); // Example of specifying a URL that results in an error liff .createShortcutOnHomeScreen({ url: "https://example.com/invalid-path", }) .then(() => { /* ... */ }) .catch((error) => { // invalid URL. console.log(error.message); }); ``` -------------------------------- ### Activate a custom LIFF plugin Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/liff/index.html.md This example demonstrates how to use a custom LIFF plugin by defining a class with an `install` method and then registering it with `liff.use()`. The plugin can expose custom functionalities. ```javascript class greetPlugin { constructor() { this.name = "greet"; } install() { return { hello: this.hello, }; } hello() { console.log("Hello, World!"); } } liff.use(new greetPlugin()); ``` -------------------------------- ### Project Installation Output Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/cli-tool-create-liff-app/index.html.md Terminal output showing the dependency installation process after configuration. ```bash yarn install v1.22.19 warning package.json: No license field info No lockfile found. warning my-app@0.0.0: No license field [1/4] 🔍 Resolving packages... [2/4] 🚚 Fetching packages... [3/4] 🔗 Linking dependencies... [4/4] 🔨 Building fresh packages... success Saved lockfile. ✨ Done in 25.06s. Done! Now run: cd my-app yarn dev ``` -------------------------------- ### Install Netlify CLI Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/trying-liff-app/index.html.md Install the Netlify command line interface globally to manage Netlify deployments. ```bash npm install -g netlify-cli ``` -------------------------------- ### Install mkcert Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/liff-cli/index.html.md Installs mkcert via Homebrew for generating local SSL certificates. ```bash # For macOS (using Homebrew) $ brew install mkcert ``` -------------------------------- ### Example of the correct URL after login Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/release-notes/index.html.md This is an example of the correct URL that should be opened after login, following the fix for the redirectUri bug. ```html https://example.com/path?liffIsEscapedFromApp=true ``` -------------------------------- ### Install mkcert on Windows Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/liff-cli/index.html.md Use Chocolatey to install the mkcert tool on a Windows environment. ```bash $ choco install mkcert ``` -------------------------------- ### Install Express.js Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/messaging-api/nodejs-sample/index.html.md Installs the Express.js framework as a project dependency. ```sh npm install express ``` -------------------------------- ### Install dependencies with CocoaPods Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-login-sdks/ios-sdk/swift/setting-up-project/index.html.md Execute this command in your terminal to install the SDK. ```bash $ pod install ``` -------------------------------- ### Initialize Create LIFF App Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/cli-tool-create-liff-app/index.html.md Execute the CLI tool to begin the interactive project setup process. ```bash $ npx @line/create-liff-app ``` -------------------------------- ### Set up LINE SDK in AppDelegate Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-login-sdks/ios-sdk/swift/migration-guide/index.html.md Call `LoginManager.shared.setup` in your app's `didFinishLaunching` delegate method to initialize the SDK with your channel ID. Ensure universal links are handled correctly if applicable. ```swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Add this to your "didFinishLaunching" delegate method. LoginManager.shared.setup(channelID: "YOUR_CHANNEL_ID", universalLinkURL: nil) return true } ``` -------------------------------- ### Example Response for Get Rich Menu List Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md This JSON object displays an example response when successfully retrieving a list of rich menus, including their IDs, names, sizes, and configurations. ```json { "richmenus": [ { "richMenuId": "{richMenuId}", "name": "Nice rich menu", "size": { "width": 2500, "height": 1686 }, "chatBarText": "Tap to open", "selected": false, "areas": [ { "bounds": { "x": 0, "y": 0, "width": 2500, "height": 1686 }, "action": { "type": "postback", "data": "action=buy&itemid=123" } } ] } ] } ``` -------------------------------- ### Example response for getting unit names Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md This is an example of a successful response when retrieving unit names. The `customAggregationUnits` property contains the list of names, and the `next` property is included if there are more results available. ```json { "customAggregationUnits": ["promotion_a", "promotion_b"], "next": "jxEWCEEP..." } ``` -------------------------------- ### Initialize index.js Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/messaging-api/nodejs-sample/index.html.md Creates the main server file and imports necessary modules. ```sh touch index.js ``` ```javascript const https = require("https"); const express = require("express"); const app = express(); ``` -------------------------------- ### Start LINE Login Activity Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-login-sdks/android-sdk/integrate-line-login/index.html.md Initiates the LINE Login flow by getting a login intent and starting the activity. Requires context and channel ID. Handles both app-to-app and browser-based login. ```java private static final int REQUEST_CODE = 1; ... final TextView loginButton = (TextView) findViewById(R.id.login_button); loginButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { try { // App-to-app login Intent loginIntent = LineLoginApi.getLoginIntent( view.getContext(), Constants.CHANNEL_ID, new LineAuthenticationParams.Builder() .scopes(Arrays.asList(Scope.PROFILE)) // .nonce("") // nonce can be used to improve security .build()); startActivityForResult(loginIntent, REQUEST_CODE); } catch(Exception e) { Log.e("ERROR", e.toString()); } } }); ``` -------------------------------- ### Start Local Development Server Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/cli-tool-create-liff-app/index.html.md Command to launch the development server and the expected terminal output. ```bash $ yarn dev yarn run v1.22.19 warning package.json: No license field $ vite vite v2.9.13 dev server running at: > Local: http://localhost:3000/ > Network: use `--host` to expose ready in 170ms. ``` -------------------------------- ### Example Error Response for Get Rich Menu ID (Invalid User ID) Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Illustrates the error response when an invalid user ID is provided for the get rich menu ID request. ```json // If you specify an invalid user ID (400 Bad Request) { "message": "The value for the 'userId' parameter is invalid" } ``` -------------------------------- ### Error Response Example (400 Bad Request) Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Example of an error response when the request to get statistics fails, typically due to invalid parameters like missing unit name or aggregation period. ```json { "message": null, "key": null, "stacktrace": null, "code": null } ``` -------------------------------- ### Clone LINE Login Starter Repository Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-login/getting-started/index.html.md Use this command to download the starter application for LINE Login to your local machine. Ensure Git is installed. ```sh git clone https://github.com/line/line-login-starter.git ``` -------------------------------- ### Get Bot Information Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/partner-docs/index.html.md Retrieves a list of bots with their basic information. Supports pagination using limit and start parameters. ```APIDOC ## GET /v2/bot/list ### Description Retrieves a list of bots with their basic information. Supports pagination using limit and start parameters. ### Method GET ### Endpoint /v2/bot/list ### Parameters #### Query Parameters - **limit** (integer) - Optional - Specify the maximum number of bots that you get basic information from. The default value is `100`. Max value: `100` - **start** (string) - Optional - Value of the continuation token found in the `next` property of the JSON object returned in the response. If you can't get all basic information about the bots in one request, include this parameter to get the remaining array. ### Response #### Success Response (200) - **bots** (array) - Array of Bot list Item objects representing basic information about the bot. - **bots[].userId** (string) - Bot's user ID - **bots[].basicId** (string) - Bot's basic ID - **bots[].premiumId** (string) - Optional - Bot's premium ID. Not included in the response if the premium ID isn't set. - **bots[].displayName** (string) - Bot's display name - **bots[].pictureUrl** (string) - Optional - Profile image URL. Image URL starting with "https://". Not included in the response if the bot doesn't have a profile image. - **next** (string) - Optional - Continuation token. Used to get the next array of basic bot information. This property is only returned if there are more unreturned results. The continuation token expires in 24 hours (86,400 seconds). ### Request Example ```json { "bots": [ { "userId": "Uf2dd6e8b081d2ff9c05c98a8a8b269c9", "basicId": "@628...", "displayName": "Test01", "pictureUrl": "https://profile.line-scdn.net/0hyxytJNAlJldEDQzlatVZAHhIKDoz..." }, { "userId": "Ua831d37bfe8232808202b85127663f70", "basicId": "@076lu...", "displayName": "Test02", "pictureUrl": "https://profile.line-scdn.net/0hohnizdyzMEdTECbnVo9PEG9VPiok..." }, { "userId": "Ub77ea431fba86f7c159a0c0f5be43d9f", "basicId": "@290n...", "displayName": "Test03" }, { "userId": "Ub8ec80a14e879e9c6833fb4cee0e632b", "basicId": "@793j...", "displayName": "Test04" } ] } ``` ### Response Example ```json { "bots": [ { "userId": "Uf2dd6e8b081d2ff9c05c98a8a8b269c9", "basicId": "@628...", "displayName": "Test01", "pictureUrl": "https://profile.line-scdn.net/0hyxytJNAlJldEDQzlatVZAHhIKDoz..." }, { "userId": "Ua831d37bfe8232808202b85127663f70", "basicId": "@076lu...", "displayName": "Test02", "pictureUrl": "https://profile.line-scdn.net/0hohnizdyzMEdTECbnVo9PEG9VPiok..." }, { "userId": "Ub77ea431fba86f7c159a0c0f5be43d9f", "basicId": "@290n...", "displayName": "Test03" }, { "userId": "Ub8ec80a14e879e9c6833fb4cee0e632b", "basicId": "@793j...", "displayName": "Test04" } ] } ``` #### Error Response - **400** - An invalid continuation token is specified. ``` -------------------------------- ### Build SDK with Carthage Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-login-sdks/ios-sdk/swift/setting-up-project/index.html.md Run this command to build the LINE SDK framework. ```bash $ carthage update line-sdk-ios-swift ``` -------------------------------- ### liff.scanCode() Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/liff/index.html.md Starts a 2D code reader and gets the string read by the user. This method is deprecated and liff.scanCodeV2() is recommended. It is not available on LINE for iOS. ```APIDOC ## liff.scanCode() ### Description Starts a 2D code reader and gets the string read by the user. To start the 2D code reader, turn on `ScanQR` on the [LINE Developers Console](https://developers.line.biz/console/). **Note:** This method is deprecated and `liff.scanCodeV2()` is recommended. It is not available on LINE for iOS. ### Method JavaScript ### Endpoint N/A (JavaScript SDK method) ### Parameters None ### Request Example ```javascript if (liff.scanCode) { liff.scanCode().then((result) => { // result = { value: "" } }); } ``` ### Response #### Success Response Returns a `Promise` object that resolves with an object containing the scanned string. - **value** (String) - String read by the 2D code reader #### Response Example ```json { "value": "scanned_string" } ``` ``` -------------------------------- ### Initialize Quick-fill plugin with npm package Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-mini-app/quick-fill/overview/index.html.md Import the necessary modules from `@line/liff` and `@line/liff-common-profile-plugin`. Initialize the plugin by passing an instance to `liff.use()`, then retrieve and fill profile data. ```javascript import liff from "@line/liff"; import { LiffCommonProfilePlugin } from "@line/liff-common-profile-plugin"; liff.use(new LiffCommonProfilePlugin()); const { data, error } = await liff.$commonProfile.get(); liff.$commonProfile.fill(data); ``` -------------------------------- ### Example Error Response for Get Rich Menu ID (No Rich Menu Linked) Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Illustrates the error response when a user is not linked to any rich menu. ```json // If you specify the user to whom the rich menu isn't linked (404 Not Found) { "message": "the user has no richmenu", "details": [] } ``` -------------------------------- ### Initialize Heroku project Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/messaging-api/nodejs-sample/index.html.md Create a new directory, initialize a Git repository, and provision a new Heroku application. ```sh mkdir sample-app cd sample-app git init heroku create {Name of your app} ``` -------------------------------- ### Example Button Configuration Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/line-notification-messages/index.html.md Use this JSON object to configure a button with a specific key and a URL to open when pressed. Ensure the buttonKey is valid and the URL does not exceed 1000 characters. ```json { "buttonKey": "contact_ja", "url": "https://example.com/ContactUs/" } ``` -------------------------------- ### Get Follower IDs Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Use this cURL command to retrieve a list of user IDs who have added your LINE Official Account as a friend. You can specify a limit and a starting point for pagination. ```sh curl -v -X GET https://api.line.me/v2/bot/followers/ids \ -H 'Authorization: Bearer {channel access token}' \ -d 'limit=1000' \ -d 'start=yANU9IA...' \ -G ``` -------------------------------- ### Example cURL Request for Aggregation Info Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Demonstrates how to make a GET request to retrieve the number of custom aggregation units available for the current month. Requires a channel access token. ```shell curl -v -X GET https://api.line.me/v2/bot/message/aggregation/info \ -H 'Authorization: Bearer {channel access token}' ``` -------------------------------- ### Initialize npm project Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/messaging-api/nodejs-sample/index.html.md Initializes a new npm package with default settings. ```sh npm init -y ``` -------------------------------- ### Example User ID in a Module Channel Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/partner-docs/module-technical-using-messaging-api/index.html.md Illustrates the format of a user ID in a module channel, which is a 68-digit string starting with 'L'. This identifier is unique per LINE Official Account. ```text LUb577ef3cbe786a8da85ff8e902a03fc6-U5fac33f633e72c192759f09afc41fa28 ``` -------------------------------- ### Get Statistics per Unit Request Example Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md This cURL command demonstrates how to request per-unit statistics for messages sent within a specified date range. Ensure you replace `{channel access token}` with your actual token. ```shell curl -v -X GET https://api.line.me/v2/bot/insight/message/event/aggregation \ -H 'Authorization: Bearer {channel access token}' \ --data-urlencode 'customAggregationUnit=promotion_a' \ --data-urlencode 'from=20210301' \ --data-urlencode 'to=20210331' \ -G ``` -------------------------------- ### Initialize Quick-fill plugin with CDN Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/line-mini-app/quick-fill/overview/index.html.md After loading the scripts, initialize the LIFF common profile plugin by passing an instance to `liff.use()`. Then, you can retrieve and fill profile data. ```javascript liff.use(new liffCommonProfile.LiffCommonProfilePlugin()); const { data, error } = await liff.$commonProfile.get(); liff.$commonProfile.fill(data); ``` -------------------------------- ### Initialize Local Certificate Authority Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/liff-cli/index.html.md Run this command to create a local certificate authority on your machine. ```bash $ mkcert -install ``` -------------------------------- ### Flex Message Bubble with Linear Gradient Background Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Example of a Flex Message bubble containing a box with a vertical layout and a linear gradient background. This demonstrates how to configure the background type, angle, start color, and end color for a gradient. ```json { "type": "bubble", "body": { "type": "box", "layout": "vertical", "contents": [ { "type": "image", "url": "https://example.com/flex/images/image.jpg" }, { "type": "separator" }, { "type": "text", "text": "Text in the box" }, { "type": "box", "layout": "vertical", "contents": [], "width": "30px", "height": "30px", "background": { "type": "linearGradient", "angle": "90deg", "startColor": "#FFFF00", "endColor": "#0080ff" } } ], "height": "400px", "justifyContent": "space-evenly", "alignItems": "center" } } ``` -------------------------------- ### Serve local development server Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/liff-cli/index.html.md Starts a local development server for a specific LIFF ID by specifying host and port. ```bash $ liff-cli serve \ --liff-id 1234567890-AbcdEfgh \ --host localhost \ --port 3000 ``` -------------------------------- ### Get Multi-Person Chat Member User IDs (Shell) Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Use this cURL command to request the user IDs of members in a multi-person chat. Include the `start` query parameter for pagination if needed. Ensure you have a valid channel access token. ```sh curl -v -X GET 'https://api.line.me/v2/bot/room/{roomId}/members/ids?start={continuationToken}' \ -H 'Authorization: Bearer {channel access token}' ``` -------------------------------- ### Get Membership User IDs Request Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Use this cURL command to request a list of user IDs who have joined a specific membership. Ensure you replace placeholders with your actual channel access token, membership ID, limit, and start parameters. ```sh curl -v -X GET https://api.line.me/v2/bot/membership/{membershipId}/users/ids \ -H 'Authorization: Bearer {channel access token}' \ -d 'limit={limit}' \ -d 'start={start}' \ -G ``` -------------------------------- ### Example Authorization URL for LINE Profile+ Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/partner-docs/line-profile-plus/index.html.md Construct an authorization URL with specific scopes to request LINE Profile+ information. Ensure 'openid' is included to obtain an ID token. ```sh https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=1234567890&redirect_uri=https%3A%2F%2Fexample.com%2Fauth%3Fkey%3Dvalue&state=123abc&scope=openid%20profile%20real_name%20gender%20birthdate%20phone%20address&bot_prompt=normal&nonce=0987654asd ``` -------------------------------- ### Get Decoded ID Token Payload Structure Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/liff/index.html.md An example JSON object representing the payload of a decoded ID token. This payload contains user information such as issuer, subject, audience, expiration time, issued at time, authentication method, name, and picture URL. ```json { "iss": "https://access.line.me", "sub": "U1234567890abcdef1234567890abcdef ", "aud": "1234567890", "exp": 1504169092, "iat": 1504263657, "amr": ["pwd"], "name": "Taro Line", "picture": "https://sample_line.me/aBcdefg123456" } ``` -------------------------------- ### Get a list of unit names assigned during this month Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/reference/messaging-api/index.html.md Use this endpoint to retrieve a unique list of unit names assigned to messages within the current month. Include the `start` parameter for pagination if the list is large. The `limit` parameter controls the number of results per request. ```shell curl -v -X GET https://api.line.me/v2/bot/message/aggregation/list \ -H 'Authorization: Bearer {channel access token}' \ --data-urlencode 'limit=30' \ -G ``` -------------------------------- ### Initialize a LIFF app environment Source: https://github.com/line/line-developers-docs-source/blob/main/docs/en/docs/liff/liff-cli/index.html.md Creates a new LIFF app development environment by adding a channel, creating the app, and scaffolding a template. ```bash $ liff-cli init \ --channel-id 1234567890 \ --name "Brown Coffee" \ --view-type full \ --endpoint-url https://example.com ``` ```bash liff-cli init \ --channel-id 1234567890 \ --name "Brown Coffee" \ --view-type full \ --endpoint-url https://example.com ? Channel Secret?: ******************************** Channel 1234567890 is now added. Welcome to the Create LIFF App ? Which template do you want to use? vanilla ? JavaScript or TypeScript? JavaScript ? Which package manager do you want to use? npm Installing dependencies: - @line/liff removed 10 packages in 944ms 22 packages are looking for funding run `npm fund` for details Installing devDependencies: - vite added 10 packages in 7s 25 packages are looking for funding run `npm fund` for details Done! Now run: cd Brown Coffee npm run dev App 1234567890-AbcdEfgh successfully created. Now do the following: 1. go to app directory: `cd Brown Coffee` 2. create certificate key files (e.g. `mkcert localhost`, see: https://developers.line.biz/en/docs/liff/liff-cli/#serve-operating-conditions ) 3. run LIFF app template using command above (e.g. `npm run dev` or `yarn dev`) 4. open new terminal window, navigate to `Brown Coffee` directory 5. run `liff-cli serve -l 1234567890-AbcdEfgh -u http://localhost:${PORT FROM STEP 3.}/` 6. open browser and navigate to http://localhost:${PORT FROM STEP 3.}/ ``` ```bash $ liff-cli init ? Channel ID? 1234567890 ? App name? Brown Coffee ? View type? full ? Endpoint URL? (leave empty for default 'https://localhost:9000') https://example.com ```