@inertiajs/svelte 1.0.0-beta.2 → 1.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inertiajs/svelte",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.5",
4
4
  "license": "MIT",
5
5
  "description": "The Svelte adapter for Inertia.js",
6
6
  "contributors": [
@@ -19,12 +19,16 @@
19
19
  "keywords": [
20
20
  "svelte"
21
21
  ],
22
+ "exports": {
23
+ ".": "./src/index.js",
24
+ "./server": "./src/server.js"
25
+ },
22
26
  "main": "src/index.js",
23
27
  "peerDependencies": {
24
28
  "svelte": "^3.20.0"
25
29
  },
26
30
  "dependencies": {
27
- "@inertiajs/core": "1.0.0-beta.2",
31
+ "@inertiajs/core": "1.0.0-beta.5",
28
32
  "lodash.isequal": "^4.5.0"
29
33
  }
30
34
  }
package/src/App.svelte CHANGED
@@ -1,22 +1,7 @@
1
1
  <script>
2
- import { router } from '@inertiajs/core'
3
2
  import Render, { h } from './Render.svelte'
4
3
  import store from './store'
5
4
 
6
- export let initialPage, resolveComponent
7
-
8
- router.init({
9
- initialPage,
10
- resolveComponent,
11
- swapComponent: async ({ component, page, preserveState }) => {
12
- store.update((current) => ({
13
- component,
14
- page,
15
- key: preserveState ? current.key : Date.now()
16
- }))
17
- }
18
- })
19
-
20
5
  $: child = $store.component && h($store.component.default, $store.page.props)
21
6
  $: layout = $store.component && $store.component.layout
22
7
  $: components = layout
package/src/Link.svelte CHANGED
@@ -1,49 +1,59 @@
1
1
  <script>
2
- import { mergeDataIntoQueryString, router, shouldIntercept } from '@inertiajs/core'
3
- import { beforeUpdate, createEventDispatcher } from 'svelte'
4
-
5
- const dispatch = createEventDispatcher()
6
-
7
- export let
8
- data = {},
9
- href,
10
- method = 'get',
11
- replace = false,
12
- preserveScroll = false,
13
- preserveState = null,
14
- only = [],
15
- headers = {}
2
+ import { beforeUpdate } from 'svelte'
3
+ import { default as inertia } from './link'
4
+
5
+ export let href
6
+ export let as = 'a'
7
+ export let data = {}
8
+ export let method = 'get'
9
+ export let replace = false
10
+ export let preserveScroll = false
11
+ export let preserveState = null
12
+ export let only = []
13
+ export let headers = {}
14
+ export let queryStringArrayFormat = 'brackets'
16
15
 
17
16
  beforeUpdate(() => {
18
- method = method.toLowerCase()
19
- const [_href, _data] = mergeDataIntoQueryString(method, href, data)
20
- href = _href
21
- data = _data
22
-
23
- if (method !== 'get') {
24
- console.warn(`Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes "Open Link in New Tab/Window" accessibility issues.\n\nPlease specify a more appropriate element using the "inertia" directive. For example:\n\n<button use:inertia={{ method: 'post', href: '${href}' }}>...</button>`)
17
+ if (as === 'a' && method.toLowerCase() !== 'get') {
18
+ console.warn(
19
+ `Creating POST/PUT/PATCH/DELETE <a> links is discouraged as it causes "Open Link in New Tab/Window" accessibility issues.\n\nPlease specify a more appropriate element using the "as" attribute. For example:\n\n<Link href="${href}" method="${method}" as="button">...</Link>`,
20
+ )
25
21
  }
26
22
  })
27
-
28
- function visit(event) {
29
- dispatch('click', event)
30
-
31
- if (shouldIntercept(event)) {
32
- event.preventDefault()
33
-
34
- router.visit(href, {
35
- data,
36
- method,
37
- preserveScroll,
38
- preserveState: preserveState !== null ? preserveState : (method !== 'get'),
39
- replace,
40
- only,
41
- headers,
42
- })
43
- }
44
- }
45
23
  </script>
46
24
 
47
- <a {...$$restProps} {href} on:click={visit}>
25
+ <svelte:element
26
+ this={as}
27
+ use:inertia={{
28
+ ...(as !== 'a' ? { href } : {}),
29
+ data,
30
+ method,
31
+ replace,
32
+ preserveScroll,
33
+ preserveState: preserveState ?? method !== 'get',
34
+ only,
35
+ headers,
36
+ queryStringArrayFormat,
37
+ }}
38
+ {...as === 'a' ? { href } : {}}
39
+ {...$$restProps}
40
+ on:focus
41
+ on:blur
42
+ on:click
43
+ on:dblclick
44
+ on:mousedown
45
+ on:mousemove
46
+ on:mouseout
47
+ on:mouseover
48
+ on:mouseup
49
+ on:cancel-token
50
+ on:before
51
+ on:start
52
+ on:progress
53
+ on:finish
54
+ on:cancel
55
+ on:success
56
+ on:error
57
+ >
48
58
  <slot />
49
- </a>
59
+ </svelte:element>
package/src/Render.svelte CHANGED
@@ -3,7 +3,7 @@
3
3
  return {
4
4
  component,
5
5
  ...(props ? { props } : {}),
6
- ...(children ? { children } : {})
6
+ ...(children ? { children } : {}),
7
7
  }
8
8
  }
9
9
  </script>
