vueless 0.0.76 → 0.0.78

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/index.js CHANGED
@@ -14,14 +14,7 @@ export {
14
14
  loaderRenderingOn,
15
15
  loaderRenderingOff,
16
16
  } from "./ui.loader-rendering/services/loaderRedering.service";
17
- export {
18
- loaderTopOn,
19
- loaderTopOff,
20
- addLoadingTopRequestUrl,
21
- removeLoadingTopRequestUrl,
22
- setLoadingTopComponentRequestQueue,
23
- removeLoadingTopComponentRequestQueue,
24
- } from "./ui.loader-top/services/loaderTop.service";
17
+ export { loaderTopOn, loaderTopOff } from "./ui.loader-top/services/loaderTop.service";
25
18
  export {
26
19
  notify,
27
20
  notifySuccess,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.76",
3
+ "version": "0.0.78",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless Component Framework.",
6
6
  "homepage": "https://vueless.com",
@@ -21,7 +21,7 @@
21
21
  "sb:dev": "storybook dev -p 6006 --docs --no-open",
22
22
  "sb:build": "storybook build --docs",
23
23
  "sb:preview": "vite preview --host --outDir=storybook-static",
24
- "package:prepare": "node src/gen.web-types && node icons.prepare && rm -rf dist && mkdir -p dist && cp -r src/. package.json LICENSE web-types.json README.md dist/ && node dist.prepare"
24
+ "package:prepare": "npx @vueless/web-types && node icons.prepare && rm -rf dist && mkdir -p dist && cp -r src/. package.json LICENSE web-types.json README.md dist/ && node dist.prepare"
25
25
  },
26
26
  "dependencies": {
27
27
  "@tailwindcss/forms": "^0.5.7",
@@ -42,6 +42,7 @@
42
42
  "@vue/eslint-config-prettier": "^9.0.0",
43
43
  "@vueless/plugin-vite": "^0.0.7",
44
44
  "@vueless/storybook": "^0.0.17",
45
+ "@vueless/web-types": "^0.0.4",
45
46
  "autoprefixer": "^10.4.19",
46
47
  "cssnano": "^6.1.2",
47
48
  "eslint": "^8.55.0",
@@ -50,7 +51,6 @@
50
51
  "eslint-plugin-storybook": "^0.8.0",
51
52
  "eslint-plugin-tailwindcss": "^3.15.1",
52
53
  "eslint-plugin-vue": "^9.25.0",
53
- "globby": "^13.2.2",
54
54
  "postcss": "^8.4.38",
55
55
  "prettier": "^3.2.5",
56
56
  "prettier-eslint": "^16.3.0",
@@ -22,12 +22,10 @@ You can control loader state using *useLoaderRendering* composable.
22
22
  import { useLoaderTop } from "vueless";
23
23
 
24
24
  const {
25
- setLoadingOn,
26
- setLoadingOff,
25
+ setLoaderOn,
26
+ setLoaderOff,
27
27
  addRequestUrl,
28
- removeRequestUrl,
29
- setComponentRequestQueue,
30
- removeComponentRequestQueue,
28
+ removeRequestUrl
31
29
  } = useLoaderTop();
32
30
  `} language="jsx" dark />
33
31
 
@@ -38,9 +36,5 @@ You can control loader state outside of vue components using following methods.
38
36
  import {
39
37
  loaderTopOn,
40
38
  loaderTopOff,
41
- addLoadingTopRequestUrl,
42
- removeLoadingTopRequestUrl,
43
- setLoadingTopComponentRequestQueue,
44
- removeLoadingTopComponentRequestQueue,
45
39
  } from "vueless";
46
40
  `} language="jsx" dark />
@@ -8,7 +8,7 @@ const loaderRequestQueue = ref([]);
8
8
  const loaderRequestTimeout = ref(0);
9
9
  const componentLoaderRequestQueue = ref([]);
10
10
 
