@chalky/chalky 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +45 -2
- package/app/SYSTEM.md +31 -0
- package/app/extensions/appdata/README.md +10 -0
- package/app/extensions/appdata/guide.md +4 -0
- package/app/extensions/appdata/index.ts +47 -0
- package/app/extensions/boards/browser.js +357 -0
- package/app/extensions/boards/guide.md +4 -0
- package/app/extensions/boards/index.ts +98 -0
- package/app/extensions/commands/browser.js +13 -0
- package/app/extensions/commands/guide.md +3 -0
- package/app/extensions/commands/index.ts +96 -0
- package/app/extensions/doodle/README.md +15 -0
- package/app/extensions/doodle/browser.js +398 -0
- package/app/extensions/doodle/guide.md +6 -0
- package/app/extensions/doodle/index.ts +54 -0
- package/app/extensions/files/browser.js +96 -0
- package/app/extensions/files/guide.md +7 -0
- package/app/extensions/files/index.ts +73 -0
- package/app/extensions/frames/README.md +37 -0
- package/app/extensions/frames/browser.js +166 -0
- package/app/extensions/frames/guide.md +7 -0
- package/app/extensions/frames/index.ts +85 -0
- package/app/extensions/login/browser.js +363 -0
- package/app/extensions/login/index.ts +214 -0
- package/app/extensions/mcp/browser.js +64 -0
- package/app/extensions/mcp/guide.md +5 -0
- package/app/extensions/mcp/index.ts +64 -0
- package/app/extensions/model/index.ts +20 -0
- package/app/extensions/page/index.ts +96 -0
- package/app/extensions/page/page.html +615 -0
- package/app/extensions/point/README.md +22 -0
- package/app/extensions/point/browser.js +247 -0
- package/app/extensions/point/guide.md +6 -0
- package/app/extensions/point/index.ts +112 -0
- package/app/extensions/prompt/index.ts +19 -0
- package/app/extensions/reload/index.ts +21 -0
- package/app/extensions/screen/browser.js +76 -0
- package/app/extensions/screen/index.ts +80 -0
- package/app/extensions/steps/index.ts +17 -0
- package/app/extensions/swarm/README.md +47 -0
- package/app/extensions/swarm/guide.md +11 -0
- package/app/extensions/swarm/index.ts +304 -0
- package/app/extensions/ui/README.md +69 -0
- package/app/extensions/ui/agents.js +45 -0
- package/app/extensions/ui/browser.js +364 -0
- package/app/extensions/ui/components/App.js +28 -0
- package/app/extensions/ui/components/Button.js +28 -0
- package/app/extensions/ui/components/Card.js +23 -0
- package/app/extensions/ui/components/Column.js +17 -0
- package/app/extensions/ui/components/Markdown.js +37 -0
- package/app/extensions/ui/components/Row.js +17 -0
- package/app/extensions/ui/components/Table.js +31 -0
- package/app/extensions/ui/components/Text.js +19 -0
- package/app/extensions/ui/components/TextField.js +30 -0
- package/app/extensions/ui/guide.md +7 -0
- package/app/extensions/ui/index.ts +291 -0
- package/app/extensions/ui/skills/agent-apps/SKILL.md +91 -0
- package/app/extensions/ui/skills/ui-check/SKILL.md +71 -0
- package/app/extensions/ui/skills/ui-check/scripts/check.mjs +306 -0
- package/app/extensions/ui/skills/ui-design/SKILL.md +123 -0
- package/app/extensions/ui/voice.js +114 -0
- package/app/extensions/ui_history/browser.js +97 -0
- package/app/extensions/ui_history/index.ts +109 -0
- package/app/extensions/versions/browser.js +58 -0
- package/app/extensions/versions/index.ts +168 -0
- package/app/extensions/viewer/README.md +12 -0
- package/app/extensions/viewer/browser.js +322 -0
- package/app/extensions/viewer/guide.md +5 -0
- package/app/extensions/viewer/index.ts +209 -0
- package/app/extensions/voice/browser.js +71 -0
- package/app/extensions/voice/index.ts +37 -0
- package/app/mcp.json +3 -0
- package/app/settings.json +3 -0
- package/app/skills/plugin-map/SKILL.md +49 -0
- package/app/skills/write-skill/SKILL.md +57 -0
- package/app/ui/apps/.keep +0 -0
- package/bin/chalky.mjs +11 -0
- package/node_modules/xlsx/CHANGELOG.md +361 -0
- package/node_modules/xlsx/LICENSE +201 -0
- package/node_modules/xlsx/README.md +41 -0
- package/node_modules/xlsx/bin/xlsx.njs +310 -0
- package/node_modules/xlsx/bower.json +22 -0
- package/node_modules/xlsx/dist/LICENSE +201 -0
- package/node_modules/xlsx/dist/cpexcel.d.ts +39 -0
- package/node_modules/xlsx/dist/cpexcel.full.mjs +1502 -0
- package/node_modules/xlsx/dist/cpexcel.js +1506 -0
- package/node_modules/xlsx/dist/shim.min.js +2 -0
- package/node_modules/xlsx/dist/xlsx.core.min.js +18 -0
- package/node_modules/xlsx/dist/xlsx.core.min.map +1 -0
- package/node_modules/xlsx/dist/xlsx.extendscript.js +28259 -0
- package/node_modules/xlsx/dist/xlsx.full.min.js +24 -0
- package/node_modules/xlsx/dist/xlsx.full.min.map +1 -0
- package/node_modules/xlsx/dist/xlsx.mini.min.js +10 -0
- package/node_modules/xlsx/dist/xlsx.mini.min.map +1 -0
- package/node_modules/xlsx/dist/xlsx.zahl.js +4 -0
- package/node_modules/xlsx/dist/xlsx.zahl.mjs +2 -0
- package/node_modules/xlsx/dist/zahl.d.ts +4 -0
- package/node_modules/xlsx/package.json +183 -0
- package/node_modules/xlsx/types/index.d.ts +1065 -0
- package/node_modules/xlsx/types/tsconfig.json +15 -0
- package/node_modules/xlsx/xlsx.js +28103 -0
- package/node_modules/xlsx/xlsx.mjs +28228 -0
- package/node_modules/xlsx/xlsxworker.js +14 -0
- package/package.json +42 -4
- package/server.ts +281 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Voice input: speech to text (port of the Python voice plugin). The browser half: a microphone button by the send
|
|
2
|
+
// button (browser.js) and /ui/voice.js, which apps can import too.
|
|
3
|
+
// Settings (environment, like MODEL_*): STT_BASE_URL, STT_MODEL, STT_API_KEY. With STT_BASE_URL set, audio goes to
|
|
4
|
+
// POST {STT_BASE_URL}/audio/transcriptions, OpenAI's endpoint, which most providers speak (OpenAI, Groq, Mistral,
|
|
5
|
+
// vLLM; others through LiteLLM). Without it, voice.js uses the browser's own speech recognition.
|
|
6
|
+
// The key stays here: apps are agent-written code, so they post audio to this server, never to the provider.
|
|
7
|
+
// GET /voice-api/config {"api": true | false}: whether audio can go to the API
|
|
8
|
+
// POST /voice-api/transcribe multipart: file (a complete audio file, e.g. chunk.webm), language?, prompt?
|
|
9
|
+
// -> {"text"} or {"error"} (with the provider's status)
|
|
10
|
+
import { Readable } from "node:stream";
|
|
11
|
+
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
12
|
+
|
|
13
|
+
const host = (globalThis as any).chalky;
|
|
14
|
+
|
|
15
|
+
export default function (_pi: ExtensionAPI) {
|
|
16
|
+
const base = (process.env.STT_BASE_URL || "").replace(/\/$/, "");
|
|
17
|
+
const json = (res: any, status: number, data: object) =>
|
|
18
|
+
res.writeHead(status, { "content-type": "application/json" }).end(JSON.stringify(data));
|
|
19
|
+
|
|
20
|
+
host.routes.set("/voice-api/config", (_req: any, res: any) => json(res, 200, { api: !!base }));
|
|
21
|
+
|
|
22
|
+
host.routes.set("/voice-api/transcribe", async (req: any, res: any) => {
|
|
23
|
+
if (!base) return json(res, 400, { error: "no STT_BASE_URL: use the browser's speech recognition" });
|
|
24
|
+
try {
|
|
25
|
+
// the page's form as is, plus the model (Node reads multipart itself: Request.formData)
|
|
26
|
+
const form = await new Request("http://local", { method: "POST", headers: req.headers,
|
|
27
|
+
body: Readable.toWeb(req) as any, duplex: "half" } as any).formData();
|
|
28
|
+
if (!(form.get("file") instanceof Blob)) return json(res, 400, { error: "no audio file" });
|
|
29
|
+
form.set("model", process.env.STT_MODEL || "whisper-1");
|
|
30
|
+
const r = await fetch(`${base}/audio/transcriptions`, { method: "POST", body: form,
|
|
31
|
+
headers: process.env.STT_API_KEY ? { authorization: `Bearer ${process.env.STT_API_KEY}` } : {} });
|
|
32
|
+
const data: any = await r.json().catch(() => ({}));
|
|
33
|
+
if (!r.ok) return json(res, 502, { error: `speech to text: ${r.status} ${data.error?.message ?? ""}`.trim() });
|
|
34
|
+
json(res, 200, { text: data.text ?? "" });
|
|
35
|
+
} catch (e: any) { json(res, 502, { error: `speech to text: ${e.message}` }); }
|
|
36
|
+
});
|
|
37
|
+
}
|
package/app/mcp.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plugin-map
|
|
3
|
+
description: Find your way around your own code (the pi extensions in your code folder, the page among them) without reading whole files. Use before changing yourself, or before planning work for others that will.
|
|
4
|
+
---
|
|
5
|
+
# Getting a map of your own code
|
|
6
|
+
|
|
7
|
+
Your code folder is the one your prompt names (it holds `extensions/`). Every feature is one extension, and every
|
|
8
|
+
extension is one folder, `extensions/<name>/`, holding all of that feature:
|
|
9
|
+
|
|
10
|
+
| File | What it is |
|
|
11
|
+
|---------------|--------------------------------------------------------------------|
|
|
12
|
+
| `index.ts` | the extension itself (pi loads it); starts with a header comment |
|
|
13
|
+
| `guide.md` | its short prompt section (the part you are reading in your own prompt) |
|
|
14
|
+
| `README.md` | the whole of what the guide says, read when the guide says |
|
|
15
|
+
| `browser.js` | its part of the page (the page extension loads every one it finds) |
|
|
16
|
+
| `skills/` | skills only this feature needs (its index.ts gives them to pi) |
|
|
17
|
+
|
|
18
|
+
An extension can have other files too (`ui/` has its components, `page/` has `page.html`). The headers are the
|
|
19
|
+
documentation, kept with the code, so read them before the code itself.
|
|
20
|
+
|
|
21
|
+
## 1. The map: one line per extension
|
|
22
|
+
From your code folder:
|
|
23
|
+
```
|
|
24
|
+
for d in extensions/*/; do printf '%-24s %s\n' "$d" "$(grep -m1 '^//' "$d/index.ts" | sed 's|^// \?||' | cut -c1-140)"; done
|
|
25
|
+
```
|
|
26
|
+
Also there:
|
|
27
|
+
- `extensions/page/`: the page itself (`page.html`), its list of browser parts, and what serves them.
|
|
28
|
+
- `extensions/ui/components/*.js`: UI components, each starting with a comment line on what it is, then its
|
|
29
|
+
`about` block (props, levers, example; `head -20 <file>`).
|
|
30
|
+
- `skills/<name>/SKILL.md`: skills about you as a whole (this one); a feature's own skills are in its folder.
|
|
31
|
+
- `ui/`: what you built, not code: `surfaces.json` (the surfaces' design) and `apps/<name>/`.
|
|
32
|
+
- The host, `server.ts` one folder up: sessions, the web server, `globalThis.chalky`. Read its header; don't edit it.
|
|
33
|
+
|
|
34
|
+
## 2. The headers of the extensions involved
|
|
35
|
+
```
|
|
36
|
+
awk '/^import /{exit} 1' extensions/swarm/index.ts # everything above the imports
|
|
37
|
+
```
|
|
38
|
+
Read only the headers of the extensions your work touches. All of them at once is over 13,000 characters.
|
|
39
|
+
|
|
40
|
+
## 3. Then only the code you will change
|
|
41
|
+
Use `grep -n` to find the function, then `sed -n 'START,ENDp'` for that part. A whole file can be long
|
|
42
|
+
(swarm's index.ts is over 16,000 characters). If you are planning work for other agents, the headers are usually
|
|
43
|
+
enough: let each agent read the code it owns.
|
|
44
|
+
|
|
45
|
+
## Keep the headers true
|
|
46
|
+
When you change what an extension provides (a tool, a route, a page message, an event, a host service), update
|
|
47
|
+
its header in the same change. Other agents, and you after a reload, rely on it. A new extension is a new folder
|
|
48
|
+
with an `index.ts` whose header starts with a one-line summary: that line is its entry in the map. After editing,
|
|
49
|
+
call the reload tool.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: write-skill
|
|
3
|
+
description: How to write or improve a skill (SKILL.md format, folder layout, a good description). Use when you want to save a method you worked out so you and other agents can reuse it, or when a skill is listed as broken.
|
|
4
|
+
---
|
|
5
|
+
# Writing a skill
|
|
6
|
+
|
|
7
|
+
## When a skill is worth it
|
|
8
|
+
- You worked out a method that wasn't obvious, and the task will come up again (here or in later runs).
|
|
9
|
+
- You hit a pitfall that cost time. Save the fix, not the story.
|
|
10
|
+
- Not for facts about the current project: those belong in the project's own files (e.g. CONTRACTS.md).
|
|
11
|
+
- One skill per kind of task. If one already covers it, improve that one instead of adding another.
|
|
12
|
+
|
|
13
|
+
## Layout
|
|
14
|
+
```
|
|
15
|
+
skills/<name>/ in your code folder (the one your prompt names, with extensions/ in it)
|
|
16
|
+
SKILL.md required: front matter + instructions
|
|
17
|
+
scripts/ optional: code to run (node or bash; python only if it is installed)
|
|
18
|
+
references/ optional: longer docs, read only when needed
|
|
19
|
+
assets/ optional: templates, data files
|
|
20
|
+
```
|
|
21
|
+
A skill that only one feature needs goes in that extension's folder instead, `extensions/<name>/skills/<skill>/`
|
|
22
|
+
(as `extensions/ui/skills/`), and its `index.ts` gives the folder to pi:
|
|
23
|
+
`pi.on("resources_discover", () => ({ skillPaths: [path.join(import.meta.dirname, "skills")] }))`.
|
|
24
|
+
|
|
25
|
+
## SKILL.md
|
|
26
|
+
```markdown
|
|
27
|
+
---
|
|
28
|
+
name: csv-report
|
|
29
|
+
description: Turns a CSV file into a summary report with totals per column. Use when the user gives a CSV and asks for a summary, report or totals.
|
|
30
|
+
---
|
|
31
|
+
# CSV report
|
|
32
|
+
1. Run `node scripts/report.mjs <file.csv>` (paths are relative to this skill's folder) to get the totals.
|
|
33
|
+
...
|
|
34
|
+
```
|
|
35
|
+
- `name`: exactly the folder's name. Lowercase letters, digits and single hyphens; at most 64 characters.
|
|
36
|
+
- `description`: at most 1024 characters. Say what it does AND when to use it, with the words a matching
|
|
37
|
+
task would contain. Agents decide whether to load the skill from this line alone, so it matters most.
|
|
38
|
+
|
|
39
|
+
## Writing the body
|
|
40
|
+
- Write steps in the imperative ("Run …", "Check …"), with a short example of input and output.
|
|
41
|
+
- Explain why a step matters instead of shouting MUST: an agent that understands the reason handles
|
|
42
|
+
cases you didn't foresee. Keep it general, not tied to the one case you just solved.
|
|
43
|
+
- Work that must come out the same every time (parsing, checks, setup) goes in a script, not in prose.
|
|
44
|
+
Run the script once before saving it.
|
|
45
|
+
- Keep SKILL.md under ~500 lines. Move long material to references/ and say when to read each file.
|
|
46
|
+
A reference over ~300 lines gets a table of contents at the top.
|
|
47
|
+
- If the skill covers variants (e.g. several frameworks), keep the shared workflow in SKILL.md and one
|
|
48
|
+
reference per variant (references/react.md, references/vue.md), so only the relevant one is read.
|
|
49
|
+
- Refer to files by paths relative to the skill folder.
|
|
50
|
+
- No surprises: a skill does what its description says. Never put secrets (keys, passwords) in one.
|
|
51
|
+
|
|
52
|
+
## After writing
|
|
53
|
+
- Call the reload tool: your skill list loads again when your turn ends, and the new skill shows in your prompt
|
|
54
|
+
(name, description and path; you read SKILL.md with read). If it doesn't show, its front matter is wrong.
|
|
55
|
+
- Read it once as a newcomer would: is anything only clear because you just did the work?
|
|
56
|
+
- Skills are shared, but another agent only sees a new skill after it reloads (tell it to call reload).
|
|
57
|
+
Tell the user what you added.
|
|
File without changes
|
package/bin/chalky.mjs
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// chalky: starts Chalky from the installed package. Its home (app/, state/, workspace/) is CHALKY_HOME, else
|
|
3
|
+
// ~/.chalky; the first run copies the package's app/ there. Node won't run TypeScript under node_modules
|
|
4
|
+
// (ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING), so server.ts loads through jiti, as pi loads extensions.
|
|
5
|
+
// MODEL_BASE_URL=... MODEL_API_KEY=... [MODEL_NAME=...] chalky
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { createJiti } from "jiti";
|
|
9
|
+
|
|
10
|
+
process.env.CHALKY_HOME ??= path.join(os.homedir(), ".chalky");
|
|
11
|
+
await createJiti(import.meta.url).import(path.join(import.meta.dirname, "../server.ts"));
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
This log is intended to keep track of backwards-incompatible changes, including
|
|
4
|
+
but not limited to API changes and file location changes. Minor behavioral
|
|
5
|
+
changes may not be included if they are not expected to break existing code.
|
|
6
|
+
|
|
7
|
+
## v0.20.3
|
|
8
|
+
|
|
9
|
+
* Correct parsing of NUMBERS and ODS merge cells (h/t @s-ashwin)
|
|
10
|
+
* More precise treatment of infinite and NaN values
|
|
11
|
+
* XLML Streaming Write
|
|
12
|
+
* Parse `Int8Array` objects (for compatibility with JS engines in Java)
|
|
13
|
+
* CSV Export only quote leading ID (h/t @lako12)
|
|
14
|
+
|
|
15
|
+
## v0.20.2
|
|
16
|
+
|
|
17
|
+
* Reworked parsing methods to avoid slow regexes (CVE-2024-22363)
|
|
18
|
+
* HTML properly encode data-v attribute
|
|
19
|
+
* SYLK read and write error cells
|
|
20
|
+
|
|
21
|
+
## v0.20.1
|
|
22
|
+
|
|
23
|
+
* `init` use packaged test files to work around GitHub breaking changes
|
|
24
|
+
* SSF date code rounding to 15 decimal digits (h/t @davidtamaki)
|
|
25
|
+
* `sheet_to_json` force UTC interpretation for formatted strings (h/t @Blanay)
|
|
26
|
+
* QPW extract result of string formula
|
|
27
|
+
* XLSX parse non-compliant merge cell expressions
|
|
28
|
+
* NUMBERS correctly handle rows omitted from official exports
|
|
29
|
+
* DBF parse empty logical field (h/t @Roman91)
|
|
30
|
+
* `dense` option added to types
|
|
31
|
+
* package.json add mini and core scripts to export map (h/t @stof)
|
|
32
|
+
|
|
33
|
+
## v0.20.0
|
|
34
|
+
|
|
35
|
+
* Use UTC interpretation of Date objects for date cells (potentially breaking)
|
|
36
|
+
* API functions support UTC and local time value interpretations
|
|
37
|
+
* Export `NaN` values to `#NUM!` and infinite values to `#DIV/0!`
|
|
38
|
+
|
|
39
|
+
## v0.19.3
|
|
40
|
+
|
|
41
|
+
* XLSX Ensure comment address is valid (h/t @slonser)
|
|
42
|
+
* Enforce Excel worksheet name restrictions
|
|
43
|
+
* Fixed "Prototype Pollution" vulnerability (CVE-2023-30533)
|
|
44
|
+
|
|
45
|
+
## v0.19.2
|
|
46
|
+
|
|
47
|
+
* XLSX proper decoding of hyperlinks (h/t @tw-yaxu)
|
|
48
|
+
* XLSX ignore unexpected attributes in rich text (h/t @colin4)
|
|
49
|
+
* `sheet_to_json` type fix (h/t @chsdwn)
|
|
50
|
+
|
|
51
|
+
## v0.19.1
|
|
52
|
+
|
|
53
|
+
* Fixed types issue in strict mode (h/t @younes-io)
|
|
54
|
+
* Numbers 12.2 parsing skip ActivityStream.iwa
|
|
55
|
+
|
|
56
|
+
## v0.19.0
|
|
57
|
+
|
|
58
|
+
* XLSX export hyperlinks compatible with google sheets (h/t Evan Bovie)
|
|
59
|
+
* NUMBERS export multiple sheets, full worksheet range
|
|
60
|
+
* formalized `dense` mode
|
|
61
|
+
|
|
62
|
+
## v0.18.12
|
|
63
|
+
|
|
64
|
+
* `package.json` added types in `exports` structure
|
|
65
|
+
* uncapped NUMBERS single-sheet single-table export
|
|
66
|
+
* DBF export records using supported codepages
|
|
67
|
+
|
|
68
|
+
## v0.18.11
|
|
69
|
+
|
|
70
|
+
* Base64 input ignore data URI wrapper
|
|
71
|
+
* Parse ZIP files that use ZIP64 extended information field
|
|
72
|
+
* More precise handling of time-only values
|
|
73
|
+
* Threaded Comment fallback text for older Excel
|
|
74
|
+
|
|
75
|
+
## v0.18.10
|
|
76
|
+
|
|
77
|
+
* `exports` field in package.json to satiate ViteJS and newer tooling
|
|
78
|
+
* JSC (Safari / Bun) perf, see <https://bugs.webkit.org/show_bug.cgi?id=243148>
|
|
79
|
+
* workbook `bookType` property to denote the origin format when parsed from file
|
|
80
|
+
* XLSX force export of stub cells with number formats when `sheetStubs` is set
|
|
81
|
+
|
|
82
|
+
## v0.18.9
|
|
83
|
+
|
|
84
|
+
* XLSX / ODS write defined names
|
|
85
|
+
* sync defined names to AutoFilter setting on export
|
|
86
|
+
* 1904 date system setting properly roundtripped
|
|
87
|
+
* ODS read/write number formats
|
|
88
|
+
|
|
89
|
+
## v0.18.8
|
|
90
|
+
|
|
91
|
+
* Plaintext parsing of dateless meridien time values (`1:23:45 PM`)
|
|
92
|
+
* Legacy format (SYLK / WK# / Multiplan) minutiae
|
|
93
|
+
|
|
94
|
+
## v0.18.7
|
|
95
|
+
|
|
96
|
+
* Normalized handling of `\r` and `\n` newline characters
|
|
97
|
+
|
|
98
|
+
## v0.18.6
|
|
99
|
+
|
|
100
|
+
* Removed all npm dependencies
|
|
101
|
+
* Auto-correct bad Google Sheets format `d.m`
|
|
102
|
+
* NUMBERS write merge cells, cells up to column "ALL"
|
|
103
|
+
|
|
104
|
+
## v0.18.5
|
|
105
|
+
|
|
106
|
+
* Enabled `sideEffects: false` in package.json
|
|
107
|
+
* Basic NUMBERS write support
|
|
108
|
+
|
|
109
|
+
## v0.18.4
|
|
110
|
+
|
|
111
|
+
* CSV output omits trailing record separator
|
|
112
|
+
* Properly terminate NodeJS Streams
|
|
113
|
+
* DBF preserve column types on import and use when applicable on export
|
|
114
|
+
|
|
115
|
+
## v0.18.3
|
|
116
|
+
|
|
117
|
+
* Removed references to `require` and `process` in browser builds
|
|
118
|
+
|
|
119
|
+
## v0.18.2
|
|
120
|
+
|
|
121
|
+
* Hotfix for unicode processing of XLSX exports
|
|
122
|
+
|
|
123
|
+
## v0.18.1
|
|
124
|
+
|
|
125
|
+
* Removed Node ESM build script and folded into standard ESM build
|
|
126
|
+
* Removed undocumented aliases including `make_formulae` and `get_formulae`
|
|
127
|
+
|
|
128
|
+
## v0.18.0
|
|
129
|
+
|
|
130
|
+
* Browser scripts only expose `XLSX` variable
|
|
131
|
+
* Module no longer ships with `dist/jszip.js` browser script
|
|
132
|
+
|
|
133
|
+
## v0.17.4
|
|
134
|
+
|
|
135
|
+
* CLI script moved to `xlsx-cli` package
|
|
136
|
+
|
|
137
|
+
## v0.17.3
|
|
138
|
+
|
|
139
|
+
* `window.XLSX` explicit assignment to satiate LWC
|
|
140
|
+
* CSV Proper formatting of errors
|
|
141
|
+
* HTML emit data-\* attributes
|
|
142
|
+
|
|
143
|
+
## v0.17.2
|
|
144
|
+
|
|
145
|
+
* Browser and Node optional ESM support
|
|
146
|
+
* DSV correct handling of bare quotes (h/t @bgamrat)
|
|
147
|
+
|
|
148
|
+
## v0.17.1
|
|
149
|
+
|
|
150
|
+
* `XLSB` writer uses short cell form when viable
|
|
151
|
+
|
|
152
|
+
## 0.17.0:
|
|
153
|
+
|
|
154
|
+
* mini build includes ODS parse/write support
|
|
155
|
+
* DBF explicitly cap worksheet to 1<<20 rows
|
|
156
|
+
* XLS throw errors on truncated records
|
|
157
|
+
|
|
158
|
+
## v0.16.2
|
|
159
|
+
|
|
160
|
+
* Disabled `PRN` parsing by default (better support for CSV without delimeters)
|
|
161
|
+
|
|
162
|
+
## v0.16.1
|
|
163
|
+
|
|
164
|
+
* skip empty custom property tags if data is absent (fixes DocSecurity issue)
|
|
165
|
+
* HTML output add raw value, type, number format
|
|
166
|
+
* DOM parse look for `v` / `t` / `z` attributes when determining value
|
|
167
|
+
* double quotes in properties escaped using `_x0022_`
|
|
168
|
+
* changed AMD structure for NetSuite and other RequireJS implementations
|
|
169
|
+
- `encode_cell` and `decode_cell` do not rely on `encode_col` / `decode_col`
|
|
170
|
+
|
|
171
|
+
## v0.16.0
|
|
172
|
+
|
|
173
|
+
* Date handling changed
|
|
174
|
+
* XLML certain tag tests are now case insensitive
|
|
175
|
+
* Fixed potentially vulnerable regular expressions
|
|
176
|
+
|
|
177
|
+
## v0.15.6
|
|
178
|
+
|
|
179
|
+
* CFB prevent infinite loop
|
|
180
|
+
* ODS empty cells marked as stub (type "z")
|
|
181
|
+
* `cellStyles` option implies `sheetStubs`
|
|
182
|
+
|
|
183
|
+
## v0.15.5
|
|
184
|
+
|
|
185
|
+
* `sheets` parse option to specify which sheets to parse
|
|
186
|
+
|
|
187
|
+
## v0.15.4
|
|
188
|
+
|
|
189
|
+
* AOA utilities properly preserve number formats
|
|
190
|
+
* Number formats captured in stub cells
|
|
191
|
+
|
|
192
|
+
## v0.15.3
|
|
193
|
+
|
|
194
|
+
* Properties and Custom Properties properly XML-encoded
|
|
195
|
+
|
|
196
|
+
## v0.15.2
|
|
197
|
+
|
|
198
|
+
- `sheet_get_cell` utility function
|
|
199
|
+
- `sheet_to_json` explicitly support `null` as alias for default behavior
|
|
200
|
+
- `encode_col` throw on negative column index
|
|
201
|
+
- HTML properly handle whitespace around tags in a run
|
|
202
|
+
- HTML use `id` option on write
|
|
203
|
+
- Files starting with `0x09` followed by a display character are now TSV files
|
|
204
|
+
- XLS parse references col/row indices mod by the correct number for BIFF ver
|
|
205
|
+
- XLSX comments moved to avoid overlapping cell
|
|
206
|
+
- XLSB outline level
|
|
207
|
+
- AutoFilter update `_FilterDatabase` defined name on write
|
|
208
|
+
- XLML skip CDATA blocks
|
|
209
|
+
|
|
210
|
+
## v0.15.1 (2019-08-14)
|
|
211
|
+
|
|
212
|
+
* XLSX ignore XML artifacts
|
|
213
|
+
* HTML capture and persist merges
|
|
214
|
+
|
|
215
|
+
## v0.15.0
|
|
216
|
+
|
|
217
|
+
* `dist/xlsx.mini.min.js` mini build with XLSX read/write and some utilities
|
|
218
|
+
* Removed legacy conversion utility functions
|
|
219
|
+
|
|
220
|
+
## v0.14.5
|
|
221
|
+
|
|
222
|
+
* XLS PtgNameX lookup
|
|
223
|
+
* XLS always create stub cells for blank cells with comments
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
## v0.14.4
|
|
227
|
+
|
|
228
|
+
* Better treatment of `skipHidden` in CSV output
|
|
229
|
+
* Ignore CLSID in XLS
|
|
230
|
+
* SYLK 7-bit character encoding
|
|
231
|
+
* SYLK and DBF codepage support
|
|
232
|
+
|
|
233
|
+
## v0.14.3
|
|
234
|
+
|
|
235
|
+
* Proper shifting of addresses in Shared Formulae
|
|
236
|
+
|
|
237
|
+
## v0.14.2
|
|
238
|
+
|
|
239
|
+
* Proper XML encoding of comments
|
|
240
|
+
|
|
241
|
+
## v0.14.1
|
|
242
|
+
|
|
243
|
+
* raw cell objects can be passed to `sheet_add_aoa`
|
|
244
|
+
* `_FilterDatabase` fix for AutoFilter-related crashes
|
|
245
|
+
* `stream.to_json` doesn't end up accidentally scanning to max row
|
|
246
|
+
|
|
247
|
+
## 0.14.0 (2018-09-06)
|
|
248
|
+
|
|
249
|
+
* `sheet_to_json` default flipped to `raw: true`
|
|
250
|
+
|
|
251
|
+
## 0.13.5 (2018-08-25)
|
|
252
|
+
|
|
253
|
+
* HTML output generates `<br/>` instead of encoded newline character
|
|
254
|
+
|
|
255
|
+
## 0.13.2 (2018-07-08)
|
|
256
|
+
|
|
257
|
+
* Buffer.from shim replaced, will not be defined in node `<=0.12`
|
|
258
|
+
|
|
259
|
+
## 0.13.0 (2018-06-01)
|
|
260
|
+
|
|
261
|
+
* Library reshaped to support AMD out of the box
|
|
262
|
+
|
|
263
|
+
## 0.12.11 (2018-04-27)
|
|
264
|
+
|
|
265
|
+
* XLS/XLSX/XLSB range truncation (errors in `WTF` mode)
|
|
266
|
+
|
|
267
|
+
## 0.12.4 (2018-03-04)
|
|
268
|
+
|
|
269
|
+
* `JSZip` renamed to `JSZipSync`
|
|
270
|
+
|
|
271
|
+
## 0.12.0 (2018-02-08)
|
|
272
|
+
|
|
273
|
+
* Extendscript target script in NPM package
|
|
274
|
+
|
|
275
|
+
## 0.11.19 (2018-02-03)
|
|
276
|
+
|
|
277
|
+
* Error on empty workbook
|
|
278
|
+
|
|
279
|
+
## 0.11.16 (2017-12-30)
|
|
280
|
+
|
|
281
|
+
* XLS ANSI/CP separation
|
|
282
|
+
* 'array' write type and ArrayBuffer processing
|
|
283
|
+
|
|
284
|
+
## 0.11.6 (2017-10-16)
|
|
285
|
+
|
|
286
|
+
* Semicolon-delimited files are detected
|
|
287
|
+
|
|
288
|
+
## 0.11.5 (2017-09-30)
|
|
289
|
+
|
|
290
|
+
* Bower main script shifted to full version
|
|
291
|
+
* 'binary' / 'string' encoding
|
|
292
|
+
|
|
293
|
+
## 0.11.3 (2017-08-19)
|
|
294
|
+
|
|
295
|
+
* XLS cell ixfe/XF removed
|
|
296
|
+
|
|
297
|
+
## 0.11.0 (2017-07-31)
|
|
298
|
+
|
|
299
|
+
* Strip `require` statements from minified version
|
|
300
|
+
* minifier mangler enabled
|
|
301
|
+
|
|
302
|
+
## 0.10.9 (2017-07-28)
|
|
303
|
+
|
|
304
|
+
* XLML/HTML resolution logic looks further into the data stream to decide type
|
|
305
|
+
* Errors thrown on suspected RTF files
|
|
306
|
+
|
|
307
|
+
## 0.10.5 (2017-06-09)
|
|
308
|
+
|
|
309
|
+
* HTML Table output header/footer should not include `<table>` tag
|
|
310
|
+
|
|
311
|
+
## 0.10.2 (2017-05-16)
|
|
312
|
+
|
|
313
|
+
* Dates are converted to numbers by default (set `cellDates:true` to emit Dates)
|
|
314
|
+
* Module does not export CFB
|
|
315
|
+
|
|
316
|
+
## 0.9.10 (2017-04-08)
|
|
317
|
+
|
|
318
|
+
* `--perf` renamed to `--read-only`
|
|
319
|
+
|
|
320
|
+
## 0.9.9 (2017-04-03)
|
|
321
|
+
|
|
322
|
+
* default output format changed to XLSB
|
|
323
|
+
* comment text line endings are now normalized
|
|
324
|
+
* errors thrown on write when worksheets have invalid names
|
|
325
|
+
|
|
326
|
+
## 0.9.7 (2017-03-28)
|
|
327
|
+
|
|
328
|
+
* XLS legacy `!range` field removed
|
|
329
|
+
* Hyperlink tooltip is stored in the `Tooltip` field
|
|
330
|
+
|
|
331
|
+
## 0.9.6 (2017-03-25)
|
|
332
|
+
|
|
333
|
+
* `sheet_to_json` now passes `null` values when `raw` is set to `true`
|
|
334
|
+
* `sheet_to_json` treats `null` stub cells as values in conjunction with `raw`
|
|
335
|
+
|
|
336
|
+
## 0.9.5 (2017-03-22)
|
|
337
|
+
|
|
338
|
+
* `cellDates` affects parsing in non-XLSX formats
|
|
339
|
+
|
|
340
|
+
## 0.9.3 (2017-03-15)
|
|
341
|
+
|
|
342
|
+
* XLML property names are more closely mapped to the XLSX equivalent
|
|
343
|
+
* Stub cells are now cell type `z`
|
|
344
|
+
|
|
345
|
+
## 0.9.2 (2017-03-13)
|
|
346
|
+
|
|
347
|
+
* Removed stale TypeScript definition files. Flowtype comments are used in the
|
|
348
|
+
`xlsx.flow.js` source and stripped to produce `xlsx.js`.
|
|
349
|
+
* sed usage reworked to support GNU sed in-place form. BSD sed seems to work,
|
|
350
|
+
but the build script has not been tested on other sed variants:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
$ sed -i.ext [...] # GNU
|
|
354
|
+
$ sed -i .ext [...] # bsd
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## 0.9.0 (2017-03-09)
|
|
358
|
+
|
|
359
|
+
* Removed ods.js source. The xlsx.js source absorbed the ODS logic and exposes
|
|
360
|
+
the ODS variable, so projects should remove references to ods.js
|
|
361
|
+
|