package/src/SSR.svelte ADDED
@@ -0,0 +1,8 @@
1
+ <script>
2
+ import App from './App.svelte'
3
+ export let id, initialPage
4
+ </script>
5
+
6
+ <div data-server-rendered="true" {id} data-page={JSON.stringify(initialPage)}>
7
+ <App />
8
+ </div>
@@ -1,32 +1,54 @@
1
- import { setupProgress } from '@inertiajs/core'
1
+ import { router, setupProgress } from '@inertiajs/core'
2
2
  import App from './App.svelte'
3
+ import SSR from './SSR.svelte'
4
+ import store from './store'
3
5
 
4
- export default async function createInertiaApp({ id = 'app', resolve, setup, progress = {}, page, render }) {
6
+ export default async function createInertiaApp({ id = 'app', resolve, setup, progress = {}, page }) {
5
7
  const isServer = typeof window === 'undefined'
6
8
  const el = isServer ? null : document.getElementById(id)
7
9
  const initialPage = page || JSON.parse(el.dataset.page)
8
10
  const resolveComponent = (name) => Promise.resolve(resolve(name))
9
11
 
10
- let head = []
12
+ await resolveComponent(initialPage.component).then((initialComponent) => {
13
+ store.set({
14
+ component: initialComponent,
15
+ page: initialPage,
16
+ })
17
+ })
18
+
19
+ if (!isServer) {
20
+ router.init({
21
+ initialPage,
22
+ resolveComponent,
23
+ swapComponent: async ({ component, page, preserveState }) => {
24
+ store.update((current) => ({
25
+ component,
26
+ page,
27
+ key: preserveState ? current.key : Date.now(),
28
+ }))
29
+ },
30
+ })
31
+
32
+ if (progress) {
33
+ setupProgress(progress)
34
+ }
11
35
 
12
- const svelteApp = await resolveComponent(initialPage.component).then((initialComponent) => {
13
36
  return setup({
14
37
  el,
15
38
  App,
16
39
  props: {
17
40
  initialPage,
18
- initialComponent,
19
41
  resolveComponent,
20
- onHeadUpdate: isServer ? (elements) => (head = elements) : null,
21
42
  },
22
43
  })
23
- })
24
-
25
- if (!isServer && progress) {
26
- setupProgress(progress)
27
44
  }
28
45
 
29
46
  if (isServer) {
30
- // TODO
47
+ const { html, head } = SSR.render({ id, initialPage })
48
+
49
+ return {
50
+ body: html,
51
+ head: [head],
52
+ }
31
53
  }
32
54
  }
package/src/link.js CHANGED
@@ -1,30 +1,42 @@
1
1
  import { mergeDataIntoQueryString, router, shouldIntercept } from '@inertiajs/core'
2
- import { createEventDispatcher } from 'svelte'
3
2
 
4
3
  export default (node, options = {}) => {
5
- const [href, data] = mergeDataIntoQueryString(
6
- options.method || 'get',
7
- node.href || options.href || '',
8
- options.data || {},
9
- options.queryStringArrayFormat || 'brackets',
10
- )
4
+ const [href, data] = hrefAndData(options)
11
5
  node.href = href
12
6
  options.data = data
13
7
 
14
- const dispatch = createEventDispatcher()
15
-
16
- function visit(event) {
17
- dispatch('click', event)
8
+ function fireEvent(name, eventOptions = {}) {
9
+ return node.dispatchEvent(new CustomEvent(name, eventOptions))
10
+ }
18
11
 
19
- const href = node.href || options.href
12
+ function hrefAndData(options) {
13
+ return mergeDataIntoQueryString(
14
+ options.method || 'get',
15
+ node.href || options.href || '',
16
+ options.data || {},
17
+ options.queryStringArrayFormat || 'brackets',
18
+ )
19
+ }
20
20
 
21
- if (!href) {
21
+ function visit(event) {
22
+ if (!node.href) {
22
23
  throw new Error('Option "href" is required')
23
24
  }
24
25
 
25
26
  if (shouldIntercept(event)) {
26
27
  event.preventDefault()
27
- router.visit(href, options)
28
+
29
+ router.visit(node.href, {
30
+ onCancelToken: () => fireEvent('cancel-token'),
31
+ onBefore: (visit) => fireEvent('before', { detail: { visit } }),
32
+ onStart: (visit) => fireEvent('start', { detail: { visit } }),
33
+ onProgress: (progress) => fireEvent('progress', { detail: { progress } }),
34
+ onFinish: (visit) => fireEvent('finish', { detail: { visit } }),
35
+ onCancel: () => fireEvent('cancel'),
36
+ onSuccess: (page) => fireEvent('success', { detail: { page } }),
37
+ onError: (errors) => fireEvent('error', { detail: { errors } }),
38
+ ...options,
39
+ })
28
40
  }
29
41
  }
30
42
 
@@ -32,15 +44,9 @@ export default (node, options = {}) => {
32
44
 
33
45
  return {
34
46
  update(newOptions) {
35
- const [href, data] = mergeDataIntoQueryString(
36
- newOptions.method || 'get',
37
- node.href || newOptions.href,
38
- newOptions.data || {},
39
- newOptions.queryStringArrayFormat || 'brackets',
40
- )
47
+ const [href, data] = hrefAndData(newOptions)
41
48
  node.href = href
42
- newOptions.data = data
43
- options = newOptions
49
+ options = { ...newOptions, data }
44
50
  },
45
51
  destroy() {
46
52
  node.removeEventListener('click', visit)
package/src/server.js ADDED
@@ -0,0 +1 @@
1
+ export { default as default } from '@inertiajs/core/server'