11
- function setLoadingOn(url) {
11
+ function setLoaderOn(url) {
12
12
  loaderRequestQueue.value.push(url);
13
13
 
14
14
  isLoading.value = true;
@@ -16,7 +16,7 @@ function setLoadingOn(url) {
16
16
  clearTimeout(loaderRequestTimeout.value);
17
17
  }
18
18
 
19
- function setLoadingOff(url) {
19
+ function setLoaderOff(url) {
20
20
  loaderRequestQueue.value = url ? loaderRequestQueue.value.filter((item) => item !== url) : [];
21
21
 
22
22
  loaderRequestTimeout.value = setTimeout(() => {
@@ -42,16 +42,12 @@ function removeComponentRequestQueue() {
42
42
  componentLoaderRequestQueue.value = [];
43
43
  }
44
44
 
45
- function addRequestUrlHandler(event) {
46
- addRequestUrl(event.detail.url);
45
+ function setLoaderOnHandler(event) {
46
+ setLoaderOn(event.detail.resource);
47
47
  }
48
48
 
49
- function removeRequestUrlHandler(event) {
50
- removeRequestUrl(event.detail.url);
51
- }
52
-
53
- function setComponentRequestQueueHandler(event) {
54
- setComponentRequestQueue(event.detail.requests);
49
+ function setLoaderOffHandler(event) {
50
+ setLoaderOff(event.detail.resource);
55
51
  }
56
52
 
57
53
  export function createLoaderTop() {
@@ -61,8 +57,8 @@ export function createLoaderTop() {
61
57
  loaderRequestQueue: readonly(loaderRequestQueue),
62
58
  loaderRequestTimeout: readonly(loaderRequestTimeout),
63
59
  componentLoaderRequestQueue: readonly(componentLoaderRequestQueue),
64
- setLoadingOn,
65
- setLoadingOff,
60
+ setLoaderOn,
61
+ setLoaderOff,
66
62
  addRequestUrl,
67
63
  removeRequestUrl,
68
64
  setComponentRequestQueue,
@@ -74,21 +70,13 @@ export function useLoaderTop() {
74
70
  const loaderTopState = inject(LoaderTopSymbol);
75
71
 
76
72
  onMounted(() => {
77
- window.addEventListener("setLoadingOn", setLoadingOn);
78
- window.addEventListener("setLoadingOff", setLoadingOff);
79
- window.addEventListener("addRequestUrl", addRequestUrlHandler);
80
- window.addEventListener("removeRequestUrl", removeRequestUrlHandler);
81
- window.addEventListener("setComponentRequestQueue", setComponentRequestQueueHandler);
82
- window.addEventListener("removeComponentRequestQueue", removeComponentRequestQueue);
73
+ window.addEventListener("setLoaderOn", setLoaderOnHandler);
74
+ window.addEventListener("setLoaderOff", setLoaderOffHandler);
83
75
  });
84
76
 
85
77
  onBeforeUnmount(() => {
86
- window.removeEventListener("setLoadingOn", setLoadingOn);
87
- window.removeEventListener("setLoadingOff", setLoadingOff);
88
- window.removeEventListener("addRequestUrl", addRequestUrlHandler);
89
- window.removeEventListener("removeRequestUrl", removeRequestUrlHandler);
90
- window.removeEventListener("setComponentRequestQueue", setComponentRequestQueueHandler);
91
- window.removeEventListener("removeComponentRequestQueue", removeComponentRequestQueue);
78
+ window.removeEventListener("setLoaderOn", setLoaderOnHandler);
79
+ window.removeEventListener("setLoaderOff", setLoaderOffHandler);
92
80
  });
93
81
 
94
82
  return loaderTopState;
@@ -17,17 +17,17 @@ export default {
17
17
  const DefaultTemplate = (args) => ({
18
18
  components: { ULoaderTop, UButton },
19
19
  setup() {
20
- const { setLoadingOn, setLoadingOff } = useLoaderTop();
20
+ const { setLoaderOn, setLoaderOff } = useLoaderTop();
21
21
 
22
- return { args, setLoadingOn, setLoadingOff };
22
+ return { args, setLoaderOn, setLoaderOff };
23
23
  },
24
24
  template: `
25
25
  <div>
26
26
  <ULoaderTop color="blue" v-bind="args" resource-names="https://api.publicapis.org/entries"/>
27
27
 
28
28
  <div class="flex gap-2">
29
- <UButton label="On" @click="setLoadingOn('https://api.publicapis.org/entries')" />
30
- <UButton label="Off" @click="setLoadingOff('https://api.publicapis.org/entries')" />
29
+ <UButton label="On" @click="setLoaderOn('https://api.publicapis.org/entries')" />
30
+ <UButton label="Off" @click="setLoaderOff('https://api.publicapis.org/entries')" />
31
31
  </div>
32
32
  </div>
33
33
  `,
@@ -36,12 +36,12 @@ const DefaultTemplate = (args) => ({
36
36
  const ColorsTemplate = (args, { argTypes } = {}) => ({
37
37
  components: { ULoaderTop, UButton },
38
38
  setup() {
39
- const { setLoadingOn, setLoadingOff } = useLoaderTop();
39
+ const { setLoaderOn, setLoaderOff } = useLoaderTop();
40
40
 
41
41
  return {
42
42
  args,
43
- setLoadingOn,
44
- setLoadingOff,
43
+ setLoaderOn,
44
+ setLoaderOff,
45
45
  colors: argTypes.color.options,
46
46
  };
47
47
  },
@@ -56,8 +56,8 @@ const ColorsTemplate = (args, { argTypes } = {}) => ({
56
56
  />
57
57
  </div>
58
58
  <div class="flex gap-2 pt-4">
59
- <UButton label="On" @click="setLoadingOn('https://api.publicapis.org/entries')" />
60
- <UButton label="Off" @click="setLoadingOff('https://api.publicapis.org/entries')" />
59
+ <UButton label="On" @click="setLoaderOn('https://api.publicapis.org/entries')" />
60
+ <UButton label="Off" @click="setLoaderOff('https://api.publicapis.org/entries')" />
61
61
  </div>
62
62
  `,
63
63
  });
@@ -30,34 +30,14 @@ export const queue = (() => {
30
30
  };
31
31
  })();
32
32
 
33
- export function loaderTopOn() {
34
- window.dispatchEvent(new Event("setLoadingOn"));
35
- }
33
+ export function loaderTopOn(resource) {
34
+ const loaderTopOnEvent = new CustomEvent("setLoadingOn", { detail: { resource } });
36
35
 
37
- export function loaderTopOff() {
38
- window.dispatchEvent(new Event("setLoadingOff"));
36
+ window.dispatchEvent(loaderTopOnEvent);
39
37
  }
40
38
 
41
- export function addLoadingTopRequestUrl(url) {
42
- const addRequestUrlEvent = new CustomEvent("setLoadingOff", { detail: { url } });
43
-
44
- window.dispatchEvent(addRequestUrlEvent);
45
- }
46
-
47
- export function removeLoadingTopRequestUrl(url) {
48
- const removeRequestUrlEvent = new CustomEvent("removeRequestUrl", { detail: { url } });
49
-
50
- window.dispatchEvent(removeRequestUrlEvent);
51
- }
52
-
53
- export function setLoadingTopComponentRequestQueue(requests) {
54
- const setComponentRequestQueueEvent = new CustomEvent("setComponentRequestQueue", {
55
- detail: { requests },
56
- });
57
-
58
- window.dispatchEvent(setComponentRequestQueueEvent);
59
- }
39
+ export function loaderTopOff(resource) {
40
+ const loaderTopOfEvent = new CustomEvent("setLoadingOff", { detail: { resource } });
60
41
 
61
- export function removeLoadingTopComponentRequestQueue() {
62
- window.dispatchEvent("removeComponentRequestQueue");
42
+ window.dispatchEvent(loaderTopOfEvent);
63
43
  }
package/web-types.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "framework": "vue",
3
3
  "name": "vueless",
4
- "version": "0.0.76",
4
+ "version": "0.0.78",
5
5
  "contributions": {
6
6
  "html": {
7
7
  "description-markup": "markdown",
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env node
2
- import minimist from "minimist";
3
- import { extractConfig } from "./lib/config.js";
4
- import build from "./lib/build.js";
5
-
6
- const {
7
- _: pathArray,
8
- configFile,
9
- watch,
10
- cwd,
11
- } = minimist(process.argv.slice(2), {
12
- alias: { c: "configFile", w: "watch" },
13
- });
14
-
15
- const conf = await extractConfig(cwd || process.cwd(), watch, configFile, pathArray);
16
-
17
- build(conf);
@@ -1,254 +0,0 @@
1
- import path from "path";
2
- import { globbySync } from "globby";
3
- import * as chokidar from "chokidar";
4
- import { parse } from "vue-docgen-api";
5
- import * as fs from "fs";
6
- import mkdirp from "mkdirp";
7
- import _ from "lodash-es";
8
- import { merge } from "lodash-es";
9
-
10
- export default async function build(config) {
11
- config.componentsRoot = path.resolve(config.cwd, config.componentsRoot);
12
- config.outFile = path.resolve(config.cwd, config.outFile);
13
-
14
- // then create the watcher if necessary
15
- const { watcher, componentFiles } = getSources(config.components, config.componentsRoot);
16
-
17
- // eslint-disable-next-line no-console
18
- console.log("Building web-types to " + config.outFile);
19
-
20
- const cache = {};
21
- const buildWebTypesBound = rebuild.bind(null, config, componentFiles, cache, watcher);
22
-
23
- try {
24
- await buildWebTypesBound();
25
- } catch (e) {
26
- // eslint-disable-next-line no-console
27
- console.error("Error building web-types: " + e.message);
28
- await watcher.close();
29
-
30
- return;
31
- }
32
-
33
- if (config.watch) {
34
- watcher
35
- .on("add", buildWebTypesBound)
36
- .on("change", buildWebTypesBound)
37
- .on("unlink", async (filePath) => {
38
- // eslint-disable-next-line no-console
39
- console.log("Rebuilding on file removal " + filePath);
40
- delete cache[filePath];
41
- await writeDownWebTypesFile(config, Object.values(cache), config.outFile);
42
- });
43
- } else {
44
- await watcher.close();
45
- }
46
- }
47
-
48
- function getSources(components, cwd) {
49
- const watcher = chokidar.watch(components, { cwd });
50
-
51
- const allComponentFiles = globbySync(components, { cwd });
52
-
53
- return { watcher, componentFiles: allComponentFiles };
54
- }
55
-
56
- async function rebuild(config, files, cachedContent, watcher, changedFilePath) {
57
- const cacheWebTypesContent = async (filePath) => {
58
- cachedContent[filePath.replace(/\\/g, "/")] = await extractInformation(
59
- path.join(config.componentsRoot, filePath),
60
- config,
61
- );
62
-
63
- return true;
64
- };
65
-
66
- if (changedFilePath) {
67
- // eslint-disable-next-line no-console
68
- console.log("Rebuilding on update file " + changedFilePath);
69
-
70
- try {
71
- // if in chokidar mode (watch), the path of the file that was just changed
72
- // is passed as an argument. We only affect the changed file and avoid re-parsing the rest
73
- await cacheWebTypesContent(changedFilePath);
74
- } catch (e) {
75
- throw new Error(
76
- `Error building file ${config.outFile} when file ${changedFilePath} has changed: ${e.message}`,
77
- );
78
- }
79
- } else {
80
- try {
81
- // if we are initializing the current file, parse all components
82
- await Promise.all(files.map(cacheWebTypesContent));
83
- } catch (e) {
84
- throw new Error(`Error building file ${config.outFile}: ${e.message}`);
85
- }
86
- }
87
-
88
- // and finally save all concatenated values to the markdown file
89
- await writeDownWebTypesFile(config, Object.values(cachedContent), config.outFile);
90
- }
91
-
92
- async function writeDownWebTypesFile(config, definitions, destFilePath) {
93
- const destFolder = path.dirname(destFilePath);
94
-
95
- await mkdirp(destFolder);
96
- let writeStream = fs.createWriteStream(destFilePath);
97
- const contents = {
98
- framework: "vue",
99
- name: config.packageName,
100
- version: config.packageVersion,
101
- contributions: {
102
- html: {
103
- "description-markup": config.descriptionMarkup,
104
- "types-syntax": config.typesSyntax,
105
- tags: _(definitions)
106
- .flatMap((d) => d.tags || [])
107
- .orderBy("name", "asc")
108
- .value(),
109
- attributes: _(definitions)
110
- .flatMap((d) => d.attributes || [])
111
- .orderBy("name", "asc")
112
- .value(),
113
- "vue-filters": _(definitions)
114
- .flatMap((d) => d["vue-filters"] || [])
115
- .orderBy("name", "asc")
116
- .value(),
117
- },
118
- },
119
- };
120
-
121
- const html = contents.contributions.html;
122
-
123
- if (html.tags?.length == 0) html.tags = undefined;
124
- if (html.attributes?.length == 0) html.attributes = undefined;
125
- if (html["vue-filters"]?.length == 0) html["vue-filters"] = undefined;
126
-
127
- writeStream.write(JSON.stringify(contents, null, 2));
128
-
129
- // close the stream
130
- writeStream.close();
131
- }
132
-
133
- function ensureRelative(path) {
134
- // The .replace() is a fix for paths that end up like "./src\\components\\General\\VerticalButton.vue" on windows machines.
135
- return (path.startsWith("./") || path.startsWith("../") ? path : "./" + path).replace(/\\/g, "/");
136
- }
137
-
138
- async function extractInformation(absolutePath, config) {
139
- const doc = await parse(absolutePath, config.apiOptions);
140
- const name = doc.name || doc.displayName;
141
- let description = doc.description?.trim() ?? "";
142
-
143
- // Get default component config
144
- const configPath = path.join(path.dirname(absolutePath), "configs/default.config.js");
145
- let globalConfig = null;
146
- let defaultConfig = null;
147
- let defaultValues = null;
148
-
149
- if (fs.existsSync(configPath)) {
150
- const defaultConfigFile = fs.readFileSync(configPath).toString();
151
- const globalConfigFile = fs.readFileSync(config.cwd + "/vueless.config.js").toString();
152
-
153
- defaultConfig = getDefaultConfigJson(defaultConfigFile);
154
- globalConfig = getGlobalConfigJson(globalConfigFile, name);
155
- defaultValues = merge(defaultConfig.defaultVariants, globalConfig[name]?.defaultVariants);
156
- }
157
-
158
- function getDefaultConfigJson(fileContents) {
159
- const objectStartIndex = fileContents.indexOf("{");
160
- const variablePattern = /([^:]+):\s*(?!true|false|undefined)([a-zA-Z_]\w*)/g;
161
- let objectString = fileContents
162
- .substring(objectStartIndex)
163
- .replace("};", "}")
164
- .replace(/undefined/g, '"undefined"')
165
- .replace(variablePattern, (match, key) => key + ": {}");
166
-
167
- return eval("(" + objectString + ")"); // Converting into JS object
168
- }
169
-
170
- function getGlobalConfigJson(fileContents, componentName) {
171
- const startIndex = fileContents.indexOf(`${componentName}:`);
172
-
173
- // find index of the last closing bracket
174
- let endIndex = -1;
175
- let braceCount = 0;
176
-
177
- for (let i = startIndex; i < fileContents.length; i++) {
178
- if (fileContents[i] === "{") {
179
- braceCount++;
180
- } else if (fileContents[i] === "}") {
181
- braceCount--;
182
-
183
- if (braceCount === 0) {
184
- endIndex = i;
185
- break;
186
- }
187
- }
188
- }
189
-
190
- // Get component config raw string
191
- const rawString = fileContents.slice(startIndex, endIndex);
192
-
193
- // If the stings are present in config but commented - remove them
194
- const stringWithoutComments = rawString.replace(/\/\/.*$/gm, "");
195
-
196
- // Check if final JSON string is valid: TODO: find better solution
197
- if (!stringWithoutComments.includes("}")) return {};
198
-
199
- const jsonString = `{${stringWithoutComments}\n}}`
200
- .replace(/[`']/g, '"')
201
- .replace(/(\w+)\s*: /g, '"$1":')
202
- .replace(/,\s*}/g, "}");
203
-
204
- return JSON.parse(jsonString);
205
- }
206
-
207
- doc.docsBlocks?.forEach((block) => {
208
- if (description.length > 0) {
209
- if (config.descriptionMarkup === "html") {
210
- description += "<br/><br/>";
211
- } else {
212
- description += "\n\n";
213
- }
214
- }
215
-
216
- description += block;
217
- });
218
-
219
- const componentPath = ensureRelative(path.relative(config.cwd, absolutePath));
220
-
221
- return {
222
- tags: [
223
- {
224
- name,
225
- description,
226
- attributes: doc.props?.map((prop) => ({
227
- name: prop.name,
228
- required: prop.required,
229
- description: prop.tags?.ignore ? "@ignore: " + prop.description : prop.description,
230
- value: {
231
- kind: "expression",
232
- type: prop.values ? `'${prop.values.join("' | '")}'` : prop.type?.name ?? "any",
233
- },
234
- default:
235
- defaultValues && prop.name in defaultValues
236
- ? defaultValues[prop.name].toString()
237
- : prop.defaultValue?.value.toString(),
238
- })),
239
- events: doc.events?.map((event) => ({
240
- name: event.name,
241
- description: event.description,
242
- })),
243
- slots: doc.slots?.map((slot) => ({
244
- name: slot.name,
245
- description: slot.description,
246
- })),
247
- source: {
248
- module: config.isVuelessEnv ? componentPath.replace("./src", "vueless") : componentPath,
249
- symbol: doc.exportName,
250
- },
251
- },
252
- ],
253
- };
254
- }
@@ -1,32 +0,0 @@
1
- import path from "path";
2
- import fs from "fs";
3
- import { readFile } from "fs/promises";
4
-
5
- export async function extractConfig(cwd, watch = false, configFileFromCmd, pathArray = []) {
6
- const configFilePath = configFileFromCmd
7
- ? path.resolve(cwd, configFileFromCmd)
8
- : path.join(cwd, "web-types.config.js");
9
- const [componentsFromCmd, outFileFromCmd] = pathArray;
10
-
11
- const fileContent = await readFile(path.join(cwd, "package.json"), "utf-8");
12
- const packageJson = JSON.parse(fileContent);
13
-
14
- let additionalConfig = {};
15
-
16
- if (fs.existsSync(configFilePath)) {
17
- additionalConfig = await import(configFilePath);
18
- }
19
-
20
- return {
21
- cwd,
22
- watch,
23
- componentsRoot: configFilePath ? path.dirname(configFilePath) : cwd,
24
- components: componentsFromCmd || "src/**/*.vue",
25
- outFile: outFileFromCmd || packageJson["web-types"] || "./web-types.json",
26
- packageName: packageJson["name"],
27
- packageVersion: packageJson["version"],
28
- typesSyntax: "typescript",
29
- descriptionMarkup: "markdown",
30
- ...additionalConfig.default,
31
- };
32
- }