diff --git a/.rubocop.yml b/.rubocop.yml index 25ef515fe1..c499199528 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -137,3 +137,14 @@ RSpec/NoExpectationExample: AllowedPatterns: - ^expect_ - ^assert_ + +Style/Copyright: + Enabled: true + Notice: '^# Copyright \(c\) \d{4}(–\d{4})? ShakaCode, LLC' + AutocorrectNotice: | + # Copyright (c) 2015–2025 ShakaCode, LLC + # SPDX-License-Identifier: MIT + Include: + - 'app/helpers/react_on_rails_helper.rb' + - 'lib/generators/react_on_rails/**/*.rb' + - 'lib/react_on_rails/**/*.rb' diff --git a/app/helpers/react_on_rails_helper.rb b/app/helpers/react_on_rails_helper.rb index 0b111f0859..e20d1b315c 100644 --- a/app/helpers/react_on_rails_helper.rb +++ b/app/helpers/react_on_rails_helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRailsHelper include ReactOnRails::Helper end diff --git a/eslint.config.ts b/eslint.config.ts index 14f5cf639c..0f6b54404d 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -1,6 +1,8 @@ import path from 'node:path'; import { globalIgnores } from 'eslint/config'; import jest from 'eslint-plugin-jest'; +import type { ESLint } from 'eslint'; +import licenseHeader from 'eslint-plugin-license-header'; import prettierRecommended from 'eslint-plugin-prettier/recommended'; import testingLibrary from 'eslint-plugin-testing-library'; import globals from 'globals'; @@ -50,6 +52,18 @@ const config = tsEslint.config([ }, js.configs.recommended, compat.extends('eslint-config-shakacode'), + { + files: ['node_package/src/**/*.ts', 'node_package/src/**/*.tsx'], + plugins: { + 'license-header': licenseHeader as ESLint.Plugin, + }, + rules: { + 'license-header/header': [ + 'error', + ['/* Copyright (c) 2015–2025 ShakaCode, LLC', ' SPDX-License-Identifier: MIT */'], + ], + }, + }, { languageOptions: { globals: { diff --git a/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb b/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb index 69c84c0a65..154e031ae3 100644 --- a/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb +++ b/lib/generators/react_on_rails/adapt_for_older_shakapacker_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/generators" require_relative "generator_helper" diff --git a/lib/generators/react_on_rails/base_generator.rb b/lib/generators/react_on_rails/base_generator.rb index cf7e851d45..09718b53b3 100644 --- a/lib/generators/react_on_rails/base_generator.rb +++ b/lib/generators/react_on_rails/base_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/generators" require_relative "generator_messages" require_relative "generator_helper" diff --git a/lib/generators/react_on_rails/dev_tests_generator.rb b/lib/generators/react_on_rails/dev_tests_generator.rb index 3a20a2b72e..8dba562494 100644 --- a/lib/generators/react_on_rails/dev_tests_generator.rb +++ b/lib/generators/react_on_rails/dev_tests_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/generators" require_relative "generator_helper" diff --git a/lib/generators/react_on_rails/generator_helper.rb b/lib/generators/react_on_rails/generator_helper.rb index 38414c17c4..b876f7e4a3 100644 --- a/lib/generators/react_on_rails/generator_helper.rb +++ b/lib/generators/react_on_rails/generator_helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "package_json" require "rainbow" diff --git a/lib/generators/react_on_rails/generator_messages.rb b/lib/generators/react_on_rails/generator_messages.rb index 0b36c1d2d0..66c2310714 100644 --- a/lib/generators/react_on_rails/generator_messages.rb +++ b/lib/generators/react_on_rails/generator_messages.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module GeneratorMessages class << self def output diff --git a/lib/generators/react_on_rails/install_generator.rb b/lib/generators/react_on_rails/install_generator.rb index d327dd67bf..7ac706694a 100644 --- a/lib/generators/react_on_rails/install_generator.rb +++ b/lib/generators/react_on_rails/install_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/generators" require_relative "generator_helper" require_relative "generator_messages" diff --git a/lib/generators/react_on_rails/react_no_redux_generator.rb b/lib/generators/react_on_rails/react_no_redux_generator.rb index afc2380aae..9f6ede9455 100644 --- a/lib/generators/react_on_rails/react_no_redux_generator.rb +++ b/lib/generators/react_on_rails/react_no_redux_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/generators" require_relative "generator_helper" diff --git a/lib/generators/react_on_rails/react_with_redux_generator.rb b/lib/generators/react_on_rails/react_with_redux_generator.rb index 2b68c95206..a64640c73d 100644 --- a/lib/generators/react_on_rails/react_with_redux_generator.rb +++ b/lib/generators/react_on_rails/react_with_redux_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/generators" module ReactOnRails diff --git a/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb b/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb index ad09c5ef3b..aa4ec56fcf 100644 --- a/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb +++ b/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + class HelloWorldController < ApplicationController layout "hello_world" diff --git a/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb b/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb index dded6614f8..7c9f58c686 100644 --- a/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +++ b/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + # This file is copied to spec/ when you run "rails generate rspec:install" ENV["RAILS_ENV"] ||= "test" require_relative "../config/environment" diff --git a/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb b/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb index 49dabe0789..313e66a332 100644 --- a/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb +++ b/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + # Starts SimpleCov for code coverage. if ENV["COVERAGE"] == "true" diff --git a/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb b/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb index 66a096b0f4..6e4dcb1b3e 100644 --- a/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb +++ b/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + # This file was generated by the `rails generate rspec:install` command. Conventionally, all # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. # The generated `.rspec` file contains `--require spec_helper` which will cause diff --git a/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb b/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb index bd32b69f7b..406a96ace3 100644 --- a/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb +++ b/lib/generators/react_on_rails/templates/dev_tests/spec/system/hello_world_spec.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require_relative "../rails_helper" describe "Hello World", :js do diff --git a/lib/react_on_rails.rb b/lib/react_on_rails.rb index 2cdf7a472c..45f5de0c50 100644 --- a/lib/react_on_rails.rb +++ b/lib/react_on_rails.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails" require "react_on_rails/error" diff --git a/lib/react_on_rails/configuration.rb b/lib/react_on_rails/configuration.rb index 2cfa2c187c..1f8caf7923 100644 --- a/lib/react_on_rails/configuration.rb +++ b/lib/react_on_rails/configuration.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + # rubocop:disable Metrics/ClassLength module ReactOnRails diff --git a/lib/react_on_rails/controller.rb b/lib/react_on_rails/controller.rb index 440f808ed6..ec07ece192 100644 --- a/lib/react_on_rails/controller.rb +++ b/lib/react_on_rails/controller.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails module Controller # Separate initialization of store from react_component allows multiple react_component calls to diff --git a/lib/react_on_rails/engine.rb b/lib/react_on_rails/engine.rb index 66c2d07c7a..bbd00660f2 100644 --- a/lib/react_on_rails/engine.rb +++ b/lib/react_on_rails/engine.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rails/railtie" module ReactOnRails diff --git a/lib/react_on_rails/error.rb b/lib/react_on_rails/error.rb index f298dd446b..fc09a39384 100644 --- a/lib/react_on_rails/error.rb +++ b/lib/react_on_rails/error.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails class Error < StandardError end diff --git a/lib/react_on_rails/git_utils.rb b/lib/react_on_rails/git_utils.rb index 98364b118d..bd3a2c1ed6 100644 --- a/lib/react_on_rails/git_utils.rb +++ b/lib/react_on_rails/git_utils.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "English" module ReactOnRails diff --git a/lib/react_on_rails/helper.rb b/lib/react_on_rails/helper.rb index 34837cc953..c3cfc0eb12 100644 --- a/lib/react_on_rails/helper.rb +++ b/lib/react_on_rails/helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + # rubocop:disable Metrics/ModuleLength # rubocop:disable Metrics/MethodLength # NOTE: diff --git a/lib/react_on_rails/json_output.rb b/lib/react_on_rails/json_output.rb index 6c65c6bdcc..7eeb020cca 100644 --- a/lib/react_on_rails/json_output.rb +++ b/lib/react_on_rails/json_output.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "active_support/core_ext/string/output_safety" module ReactOnRails diff --git a/lib/react_on_rails/json_parse_error.rb b/lib/react_on_rails/json_parse_error.rb index dbdf9fa8ca..993df5d74b 100644 --- a/lib/react_on_rails/json_parse_error.rb +++ b/lib/react_on_rails/json_parse_error.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails class JsonParseError < ::ReactOnRails::Error attr_reader :json diff --git a/lib/react_on_rails/locales/base.rb b/lib/react_on_rails/locales/base.rb index 335c33f153..102e51c2b3 100644 --- a/lib/react_on_rails/locales/base.rb +++ b/lib/react_on_rails/locales/base.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "erb" module ReactOnRails diff --git a/lib/react_on_rails/locales/to_js.rb b/lib/react_on_rails/locales/to_js.rb index 63d7ba5823..ef2ef7718b 100644 --- a/lib/react_on_rails/locales/to_js.rb +++ b/lib/react_on_rails/locales/to_js.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "erb" module ReactOnRails diff --git a/lib/react_on_rails/locales/to_json.rb b/lib/react_on_rails/locales/to_json.rb index 4d15f0ecda..ff06eb8ea9 100644 --- a/lib/react_on_rails/locales/to_json.rb +++ b/lib/react_on_rails/locales/to_json.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "erb" module ReactOnRails diff --git a/lib/react_on_rails/packer_utils.rb b/lib/react_on_rails/packer_utils.rb index 66e4196450..e29d2c07dc 100644 --- a/lib/react_on_rails/packer_utils.rb +++ b/lib/react_on_rails/packer_utils.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails module PackerUtils def self.using_packer? diff --git a/lib/react_on_rails/packs_generator.rb b/lib/react_on_rails/packs_generator.rb index a2628caa91..36c1e46297 100644 --- a/lib/react_on_rails/packs_generator.rb +++ b/lib/react_on_rails/packs_generator.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "fileutils" require "set" diff --git a/lib/react_on_rails/prerender_error.rb b/lib/react_on_rails/prerender_error.rb index 096fae6db6..53bbe5a8b4 100644 --- a/lib/react_on_rails/prerender_error.rb +++ b/lib/react_on_rails/prerender_error.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rainbow" # rubocop:disable: Layout/IndentHeredoc diff --git a/lib/react_on_rails/react_component/render_options.rb b/lib/react_on_rails/react_component/render_options.rb index 654aeece58..a41b334a62 100644 --- a/lib/react_on_rails/react_component/render_options.rb +++ b/lib/react_on_rails/react_component/render_options.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "react_on_rails/utils" module ReactOnRails diff --git a/lib/react_on_rails/server_rendering_js_code.rb b/lib/react_on_rails/server_rendering_js_code.rb index dc807b7a28..f190f5184c 100644 --- a/lib/react_on_rails/server_rendering_js_code.rb +++ b/lib/react_on_rails/server_rendering_js_code.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails module ServerRenderingJsCode class << self diff --git a/lib/react_on_rails/server_rendering_pool.rb b/lib/react_on_rails/server_rendering_pool.rb index aeccca8590..49d500acba 100644 --- a/lib/react_on_rails/server_rendering_pool.rb +++ b/lib/react_on_rails/server_rendering_pool.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "connection_pool" require_relative "server_rendering_pool/ruby_embedded_java_script" diff --git a/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb b/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb index acc1b6dc81..894446bd1f 100644 --- a/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +++ b/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "open-uri" require "execjs" diff --git a/lib/react_on_rails/test_helper.rb b/lib/react_on_rails/test_helper.rb index a8cb1f5891..1f0afb122c 100644 --- a/lib/react_on_rails/test_helper.rb +++ b/lib/react_on_rails/test_helper.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails module TestHelper # Because you will probably want to run RSpec tests that rely on compiled webpack assets diff --git a/lib/react_on_rails/test_helper/ensure_assets_compiled.rb b/lib/react_on_rails/test_helper/ensure_assets_compiled.rb index 3212be1498..04b38184ca 100644 --- a/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +++ b/lib/react_on_rails/test_helper/ensure_assets_compiled.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails module TestHelper class EnsureAssetsCompiled diff --git a/lib/react_on_rails/test_helper/webpack_assets_compiler.rb b/lib/react_on_rails/test_helper/webpack_assets_compiler.rb index bf87b8e9dc..ad7bb21d8b 100644 --- a/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +++ b/lib/react_on_rails/test_helper/webpack_assets_compiler.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + # You can replace this implementation with your own for use by the # ReactOnRails::TestHelper.ensure_assets_compiled helper module ReactOnRails diff --git a/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb b/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb index fbd1889a05..d95b304344 100644 --- a/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +++ b/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "rake" require "fileutils" require "react_on_rails/utils" diff --git a/lib/react_on_rails/utils.rb b/lib/react_on_rails/utils.rb index bca6b39a9f..1b0dba7011 100644 --- a/lib/react_on_rails/utils.rb +++ b/lib/react_on_rails/utils.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require "English" require "open3" require "rainbow" diff --git a/lib/react_on_rails/version.rb b/lib/react_on_rails/version.rb index 1fc0132b98..8637aad9f4 100644 --- a/lib/react_on_rails/version.rb +++ b/lib/react_on_rails/version.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails VERSION = "15.0.0" end diff --git a/lib/react_on_rails/version_checker.rb b/lib/react_on_rails/version_checker.rb index 364708f9ef..dbdfe26702 100644 --- a/lib/react_on_rails/version_checker.rb +++ b/lib/react_on_rails/version_checker.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + module ReactOnRails # Responsible for checking versions of rubygem versus yarn node package # against each other at runtime. diff --git a/lib/react_on_rails/version_syntax_converter.rb b/lib/react_on_rails/version_syntax_converter.rb index 3f63a635b2..e32b55888d 100644 --- a/lib/react_on_rails/version_syntax_converter.rb +++ b/lib/react_on_rails/version_syntax_converter.rb @@ -1,5 +1,8 @@ # frozen_string_literal: true +# Copyright (c) 2015–2025 ShakaCode, LLC +# SPDX-License-Identifier: MIT + require_relative "version" module ReactOnRails diff --git a/node_package/src/Authenticity.ts b/node_package/src/Authenticity.ts index 6b01fb2f34..d29a9902d5 100644 --- a/node_package/src/Authenticity.ts +++ b/node_package/src/Authenticity.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import type { AuthenticityHeaders } from './types/index.ts'; export function authenticityToken(): string | null { diff --git a/node_package/src/CallbackRegistry.ts b/node_package/src/CallbackRegistry.ts index e0d5b5ebcc..55f49038a0 100644 --- a/node_package/src/CallbackRegistry.ts +++ b/node_package/src/CallbackRegistry.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { ItemRegistrationCallback } from './types/index.ts'; import { onPageLoaded, onPageUnloaded } from './pageLifecycle.ts'; import { getRailsContext } from './context.ts'; diff --git a/node_package/src/ClientSideRenderer.ts b/node_package/src/ClientSideRenderer.ts index b4978c5985..cd5174f231 100644 --- a/node_package/src/ClientSideRenderer.ts +++ b/node_package/src/ClientSideRenderer.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + /* eslint-disable max-classes-per-file */ import type { ReactElement } from 'react'; diff --git a/node_package/src/ComponentRegistry.ts b/node_package/src/ComponentRegistry.ts index d6cf72a482..4107817ff7 100644 --- a/node_package/src/ComponentRegistry.ts +++ b/node_package/src/ComponentRegistry.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { type RegisteredComponent, type ReactComponentOrRenderFunction } from './types/index.ts'; import isRenderFunction from './isRenderFunction.ts'; import CallbackRegistry from './CallbackRegistry.ts'; diff --git a/node_package/src/PostSSRHookTracker.ts b/node_package/src/PostSSRHookTracker.ts index f18de7f1dd..f8d8dd7b60 100644 --- a/node_package/src/PostSSRHookTracker.ts +++ b/node_package/src/PostSSRHookTracker.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + type PostSSRHook = () => void; /** diff --git a/node_package/src/RSCProvider.tsx b/node_package/src/RSCProvider.tsx index 61da252972..2630d61e21 100644 --- a/node_package/src/RSCProvider.tsx +++ b/node_package/src/RSCProvider.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import type { ClientGetReactServerComponentProps } from './getReactServerComponent.client.ts'; import { createRSCPayloadKey } from './utils.ts'; diff --git a/node_package/src/RSCRequestTracker.ts b/node_package/src/RSCRequestTracker.ts index 9c6e3e7c5c..92fdcb6585 100644 --- a/node_package/src/RSCRequestTracker.ts +++ b/node_package/src/RSCRequestTracker.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { PassThrough, Readable } from 'stream'; import { extractErrorMessage } from './utils.ts'; import { diff --git a/node_package/src/RSCRoute.tsx b/node_package/src/RSCRoute.tsx index eb52e2d9f5..62a31fa6d1 100644 --- a/node_package/src/RSCRoute.tsx +++ b/node_package/src/RSCRoute.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import { useRSC } from './RSCProvider.tsx'; import { ServerComponentFetchError } from './ServerComponentFetchError.ts'; diff --git a/node_package/src/ReactOnRails.client.ts b/node_package/src/ReactOnRails.client.ts index 752fba1d4c..c16450dafa 100644 --- a/node_package/src/ReactOnRails.client.ts +++ b/node_package/src/ReactOnRails.client.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import type { ReactElement } from 'react'; import * as ClientStartup from './clientStartup.ts'; import { renderOrHydrateComponent, hydrateStore } from './ClientSideRenderer.ts'; diff --git a/node_package/src/ReactOnRails.full.ts b/node_package/src/ReactOnRails.full.ts index 4f03bfb531..ff0813aabc 100644 --- a/node_package/src/ReactOnRails.full.ts +++ b/node_package/src/ReactOnRails.full.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import handleError from './handleError.ts'; import serverRenderReactComponent from './serverRenderReactComponent.ts'; import type { RenderParams, RenderResult, ErrorOptions } from './types/index.ts'; diff --git a/node_package/src/ReactOnRails.node.ts b/node_package/src/ReactOnRails.node.ts index 407d2658b9..2d9fd4b8c4 100644 --- a/node_package/src/ReactOnRails.node.ts +++ b/node_package/src/ReactOnRails.node.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import ReactOnRails from './ReactOnRails.full.ts'; import streamServerRenderedReactComponent from './streamServerRenderedReactComponent.ts'; diff --git a/node_package/src/ReactOnRailsRSC.ts b/node_package/src/ReactOnRailsRSC.ts index 4089238ca0..93b39cc10d 100644 --- a/node_package/src/ReactOnRailsRSC.ts +++ b/node_package/src/ReactOnRailsRSC.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { BundleManifest } from 'react-on-rails-rsc'; import { buildServerRenderer } from 'react-on-rails-rsc/server.node'; import { Readable } from 'stream'; diff --git a/node_package/src/RenderUtils.ts b/node_package/src/RenderUtils.ts index 9b5ab6cbde..48a560bd94 100644 --- a/node_package/src/RenderUtils.ts +++ b/node_package/src/RenderUtils.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + // eslint-disable-next-line import/prefer-default-export -- only one export for now, but others may be added later export function wrapInScriptTags(scriptId: string, scriptBody: string): string { if (!scriptBody) { diff --git a/node_package/src/ServerComponentFetchError.ts b/node_package/src/ServerComponentFetchError.ts index f1c4d95cce..80e4d7fc23 100644 --- a/node_package/src/ServerComponentFetchError.ts +++ b/node_package/src/ServerComponentFetchError.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + /** * Custom error type for when there's an issue fetching or rendering a server component. * This error includes information about the server component and the original error that occurred. diff --git a/node_package/src/StoreRegistry.ts b/node_package/src/StoreRegistry.ts index 0d559c3e2c..56d58e8389 100644 --- a/node_package/src/StoreRegistry.ts +++ b/node_package/src/StoreRegistry.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import CallbackRegistry from './CallbackRegistry.ts'; import type { Store, StoreGenerator } from './types/index.ts'; diff --git a/node_package/src/buildConsoleReplay.ts b/node_package/src/buildConsoleReplay.ts index b8e924dde6..78a25d9b76 100644 --- a/node_package/src/buildConsoleReplay.ts +++ b/node_package/src/buildConsoleReplay.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { wrapInScriptTags } from './RenderUtils.ts'; import scriptSanitizedVal from './scriptSanitizedVal.ts'; diff --git a/node_package/src/clientStartup.ts b/node_package/src/clientStartup.ts index bffefaa3ad..f9828a9472 100644 --- a/node_package/src/clientStartup.ts +++ b/node_package/src/clientStartup.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { hydrateAllStores, hydrateForceLoadedStores, diff --git a/node_package/src/context.ts b/node_package/src/context.ts index 8d5485cf23..7d37d6ee88 100644 --- a/node_package/src/context.ts +++ b/node_package/src/context.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import type { ReactOnRailsInternal, RailsContext } from './types/index.ts'; declare global { diff --git a/node_package/src/createReactOutput.ts b/node_package/src/createReactOutput.ts index a63f886498..cdf08450e5 100644 --- a/node_package/src/createReactOutput.ts +++ b/node_package/src/createReactOutput.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import type { CreateParams, ReactComponent, RenderFunction, CreateReactOutputResult } from './types/index.ts'; import { isServerRenderHash, isPromise } from './isServerRenderResult.ts'; diff --git a/node_package/src/getReactServerComponent.client.ts b/node_package/src/getReactServerComponent.client.ts index 45b1a5b4f8..48bbd7544f 100644 --- a/node_package/src/getReactServerComponent.client.ts +++ b/node_package/src/getReactServerComponent.client.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import { createFromReadableStream } from 'react-on-rails-rsc/client.browser'; import { createRSCPayloadKey, fetch, wrapInNewPromise, extractErrorMessage } from './utils.ts'; diff --git a/node_package/src/getReactServerComponent.server.ts b/node_package/src/getReactServerComponent.server.ts index 885a712f16..8005698faf 100644 --- a/node_package/src/getReactServerComponent.server.ts +++ b/node_package/src/getReactServerComponent.server.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { BundleManifest } from 'react-on-rails-rsc'; import { buildClientRenderer } from 'react-on-rails-rsc/client.node'; import transformRSCStream from './transformRSCNodeStream.ts'; diff --git a/node_package/src/handleError.ts b/node_package/src/handleError.ts index eb9c3b12c9..f6fb306c38 100644 --- a/node_package/src/handleError.ts +++ b/node_package/src/handleError.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import { renderToString } from './ReactDOMServer.cts'; import type { ErrorOptions } from './types/index.ts'; diff --git a/node_package/src/injectRSCPayload.ts b/node_package/src/injectRSCPayload.ts index 0dea3ab0bc..ae87e82643 100644 --- a/node_package/src/injectRSCPayload.ts +++ b/node_package/src/injectRSCPayload.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { PassThrough } from 'stream'; import { finished } from 'stream/promises'; import { createRSCPayloadKey } from './utils.ts'; diff --git a/node_package/src/isRenderFunction.ts b/node_package/src/isRenderFunction.ts index 19e81a2f11..52cfa206e9 100644 --- a/node_package/src/isRenderFunction.ts +++ b/node_package/src/isRenderFunction.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + // See discussion: // https://discuss.reactjs.org/t/how-to-determine-if-js-object-is-react-component/2825/2 import { ReactComponentOrRenderFunction, RenderFunction } from './types/index.ts'; diff --git a/node_package/src/isServerRenderResult.ts b/node_package/src/isServerRenderResult.ts index 6f720045c1..0c0099b766 100644 --- a/node_package/src/isServerRenderResult.ts +++ b/node_package/src/isServerRenderResult.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import type { CreateReactOutputResult, ServerRenderResult, diff --git a/node_package/src/loadJsonFile.ts b/node_package/src/loadJsonFile.ts index e503d109d4..8353e3e26b 100644 --- a/node_package/src/loadJsonFile.ts +++ b/node_package/src/loadJsonFile.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as path from 'path'; import * as fs from 'fs/promises'; diff --git a/node_package/src/pageLifecycle.ts b/node_package/src/pageLifecycle.ts index d17bc6b770..c5a4093e0c 100644 --- a/node_package/src/pageLifecycle.ts +++ b/node_package/src/pageLifecycle.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { debugTurbolinks, turbolinksInstalled, diff --git a/node_package/src/reactHydrateOrRender.ts b/node_package/src/reactHydrateOrRender.ts index 26b4717fa1..93bf7a94b4 100644 --- a/node_package/src/reactHydrateOrRender.ts +++ b/node_package/src/reactHydrateOrRender.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import type { ReactElement } from 'react'; import type { RenderReturnType } from './types/index.ts'; import { reactHydrate, reactRender } from './reactApis.cts'; diff --git a/node_package/src/registerServerComponent/client.tsx b/node_package/src/registerServerComponent/client.tsx index e24122a39c..c6f928ad67 100644 --- a/node_package/src/registerServerComponent/client.tsx +++ b/node_package/src/registerServerComponent/client.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import ReactOnRails from '../ReactOnRails.client.ts'; import RSCRoute from '../RSCRoute.tsx'; diff --git a/node_package/src/registerServerComponent/server.rsc.ts b/node_package/src/registerServerComponent/server.rsc.ts index c5ee59c0be..cdc2fdb053 100644 --- a/node_package/src/registerServerComponent/server.rsc.ts +++ b/node_package/src/registerServerComponent/server.rsc.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import ReactOnRails from '../ReactOnRails.client.ts'; import { ReactComponent, RenderFunction } from '../types/index.ts'; diff --git a/node_package/src/registerServerComponent/server.tsx b/node_package/src/registerServerComponent/server.tsx index 6ece231672..9608038004 100644 --- a/node_package/src/registerServerComponent/server.tsx +++ b/node_package/src/registerServerComponent/server.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import ReactOnRails from '../ReactOnRails.client.ts'; import RSCRoute from '../RSCRoute.tsx'; diff --git a/node_package/src/scriptSanitizedVal.ts b/node_package/src/scriptSanitizedVal.ts index cca1435de1..e12c33ced4 100644 --- a/node_package/src/scriptSanitizedVal.ts +++ b/node_package/src/scriptSanitizedVal.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + export default (val: string): string => { // Replace closing const re = /<\/\W*script/gi; diff --git a/node_package/src/serverRenderReactComponent.ts b/node_package/src/serverRenderReactComponent.ts index a33bb5c144..31361715cf 100644 --- a/node_package/src/serverRenderReactComponent.ts +++ b/node_package/src/serverRenderReactComponent.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import type { ReactElement } from 'react'; diff --git a/node_package/src/serverRenderUtils.ts b/node_package/src/serverRenderUtils.ts index d5ae25f2d4..ff55603c4a 100644 --- a/node_package/src/serverRenderUtils.ts +++ b/node_package/src/serverRenderUtils.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import type { RegisteredComponent, RenderResult, diff --git a/node_package/src/streamServerRenderedReactComponent.ts b/node_package/src/streamServerRenderedReactComponent.ts index cf6436021c..adc1689b4d 100644 --- a/node_package/src/streamServerRenderedReactComponent.ts +++ b/node_package/src/streamServerRenderedReactComponent.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import { PassThrough, Readable } from 'stream'; diff --git a/node_package/src/transformRSCNodeStream.ts b/node_package/src/transformRSCNodeStream.ts index e26f1a44a5..0922660575 100644 --- a/node_package/src/transformRSCNodeStream.ts +++ b/node_package/src/transformRSCNodeStream.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { Transform } from 'stream'; /** diff --git a/node_package/src/transformRSCStreamAndReplayConsoleLogs.ts b/node_package/src/transformRSCStreamAndReplayConsoleLogs.ts index 724706e552..fa4ef31858 100644 --- a/node_package/src/transformRSCStreamAndReplayConsoleLogs.ts +++ b/node_package/src/transformRSCStreamAndReplayConsoleLogs.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import { RSCPayloadChunk } from './types/index.ts'; /** diff --git a/node_package/src/turbolinksUtils.ts b/node_package/src/turbolinksUtils.ts index 4ec70415bf..c7b59f5fde 100644 --- a/node_package/src/turbolinksUtils.ts +++ b/node_package/src/turbolinksUtils.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + declare global { namespace Turbolinks { interface TurbolinksStatic { diff --git a/node_package/src/types/index.ts b/node_package/src/types/index.ts index a425a2d21b..e0bfb30330 100644 --- a/node_package/src/types/index.ts +++ b/node_package/src/types/index.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + /// import type { ReactElement, ReactNode, Component, ComponentType } from 'react'; diff --git a/node_package/src/utils.ts b/node_package/src/utils.ts index c8093c7ae6..3bb781f6be 100644 --- a/node_package/src/utils.ts +++ b/node_package/src/utils.ts @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + // Override the fetch function to make it easier to test // The default fetch implementation in jest returns Node's Readable stream // In jest.setup.js, we configure this fetch to return a web-standard ReadableStream instead, diff --git a/node_package/src/wrapServerComponentRenderer/client.tsx b/node_package/src/wrapServerComponentRenderer/client.tsx index 491b7866b0..f943fd9259 100644 --- a/node_package/src/wrapServerComponentRenderer/client.tsx +++ b/node_package/src/wrapServerComponentRenderer/client.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import * as ReactDOMClient from 'react-dom/client'; import { ReactComponentOrRenderFunction, RenderFunction } from '../types/index.ts'; diff --git a/node_package/src/wrapServerComponentRenderer/server.rsc.tsx b/node_package/src/wrapServerComponentRenderer/server.rsc.tsx index 2da98f23fc..6a9fc8fdeb 100644 --- a/node_package/src/wrapServerComponentRenderer/server.rsc.tsx +++ b/node_package/src/wrapServerComponentRenderer/server.rsc.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + const wrapServerComponentRenderer = () => { // Do nothing // Server component renderers are client components and not needed in the RSC bundle diff --git a/node_package/src/wrapServerComponentRenderer/server.tsx b/node_package/src/wrapServerComponentRenderer/server.tsx index f4c022c474..95574db3db 100644 --- a/node_package/src/wrapServerComponentRenderer/server.tsx +++ b/node_package/src/wrapServerComponentRenderer/server.tsx @@ -1,3 +1,6 @@ +/* Copyright (c) 2015–2025 ShakaCode, LLC + SPDX-License-Identifier: MIT */ + import * as React from 'react'; import type { RenderFunction, ReactComponentOrRenderFunction } from '../types/index.ts'; import getReactServerComponent from '../getReactServerComponent.server.ts'; diff --git a/package.json b/package.json index d0511f224b..65c3f501df 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.11.0", "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-license-header": "^0.8.0", "eslint-plugin-prettier": "^5.2.3", "eslint-plugin-react": "^7.37.4", "eslint-plugin-react-hooks": "^5.2.0", diff --git a/yarn.lock b/yarn.lock index 55cd825c97..385b2d181d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3011,6 +3011,13 @@ eslint-plugin-jsx-a11y@^6.10.2, eslint-plugin-jsx-a11y@^6.5.1: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.1" +eslint-plugin-license-header@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-license-header/-/eslint-plugin-license-header-0.8.0.tgz#7e44c6d38048445cf2e06458619f355ef627407f" + integrity sha512-khTCz6G3JdoQfwrtY4XKl98KW4PpnWUKuFx8v+twIRhJADEyYglMDC0td8It75C1MZ88gcvMusWuUlJsos7gYg== + dependencies: + requireindex "^1.2.0" + eslint-plugin-prettier@^5.2.3: version "5.2.3" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" @@ -5364,6 +5371,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"