# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//tools/typescript/ts_library.gni")
import("//ui/webui/resources/tools/bundle_js.gni")
import("//ui/webui/resources/tools/generate_code_cache.gni")
import("//ui/webui/resources/tools/generate_grd.gni")
import("//ui/webui/resources/tools/minify_js.gni")
import("//ui/webui/webui_features.gni")

ts_library("build_ts") {
  visibility = [
    ":build_bundle",

    # Lit has officially being declared as the preferred framework (over
    # Polymer) for new WebUI code, see [1] and [2]
    #
    # [1] https://chromium.googlesource.com/chromium/src/+/HEAD/styleguide/web/web.md#Lit
    # [2] https://chromium.googlesource.com/chromium/src/+/HEAD/docs/webui/webui_using_lit.md
    #
    # Explicitly tracking targets that can depend on third_party/lit is still
    # useful to audit UIs that depend on Lit, and to prevent adding Lit as a
    # dependency to CrOS-only UIs (to reduce coupling between Desktop and CrOS
    # and reduce the maintenance burden for the Desktop WebUI team).

    "//chrome/browser/resources/about_sys:build_ts",
    "//chrome/browser/resources/access_code_cast:build_ts",
    "//chrome/browser/resources/actor_overlay:build_ts",
    "//chrome/browser/resources/app_home:build_ts",
    "//chrome/browser/resources/app_service_internals:build_ts",
    "//chrome/browser/resources/app_settings:build_ts",
    "//chrome/browser/resources/autofill_ml_internals:build_ts",
    "//chrome/browser/resources/bookmarks:build_ts",
    "//chrome/browser/resources/browser_switch:build_ts",
    "//chrome/browser/resources/certificate_manager:build_ts",
    "//chrome/browser/resources/certificate_viewer:build_ts",
    "//chrome/browser/resources/chrome_finds_internals:build_ts",
    "//chrome/browser/resources/color_pipeline_internals:build_ts",
    "//chrome/browser/resources/components:build_ts",
    "//chrome/browser/resources/compose:build_ts",
    "//chrome/browser/resources/conflicts:build_ts",
    "//chrome/browser/resources/content_settings:build_ts",
    "//chrome/browser/resources/context_hub:build_ts",
    "//chrome/browser/resources/contextual_cueing/internals:build_ts",
    "//chrome/browser/resources/contextual_tasks:build_ts",
    "//chrome/browser/resources/contextual_tasks/extension:build_ts",
    "//chrome/browser/resources/default_browser/default_browser_modal:build_ts",
    "//chrome/browser/resources/default_browser/visual_guided_setter:build_ts",
    "//chrome/browser/resources/device_log:build_ts",
    "//chrome/browser/resources/discards:build_ts",
    "//chrome/browser/resources/downloads:build_ts",
    "//chrome/browser/resources/drive_picker_host:build_ts",
    "//chrome/browser/resources/drive_picker_host/untrusted:build_ts",
    "//chrome/browser/resources/extensions:build_ts",
    "//chrome/browser/resources/extensions_zero_state_promo:build_ts",
    "//chrome/browser/resources/family_link_user_internals:build_ts",
    "//chrome/browser/resources/feature_showcase:build_ts",
    "//chrome/browser/resources/feedback:build_ts",
    "//chrome/browser/resources/feedback/report_unsafe_site:build_ts",
    "//chrome/browser/resources/glic:build_ts",
    "//chrome/browser/resources/glic/selection_overlay:build_ts",
    "//chrome/browser/resources/guest_view_shared:build_ts",
    "//chrome/browser/resources/history:build_ts",
    "//chrome/browser/resources/indigo:build_ts",
    "//chrome/browser/resources/indigo_internals:build_ts",
    "//chrome/browser/resources/infobar_internals:build_ts",
    "//chrome/browser/resources/inline_login:build_ts",
    "//chrome/browser/resources/intro:build_ts",
    "//chrome/browser/resources/iwa_dev:build_ts",
    "//chrome/browser/resources/key_value_pair_viewer_shared:build_ts",
    "//chrome/browser/resources/lens/overlay:build_ts",
    "//chrome/browser/resources/lens/shared:build_ts",
    "//chrome/browser/resources/management:build_ts",
    "//chrome/browser/resources/media_router/cast_feedback:build_ts",
    "//chrome/browser/resources/multistep_filter_internals:build_ts",
    "//chrome/browser/resources/new_tab_footer:build_ts",
    "//chrome/browser/resources/new_tab_page:build_ts",
    "//chrome/browser/resources/new_tab_shared:build_ts",
    "//chrome/browser/resources/omnibox/aim_eligibility:build_ts",
    "//chrome/browser/resources/omnibox/aim_eligibility_extension:build_ts",
    "//chrome/browser/resources/omnibox/logging:build_ts",
    "//chrome/browser/resources/omnibox_everywhere:build_ts",
    "//chrome/browser/resources/omnibox_popup:build_ts",
    "//chrome/browser/resources/on_device_internals:build_ts",
    "//chrome/browser/resources/on_device_translation_internals:build_ts",
    "//chrome/browser/resources/organizer_panel:build_ts",
    "//chrome/browser/resources/page_action_internals:build_ts",
    "//chrome/browser/resources/pdf:build_ts",
    "//chrome/browser/resources/print_preview:build_ts",
    "//chrome/browser/resources/profile_internals:build_ts",
    "//chrome/browser/resources/search_engine_choice:build_ts",
    "//chrome/browser/resources/settings:build_ts",
    "//chrome/browser/resources/settings_shared:build_ts",
    "//chrome/browser/resources/side_panel/bookmarks:build_ts",
    "//chrome/browser/resources/side_panel/comments:build_ts",
    "//chrome/browser/resources/side_panel/commerce:build_ts",
    "//chrome/browser/resources/side_panel/customize_chrome:build_ts",
    "//chrome/browser/resources/side_panel/history:build_ts",
    "//chrome/browser/resources/side_panel/history_clusters:build_ts",
    "//chrome/browser/resources/side_panel/read_anything:build_ts",
    "//chrome/browser/resources/side_panel/reading_list:build_ts",
    "//chrome/browser/resources/side_panel/shared:build_ts",
    "//chrome/browser/resources/side_panel/tabs_from_other_devices:build_ts",
    "//chrome/browser/resources/signin:build_ts",
    "//chrome/browser/resources/signin/batch_upload:build_ts",
    "//chrome/browser/resources/signin/history_sync_optin:build_ts",
    "//chrome/browser/resources/signin/profile_picker:build_ts",
    "//chrome/browser/resources/signin/signout_confirmation:build_ts",
    "//chrome/browser/resources/skills:build_ts",
    "//chrome/browser/resources/subresource_filter:build_ts",
    "//chrome/browser/resources/suggest_internals:build_ts",
    "//chrome/browser/resources/support_tool:build_ts",
    "//chrome/browser/resources/tab_group_home:build_ts",
    "//chrome/browser/resources/tab_search:build_ts",
    "//chrome/browser/resources/unexportable_keys_internals:build_ts",
    "//chrome/browser/resources/updater:build_ts",
    "//chrome/browser/resources/user_education_internals:build_ts",
    "//chrome/browser/resources/watermark:build_ts",
    "//chrome/browser/resources/web_app_internals:build_ts",
    "//chrome/browser/resources/webnn_internals:build_ts",
    "//chrome/browser/resources/webui_browser:build_ts",
    "//chrome/browser/resources/webui_browser/internal:build_ts",
    "//chrome/browser/resources/webui_gallery:build_ts",
    "//chrome/browser/resources/webui_toolbar:build_ts",
    "//chrome/browser/resources/webui_toolbar_shared:build_ts",
    "//chrome/browser/resources/whats_new:build_ts",
    "//chrome/browser/ttc/resources:build_ts",
    "//chrome/test/data/pdf:build_ts",
    "//chrome/test/data/webui/actor_overlay:build_ts",
    "//chrome/test/data/webui/app_home:build_ts",
    "//chrome/test/data/webui/app_settings:build_ts",
    "//chrome/test/data/webui/bookmarks:build_ts",
    "//chrome/test/data/webui/certificate_manager:build_ts",
    "//chrome/test/data/webui/cr_components:build_ts",
    "//chrome/test/data/webui/cr_components/composebox:build_ts",
    "//chrome/test/data/webui/cr_components/cr_shortcut_input:build_ts",
    "//chrome/test/data/webui/cr_components/custom_help_bubble:build_ts",
    "//chrome/test/data/webui/cr_components/help_bubble:build_ts",
    "//chrome/test/data/webui/cr_components/history_clusters:build_ts",
    "//chrome/test/data/webui/cr_components/searchbox:build_ts",
    "//chrome/test/data/webui/cr_elements:build_ts",
    "//chrome/test/data/webui/extensions:build_ts",
    "//chrome/test/data/webui/history:build_ts",
    "//chrome/test/data/webui/notebooks_internals:build_ts",
    "//chrome/test/data/webui/organizer_panel:build_ts",
    "//chrome/test/data/webui/print_preview:build_ts",
    "//chrome/test/data/webui/settings:build_ts",
    "//chrome/test/data/webui/signin:build_ts",
    "//chrome/test/data/webui/signin/signout_confirmation:build_ts",
    "//chrome/test/data/webui/tab_search:build_ts",
    "//chrome/test/data/webui/webui_toolbar:build_ts",
    "//components/commerce/core/internals/resources:build_ts",
    "//components/download/resources/download_internals:build_ts",
    "//components/neterror/resources:build_ts",
    "//components/notebooks/internals/webui/resources:build_ts",
    "//components/ntp_tiles/webui/resources:build_ts",
    "//components/policy/resources/webui:build_ts",
    "//components/signin/core/browser/resources:build_ts",
    "//components/sync/service/resources:build_ts",
    "//components/webui/chrome_urls/resources:build_ts",
    "//components/webui/flags/resources:build_ts",
    "//content/browser/resources/indexed_db:build_ts",
    "//content/browser/resources/service_worker:build_ts",
    "//content/browser/resources/traces_internals:build_ts",
    "//ios/chrome/app/resources/profile_internals:build_ts",
    "//ui/webui/resources/cr_components/composebox:build_ts",
    "//ui/webui/resources/cr_components/cr_shortcut_input:build_ts",
    "//ui/webui/resources/cr_components/customize_color_scheme_mode:build_ts",
    "//ui/webui/resources/cr_components/help_bubble:build_ts",
    "//ui/webui/resources/cr_components/history_clusters:build_ts",
    "//ui/webui/resources/cr_components/history_embeddings:build_ts",
    "//ui/webui/resources/cr_components/localized_link:build_ts",
    "//ui/webui/resources/cr_components/managed_dialog:build_ts",
    "//ui/webui/resources/cr_components/managed_footnote:build_ts",
    "//ui/webui/resources/cr_components/most_visited:build_ts",
    "//ui/webui/resources/cr_components/search:build_ts",
    "//ui/webui/resources/cr_components/searchbox:build_ts",
    "//ui/webui/resources/cr_components/theme_color_picker:build_ts",
    "//ui/webui/resources/cr_elements:build_ts",
  ]
  tsconfig_base = "tsconfig_base.json"
  composite = true
  in_files = [
    "cr_lit_element.ts",
    "deduping_mixin.ts",
    "lit.ts",
  ]

  node_modules = "//third_party/node/node_modules"
  definitions = [
    "${node_modules}/lit-html/directives/repeat.d.ts",
    "${node_modules}/lit-html/directives/when.d.ts",
    "${node_modules}/lit-html/directives/ref.d.ts",
    "${node_modules}/lit-html/directives/cache.d.ts",
    "${node_modules}/lit-html/directives/choose.d.ts",
    "${node_modules}/lit-html/directives/async-append.d.ts",
    "${node_modules}/lit-html/directives/until.d.ts",
    "${node_modules}/lit-html/directives/template-content.d.ts",
    "${node_modules}/lit-html/directives/keyed.d.ts",
    "${node_modules}/lit-html/directives/style-map.d.ts",
    "${node_modules}/lit-html/directives/if-defined.d.ts",
    "${node_modules}/lit-html/directives/join.d.ts",
    "${node_modules}/lit-html/directives/unsafe-svg.d.ts",
    "${node_modules}/lit-html/directives/live.d.ts",
    "${node_modules}/lit-html/directives/guard.d.ts",
    "${node_modules}/lit-html/directives/async-replace.d.ts",
    "${node_modules}/lit-html/directives/unsafe-html.d.ts",
    "${node_modules}/lit-html/directives/map.d.ts",
    "${node_modules}/lit-html/directives/private-async-helpers.d.ts",
    "${node_modules}/lit-html/directives/range.d.ts",
    "${node_modules}/lit-html/directives/class-map.d.ts",
    "${node_modules}/lit-html/static.d.ts",
    "${node_modules}/lit-html/lit-html.d.ts",
    "${node_modules}/lit-html/is-server.d.ts",
    "${node_modules}/lit-html/async-directive.d.ts",
    "${node_modules}/lit-html/directive.d.ts",
    "${node_modules}/lit-html/directive-helpers.d.ts",
    "${node_modules}/lit-element/lit-element.d.ts",
    "${node_modules}/lit-element/index.d.ts",
    "${node_modules}/lit/directives/repeat.d.ts",
    "${node_modules}/lit/directives/when.d.ts",
    "${node_modules}/lit/directives/ref.d.ts",
    "${node_modules}/lit/directives/cache.d.ts",
    "${node_modules}/lit/directives/choose.d.ts",
    "${node_modules}/lit/directives/async-append.d.ts",
    "${node_modules}/lit/directives/until.d.ts",
    "${node_modules}/lit/directives/template-content.d.ts",
    "${node_modules}/lit/directives/keyed.d.ts",
    "${node_modules}/lit/directives/style-map.d.ts",
    "${node_modules}/lit/directives/if-defined.d.ts",
    "${node_modules}/lit/directives/join.d.ts",
    "${node_modules}/lit/directives/unsafe-svg.d.ts",
    "${node_modules}/lit/directives/live.d.ts",
    "${node_modules}/lit/directives/guard.d.ts",
    "${node_modules}/lit/directives/async-replace.d.ts",
    "${node_modules}/lit/directives/unsafe-html.d.ts",
    "${node_modules}/lit/directives/map.d.ts",
    "${node_modules}/lit/directives/range.d.ts",
    "${node_modules}/lit/directives/class-map.d.ts",
    "${node_modules}/lit/static-html.d.ts",
    "${node_modules}/lit/async-directive.d.ts",
    "${node_modules}/lit/html.d.ts",
    "${node_modules}/lit/directive.d.ts",
    "${node_modules}/lit/directive-helpers.d.ts",
    "${node_modules}/lit/index.d.ts",
    "${node_modules}/@lit/reactive-element/reactive-controller.d.ts",
    "${node_modules}/@lit/reactive-element/css-tag.d.ts",
    "${node_modules}/@lit/reactive-element/reactive-element.d.ts",
  ]

  path_mappings = [
    "lit/directives/repeat.js|" +
        rebase_path("${node_modules}/lit/directives/repeat.d.ts",
                    target_gen_dir),
    "lit/index.js|" +
        rebase_path("${node_modules}/lit/index.d.ts", target_gen_dir),
    "lit-html/async-directive.js|" +
        rebase_path("${node_modules}/lit-html/async-directive.d.ts",
                    target_gen_dir),
    "lit-html/directives/repeat.js|" +
        rebase_path("${node_modules}/lit-html/directives/repeat.d.ts",
                    target_gen_dir),
    "lit-html/directive.js|" +
        rebase_path("${node_modules}/lit-html/directive.d.ts", target_gen_dir),
    "lit-html|" +
        rebase_path("${node_modules}/lit-html/lit-html.d.ts", target_gen_dir),
    "@lit/reactive-element|" + rebase_path(
            "${node_modules}/@lit/reactive-element/reactive-element.d.ts",
            target_gen_dir),
  ]
}

