From d624bc185ee245113c3208c781b16e6b61c6d334 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kryukov Date: Fri, 25 Oct 2024 21:37:32 +0300 Subject: [PATCH] Add Svelte 5 support --- README.md | 4 +- docs/guide/server-side-setup.md | 4 +- lib/generators/inertia/install/frameworks.yml | 31 ++++- .../inertia/install/install_generator.rb | 8 +- .../install/templates/react/inertia.ts | 6 +- .../templates/svelte/InertiaExample.svelte | 10 +- .../templates/svelte/InertiaExample.ts.svelte | 10 +- .../install/templates/svelte/inertia.js | 5 +- .../install/templates/svelte/inertia.ts | 16 +-- .../templates/svelte4/InertiaExample.svelte | 116 +++++++++++++++++ .../svelte4/InertiaExample.ts.svelte | 116 +++++++++++++++++ .../install/templates/svelte4/inertia.js | 29 +++++ .../install/templates/svelte4/inertia.ts | 29 +++++ .../templates/svelte4/svelte.config.js | 7 + .../install/templates/svelte4/tsconfig.json | 21 +++ .../templates/svelte4/tsconfig.node.json | 12 ++ .../install/templates/svelte4/vite-env.d.ts | 2 + .../inertia/install/templates/vue/inertia.ts | 6 +- .../templates/svelte4/view.svelte.tt | 2 + .../scaffold/templates/react/Form.jsx.tt | 2 +- .../scaffold/templates/svelte/Edit.svelte.tt | 7 +- .../scaffold/templates/svelte/Form.svelte.tt | 22 ++-- .../scaffold/templates/svelte/Index.svelte.tt | 9 +- .../scaffold/templates/svelte/New.svelte.tt | 7 +- .../scaffold/templates/svelte/One.svelte.tt | 2 +- .../scaffold/templates/svelte/Show.svelte.tt | 13 +- .../scaffold/templates/svelte4/Edit.svelte.tt | 37 ++++++ .../scaffold/templates/svelte4/Form.svelte.tt | 96 ++++++++++++++ .../templates/svelte4/Index.svelte.tt | 36 ++++++ .../scaffold/templates/svelte4/New.svelte.tt | 30 +++++ .../scaffold/templates/svelte4/One.svelte.tt | 28 ++++ .../scaffold/templates/svelte4/Show.svelte.tt | 46 +++++++ .../scaffold/templates/vue/Form.vue.tt | 2 +- .../templates/svelte4/view.svelte.tt | 2 + .../scaffold/templates/react/Form.jsx.tt | 2 +- .../scaffold/templates/svelte/Edit.svelte.tt | 7 +- .../scaffold/templates/svelte/Form.svelte.tt | 23 ++-- .../scaffold/templates/svelte/Index.svelte.tt | 9 +- .../scaffold/templates/svelte/New.svelte.tt | 7 +- .../scaffold/templates/svelte/One.svelte.tt | 2 +- .../scaffold/templates/svelte/Show.svelte.tt | 15 +-- .../scaffold/templates/svelte4/Edit.svelte.tt | 45 +++++++ .../scaffold/templates/svelte4/Form.svelte.tt | 120 ++++++++++++++++++ .../templates/svelte4/Index.svelte.tt | 43 +++++++ .../scaffold/templates/svelte4/New.svelte.tt | 33 +++++ .../scaffold/templates/svelte4/One.svelte.tt | 28 ++++ .../scaffold/templates/svelte4/Show.svelte.tt | 58 +++++++++ .../scaffold/templates/vue/Form.vue.tt | 2 +- .../generators_helper.rb | 7 +- .../install/install_generator_spec.rb | 54 +++++++- 50 files changed, 1103 insertions(+), 125 deletions(-) create mode 100644 lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte create mode 100644 lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte create mode 100644 lib/generators/inertia/install/templates/svelte4/inertia.js create mode 100644 lib/generators/inertia/install/templates/svelte4/inertia.ts create mode 100644 lib/generators/inertia/install/templates/svelte4/svelte.config.js create mode 100644 lib/generators/inertia/install/templates/svelte4/tsconfig.json create mode 100644 lib/generators/inertia/install/templates/svelte4/tsconfig.node.json create mode 100644 lib/generators/inertia/install/templates/svelte4/vite-env.d.ts create mode 100644 lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt create mode 100644 lib/generators/inertia_templates/scaffold/templates/svelte4/Edit.svelte.tt create mode 100644 lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt create mode 100644 lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt create mode 100644 lib/generators/inertia_templates/scaffold/templates/svelte4/New.svelte.tt create mode 100644 lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt create mode 100644 lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/controller/templates/svelte4/view.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Edit.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/scaffold/templates/svelte4/New.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.svelte.tt create mode 100644 lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.svelte.tt diff --git a/README.md b/README.md index d367001..3a7e1cd 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ bin/rails generate inertia:install This command will: - Check for Vite Rails and install it if not present - Ask if you want to use TypeScript -- Ask you to choose your preferred frontend framework (React, Vue, or Svelte) +- Ask you to choose your preferred frontend framework (React, Vue, Svelte 4, or Svelte 5) - Ask if you want to install Tailwind CSS - Install necessary dependencies - Set up the application to work with Inertia @@ -51,7 +51,7 @@ Vite Rails gem successfully installed Vite Rails successfully installed Would you like to use TypeScript? (y/n) y Adding TypeScript support -What framework do you want to use with Inertia? [react, vue, svelte] (react) +What framework do you want to use with Inertia? [react, vue, svelte4, svelte] (react) run npm add @types/react @types/react-dom typescript --silent from "." Would you like to install Tailwind CSS? (y/n) y Installing Tailwind CSS diff --git a/docs/guide/server-side-setup.md b/docs/guide/server-side-setup.md index da0dc74..e78dbaf 100644 --- a/docs/guide/server-side-setup.md +++ b/docs/guide/server-side-setup.md @@ -27,7 +27,7 @@ bin/rails generate inertia:install This command will: - Check for Vite Rails and install it if not present - Ask if you want to use TypeScript -- Ask you to choose your preferred frontend framework (React, Vue, or Svelte) +- Ask you to choose your preferred frontend framework (React, Vue, Svelte 4, or Svelte 5) - Ask if you want to install Tailwind CSS - Install necessary dependencies - Set up the application to work with Inertia @@ -52,7 +52,7 @@ Vite Rails gem successfully installed Vite Rails successfully installed Would you like to use TypeScript? (y/n) y Adding TypeScript support -What framework do you want to use with Inertia? [react, vue, svelte] (react) +What framework do you want to use with Inertia? [react, vue, svelte4, svelte] (react) run npm add @types/react @types/react-dom typescript --silent from "." Would you like to install Tailwind CSS? (y/n) y Installing Tailwind CSS diff --git a/lib/generators/inertia/install/frameworks.yml b/lib/generators/inertia/install/frameworks.yml index 8868514..6a11dc6 100644 --- a/lib/generators/inertia/install/frameworks.yml +++ b/lib/generators/inertia/install/frameworks.yml @@ -47,13 +47,38 @@ vue: copy_files_js: "InertiaExample.vue": "%{js_destination_path}/pages/InertiaExample.vue" +svelte4: + inertia_package: "@inertiajs/svelte" + packages: + - "svelte@4" + - "@sveltejs/vite-plugin-svelte@3" + packages_ts: + - "@tsconfig/svelte@4" + - "svelte-check" + - "typescript" + - "tslib" + vite_plugin_import: "import { svelte } from '@sveltejs/vite-plugin-svelte'" + vite_plugin_call: "svelte()" + copy_files_ts: + "InertiaExample.ts.svelte": "%{js_destination_path}/pages/InertiaExample.svelte" + "tsconfig.json": "tsconfig.json" + "tsconfig.node.json": "tsconfig.node.json" + "vite-env.d.ts": "%{js_destination_path}/vite-env.d.ts" + copy_files_js: + "InertiaExample.svelte": "%{js_destination_path}/pages/InertiaExample.svelte" + copy_files: + "svelte.config.js": "svelte.config.js" + "../assets/svelte.svg": "%{js_destination_path}/assets/svelte.svg" + "../assets/inertia.svg": "%{js_destination_path}/assets/inertia.svg" + "../assets/vite_ruby.svg": "%{js_destination_path}/assets/vite_ruby.svg" + svelte: inertia_package: "@inertiajs/svelte" packages: - - "svelte" - - "@sveltejs/vite-plugin-svelte" + - "svelte@5" + - "@sveltejs/vite-plugin-svelte@4" packages_ts: - - "@tsconfig/svelte" + - "@tsconfig/svelte@5" - "svelte-check" - "typescript" - "tslib" diff --git a/lib/generators/inertia/install/install_generator.rb b/lib/generators/inertia/install/install_generator.rb index f124183..8315216 100644 --- a/lib/generators/inertia/install/install_generator.rb +++ b/lib/generators/inertia/install/install_generator.rb @@ -99,7 +99,7 @@ def install_inertia insert_into_file application_layout.to_s, "<%= vite_react_refresh_tag %>\n ", before: "<%= vite_client_tag %>" end - gsub_file application_layout.to_s, //, "<title inertia>" if framework != "svelte" + gsub_file application_layout.to_s, /<title>/, "<title inertia>" unless svelte? else say_error "Could not find the application layout file. Please add the following tags manually:", :red say_error "- <title>..." @@ -112,7 +112,7 @@ def install_inertia def install_typescript say "Adding TypeScript support" - if framework == "svelte" && inertia_resolved_version.release < Gem::Version.new("1.3.0") + if svelte? && inertia_resolved_version.release < Gem::Version.new("1.3.0") say "WARNING: @inertiajs/svelte < 1.3.0 does not support TypeScript (resolved version: #{inertia_resolved_version}).", :yellow say "Skipping TypeScript support for @inertiajs/svelte", :yellow @typescript = false @@ -270,6 +270,10 @@ def verbose? options[:verbose] end + def svelte? + framework.start_with? "svelte" + end + def inertia_package "#{FRAMEWORKS[framework]["inertia_package"]}@#{options[:inertia_version]}" end diff --git a/lib/generators/inertia/install/templates/react/inertia.ts b/lib/generators/inertia/install/templates/react/inertia.ts index b6017fe..4ef3a28 100644 --- a/lib/generators/inertia/install/templates/react/inertia.ts +++ b/lib/generators/inertia/install/templates/react/inertia.ts @@ -16,14 +16,14 @@ createInertiaApp({ // progress: false, resolve: (name) => { - const pages = import.meta.glob('../pages/**/*.tsx', { eager: true }) - return pages[`../pages/${name}.tsx`] as ResolvedComponent + const pages = import.meta.glob('../pages/**/*.tsx', { eager: true }) + return pages[`../pages/${name}.tsx`] // To use a default layout, import the Layout component // and use the following lines. // see https://inertia-rails.netlify.app/guide/pages#default-layouts // - // const page = pages[`../pages/${name}.tsx`] as ResolvedComponent + // const page = pages[`../pages/${name}.tsx`] // page.default.layout ||= (page) => createElement(Layout, null, page) // return page }, diff --git a/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte b/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte index 96785fe..4c6d294 100644 --- a/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte +++ b/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte @@ -3,13 +3,9 @@ import inertiaSvg from '/assets/inertia.svg' import viteRubySvg from '/assets/vite_ruby.svg' - export let name + let { name } = $props() - let count = 0 - - function handleClick() { - count += 1 - } + let count = $state(0) @@ -34,7 +30,7 @@

