nuxt-codemirror 0.0.2 β†’ 0.0.4

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/README.md CHANGED
@@ -1,85 +1,93 @@
1
-
2
-
3
- # Nuxt-CodeMirror
4
-
5
- [![npm version][npm-version-src]][npm-version-href]
6
- [![npm downloads][npm-downloads-src]][npm-downloads-href]
7
- [![License][license-src]][license-href]
8
- [![Nuxt][nuxt-src]][nuxt-href]
9
-
10
- My new Nuxt module for doing amazing things.
11
-
12
- - [✨  Release Notes](/CHANGELOG.md)
13
- <!-- - [πŸ€ Online playground](https://stackblitz.com/github/your-org/my-module?file=playground%2Fapp.vue) -->
14
- <!-- - [πŸ“– &nbsp;Documentation](https://example.com) -->
15
-
16
- ## Features
17
-
18
- <!-- Highlight some of the features your module provide here -->
19
- - β›° &nbsp;Foo
20
- - 🚠 &nbsp;Bar
21
- - 🌲 &nbsp;Baz
22
-
23
- ## Quick Setup
24
-
25
- Install the module to your Nuxt application with one command:
26
-
27
- ```bash
28
- npx nuxi module add my-module
29
- ```
30
-
31
- That's it! You can now use My Module in your Nuxt app ✨
32
-
33
-
34
- ## Contribution
35
-
36
- <details>
37
- <summary>Local development</summary>
38
-
39
- ```bash
40
- # Install dependencies
41
- npm install
42
-
43
- # Generate type stubs
44
- npm run dev:prepare
45
-
46
- # Develop with the playground
47
- npm run dev
48
-
49
- # Build the playground
50
- npm run dev:build
51
-
52
- # Run ESLint
53
- npm run lint
54
-
55
- # Run Vitest
56
- npm run test
57
- npm run test:watch
58
-
59
- # Release new version
60
- npm run release
61
- ```
62
-
63
- </details>
64
-
65
-
66
- <!-- Badges -->
67
- [npm-version-src]: https://img.shields.io/npm/v/my-module/latest.svg?style=flat&colorA=020420&colorB=00DC82
68
- [npm-version-href]: https://npmjs.com/package/my-module
69
-
70
- [npm-downloads-src]: https://img.shields.io/npm/dm/my-module.svg?style=flat&colorA=020420&colorB=00DC82
71
- [npm-downloads-href]: https://npmjs.com/package/my-module
72
-
73
- [license-src]: https://img.shields.io/npm/l/my-module.svg?style=flat&colorA=020420&colorB=00DC82
74
- [license-href]: https://npmjs.com/package/my-module
75
-
76
- [nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt.js
77
- [nuxt-href]: https://nuxt.com
78
-
79
-
80
-
81
- ## TO write FAQ
82
-
83
- - I get extension duplicate error: Fix Unrecognized extension value in extension set ([object Object]). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.
84
-
85
- shamefully hoist solves it for now with pnpm together with a resolutions config for codemirror state
1
+
2
+
3
+ # Nuxt CodeMirror
4
+
5
+ [![npm version][npm-version-src]][npm-version-href]
6
+ [![npm downloads][npm-downloads-src]][npm-downloads-href]
7
+ [![License][license-src]][license-href]
8
+ [![Nuxt][nuxt-src]][nuxt-href]
9
+
10
+ Codemirror as a Nuxt module. Demo preview: Coming soon
11
+
12
+
13
+ - [✨ &nbsp;Release Notes](/CHANGELOG.md)
14
+ - [πŸ€ Online playground](https://stackblitz.com/edit/nuxt-starter-ev2hgm?file=app.vue)
15
+ <!-- - [πŸ“– &nbsp;Documentation](https://example.com) -->
16
+
17
+ ## Features
18
+
19
+ <!-- Highlight some of the features your module provide here -->
20
+ - πŸš€ Easily configure codemirror to your own needs using almost every API
21
+ - 🚠 Built with Typescript
22
+ - 🌲 Custom useNuxtCodeMirror composable for creating your own editor
23
+ - Built for CodeMirror 6 and above
24
+
25
+ ## Credits
26
+
27
+ This Nuxt module wouldn't be possible without:
28
+
29
+ - @uiw/react-codemirror: https://github.com/uiwjs/react-codemirror
30
+ - @surmon-china/vue-codemirror: https://github.com/surmon-china/vue-codemirror
31
+
32
+ ## Quick Setup
33
+
34
+ Install the module to your Nuxt application with one command:
35
+
36
+ ```bash
37
+ npx nuxi module add nuxt-codemirror
38
+ ```
39
+
40
+ That's it! You can now use Nuxt-codemirror in your Nuxt app ✨
41
+
42
+ ## Contribution
43
+
44
+ <details>
45
+ <summary>Local development</summary>
46
+
47
+ ```bash
48
+ # Install dependencies
49
+ pnpm i
50
+
51
+ # Generate type stubs
52
+ pnpm dev:prepare
53
+
54
+ # Develop with the playground
55
+ pnpm dev
56
+
57
+ # Build the playground
58
+ pnpm dev:build
59
+
60
+ # Run ESLint
61
+ pnpm lint
62
+
63
+ # Run Vitest
64
+ pnpm test
65
+ pnpm test:watch
66
+
67
+ # Release new version
68
+ pnpm release
69
+ ```
70
+
71
+ </details>
72
+
73
+
74
+ <!-- Badges -->
75
+ [npm-version-src]: https://img.shields.io/npm/v/nuxt-codemirror/latest.svg?style=flat&colorA=020420&colorB=00DC82
76
+ [npm-version-href]: https://npmjs.com/package/nuxt-codemirror
77
+
78
+ [npm-downloads-src]: https://img.shields.io/npm/dm/nuxt-codemirror.svg?style=flat&colorA=020420&colorB=00DC82
79
+ [npm-downloads-href]: https://npmjs.com/package/nuxt-codemirror
80
+
81
+ [license-src]: https://img.shields.io/npm/l/nuxt-codemirror.svg?style=flat&colorA=020420&colorB=00DC82
82
+ [license-href]: https://npmjs.com/package/nuxt-codemirror
83
+
84
+ [nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt.js
85
+ [nuxt-href]: https://nuxt.com
86
+
87
+
88
+
89
+ ## FAQ
90
+
91
+ - I get an extension duplicate error: Fix Unrecognized extension value in extension set ([object Object]). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.
92
+
93
+ For now write shamefully-hoist=true in your .npmrc file to solve this. We are working on a better solution
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nuxt-codemirror",
3
3
  "configKey": "nuxtCodemirror",
4
- "version": "0.0.2",
4
+ "version": "0.0.4",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "0.8.1",
7
7
  "unbuild": "2.0.0"
package/dist/module.mjs CHANGED
@@ -19,9 +19,14 @@ const module = defineNuxtModule({
19
19
  from: resolve("./runtime/composables/useNuxtCodeMirror.ts")
20
20
  });
21
21
  addTypeTemplate({
22
- filename: "../runtime/types/nuxt-codemirror.d.ts",
22
+ filename: "nuxt-codemirror.d.ts",
23
23
  src: resolve("./runtime/types/nuxt-codemirror.d.ts")
24
24
  });
25
+ _nuxt.hook("vite:extendConfig", (config) => {
26
+ config.resolve = config.resolve || {};
27
+ config.resolve.alias = config.resolve.alias || {};
28
+ config.resolve.alias["@codemirror/state"] = resolve(_nuxt.options.rootDir, "node_modules/@codemirror/state");
29
+ });
25
30
  }
26
31
  });
27
32
 
@@ -1,8 +1,2 @@
1
- import { EditorState } from '@codemirror/state';
2
- import { EditorView } from '@codemirror/view';
3
1
  import { type UseCodeMirrorProps } from '../types/nuxt-codemirror.js';
4
- export declare function useNuxtCodeMirror(props: UseCodeMirrorProps): {
5
- containerRef: import("#imports").Ref<HTMLDivElement | null>;
6
- viewRef: import("#imports").Ref<EditorView | undefined>;
7
- stateRef: import("#imports").Ref<EditorState | undefined>;
8
- };
2
+ export declare function useNuxtCodeMirror(props: UseCodeMirrorProps): void;
@@ -2,12 +2,12 @@ import { Annotation, EditorState, StateEffect } from "@codemirror/state";
2
2
  import { EditorView } from "@codemirror/view";
3
3
  import { getDefaultExtensions } from "../getDefaultExtensions.js";
4
4
  import { getStatistics } from "../utils/utils.js";
5
- import { onBeforeUnmount, watch, watchEffect } from "#imports";
5
+ import { onUnmounted, watch, watchEffect } from "#imports";
6
6
  const External = Annotation.define();
7
7
  const emptyExtensions = [];
8
8
  export function useNuxtCodeMirror(props) {
9
9
  const {
10
- // modelValue = '',
10
+ modelValue: value = "",
11
11
  selection,
12
12
  onChange,
13
13
  onStatistics,
@@ -51,8 +51,8 @@ export function useNuxtCodeMirror(props) {
51
51
  const updateListener = EditorView.updateListener.of((viewUpdate) => {
52
52
  if (viewUpdate.docChanged && typeof onChange === "function" && !viewUpdate.transactions.some((tr) => tr.annotation(External))) {
53
53
  const doc = viewUpdate.state.doc;
54
- const value = doc.toString();
55
- onChange(value, viewUpdate);
54
+ const value2 = doc.toString();
55
+ onChange(value2, viewUpdate);
56
56
  }
57
57
  if (viewUpdate.focusChanged) {
58
58
  viewUpdate.view.hasFocus ? onFocus && onFocus(viewUpdate) : onBlur && onBlur(viewUpdate);
@@ -75,7 +75,7 @@ export function useNuxtCodeMirror(props) {
75
75
  watchEffect(() => {
76
76
  if (containerRef.value && !stateRef?.value) {
77
77
  const config = {
78
- doc: props.modelValue,
78
+ doc: value,
79
79
  selection,
80
80
  extensions: getExtensions
81
81
  };
@@ -126,13 +126,13 @@ export function useNuxtCodeMirror(props) {
126
126
  { immediate: true }
127
127
  );
128
128
  watchEffect(() => {
129
- if (props.modelValue === void 0) {
129
+ if (value === void 0) {
130
130
  return;
131
131
  }
132
132
  const currentValue = viewRef.value ? viewRef.value.state.doc.toString() : "";
133
- if (viewRef.value && props.modelValue !== currentValue) {
133
+ if (viewRef.value && value !== currentValue) {
134
134
  viewRef.value.dispatch({
135
- changes: { from: 0, to: currentValue.length, insert: props.modelValue || "" },
135
+ changes: { from: 0, to: currentValue.length, insert: value || "" },
136
136
  annotations: [External.of(true)]
137
137
  });
138
138
  }
@@ -146,15 +146,10 @@ export function useNuxtCodeMirror(props) {
146
146
  },
147
147
  { immediate: true }
148
148
  );
149
- onBeforeUnmount(() => {
149
+ onUnmounted(() => {
150
150
  if (viewRef) {
151
151
  viewRef.value?.destroy();
152
152
  viewRef.value = void 0;
153
153
  }
154
154
  });
155
- return {
156
- containerRef,
157
- viewRef,
158
- stateRef
159
- };
160
155
  }
@@ -3,121 +3,123 @@ import type { EditorView, ViewUpdate } from '@codemirror/view'
3
3
  import type { BasicSetupOptions } from '@uiw/codemirror-extensions-basic-setup'
4
4
  import type { Ref } from '#imports'
5
5
 
6
- export interface NuxtCodeMirrorProps
7
- extends Omit<EditorStateConfig, 'doc' | 'extensions'> {
6
+ declare module 'nuxt-codemirror' {
7
+ export interface NuxtCodeMirrorProps
8
+ extends Omit<EditorStateConfig, 'doc' | 'extensions'> {
8
9
  /** value of the auto created model in the editor. */
9
- modelValue?: string
10
- height?: string
11
- minHeight?: string
12
- maxHeight?: string
13
- width?: string
14
- minWidth?: string
15
- maxWidth?: string
16
- /** focus on the editor. */
17
- autoFocus?: boolean
18
- /** Enables a placeholderβ€”a piece of example content to show when the editor is empty. */
19
- placeholder?: string | HTMLElement
20
- /**
21
- * `light` / `dark` / `Extension` Defaults to `light`.
22
- * @default light
23
- */
24
- theme?: 'light' | 'dark' | 'none' | Extension
25
- /**
26
- * Whether to optional basicSetup by default
27
- * @default true
28
- */
29
- basicSetup?: boolean | BasicSetupOptions
30
- /**
31
- * This disables editing of the editor content by the user.
32
- * @default true
33
- */
34
- editable?: boolean
35
- /**
36
- * This disables editing of the editor content by the user.
37
- * @default false
38
- */
39
- readOnly?: boolean
40
- /**
41
- * Controls whether pressing the `Tab` key inserts a tab character and indents the text (`true`)
42
- * or behaves according to the browser's default behavior (`false`).
43
- * @default true
44
- */
45
- indentWithTab?: boolean
46
- /** Fired whenever a change occurs to the document. */
47
- onChange?(value: string, viewUpdate: ViewUpdate): void
48
- /** Some data on the statistics editor. */
49
- onStatistics?(data: Statistics): void
50
- /** Fired whenever any state change occurs within the editor, including non-document changes like lint results. */
51
- onUpdate?(viewUpdate: ViewUpdate): void
52
- /** The first time the editor executes the event. */
53
- onCreateEditor?(view: EditorView, state: EditorState): void
54
- /** Fired whenever the editor is focused. */
55
- onFocus?(view: ViewUpdate): void
56
- /** Fired whenever the editor is blurred. */
57
- onBlur?(view: ViewUpdate): void
58
- /**
59
- * Extension values can be [provided](https://codemirror.net/6/docs/ref/#state.EditorStateConfig.extensions) when creating a state to attach various kinds of configuration and behavior information.
60
- * They can either be built-in extension-providing objects,
61
- * such as [state fields](https://codemirror.net/6/docs/ref/#state.StateField) or [facet providers](https://codemirror.net/6/docs/ref/#state.Facet.of),
62
- * or objects with an extension in its `extension` property. Extensions can be nested in arrays arbitrarily deepβ€”they will be flattened when processed.
63
- */
64
- extensions?: Extension[]
65
- /**
66
- * If the view is going to be mounted in a shadow root or document other than the one held by the global variable document (the default), you should pass it here.
67
- * Originally from the [config of EditorView](https://codemirror.net/6/docs/ref/#view.EditorView.constructor%5Econfig.root)
68
- */
69
- root?: ShadowRoot | Document
70
- /**
71
- * Create a state from its JSON representation serialized with [toJSON](https://codemirror.net/docs/ref/#state.EditorState.toJSON) function
72
- */
73
- initialState?: {
10
+ modelValue?: string
11
+ height?: string
12
+ minHeight?: string
13
+ maxHeight?: string
14
+ width?: string
15
+ minWidth?: string
16
+ maxWidth?: string
17
+ /** focus on the editor. */
18
+ autoFocus?: boolean
19
+ /** Enables a placeholderβ€”a piece of example content to show when the editor is empty. */
20
+ placeholder?: string | HTMLElement
21
+ /**
22
+ * `light` / `dark` / `Extension` Defaults to `light`.
23
+ * @default light
24
+ */
25
+ theme?: 'light' | 'dark' | 'none' | Extension
26
+ /**
27
+ * Whether to optional basicSetup by default
28
+ * @default true
29
+ */
30
+ basicSetup?: boolean | BasicSetupOptions
31
+ /**
32
+ * This disables editing of the editor content by the user.
33
+ * @default true
34
+ */
35
+ editable?: boolean
36
+ /**
37
+ * This disables editing of the editor content by the user.
38
+ * @default false
39
+ */
40
+ readOnly?: boolean
41
+ /**
42
+ * Controls whether pressing the `Tab` key inserts a tab character and indents the text (`true`)
43
+ * or behaves according to the browser's default behavior (`false`).
44
+ * @default true
45
+ */
46
+ indentWithTab?: boolean
47
+ /** Fired whenever a change occurs to the document. */
48
+ onChange?(value: string, viewUpdate: ViewUpdate): void
49
+ /** Some data on the statistics editor. */
50
+ onStatistics?(data: Statistics): void
51
+ /** Fired whenever any state change occurs within the editor, including non-document changes like lint results. */
52
+ onUpdate?(viewUpdate: ViewUpdate): void
53
+ /** The first time the editor executes the event. */
54
+ onCreateEditor?(view: EditorView, state: EditorState): void
55
+ /** Fired whenever the editor is focused. */
56
+ onFocus?(view: ViewUpdate): void
57
+ /** Fired whenever the editor is blurred. */
58
+ onBlur?(view: ViewUpdate): void
59
+ /**
60
+ * Extension values can be [provided](https://codemirror.net/6/docs/ref/#state.EditorStateConfig.extensions) when creating a state to attach various kinds of configuration and behavior information.
61
+ * They can either be built-in extension-providing objects,
62
+ * such as [state fields](https://codemirror.net/6/docs/ref/#state.StateField) or [facet providers](https://codemirror.net/6/docs/ref/#state.Facet.of),
63
+ * or objects with an extension in its `extension` property. Extensions can be nested in arrays arbitrarily deepβ€”they will be flattened when processed.
64
+ */
65
+ extensions?: Extension[]
66
+ /**
67
+ * If the view is going to be mounted in a shadow root or document other than the one held by the global variable document (the default), you should pass it here.
68
+ * Originally from the [config of EditorView](https://codemirror.net/6/docs/ref/#view.EditorView.constructor%5Econfig.root)
69
+ */
70
+ root?: ShadowRoot | Document
71
+ /**
72
+ * Create a state from its JSON representation serialized with [toJSON](https://codemirror.net/docs/ref/#state.EditorState.toJSON) function
73
+ */
74
+ initialState?: {
74
75
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
- json: any
76
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
- fields?: Record<string, StateField<any>>
76
+ json: any
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ fields?: Record<string, StateField<any>>
79
+ }
78
80
  }
79
- }
80
81
 
81
- export interface UseCodeMirrorProps extends NuxtCodeMirrorProps {
82
- container?: HTMLDivElement | null
83
- viewRef: Ref<EditorView | undefined>
84
- stateRef: Ref<EditorState | undefined>
85
- containerRef: Ref<HTMLDivElement | null>
86
- }
82
+ export interface UseCodeMirrorProps extends NuxtCodeMirrorProps {
83
+ container?: HTMLDivElement | null
84
+ viewRef: Ref<EditorView | undefined>
85
+ stateRef: Ref<EditorState | undefined>
86
+ containerRef: Ref<HTMLDivElement | null>
87
+ }
87
88
 
88
- export interface Statistics {
89
+ export interface Statistics {
89
90
  /** total length of the document */
90
- length: number
91
- /** Get the number of lines in the editor. */
92
- lineCount: number
93
- /** Get the currently line description around the given position. */
94
- line: Line
95
- /** Get the proper [line-break](https://codemirror.net/docs/ref/#state.EditorState^lineSeparator) string for this state. */
96
- lineBreak: string
97
- /** Returns true when the editor is [configured](https://codemirror.net/6/docs/ref/#state.EditorState^readOnly) to be read-only. */
98
- readOnly: boolean
99
- /** The size (in columns) of a tab in the document, determined by the [`tabSize`](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize) facet. */
100
- tabSize: number
101
- /** Cursor Position */
102
- selection: EditorSelection
103
- /** Make sure the selection only has one range. */
104
- selectionAsSingle: SelectionRange
105
- /** Retrieves a list of all current selections. */
106
- ranges: readonly SelectionRange[]
107
- /** Get the currently selected code. */
108
- selectionCode: string
109
- /**
110
- * The length of the given array should be the same as the number of active selections.
111
- * Replaces the content of the selections with the strings in the array.
112
- */
113
- selections: string[]
114
- /** Return true if any text is selected. */
115
- selectedText: boolean
116
- }
91
+ length: number
92
+ /** Get the number of lines in the editor. */
93
+ lineCount: number
94
+ /** Get the currently line description around the given position. */
95
+ line: Line
96
+ /** Get the proper [line-break](https://codemirror.net/docs/ref/#state.EditorState^lineSeparator) string for this state. */
97
+ lineBreak: string
98
+ /** Returns true when the editor is [configured](https://codemirror.net/6/docs/ref/#state.EditorState^readOnly) to be read-only. */
99
+ readOnly: boolean
100
+ /** The size (in columns) of a tab in the document, determined by the [`tabSize`](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize) facet. */
101
+ tabSize: number
102
+ /** Cursor Position */
103
+ selection: EditorSelection
104
+ /** Make sure the selection only has one range. */
105
+ selectionAsSingle: SelectionRange
106
+ /** Retrieves a list of all current selections. */
107
+ ranges: readonly SelectionRange[]
108
+ /** Get the currently selected code. */
109
+ selectionCode: string
110
+ /**
111
+ * The length of the given array should be the same as the number of active selections.
112
+ * Replaces the content of the selections with the strings in the array.
113
+ */
114
+ selections: string[]
115
+ /** Return true if any text is selected. */
116
+ selectedText: boolean
117
+ }
117
118
 
118
- export interface CodeMirrorRef {
119
- container: HTMLDivElement | null
120
- view: EditorView | undefined
121
- state: EditorState | undefined
122
- editor: HTMLDivElement | null
119
+ export interface CodeMirrorRef {
120
+ container: HTMLDivElement | null
121
+ view: EditorView | undefined
122
+ state: EditorState | undefined
123
+ editor: HTMLDivElement | null
124
+ }
123
125
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "nuxt-codemirror",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Nuxt codemirror module",
5
- "repository": "your-org/my-module",
5
+ "repository": "https://github.com/ThimoDEV/nuxt-codemirror",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "exports": {
@@ -30,7 +30,6 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@codemirror/commands": "^6.6.0",
33
- "@codemirror/lang-javascript": "^6.2.2",
34
33
  "@codemirror/state": "6.4.1",
35
34
  "@codemirror/theme-one-dark": "^6.1.1",
36
35
  "@codemirror/view": "6.28.1",
@@ -51,4 +50,4 @@
51
50
  "vitest": "^2.0.3",
52
51
  "vue-tsc": "^2.0.26"
53
52
  }
54
- }
53
+ }
@@ -1,2 +0,0 @@
1
- declare const _default: import("#app").Plugin<Record<string, unknown>> & import("#app").ObjectPlugin<Record<string, unknown>>;
2
- export default _default;
@@ -1,4 +0,0 @@
1
- import { defineNuxtPlugin } from "#app";
2
- export default defineNuxtPlugin((_nuxtApp) => {
3
- console.log("Plugin injected by my-module!");
4
- });