bundle_js("build_bundle") {
  # Using a dummy value for`host` which is ignored anyway since the code being
  # bundled below is using a custom config and plugin.
  host = "_ignored_"
  input = rebase_path(target_gen_dir, root_build_dir)
  js_module_in_files = [ "lit.js" ]
  rollup_config = "rollup.config.mjs"
  out_folder = "$target_gen_dir/bundled"
  deps = [ ":build_ts" ]
}

minify_js("build_min_js") {
  visibility = [
    ":build_grdp",

    # Expose target to //components/neterror only, which needs to include the
    # Lit bundle in its own bundle unlike WebUIs that exclude it and therefore
    # don't need to depend on this target.
    "//components/neterror/resources:bundle_js_internal",
  ]
  if (enable_webui_generate_code_cache) {
    visibility += [ ":build_code_cache" ]
  }
  deps = [ ":build_bundle" ]
  in_folder = "$target_gen_dir/bundled"
  in_files = [ "lit.rollup.js" ]
  out_folder = "$target_gen_dir/minified"
  out_manifest = "${target_gen_dir}/build_min_js_manifest.json"
}

generate_grd("build_grdp") {
  grd_prefix = "lit_v3_0"
  out_grd = "$target_gen_dir/resources.grdp"
  resource_path_prefix = "lit/v3_0"
  manifest_files = [ "${target_gen_dir}/build_min_js_manifest.json" ]
  deps = [ ":build_min_js" ]
}

if (enable_webui_generate_code_cache) {
  generate_code_cache("build_code_cache") {
    in_folder = "$target_gen_dir/minified"
    in_files = [ "lit.rollup.js" ]
    out_folder = "$target_gen_dir/code_cache"
    out_manifest = "$target_gen_dir/build_code_cache_manifest.json"

    deps = [ ":build_min_js" ]
  }

  generate_grd("build_code_cache_grdp") {
    grd_prefix = "lit_v3_0_code_cache"
    out_grd = "$target_gen_dir/code_cache_resources.grdp"
    resource_path_prefix = "lit/v3_0"
    manifest_files = [ "${target_gen_dir}/build_code_cache_manifest.json" ]
    deps = [ ":build_code_cache" ]
  }
}