Inertia + Vite Ruby + Svelte

-

diff --git a/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte b/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte index b0d42e3..0ed1c7d 100644 --- a/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte +++ b/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte @@ -3,13 +3,9 @@ import inertiaSvg from '/assets/inertia.svg' import viteRubySvg from '/assets/vite_ruby.svg' - export let name: string + let { name }: { name: string } = $props() - let count = 0 - - function handleClick() { - count += 1 - } + let count = $state(0) @@ -34,7 +30,7 @@

Inertia + Vite Ruby + Svelte

-

diff --git a/lib/generators/inertia/install/templates/svelte/inertia.js b/lib/generators/inertia/install/templates/svelte/inertia.js index 19c3a31..1ea6c22 100644 --- a/lib/generators/inertia/install/templates/svelte/inertia.js +++ b/lib/generators/inertia/install/templates/svelte/inertia.js @@ -1,4 +1,5 @@ import { createInertiaApp } from '@inertiajs/svelte' +import { mount } from 'svelte'; createInertiaApp({ // Set default page title @@ -23,7 +24,7 @@ createInertiaApp({ // return { default: page.default, layout: page.layout || Layout } }, - setup({ el, App }) { - new App({ target: el }) + setup({ el, App, props }) { + mount(App, { target: el, props }) }, }) diff --git a/lib/generators/inertia/install/templates/svelte/inertia.ts b/lib/generators/inertia/install/templates/svelte/inertia.ts index 93210da..d6d55cd 100644 --- a/lib/generators/inertia/install/templates/svelte/inertia.ts +++ b/lib/generators/inertia/install/templates/svelte/inertia.ts @@ -1,7 +1,5 @@ -import { createInertiaApp } from '@inertiajs/svelte' -import type { ComponentType } from 'svelte'; - -type ResolvedComponent = { default: ComponentType, layout?: ComponentType } +import { createInertiaApp, type ResolvedComponent } from '@inertiajs/svelte' +import { mount } from 'svelte' createInertiaApp({ // Set default page title @@ -15,18 +13,18 @@ createInertiaApp({ // progress: false, resolve: (name) => { - const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) - return pages[`../pages/${name}.svelte`] as ResolvedComponent + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] // To use a default layout, import the Layout component // and use the following lines. // see https://inertia-rails.netlify.app/guide/pages#default-layouts // - // const page = pages[`../pages/${name}.svelte`] as ResolvedComponent + // const page = pages[`../pages/${name}.svelte`] // return { default: page.default, layout: page.layout || Layout } }, - setup({ el, App }) { - new App({ target: el }) + setup({ el, App, props }) { + mount(App, { target: el, props }) }, }) diff --git a/lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte b/lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte new file mode 100644 index 0000000..96785fe --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte @@ -0,0 +1,116 @@ + + + + Inertia + Vite Ruby + Svelte Example + + +

+

Hello {name}!

+ + + +

Inertia + Vite Ruby + Svelte

+ +
+ +

+ Edit app/frontend/pages/InertiaExample.svelte and save to test + HMR +

+
+

+ Click on the Inertia, Vite Ruby, and Svelte logos to learn more +

+
+ + diff --git a/lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte b/lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte new file mode 100644 index 0000000..b0d42e3 --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte @@ -0,0 +1,116 @@ + + + + Inertia + Vite Ruby + Svelte Example + + +
+

Hello {name}!

+ + + +

Inertia + Vite Ruby + Svelte

+ +
+ +

+ Edit app/frontend/pages/InertiaExample.svelte and save to test + HMR +

+
+

+ Click on the Inertia, Vite Ruby, and Svelte logos to learn more +

+
+ + diff --git a/lib/generators/inertia/install/templates/svelte4/inertia.js b/lib/generators/inertia/install/templates/svelte4/inertia.js new file mode 100644 index 0000000..7c288a6 --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/inertia.js @@ -0,0 +1,29 @@ +import { createInertiaApp } from '@inertiajs/svelte' + +createInertiaApp({ + // Set default page title + // see https://inertia-rails.netlify.app/guide/title-and-meta + // + // title: title => title ? `${title} - App` : 'App', + + // Disable progress bar + // + // see https://inertia-rails.netlify.app/guide/progress-indicators + // progress: false, + + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + + // To use a default layout, import the Layout component + // and use the following lines. + // see https://inertia-rails.netlify.app/guide/pages#default-layouts + // + // const page = pages[`../pages/${name}.svelte`] + // return { default: page.default, layout: page.layout || Layout } + }, + + setup({ el, App, props }) { + new App({ target: el, props }) + }, +}) diff --git a/lib/generators/inertia/install/templates/svelte4/inertia.ts b/lib/generators/inertia/install/templates/svelte4/inertia.ts new file mode 100644 index 0000000..a4a7549 --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/inertia.ts @@ -0,0 +1,29 @@ +import { createInertiaApp, type ResolvedComponent } from '@inertiajs/svelte' + +createInertiaApp({ + // Set default page title + // see https://inertia-rails.netlify.app/guide/title-and-meta + // + // title: title => title ? `${title} - App` : 'App', + + // Disable progress bar + // + // see https://inertia-rails.netlify.app/guide/progress-indicators + // progress: false, + + resolve: (name) => { + const pages = import.meta.glob('../pages/**/*.svelte', { eager: true }) + return pages[`../pages/${name}.svelte`] + + // To use a default layout, import the Layout component + // and use the following lines. + // see https://inertia-rails.netlify.app/guide/pages#default-layouts + // + // const page = pages[`../pages/${name}.svelte`] + // return { default: page.default, layout: page.layout || Layout } + }, + + setup({ el, App, props }) { + new App({ target: el, props }) + }, +}) diff --git a/lib/generators/inertia/install/templates/svelte4/svelte.config.js b/lib/generators/inertia/install/templates/svelte4/svelte.config.js new file mode 100644 index 0000000..b0683fd --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/lib/generators/inertia/install/templates/svelte4/tsconfig.json b/lib/generators/inertia/install/templates/svelte4/tsconfig.json new file mode 100644 index 0000000..acbc1cd --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true, + "moduleDetection": "force", + }, + "include": ["<%= js_destination_path %>/**/*.ts", "<%= js_destination_path %>/**/*.js", "<%= js_destination_path %>/**/*.svelte"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/lib/generators/inertia/install/templates/svelte4/tsconfig.node.json b/lib/generators/inertia/install/templates/svelte4/tsconfig.node.json new file mode 100644 index 0000000..3126cd7 --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "noEmit": true, + }, + "include": ["vite.config.ts"] +} diff --git a/lib/generators/inertia/install/templates/svelte4/vite-env.d.ts b/lib/generators/inertia/install/templates/svelte4/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/lib/generators/inertia/install/templates/svelte4/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/lib/generators/inertia/install/templates/vue/inertia.ts b/lib/generators/inertia/install/templates/vue/inertia.ts index e9cb4cb..b4c62d6 100644 --- a/lib/generators/inertia/install/templates/vue/inertia.ts +++ b/lib/generators/inertia/install/templates/vue/inertia.ts @@ -13,14 +13,14 @@ createInertiaApp({ // progress: false, resolve: (name) => { - const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) - return pages[`../pages/${name}.vue`] as DefineComponent + const pages = import.meta.glob('../pages/**/*.vue', { eager: true }) + return pages[`../pages/${name}.vue`] // To use a default layout, import the Layout component // and use the following lines. // see https://inertia-rails.netlify.app/guide/pages#default-layouts // - // const page = pages[`../pages/${name}.vue`] as DefineComponent + // const page = pages[`../pages/${name}.vue`] // page.default.layout = page.default.layout || Layout // return page }, diff --git a/lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt b/lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt new file mode 100644 index 0000000..cd54d13 --- /dev/null +++ b/lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt @@ -0,0 +1,2 @@ +

<%= class_name %>#<%= @action %>

+

Find me in <%= @path %>

diff --git a/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt b/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt index 2707eaa..648269c 100644 --- a/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt +++ b/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt @@ -73,7 +73,7 @@ export default function Form({ <%= singular_table_name %>, onSubmit, submitText <% elsif attribute.attachments? -%> setData('<%= attribute.column_name %>', Array.from(e.target.files))} diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.svelte.tt index 8f45c81..60b691e 100644 --- a/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.svelte.tt +++ b/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.svelte.tt @@ -2,10 +2,9 @@ import { Link } from '@inertiajs/svelte' import Form from './Form.svelte' - export let <%= singular_table_name %> + let { <%= singular_table_name %> } = $props() - const handleSubmit = (e) => { - const { form } = e.detail + const handleSubmit = ({ form }) => { form.transform((data) => ({ <%= singular_table_name %>: data })) <% if attributes.any?(&:attachments?) -%> form.post(`<%= js_resource_path %>`, { @@ -26,7 +25,7 @@
} submitText="Update <%= human_name.downcase %>" - on:submit={handleSubmit} + onSubmit={handleSubmit} />
diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt index c9f1c89..c0ef8c2 100644 --- a/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt +++ b/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt @@ -2,10 +2,7 @@ import { useForm } from '@inertiajs/svelte' import { createEventDispatcher } from 'svelte' - const dispatch = createEventDispatcher() - - export let <%= singular_table_name %> - export let submitText + let { <%= singular_table_name %>, submitText, onSubmit } = $props() const form = useForm({ <% attributes.each do |attribute| -%> @@ -17,9 +14,14 @@ <% end -%> <% end -%> }) + + const handleSubmit = (e) => { + e.preventDefault() + onSubmit({form: $form }) + } - + <% attributes.each do |attribute| -%> <% if attribute.password_digest? -%>
@@ -51,28 +53,28 @@
<% if input_type(attribute) == "text_area" -%> - <% elsif attribute.attachment? -%> ($form.<%= attribute.column_name %> = e.target.files[0])} + oninput={(e) => ($form.<%= attribute.column_name %> = e.target.files[0])} /> <% elsif attribute.attachments? -%> ($form.<%= attribute.column_name %> = Array.from(e.target.files))} + oninput={(e) => ($form.<%= attribute.column_name %> = Array.from(e.target.files))} /> <% else -%> } + <%= input_type(attribute) == "checkbox" ? "bind:checked" : "bind:value" %>={$form.<%= attribute.column_name %>} /> <% end -%> {#if $form.errors.<%= attribute.column_name %>} diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte/Index.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte/Index.svelte.tt index d7af851..e8a7e7d 100644 --- a/lib/generators/inertia_templates/scaffold/templates/svelte/Index.svelte.tt +++ b/lib/generators/inertia_templates/scaffold/templates/svelte/Index.svelte.tt @@ -2,14 +2,7 @@ import { Link } from '@inertiajs/svelte' import <%= inertia_component_name %> from './<%= inertia_component_name %>.svelte' - export let <%= plural_table_name %> - export let flash - - const onDestroy = (e) => { - if (!confirm('Are you sure you want to delete this <%= human_name.downcase %>?')) { - e.preventDefault() - } - } + let { <%= plural_table_name %>, flash } = $props() diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte/New.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte/New.svelte.tt index 6238cd2..d46b465 100644 --- a/lib/generators/inertia_templates/scaffold/templates/svelte/New.svelte.tt +++ b/lib/generators/inertia_templates/scaffold/templates/svelte/New.svelte.tt @@ -2,10 +2,9 @@ import { Link } from '@inertiajs/svelte' import Form from './Form.svelte' - export let <%= singular_table_name %> + let { <%= singular_table_name %> } = $props() - const handleSubmit = (e) => { - const { form } = e.detail + const handleSubmit = ({ form }) => { form.transform((data) => ({ <%= singular_table_name %>: data })) form.post('<%= js_resources_path %>') } @@ -20,7 +19,7 @@ } submitText="Create <%= human_name.downcase %>" - on:submit={handleSubmit} + onSubmit={handleSubmit} />
diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte/One.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte/One.svelte.tt index 01b918a..717b129 100644 --- a/lib/generators/inertia_templates/scaffold/templates/svelte/One.svelte.tt +++ b/lib/generators/inertia_templates/scaffold/templates/svelte/One.svelte.tt @@ -1,5 +1,5 @@
diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte/Show.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte/Show.svelte.tt index c165323..065a058 100644 --- a/lib/generators/inertia_templates/scaffold/templates/svelte/Show.svelte.tt +++ b/lib/generators/inertia_templates/scaffold/templates/svelte/Show.svelte.tt @@ -1,9 +1,8 @@ + + + Editing <%= human_name.downcase %> + + +

Editing <%= human_name.downcase %>

+ +} + submitText="Update <%= human_name.downcase %>" + on:submit={handleSubmit} +/> + +
+ +
+ `}>Show this <%= human_name.downcase %> | + Back to <%= human_name.pluralize.downcase %> +
diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt new file mode 100644 index 0000000..8519c33 --- /dev/null +++ b/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt @@ -0,0 +1,96 @@ + + + +<% attributes.each do |attribute| -%> +<% if attribute.password_digest? -%> +
+ + + {#if $form.errors.password} +
{$form.errors.password.join(', ')}
+ {/if} +
+ +
+ + + {#if $form.errors.password_confirmation} +
{$form.errors.password_confirmation.join(', ')}
+ {/if} +
+<% else -%> +
+ +<% if input_type(attribute) == "text_area" -%> + +<% elsif attribute.attachment? -%> + ($form.<%= attribute.column_name %> = e.target.files[0])} + /> +<% elsif attribute.attachments? -%> + ($form.<%= attribute.column_name %> = Array.from(e.target.files))} + /> +<% else -%> + ={$form.<%= attribute.column_name %>} + /> +<% end -%> + {#if $form.errors.<%= attribute.column_name %>} +
{$form.errors.<%= attribute.column_name %>.join(', ')}
+ {/if} +
+<% end -%> +<% end -%> +
+ +
+ + + diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt new file mode 100644 index 0000000..7164c7b --- /dev/null +++ b/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt @@ -0,0 +1,36 @@ + + + + <%= human_name.pluralize %> + + +{#if flash.notice} +

{flash.notice}

+{/if} + +

<%= human_name.pluralize %>

+ +
+ {#each <%= plural_table_name %> as <%= singular_table_name %> (<%= singular_table_name %>.id)} +
+ <<%= inertia_component_name %> {<%= singular_table_name %>} /> +

+ `}>Show this <%= human_name.downcase %> +

+
+ {/each} +
+ +New <%= human_name.downcase %> + + diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte4/New.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte4/New.svelte.tt new file mode 100644 index 0000000..6238cd2 --- /dev/null +++ b/lib/generators/inertia_templates/scaffold/templates/svelte4/New.svelte.tt @@ -0,0 +1,30 @@ + + + + New <%= human_name.downcase %> + + +

New <%= human_name.downcase %>

+ +
} + submitText="Create <%= human_name.downcase %>" + on:submit={handleSubmit} +/> + +
+ +
+ Back to <%= human_name.pluralize.downcase %> +
diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt new file mode 100644 index 0000000..01b918a --- /dev/null +++ b/lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt @@ -0,0 +1,28 @@ + + +
+<% attributes.reject(&:password_digest?).each do |attribute| -%> +

+ <%= attribute.human_name %>: +<% if attribute.attachment? -%> + {#if <%= singular_table_name %>.<%= attribute.column_name %>} + .<%= attribute.column_name %>.url}> + {<%= singular_table_name %>.<%= attribute.column_name %>.filename} + + {/if} +

+<% elsif attribute.attachments? -%> +

+ {#each <%= singular_table_name %>.<%= attribute.column_name %> as { url, filename }} + + {/each} +<% else -%> + {<%= singular_table_name %>.<%= attribute.column_name %>} +

+<% end -%> +<% end -%> +
diff --git a/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt b/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt new file mode 100644 index 0000000..c165323 --- /dev/null +++ b/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt @@ -0,0 +1,46 @@ + + + + <%= human_name %> #{<%= singular_table_name %>.id} + + +{#if flash.notice} +

{flash.notice}

+{/if} + +

<%= human_name %> #{<%= singular_table_name %>.id}

+ +<<%= inertia_component_name %> {<%= singular_table_name %>} /> + +
+ `}>Edit this <%= human_name.downcase %> | + Back to <%= human_name.pluralize.downcase %> + +
+ + +
+ + diff --git a/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt b/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt index 2833782..226d933 100644 --- a/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt +++ b/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt @@ -44,7 +44,7 @@ <% elsif attribute.attachments? -%> <%= class_name %>#<%= @action %> +

Find me in <%= @path %>

diff --git a/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt b/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt index 7b58710..06e3127 100644 --- a/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt +++ b/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt @@ -74,7 +74,7 @@ export default function Form({ <%= singular_table_name %>, onSubmit, submitText <% elsif attribute.attachments? -%> + let { <%= singular_table_name %> } = $props() - const handleSubmit = (e) => { - const { form } = e.detail + const handleSubmit = ({ form }) => { form.transform((data) => ({ <%= singular_table_name %>: data })) <% if attributes.any?(&:attachments?) -%> form.post(`<%= js_resource_path %>`, { @@ -27,7 +26,7 @@ } submitText="Update <%= human_name.downcase %>" - on:submit={handleSubmit} + onSubmit={handleSubmit} /> - export let submitText + let { <%= singular_table_name %>, submitText, onSubmit } = $props() const form = useForm({ <% attributes.each do |attribute| -%> @@ -17,12 +14,14 @@ <% end -%> <% end -%> }) + + const handleSubmit = (e) => { + e.preventDefault() + onSubmit({form: $form }) + } - + <% attributes.each do |attribute| -%>
<% if attribute.password_digest? -%> @@ -64,22 +63,22 @@ bind:value={$form.<%= attribute.column_name %>} rows="4" class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" - /> + > <% elsif attribute.attachment? -%> ($form.<%= attribute.column_name %> = e.target.files[0])} + oninput={(e) => ($form.<%= attribute.column_name %> = e.target.files[0])} class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" /> <% elsif attribute.attachments? -%> ($form.<%= attribute.column_name %> = Array.from(e.target.files))} + oninput={(e) => ($form.<%= attribute.column_name %> = Array.from(e.target.files))} class="block shadow rounded-md border border-gray-400 outline-none px-3 py-2 mt-2 w-full" /> <% elsif attribute.field_type == :check_box -%> diff --git a/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Index.svelte.tt b/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Index.svelte.tt index f786e87..2be8bfa 100644 --- a/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Index.svelte.tt +++ b/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Index.svelte.tt @@ -2,14 +2,7 @@ import { Link } from '@inertiajs/svelte' import <%= inertia_component_name %> from './<%= inertia_component_name %>.svelte' - export let <%= plural_table_name %> - export let flash - - const onDestroy = (e) => { - if (!confirm('Are you sure you want to delete this <%= human_name.downcase %>?')) { - e.preventDefault() - } - } + let { <%= plural_table_name %>, flash } = $props() diff --git a/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.svelte.tt b/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.svelte.tt index dc3b0a1..d92a6f6 100644 --- a/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.svelte.tt +++ b/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.svelte.tt @@ -2,10 +2,9 @@ import { Link } from '@inertiajs/svelte' import Form from './Form.svelte' - export let <%= singular_table_name %> + let { <%= singular_table_name %> } = $props() - const handleSubmit = (e) => { - const { form } = e.detail + const handleSubmit = ({ form }) => { form.transform((data) => ({ <%= singular_table_name %>: data })) form.post('<%= js_resources_path %>') } @@ -21,7 +20,7 @@ } submitText="Create <%= human_name.downcase %>" - on:submit={handleSubmit} + onSubmit={handleSubmit} /> - export let <%= singular_table_name %> + let { <%= singular_table_name %> } = $props()
diff --git a/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Show.svelte.tt b/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Show.svelte.tt index 4ceafd1..c5c6380 100644 --- a/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Show.svelte.tt +++ b/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Show.svelte.tt @@ -1,9 +1,8 @@ + + + Editing <%= human_name.downcase %> + + +
+

Editing <%= human_name.downcase %>

+ + } + submitText="Update <%= human_name.downcase %>" + on:submit={handleSubmit} + /> + + `} + class="mt-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" + > + Show this <%= human_name.downcase %> + + + Back to <%= human_name.pluralize.downcase %> + +
diff --git a/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt b/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt new file mode 100644 index 0000000..fb08070 --- /dev/null +++ b/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt @@ -0,0 +1,120 @@ + + + +<% attributes.each do |attribute| -%> +
+<% if attribute.password_digest? -%> + + + {#if $form.errors.password} +
+ {$form.errors.password.join(', ')} +
+ {/if} +
+ +
+ + + {#if $form.errors.password_confirmation} +
+ {$form.errors.password_confirmation.join(', ')} +
+ {/if} +<% else -%> + +<% if input_type(attribute) == "text_area" -%> +