@omnicajs/icons 0.3.0 → 0.3.2

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +113 -0
  3. package/assets/icons/outlined/layout/sidebar-right.svg +3 -0
  4. package/assets/icons/outlined/layout/widget-bottom-right.svg +3 -0
  5. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  6. package/dist/build.js +1 -13
  7. package/dist/extracted/bundler/component-loader.cjs +26 -0
  8. package/dist/extracted/bundler/component-loader.d.ts +3 -0
  9. package/dist/extracted/bundler/plugin.cjs +125 -0
  10. package/dist/extracted/bundler/plugin.d.ts +21 -0
  11. package/dist/extracted/bundler/template-assets-loader.cjs +8 -0
  12. package/dist/extracted/bundler/template-assets-loader.d.ts +3 -0
  13. package/dist/extracted/core.d.ts +14 -0
  14. package/dist/extracted/core.js +64 -0
  15. package/dist/extracted/manifest.cjs +23 -0
  16. package/dist/extracted/manifest.d.ts +11 -0
  17. package/dist/extracted/manifest.js +20 -0
  18. package/dist/extracted/vite.d.ts +8 -0
  19. package/dist/extracted/vite.js +174 -0
  20. package/dist/manifest.cjs +1 -1
  21. package/dist/manifest.js +1 -1
  22. package/dist/manifest.json +21 -5
  23. package/dist/outlined/index.cjs +1 -1
  24. package/dist/outlined/index.d.ts +1 -1
  25. package/dist/outlined/index.js +1 -1
  26. package/dist/outlined/layout.cjs +1 -1
  27. package/dist/outlined/layout.d.ts +1 -1
  28. package/dist/outlined/layout.js +1 -1
  29. package/dist/rspack.cjs +14 -0
  30. package/dist/rspack.d.ts +16 -0
  31. package/dist/shared/sprite.d.ts +2 -0
  32. package/dist/shared/sprite.js +16 -0
  33. package/dist/sprites/outlined/layout.svg +6 -0
  34. package/dist/sprites/outlined.svg +6 -0
  35. package/dist/{adapter-output.d.ts → subset/adapter-output.d.ts} +1 -1
  36. package/dist/{adapter-output.js → subset/adapter-output.js} +1 -1
  37. package/dist/subset/vite.d.ts +7 -0
  38. package/dist/subset/vite.js +61 -0
  39. package/dist/{webpack-loader.cjs → subset/webpack-loader.cjs} +5 -9
  40. package/dist/{webpack-loader.d.ts → subset/webpack-loader.d.ts} +1 -1
  41. package/dist/{webpack-runtime.cjs → subset/webpack-runtime.cjs} +1 -1
  42. package/dist/subset/webpack.cjs +27 -0
  43. package/dist/subset/webpack.d.ts +14 -0
  44. package/dist/vite.d.ts +4 -7
  45. package/dist/vite.js +3 -61
  46. package/dist/webpack.cjs +9 -21
  47. package/dist/webpack.d.ts +12 -7
  48. package/metadata/icon-keywords.json +6 -0
  49. package/metadata/migrations/groups-v1.json +16 -0
  50. package/package.json +14 -2
  51. package/vue.d.ts +36 -0
  52. /package/dist/{webpack-runtime.d.ts → subset/webpack-runtime.d.ts} +0 -0
