Skip to content

Interactive placeholder replacement #5

@retlehs

Description

@retlehs

Summary

Implement automatic placeholder replacement directly in acorn-example-package so packages created via composer create-package roots/acorn-example-package ... can be configured immediately with prompts.

This keeps the template readable in-repo and gives users a deterministic post-create configuration step.

Proposed Implementation

1) Entrypoint

  • Add root configure.php as the canonical setup command.
  • Intended flow: run after composer create-package.

2) Inputs

Prompt for (with sensible defaults):

  • author_name
  • author_email
  • vendor_slug
  • vendor_namespace
  • package_slug
  • class_name
  • package_description

Derived:

  • command_signature = package_slug

3) Scope (Manifest-Based)

Transform only these files:

  • composer.json
  • README.md
  • src/Example.php
  • src/Providers/ExampleServiceProvider.php
  • src/Console/ExampleCommand.php
  • src/Facades/Example.php
  • config/example.php
  • resources/views/example.blade.php

No repo-wide grep/find/replace.

4) Replacement + Rename Rules

Use explicit, context-aware mappings for placeholders and symbols (vendor-name, example-package, VendorName, ExamplePackage, ExampleServiceProvider, etc.) per file.

Deterministic renames:

  • src/Example.php -> src/{class_name}.php
  • src/Providers/ExampleServiceProvider.php -> src/Providers/{class_name}ServiceProvider.php
  • src/Console/ExampleCommand.php -> src/Console/{class_name}Command.php
  • src/Facades/Example.php -> src/Facades/{class_name}.php
  • config/example.php -> config/{package_slug}.php
  • resources/views/example.blade.php -> resources/views/{package_slug}.blade.php

5) composer.json Handling

  • Parse/mutate/write as JSON (json_decode/json_encode) rather than raw text replacement.
  • Preserve 2-space indentation on write.
  • Update:
    • name
    • description
    • authors[0].name
    • authors[0].email
    • PSR-4 namespace key
    • extra.acorn.providers
    • extra.acorn.aliases

6) CLI Behavior

  • --dry-run (preview only)
  • --no-interaction (requires explicit args)
  • Interactive confirmation before writing
  • No automatic composer install
  • No self-delete behavior

7) Smoke Test

Add tests/smoke/configure_smoke.php and composer script:

  • composer test:configure

Test flow:

  1. Copy template to temp dir
  2. Run non-interactive configure with fixed inputs
  3. Assert renamed files exist and originals are gone
  4. Assert key namespace/class/config/view/command strings are updated

Acceptance Criteria

  • One configure run yields consistent namespace/class/file/config/view/command wiring.
  • composer.json metadata is updated from inputs.
  • No blind global replacements.
  • Works on macOS/Linux/Windows.
  • Smoke test passes via composer test:configure.

Notes

  • This follows the issue direction to keep it in acorn-example-package first for the create-package flow.
  • CLI extraction into Acorn can be a follow-up once the transform logic is proven here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions