Skip to content

Releases

0.14.0

Choose a tag to compare

@somework somework released this 07 Sep 17:53

Removed

  • Debounce\YiiCacheDebounceStore (wave M, spec 19 §2.9): it was the core's Debounce\Psr16DebounceStore written
    once more over the Yii cache API; the component wires new Psr16DebounceStore(new Cache\Psr16Cache($component), $prefix) for a debounce.store naming a cache component — the same keys, the same window. Migration: code that
    constructed it does the same two lines; the class was not in docs/bc.md.
  • Check\RouterCheck and Check\RecordSampler: the router.locales line is the core's Check\LocalesCheck
    (same code, one text for the three adapters that print it: the ok line now names the route parameter, and with an
    empty list and no rule asking for every locale the line is not printed — it used to be an ok line), the
    --sample-class sampler is Console\SubjectSampler of indexnowkit/console (the same class four adapters carried).

Changed

  • Log\YiiLogger throws Psr\Log\InvalidArgumentException on a level PSR-3 does not define (wave M, spec 19 §3),
    as the standard requires ("MUST throw"); it used to log the line at info. Migration: a call with a level of your
    own ($logger->log('verbose', …)) must use one of the eight of Psr\Log\LogLevel.
  • Wave M, the rest (spec 19): ActiveRecord\ActiveRecordLoader extends Console\AbstractSubjectLoader of
    indexnowkit/console (its constructor is unchanged); Queue\QueueDispatcher is the push onto the queue component
    around the core's Dispatch\BatchingDispatcher (constructor unchanged, the log lines are the core's, the texts this
    adapter already printed), Queue\SubmitUrlsJob::newId() delegates to BatchingDispatcher::newJobId();
    Url\YiiRouteUrlResolver decides the locale expansion, the pinned origin and the rebase through the core's
    Url\RouteOrigin and takes the graph's logger as an appended optional parameter, so locales: 'all' over an empty
    router.locales is warned about once per process (it collapsed silently); Check\CacheProbe writes the core's
    DebounceStoreCheck::PROBE_KEY (indexnowkit_check, no colon: PSR-16 reserves it) where it wrote indexnowkit:check;
    indexnow/status describes the debounce store through History\Adapter\HistoryServices::describeStore() (the same
    <id> (<Class>) line as before, shared with Laravel and Yii3); indexnow/sitemap leaves sitemap.enabled: false
    to the runner (same answer, exit 2) and hands it the graph's clock, so --changed-since "1 day" counts back from a
    clock override; indexnow/history --limit and key-generate --length fall back to HistoryCommand::DEFAULT_LIMIT
    and KeyGenerateCommand::DEFAULT_LENGTH instead of literals; Config\ConfigFactory folds the packages' options
    through OptionalPackage::ownedOptions() / ignoredBlocks().
  • The ActiveRecord observer no longer takes the facade: ActiveRecord\IndexNowObserver::__construct() takes a
    Closure(): Adapter\Services where it took an IndexNowKit, and builds Hook\ObserverHelper::forChanges() from
    Services::changes() on the first hook, inside a try/catch. A save() therefore resolves URLs without building
    the client, the transport or the debounce store, and a graph that cannot be built at all is one error line instead
    of an exception out of save(). Migration: nobody needs to construct the observer — use
    Yii::$app->indexnow->observer(); code that did should pass fn () => Yii::$app->indexnow->services().
  • Configuration errors of the adapter are IndexNowKit\Exception\ConfigurationException, not Yii's
    InvalidConfigException: an override (transport, debounceStore, dispatcher, urlResolver, clock, checks)
    that names nothing or the wrong type, a queue.component that is not a yii\queue\Queue, a history.store whose
    connection or cache does not resolve, --component naming something that is not the component, and the queue job's
    "component is not configured in the worker application". Yii's exception is left to what Yii itself throws.
    Migration: catch IndexNowKit\Exception\ConfigurationException (it is an InvalidArgumentException).
  • The clock is a node of the graph: the new clock component property (PSR-20, an instance, a class or a
    component id) reaches the throttle, the debounce window and the submission timestamps, because Wiring now
    passes Services::clock() to the Submitter it builds for the pre-flight and to DebounceStoreFactory::fromConfig().
    IndexNowKit\Testing\FrozenClock makes a whole flush deterministic, recorded history included.
  • history.store is wired by the package: History\Adapter\HistoryServices::storeFor() replaces the adapter's own
    twenty lines; the adapter passes only "the PDO of this db component" and "a PSR-16 view of this cache component".
    The texts and the exception are the same in every adapter (needs indexnowkit/history ^0.3.1).
  • Check\VerifySampleCheck and Check\SampleOptions are removed: the core's Check\SampleGateCheck and
    Check\SampleOptions (code verify.installed, same lines). IndexNowComponent::$samples is now the core's type.
  • An insert is verified against the values the record wrote, an update against the columns it changed, and the core
    compares only what every driver spells the same way — a DECIMAL, a date or a JSON document no longer discards the
    announcement of a new page. An update or a delete is staged under the subject (Post#7), so a second change of the
    same record in one transaction joins the first instead of discarding its URLs.

Added

  • The router.locales line of indexnow/check (the core's Check\LocalesCheck, see "Removed"): it names the
    locales locales: 'all' expands to, and warns when router.locales is empty while a hooked model carries a rule
    that asks for all of them.
  • The clock component property (see "Changed").

Fixed

  • PHP 8.5 without deprecations — ActiveRecord\IndexNowObserver uses the SplObjectStorage offset methods
    (attach()/contains() are deprecated since 8.5). No runtime change.
  • Fixed: the component was a fatal without indexnowkit/sitemap, indexnowkit/verify or indexnowkit/history
    (Class "IndexNowKit\Sitemap\Adapter\SitemapServices" not found at the first configuration build):
    Config\ConfigFactory::factory() and IndexNowComponent::sitemapPackage() / verifyPackage() / historyPackage()
    asked the packages' *Services::package() whether the package is installed, and those classes live in the packages.
    They now ask the core's Adapter\OptionalPackage::sitemap() / verify() / history() (core 0.13.0). Same texts,
    same properties. A new CI job removes the three packages and boots the application with detection
    (OptionalPackagesDetectionTest).
  • Requires indexnowkit/core ^0.13, indexnowkit/console ^0.5; indexnowkit/history ^0.4 when installed
    (HistoryServices::storeFor(); the version cascade of wave L, spec 18 — the Yii2 controller keeps parsing over the
    runners, nothing changes here).

0.13.0

Choose a tag to compare

@somework somework released this 07 Sep 05:31

Changed

  • The optional packages wire themselves: Yii2\Verify\VerifyServices, Yii2\History\HistoryServices and
    Yii2\Sitemap\SitemapServices are removed; the component, Wiring and the console actions call
    Verify\Adapter\VerifyServices, History\Adapter\HistoryServices and Sitemap\Adapter\SitemapServices of the
    packages (verify 0.3, history 0.3, sitemap 0.7 — conflict with older ones). What stays here is Yii's: the db
    connection and the cache component behind a store, the queue facts of status, the sample check over Active Record.
  • Requires indexnowkit/verify ^0.3, indexnowkit/history ^0.3, indexnowkit/sitemap ^0.7 when installed.

0.12.0

Choose a tag to compare

@somework somework released this 06 Sep 18:50

Changed

  • The router block speaks the core's vocabulary: router.locales, router.locale_parameter, router.set_app_locale
    (what the attribute calls locales, what ResolvedUrl::$locale and locale_hosts are, and what the Laravel adapter has
    always used). The pre-0.12 spellings router.languages, router.language_parameter and router.set_app_language are
    still read, each with a deprecation warning in the log naming the new key; they go in the next minor. The default GET
    parameter stays language (the Yii convention).
  • Console output goes through Controller::stdout(): the runners wrote to php://stdout directly through a
    ConsoleOutput, past --color, isColorEnabled() and any controller that redirects or captures stdout(). The
    default output is now Console\ControllerOutput (a symfony/console Output over the controller: decorated exactly
    when Yii would colour, every write through stdout()); an injected $output (tests) is untouched. symfony/console
    stays a requirement: the runners of indexnowkit/console are written against its OutputInterface, as Laravel's and
    Yii3's consoles are.
  • IndexNowComponent::submitRecords() delegates to IndexNowKit::submitEntities() (core 0.12.0).
  • Requires indexnowkit/core ^0.12.

0.11.0

Choose a tag to compare

@somework somework released this 06 Sep 17:54

Changed

  • Queue\QueueDispatcher pushes one job per batch.max_urls URLs: a bulk import was one job a queue payload limit
    rejected, and every URL was lost with one log line.
  • Cache\Psr16Cache keeps a stored false apart from a miss (an envelope around the value: entries written by 0.10
    read as misses once, then are rewritten) and throws the PSR-16 InvalidArgumentException (Cache\InvalidKey) for a
    key with reserved characters or over 64 characters.
  • check gets verify.transport; the verify.dispatch line comes from Verify\Check\DispatchCheck.
  • README: a "Verify" step (php yii indexnow/check) after the model declaration, as the other adapters have.
  • psr/log ^1.1 is gone from the constraint (the core requires ^2 || ^3).
  • Requires indexnowkit/core ^0.11, indexnowkit/console ^0.4; tests against verify ^0.2, history ^0.2, sitemap ^0.6.

0.10.0

Choose a tag to compare

@somework somework released this 06 Sep 12:23

Added

  • The paramExtractor node of the component's graph: new ParamExtractor(new ActiveRecordSubjectReader()), shared by the
    resolver, the change handler, the facade and indexnow/explain (Adapter\ServicesBuilder::paramExtractor()).

Changed

  • Requires indexnowkit/core ^0.10; the component no longer registers the reader through the removed static
    ParamExtractor::registerReader() (the same accessors resolve the same way; the process-wide flag is gone).

0.9.0

Choose a tag to compare

@somework somework released this 06 Sep 10:48

Added

  • indexnowkit/verify wiring (spec 17 §6.1). The verify block of the component options (enabled, redirect,
    non_canonical, origin_error, delay, timeout, max_redirects, max_batch, robots_cache_ttl, user_agent);
    with the package and verify.enabled: true the graph's submitter is VerifyingSubmitter and the commands'
    factory VerifyingSubmitterFactory (Verify\VerifyServices, Wiring), so sync flushes, yii2-queue jobs and the
    commands verify. Component: verifyInstalled (predicate override), verifyTransport (the pre-flight transport
    override), samples; verifyPackage(), verifyInstalled(), verifyConfig(), verifyEnabled(),
    verifyTransport(), robots(), submitterFactory(), unverifiedSubmitterFactory(), events(). check lines:
    verify.installed, verify.dispatch (warning with dispatch: sync), verify.sample. Without the package the
    block is ignored as a whole (check says so), --sample is an error naming the install line and verifyConfig()
    throws the install line.
  • indexnow/check --sample=a,b / --sample-class=Class,Class:id (comma-separated; Check\SampleOptions,
    Check\VerifySampleCheck, Check\RecordSampler over the controller's loader). A URL with a comma cannot be given.
  • indexnow/config --json prints the verify section when the package is installed.
  • indexnowkit/history wiring (spec 17 §6.2). The history block of the component options (store, limit,
    key_prefix, pdo.dsn, pdo.service, pdo.table, retention_days); with the package and history.store: psr16|pdo the graph's submission store is the package's (History\HistoryServices, Wiring): Psr16SubmissionStore
    over the cache component of debounce.store (the cache component with memory/none) through Cache\Psr16Cache,
    or PdoSubmissionStore over the PDO of the db component named by pdo.service / a PDO built from pdo.dsn —
    never both — so sync flushes, yii2-queue jobs, the commands and the verify decorator record into it; the
    submissionStore property still wins. The table is not created (see the package's docs/migrations.md).
    Component: historyInstalled (predicate override), historyPackage(), historyInstalled(), historyConfig(),
    historyEnabled(). Commands indexnow/history (--host, --status, --url, --since, --limit, --json,
    --purge[=days]; Console\HistoryAction) and indexnow/status (--json per the package's status.schema.json;
    the queue component and its class as the adapter facts); without the package both print the install line and
    exit 1 (their options are still accepted) and historyConfig() throws. check lines: history.installed
    (without the package), history.store, history.records. indexnow/config --json prints the history section.
  • Config\ConfigFactory::factory()/create()/build() take an appended ?bool $verifyInstalled = null and
    ?bool $historyInstalled = null.

Changed

  • Requires indexnowkit/core ^0.9, indexnowkit/console ^0.3 and (dev/suggest) indexnowkit/sitemap ^0.5,
    indexnowkit/verify ^0.1, indexnowkit/history ^0.1.
  • IndexNowController submits --force / --dry-run through IndexNowComponent::submitterFactory() (decorated
    when verify is on) instead of the graph's plain factory; the submitters property still overrides it.

0.8.0

Choose a tag to compare

@somework somework released this 05 Sep 19:25

Changed

  • Requires indexnowkit/core ^0.8, indexnowkit/console ^0.2 and (dev/suggest) indexnowkit/sitemap ^0.4. Core 0.8 strips tracking parameters by default (normalizer.strip_tracking_params) and makes Equals in params an error (see the core changelog).

Added

  • The indexnow/check lines of the adapter carry stable codes (core 0.8, check --json): queue.dispatch,
    queue.component, queue.driver, active_record.enabled, url_manager.key_file, url_manager.pretty_url,
    url_manager.rule, plus the core's debounce.store and sitemap.installed. Listed in the core's docs/check-codes.md.
  • php yii indexnow/check --json (the report as JSON, schema docs/check.schema.json of indexnowkit/console),
    --strict (warnings fail the command: put it in the deploy pipeline) and --host=a,b (a list; console 0.2).
  • php yii indexnow/key-generate --force keeps the replaced key as INDEXNOW_PREVIOUS_KEY and refuses a second rotation
    while it is set; --no-previous and --yes decide (console 0.2).
  • The 403 escalation of Client counts in the cache component behind debounce.store (core 0.8) through the new
    Cache\Psr16Cache (a yii\caching\CacheInterface as PSR-16): one critical line per streak for every worker;
    IndexNowComponent::failureCache() returns it (null with memory/none or a custom debounceStore).
  • Component property submissionStore (instance, class, configuration array or component id of a
    Submission\SubmissionStoreInterface; default: nothing is recorded): the store the submitter and the command
    submitters record every Result in (core 0.8); IndexNowComponent::submissionStore() returns it.
  • Options block normalizer (strip_tracking_params, tracking_params, trailing_slash, sort_query): the canonical
    form of every URL (core 0.8), read through Config::OPTIONS. Tracking parameters are stripped by default.
  • php yii indexnow/explain --json and the when values in the text output (console 0.2).
  • php yii indexnow/config (--json): the effective configuration with masked keys plus the component's own option
    blocks (console 0.2).
  • IndexNowComponent::EVENT_RESULT (spec 17 §5.7): the component triggers an Event\ResultEvent ($result) for
    every Result of the submitter and of the command submitters, through the PSR-14 Event\ResultDispatcher the
    wiring gives the core.

Changed

  • indexnow/* console actions take -v, -vv, -vvv (and SHELL_VERBOSITY) as symfony/console does; the own
    --verbose option is gone.
    Migration: php yii indexnow/sitemap --verbose → php yii indexnow/sitemap -v.

0.7.0

Choose a tag to compare

@somework somework released this 05 Sep 17:24

Changed

  • Requires core 0.7: Console\SubmitterFactory / Console\SubmitterFactoryInterface are now
    IndexNowKit\Adapter\SubmitterFactory / IndexNowKit\Adapter\SubmitterFactoryInterface, Console\ResultSummary is
    IndexNowKit\Submission\ResultSummary. Application code that names them (a decorator of the submitters property of IndexNowController) changes the use line; nothing else.
  • The test suite requires indexnowkit/testing ^0.1 (require-dev): the conformance kits and the H01–H05 assertions
    moved there from the core (Testing\Conformance\KeyFileAssertions, CheckOutputAssertions, ReadmeAssertions).
  • Requires indexnowkit/console ^0.1: the runners and definitions the console controller are built on moved there from the core
    with their FQCN unchanged (IndexNowKit\Console\*); Composer installs it with this package, nothing to do.
  • Sitemap\SitemapSupport (the @internal predicate with its static override) is gone: the component exposes
    sitemapPackage() (an IndexNowKit\Adapter\OptionalPackage) and the new property sitemapInstalled: ?bool
    (null detects, false runs as if the package were absent — tests set it in the component configuration).
    Config\ConfigFactory::factory(), create() and build() take an appended ?bool $sitemapInstalled = null. The
    check line for a configured but ignored sitemap block is a warning now (it was ok). The invalid-block critical
    line now ends with (run "php yii indexnow/check") (SitemapConfig::loadOrDisabled()).

Documentation

  • README: the quick-start record is tests/Readme/Post.php verbatim (complete use lines, the category relation the
    via: rule reads, casts/defaults that make it run); ReadmeQuickstartTest compares the README block with the file
    and runs the record through the test application against the FakeTransport.
  • README: "Notes for AI assistants" (package, minimal complete snippet, verification, pitfalls across the adapters);
    ReadmeAiNotesTest keeps it consistent with the commands and configuration keys.
  • README "Operations": the production checklist first, then monitoring rules, deleted pages, what not to submit,
    multi-domain, queue, commit safety and troubleshooting.
  • docs/configuration.md: the full core key table with defaults (parity with the Laravel adapter);
    docs/testing.md: URLs without HTTP, transactions and verify-on-commit, queue, dry_run, conformance;
    docs/multi-domain.md (new): hosts, rules on another host, languages, origin of generated URLs, www and apex,
    hreflang; docs/troubleshooting.md: "Sent, but the engine answers" (403/422/429/202), "Duplicates, timing",
    "Staging submitted its URLs", "Duplicates with memory and several workers".
  • Russian translation: docs/troubleshooting.ru.md (linked from README.ru.md).
  • homepage in composer.json points at the docs site (https://indexnowkit.github.io/php/).

0.6.0

Choose a tag to compare

@somework somework released this 05 Sep 07:41

Wave 0a of docs/spec/17 with core 0.6.0. indexnow/check fails when YII_ENV (or the component's environment)
is not in production_environments, a key is configured and dry_run is not set
(a staging copy with the
production key submits real URLs). A staging or preview environment that submits on purpose sets
'dry_run' => false in the options and gets a warning instead.

Changed

  • Requires indexnowkit/core ^0.6; indexnowkit/sitemap ^0.2 when installed.

Added

  • internetarchive and amazon accepted in engines (core 0.6).

Fixed

  • "app\models\Post" is not an ActiveRecord class names the base class the command expects; the verify-on-commit
    message for a record without a primary key says what to do and what happens meanwhile.

Documentation

  • README: the component configuration comes before key-generate / check (the controller is registered by
    bootstrap()); "Why this over X", "Notification, not indexing", the issues link. docs/bc.md:
    component options and properties, console actions, bootstrap ids, behavior, job.

0.5.0

Choose a tag to compare

@somework somework released this 04 Sep 21:03

Retry-After and the retry.* backoff are honoured by the yii2-queue job, which re-pushes the rejected URLs itself.
Migration: SubmitUrlsJob no longer throws on 429/5xx, so the retry settings of the queue (attempts, ttr
of the driver) do not limit them any more; set retry.max_attempts and the retry.* delays in the component
options instead. Nothing else changes for a 403 (still logged, no retry).

Changed

  • Queue\SubmitUrlsJob re-pushes retryable failures instead of throwing. After a 429, 5xx or network failure the
    job pushes a new SubmitUrlsJob with the rejected URLs, the same id, attempt + 1 and the delay of the core's
    Retry\RetryPolicy built from retry.* (Retry-After first), then ends successfully; at retry.max_attempts it
    logs giving up on N URL(s) of job <id> at error and ends. New public property attempt (1 from the dispatcher).
    canRetry() keeps its previous behaviour for exceptions (RetryableSubmissionException within maxAttempts), the
    job itself no longer throws it. The sync driver ignores the delay: the attempts run back-to-back in one run();
    indexnow/check says so. docs/queue.md.

  • Internal refactor, no API change: the Adapter\ServicesBuilder description of the graph and the check lines
    moved from IndexNowComponent to Wiring, the resolution of the override properties to References. The
    component keeps every public method and property; only relevant if you extend the component's internals.

Fixed

  • php yii help indexnow/<action> describes the options with the texts and defaults of the core's
    Console\Definitions (and Sitemap\Console\Definitions), the same the bundle and artisan print:
    IndexNowController::getActionOptionsHelp() reads them from the definitions instead of the property docblocks of
    the controller. sitemap without indexnowkit/sitemap keeps Yii's help.