@@ -0,0 +1,174 @@
1
+ import { loadManifest } from "../build.js";
2
+ import { createImportedSprite, createVueIconSfc, loadImportedIcon, resolveImportedIcon } from "./core.js";
3
+ import { assertImportedSymbolsAvailable, createImportedSpriteManifest, importedSpriteManifestFilename, parseImportedSpriteManifest } from "./manifest.js";
4
+ import fs from "node:fs/promises";
5
+ import path from "node:path";
6
+ import crypto from "node:crypto";
7
+ //#region tooling/extracted/vite.ts
8
+ var importedComponentPrefix = "omnicajs-icon-component:";
9
+ var importedSpritePath = "/@omnicajs/icons/imported/";
10
+ var importedSpriteMarker = "__OMNICA_IMPORTED_SPRITE_URL__";
11
+ var vueTemplateAssetImport = /(\bimport\s+_imports_\d+\s+from\s+)(["'])(@omnicajs\/icons\/assets\/icons\/(?:filled|outlined)\/[^"'?#]+\.svg)\2/g;
12
+ var isRootRelativePath = (value) => value.startsWith("/") && !value.startsWith("//");
13
+ var resolveDevSpritePath = (base) => {
14
+ if (base === "" || base.startsWith(".")) return importedSpritePath;
15
+ const basePath = URL.canParse(base) ? new URL(base).pathname : base;
16
+ return `${basePath.endsWith("/") ? basePath : `${basePath}/`}${importedSpritePath.slice(1)}`;
17
+ };
18
+ var omnicaIconComponents = (options = {}) => {
19
+ let base = "/";
20
+ let command = "build";
21
+ let clientOutputDirectory = "";
22
+ let devSpritePath = importedSpritePath;
23
+ let legacySsr = false;
24
+ let publishedClientManifest;
25
+ const devSprites = /* @__PURE__ */ new Map();
26
+ const environmentStates = /* @__PURE__ */ new WeakMap();
27
+ const legacyState = {
28
+ componentSources: /* @__PURE__ */ new Map(),
29
+ emittedIcons: [],
30
+ icons: /* @__PURE__ */ new Map()
31
+ };
32
+ const manifest = loadManifest();
33
+ const stateFor = (context) => {
34
+ if (!context.environment) return legacyState;
35
+ const existing = environmentStates.get(context.environment);
36
+ if (existing) return existing;
37
+ const created = {
38
+ componentSources: /* @__PURE__ */ new Map(),
39
+ emittedIcons: [],
40
+ icons: /* @__PURE__ */ new Map()
41
+ };
42
+ environmentStates.set(context.environment, created);
43
+ return created;
44
+ };
45
+ const isSsr = (context) => context.environment ? Boolean(context.environment.config?.build?.ssr) : legacySsr;
46
+ const loadClientManifest = (state) => {
47
+ if (publishedClientManifest) {
48
+ state.clientManifest = publishedClientManifest;
49
+ return Promise.resolve(publishedClientManifest);
50
+ }
51
+ state.clientManifestPromise ??= (async () => {
52
+ const filename = path.join(clientOutputDirectory, importedSpriteManifestFilename);
53
+ try {
54
+ const loaded = parseImportedSpriteManifest(await fs.readFile(filename, "utf8"), filename);
55
+ state.clientManifest = loaded;
56
+ return loaded;
57
+ } catch (error) {
58
+ const detail = error instanceof Error ? ` ${error.message}` : "";
59
+ throw new Error(`Unable to load the import-driven icon client manifest at ${filename}. Build the client before SSR or configure clientOutputDirectory.${detail}`);
60
+ }
61
+ })();
62
+ return state.clientManifestPromise;
63
+ };
64
+ return {
65
+ name: "omnicajs-icon-components",
66
+ enforce: "pre",
67
+ configResolved(config) {
68
+ base = config.base;
69
+ command = config.command;
70
+ if (command === "build" && !isRootRelativePath(base)) throw new Error(`Import-driven icon builds require a root-relative Vite base. Absolute, protocol-relative, and relative bases are not supported. Received ${JSON.stringify(base)}.`);
71
+ clientOutputDirectory = path.resolve(config.root, options.clientOutputDirectory ?? "dist");
72
+ devSpritePath = resolveDevSpritePath(base);
73
+ legacySsr = Boolean(config.build.ssr);
74
+ },
75
+ buildStart() {
76
+ const state = stateFor(this);
77
+ state.clientManifest = void 0;
78
+ state.clientManifestPromise = void 0;
79
+ state.emittedIcons = [];
80
+ state.spriteReference = void 0;
81
+ if (!isSsr(this)) publishedClientManifest = void 0;
82
+ },
83
+ configureServer(server) {
84
+ server.middlewares.use(devSpritePath, (request, response, next) => {
85
+ const filename = request.url?.split(/[?#]/, 1)[0]?.replace(/^\//, "");
86
+ const sprite = filename ? devSprites.get(filename) : void 0;
87
+ if (!sprite) {
88
+ next();
89
+ return;
90
+ }
91
+ response.statusCode = 200;
92
+ response.setHeader("Content-Type", "image/svg+xml");
93
+ response.setHeader("Cache-Control", "public, max-age=31536000, immutable");
94
+ response.end(sprite);
95
+ });
96
+ },
97
+ async resolveId(id, importer, resolveOptions) {
98
+ const state = stateFor(this);
99
+ if (resolveOptions.kind === "url-token" || resolveOptions.kind === "new-url" || importer !== void 0 && /\.(?:css|less|sass|scss|styl|stylus)(?:$|\?)/.test(importer)) return null;
100
+ const icon = resolveImportedIcon(id, await manifest);
101
+ if (!icon) return null;
102
+ const virtualId = `${importedComponentPrefix}${icon.importedSymbol}.vue`;
103
+ state.componentSources.set(virtualId, id);
104
+ return virtualId;
105
+ },
106
+ transform(code, id) {
107
+ if (!id.includes(".vue")) return null;
108
+ const transformed = code.replace(vueTemplateAssetImport, (_match, prefix, quote, source) => `${prefix}${quote}${source}?url${quote}`);
109
+ return transformed === code ? null : {
110
+ code: transformed,
111
+ map: null
112
+ };
113
+ },
114
+ async load(id) {
115
+ const state = stateFor(this);
116
+ const source = state.componentSources.get(id);
117
+ if (!source) return null;
118
+ const icon = await loadImportedIcon(source, await manifest);
119
+ if (!icon) return null;
120
+ state.icons.set(id, icon);
121
+ if (command === "build") {
122
+ if (isSsr(this)) await loadClientManifest(state);
123
+ return createVueIconSfc(icon, JSON.stringify(importedSpriteMarker));
124
+ }
125
+ const sprite = createImportedSprite([icon]);
126
+ const filename = `${crypto.createHash("sha256").update(sprite).digest("hex").slice(0, 16)}.svg`;
127
+ devSprites.set(filename, sprite);
128
+ return createVueIconSfc(icon, JSON.stringify(`${devSpritePath}${filename}`));
129
+ },
130
+ buildEnd(error) {
131
+ const state = stateFor(this);
132
+ const activeIcons = [...this.getModuleIds()].map((id) => state.icons.get(id)).filter((icon) => icon !== void 0);
133
+ state.emittedIcons = activeIcons;
134
+ if (error || command !== "build" || activeIcons.length === 0) return;
135
+ if (isSsr(this)) {
136
+ if (!state.clientManifest) this.error("Import-driven icon client manifest was not loaded for the SSR build.");
137
+ assertImportedSymbolsAvailable(state.clientManifest, activeIcons);
138
+ } else state.spriteReference = this.emitFile({
139
+ type: "asset",
140
+ name: options.spriteName ?? "omnica-icons-imported.svg",
141
+ source: createImportedSprite(activeIcons)
142
+ });
143
+ },
144
+ generateBundle() {
145
+ const state = stateFor(this);
146
+ if (isSsr(this) || !state.spriteReference) return;
147
+ const spriteFilename = this.getFileName(state.spriteReference);
148
+ const clientManifest = parseImportedSpriteManifest(createImportedSpriteManifest(spriteFilename, base.endsWith("/") ? `${base}${spriteFilename}` : `${base}/${spriteFilename}`, state.emittedIcons), importedSpriteManifestFilename);
149
+ publishedClientManifest = clientManifest;
150
+ this.emitFile({
151
+ type: "asset",
152
+ fileName: importedSpriteManifestFilename,
153
+ source: createImportedSpriteManifest(clientManifest.spriteFilename, clientManifest.spriteUrl, state.emittedIcons)
154
+ });
155
+ },
156
+ renderChunk(code) {
157
+ if (!code.includes(importedSpriteMarker)) return null;
158
+ const state = stateFor(this);
159
+ const spriteUrl = isSsr(this) ? state.clientManifest?.spriteUrl : (() => {
160
+ if (!state.spriteReference) return;
161
+ const filename = this.getFileName(state.spriteReference);
162
+ return base.endsWith("/") ? `${base}${filename}` : `${base}/${filename}`;
163
+ })();
164
+ if (!spriteUrl) this.error("Unable to resolve the import-driven icon sprite URL.");
165
+ const spriteExpression = JSON.stringify(spriteUrl);
166
+ const markerLiteral = new RegExp(`(["'])${importedSpriteMarker}([^"']*)\\1`, "g");
167
+ const replaced = code.replace(markerLiteral, (_match, _quote, suffix) => suffix.length === 0 ? spriteExpression : `${spriteExpression} + ${JSON.stringify(suffix)}`);
168
+ if (replaced === code) this.error("Unable to replace the import-driven icon sprite marker.");
169
+ return replaced;
170
+ }
171
+ };
172
+ };
173
+ //#endregion
174
+ export { omnicaIconComponents };